diff --git a/README.md b/README.md index 2588fe0..c525f06 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,6 @@ ```sh npm install -npm start dev +npm run dev npm run gulp ``` diff --git a/public/js/modules/handleUpload.1.min.js b/public/js/modules/handleUpload.1.min.js new file mode 100644 index 0000000..d79162f --- /dev/null +++ b/public/js/modules/handleUpload.1.min.js @@ -0,0 +1,50 @@ +import loadEmbedScript from"/js/modules/loadEmbedScript.min.js";import{fileInput,loadingAnimation,loadingText,introElement,resultsElement,userDescription,userAvatar,userInfo,userDataBreakdown,chartElement}from"./handleUpload";const handleUpload=()=>{fileInput&&fileInput.addEventListener("change",async e=>{loadingAnimation.classList.remove("d-none"),loadingText.classList.remove("d-none"),fileInput.disabled=!0;var s=new FormData;s.set("archive",fileInput.files[0]);s=await(await fetch("/extract-data",{method:"POST",body:s})).json();if(s&&s.data){introElement.classList.add("d-none"),resultsElement.classList.remove("d-none");s=s.data;let e="",t="",r=(s.actor?(e+=` +

+ ${s.actor.name||s.actor.preferredUsername} +

+ ${s.actor.summary.replaceAll('class="invisible"',"")} + `,s.actor.attachment&&(e+=` + + `),userDescription.innerHTML=`
${e}
`,s.avatar_url?userAvatar.innerHTML=` + + `:s.avatar&&(userAvatar.innerHTML=` + + `)):(userInfo.remove(),userDescription.remove()),[]),a;s?.outbox?.orderedItems?r=s.outbox.orderedItems:s?.outbox&&(r=s.outbox),n=r.length;let l=[],i={posts:0,replies:0,reblogs:0,total:0};if(n){const d=Math.ceil(Math.pow(r.length,.1));let s=0;a=r[0],r.forEach(t=>{let a=!1;var e=[...t.to,...t.cc];if(e.forEach(e=>{e.endsWith("/followers")&&(a=!0)}),a){if(s++,10<=r.length&&s<=d){const t=r[Math.pow(10,s)];var o=t.id.replace("/activity","");let e=!1;t.object.id||(e=!0),o={label:[Math.pow(10,s).toLocaleString()+"th post"],url:o,isBoost:e},l.push(o)}i.total++,"Create"===t.type?t.object.inReplyTo?i.replies++:i.posts++:i.reblogs++}else 0===e.length&&console.log(t.id.replace("users/","@").replace("statuses/","").replace("/activity",""))}),console.log({counter:i})}var n={weekday:"long",year:"numeric",month:"long",day:"numeric"};s.actor&&(c=moment(s.actor.published),c=moment().diff(c,"days"),t+=` +

+ You created your account on ${new Date(s.actor.published).toLocaleDateString(void 0,n)}, which is ${c.toLocaleString()} day(s) ago. Since then, you posted ${i.total.toLocaleString()} times, or about ${Math.round(i.total/c).toLocaleString()} time(s) a day on average. +

+ `),(0 + You have reblogged ${i.reblogs.toLocaleString()} post(s), replied ${i.replies.toLocaleString()} time(s), and posted ${i.posts.toLocaleString()} new post(s). +

+ `);let o;if(a){let e;if(!["firefish","calckey","misskey"].includes(s.format)){n=a?.uri||a?.object?.id||a?.id;try{e=new URL(n)}catch(e){console.log("error parsing data file",e)}e&&e.protocol&&e.hostname&&(o=e.protocol+"//"+e.hostname),t+=` +

+ Here's your first post! +

+ `,"mastodon"===s.format&&(t+=` + + `),l&&l.length&&(t+=` +

+ Here are more of your milestones: +

+ + `),t+=` +

+ And this is what your posting history looks like. +

+ `}}userDataBreakdown.innerHTML=t,"mastodon"===s.format&&loadEmbedScript(o);var c={labels:r.map(e=>moment(e.published||e.createdAt||e.created)),datasets:[{label:"Your posts in time",data:r.map((e,t)=>({x:moment(e.published||e.createdAt||e.created),y:new Date(e.published||e.createdAt||e.created).getHours()})),backgroundColor:["#ff6384"]}]};new Chart(chartElement,{type:"scatter",data:c,options:{scales:{x:{type:"time",position:"bottom",ticks:{beginAtZero:!1,stepSize:10}},y:{ticks:{beginAtZero:!1,display:!1},scaleLabel:{display:!1},minorTickInterval:null}},plugins:{tooltip:{callbacks:{label:e=>e.label}}}}})}else loadingAnimation.classList.add("d-none"),loadingText.classList.add("d-none"),fileInput.disabled=!1})};export{handleUpload}; +//# sourceMappingURL=handleUpload.1.min.js.map diff --git a/public/js/modules/handleUpload.1.min.js.map b/public/js/modules/handleUpload.1.min.js.map new file mode 100644 index 0000000..a8e0a36 --- /dev/null +++ b/public/js/modules/handleUpload.1.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"handleUpload.1.min.js","sources":["modules/handleUpload.1.js"],"sourcesContent":["import loadEmbedScript from \"/js/modules/loadEmbedScript.min.js\";\r\nimport { fileInput, loadingAnimation, loadingText, introElement, resultsElement, userDescription, userAvatar, userInfo, userDataBreakdown, chartElement } from \"./handleUpload\";\r\n\r\nexport const handleUpload = () => {\r\n if (fileInput) {\r\n fileInput.addEventListener(\"change\", async (ev) => {\r\n loadingAnimation.classList.remove(\"d-none\");\r\n loadingText.classList.remove(\"d-none\");\r\n fileInput.disabled = true;\r\n const formData = new FormData();\r\n formData.set(\"archive\", fileInput.files[0]);\r\n\r\n const resp = await fetch(\"/extract-data\", {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n const response = await resp.json();\r\n\r\n if (response && response.data) {\r\n introElement.classList.add(\"d-none\");\r\n resultsElement.classList.remove(\"d-none\");\r\n const userData = response.data;\r\n\r\n // let userDomain = getDomain(userData.actor.id);\r\n let userDescriptionHTML = \"\";\r\n let userDataBreakdownHTML = \"\";\r\n\r\n if (userData.actor) {\r\n userDescriptionHTML += `\r\n

\r\n ${userData.actor.name || userData.actor.preferredUsername}\r\n

\r\n ${userData.actor.summary.replaceAll('class=\"invisible\"', \"\")}\r\n `;\r\n\r\n if (userData.actor.attachment) {\r\n userDescriptionHTML += `\r\n \r\n `;\r\n }\r\n\r\n userDescription.innerHTML = `
${userDescriptionHTML}
`;\r\n\r\n if (userData.avatar_url) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n } else if (userData.avatar) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n }\r\n } else {\r\n userInfo.remove();\r\n userDescription.remove();\r\n }\r\n\r\n let posts = [];\r\n let firstPost;\r\n let postCount = 0;\r\n\r\n if (userData?.outbox?.orderedItems) {\r\n posts = userData.outbox.orderedItems;\r\n } else if (userData?.outbox) {\r\n posts = userData.outbox;\r\n }\r\n\r\n postCount = posts.length;\r\n let milestones = [];\r\n\r\n let counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\r\n total: 0,\r\n };\r\n\r\n if (postCount) {\r\n // posts = sortArrayOfObjects(posts, key, desc)\r\n const maxRoot = Math.ceil(Math.pow(posts.length, 1 / 10));\r\n let index = 0;\r\n firstPost = posts[0];\r\n\r\n posts.forEach((post) => {\r\n let isSemiPublic = false;\r\n const recipients = [...post.to, ...post.cc];\r\n\r\n recipients.forEach(recipient => {\r\n if (recipient.endsWith(\"/followers\")) {\r\n isSemiPublic = true;\r\n }\r\n });\r\n\r\n if (isSemiPublic) {\r\n index++;\r\n if (posts.length >= 10 && index <= maxRoot) {\r\n const post = posts[Math.pow(10, index)];\r\n const url = post.id.replace(\"/activity\", \"\");\r\n\r\n let milestone = {};\r\n let isBoost = false;\r\n\r\n if (!post.object.id) {\r\n isBoost = true;\r\n }\r\n\r\n milestone = {\r\n label: [`${Math.pow(10, index).toLocaleString()}th post`],\r\n url,\r\n isBoost,\r\n };\r\n\r\n milestones.push(milestone);\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n counter.total++;\r\n if (post.type === \"Create\") {\r\n if (post.object.inReplyTo) {\r\n counter.replies++;\r\n } else {\r\n counter.posts++;\r\n }\r\n } else {\r\n counter.reblogs++;\r\n }\r\n } else {\r\n // console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"), recipients);\r\n // console.log(recipients);\r\n if (recipients.length === 0) {\r\n console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"));\r\n }\r\n }\r\n });\r\n\r\n console.log({ counter });\r\n }\r\n\r\n const options = {\r\n weekday: \"long\",\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n };\r\n\r\n if (userData.actor) {\r\n const accountCreationDate = moment(userData.actor.published);\r\n const today = moment();\r\n const timeAgo = today.diff(accountCreationDate, \"days\");\r\n\r\n userDataBreakdownHTML += `\r\n

\r\n You created your account on ${new Date(\r\n userData.actor.published\r\n ).toLocaleDateString(\r\n undefined,\r\n options\r\n )}, which is ${timeAgo.toLocaleString()} day(s) ago. Since then, you posted ${counter.total.toLocaleString()} times, or about ${Math.round(\r\n counter.total / timeAgo\r\n ).toLocaleString()} time(s) a day on average.\r\n

\r\n `;\r\n }\r\n\r\n /*\r\n counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\r\n*/\r\n if (counter.reblogs > 0 || counter.replies > 0) {\r\n userDataBreakdownHTML += `\r\n

\r\n You have reblogged ${counter.reblogs.toLocaleString()} post(s), replied ${counter.replies.toLocaleString()} time(s), and posted ${counter.posts.toLocaleString()} new post(s).\r\n

\r\n `;\r\n }\r\n\r\n let instanceURL;\r\n\r\n if (firstPost) {\r\n let postURL;\r\n let url;\r\n\r\n if ([\"firefish\", \"calckey\", \"misskey\"].includes(userData.format)) {\r\n // Export file doesn't contain server name.\r\n } else {\r\n postURL = firstPost?.uri || firstPost?.object?.id || firstPost?.id;\r\n\r\n try {\r\n url = new URL(postURL);\r\n } catch (err) {\r\n console.log(\"error parsing data file\", err);\r\n }\r\n\r\n if (url && url.protocol && url.hostname) {\r\n instanceURL = `${url.protocol}//${url.hostname}`;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

\r\n Here's your first post!\r\n

\r\n `;\r\n\r\n if (userData.format === \"mastodon\") {\r\n userDataBreakdownHTML += `\r\n \r\n `;\r\n }\r\n\r\n if (milestones && milestones.length) {\r\n userDataBreakdownHTML += `\r\n

\r\n Here are more of your milestones:\r\n

\r\n \r\n `;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

\r\n And this is what your posting history looks like.\r\n

\r\n `;\r\n }\r\n }\r\n\r\n userDataBreakdown.innerHTML = userDataBreakdownHTML;\r\n\r\n if (userData.format === \"mastodon\") {\r\n loadEmbedScript(instanceURL);\r\n }\r\n\r\n // chartOptions.options.legend = {\r\n // display: false\r\n // };\r\n const data = {\r\n labels: posts.map((post) => moment(post.published || post.createdAt || post.created)\r\n ),\r\n datasets: [\r\n {\r\n label: \"Your posts in time\",\r\n data: posts.map((post, index) => {\r\n return {\r\n x: moment(post.published || post.createdAt || post.created),\r\n // y: (new Date(post.published || post.createdAt)).getHour() + 1,\r\n y: new Date(\r\n post.published || post.createdAt || post.created\r\n ).getHours(),\r\n };\r\n }),\r\n backgroundColor: [\"#ff6384\"],\r\n },\r\n ],\r\n };\r\n\r\n new Chart(chartElement, {\r\n type: \"scatter\",\r\n data: data,\r\n options: {\r\n scales: {\r\n x: {\r\n type: \"time\",\r\n position: \"bottom\",\r\n ticks: {\r\n beginAtZero: false,\r\n stepSize: 10,\r\n },\r\n },\r\n y: {\r\n ticks: {\r\n beginAtZero: false,\r\n display: false,\r\n },\r\n scaleLabel: {\r\n display: false,\r\n // labelString: chartEl.dataset.axisLabelData\r\n // labelString: chartEl.dataset.sourceId ? window.ftfDataviz[parseInt( chartEl.dataset.sourceId )].axis_label_title : ''\r\n // labelString: 'Day of the month'\r\n },\r\n minorTickInterval: null,\r\n },\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n // label: (ctx) => ctx.label\r\n label: (ctx) => {\r\n // console.log(ctx);\r\n // console.log(posts[ctx.dataIndex].object.content);\r\n return ctx.label;\r\n },\r\n },\r\n },\r\n },\r\n },\r\n });\r\n } else {\r\n loadingAnimation.classList.add(\"d-none\");\r\n loadingText.classList.add(\"d-none\");\r\n fileInput.disabled = false;\r\n }\r\n });\r\n }\r\n};\r\n"],"names":["loadEmbedScript","fileInput","loadingAnimation","loadingText","introElement","resultsElement","userDescription","userAvatar","userInfo","userDataBreakdown","chartElement","handleUpload","addEventListener","async","ev","classList","remove","disabled","formData","FormData","set","files","response","await","fetch","method","body","json","data","add","userData","let","userDescriptionHTML","userDataBreakdownHTML","posts","actor","name","preferredUsername","summary","replaceAll","attachment","map","value","replace","join","innerHTML","avatar_url","avatar","firstPost","outbox","orderedItems","postCount","length","milestones","counter","replies","reblogs","total","maxRoot","Math","ceil","pow","index","forEach","isSemiPublic","recipients","post","to","cc","recipient","endsWith","url","id","isBoost","object","milestone","label","toLocaleString","push","type","inReplyTo","console","log","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","err","protocol","hostname","labels","createdAt","created","datasets","x","y","getHours","backgroundColor","Chart","scales","position","ticks","beginAtZero","stepSize","display","scaleLabel","minorTickInterval","plugins","tooltip","callbacks","ctx"],"mappings":"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"} \ No newline at end of file diff --git a/public/js/modules/handleUpload.min.js b/public/js/modules/handleUpload.min.js index e002417..d6e5182 100644 --- a/public/js/modules/handleUpload.min.js +++ b/public/js/modules/handleUpload.min.js @@ -1,4 +1,4 @@ -import sortArrayOfObjects from"/js/modules/sortArrayOfObjects.min.js";import getDomain from"/js/modules/getDomain.min.js";import loadEmbedScript from"/js/modules/loadEmbedScript.min.js";import Cookie from"/js/cookies/main.min.js";const cookieManager=new Cookie,fileInput=document.getElementById("file-input"),introElement=document.getElementById("intro"),loadingAnimation=document.getElementById("loading-animation"),loadingText=document.getElementById("loading-text"),resultsElement=document.getElementById("results"),userInfo=document.getElementById("user-info"),userAvatar=document.getElementById("user-avatar"),userDescription=document.getElementById("user-description"),userDataBreakdown=document.getElementById("user-data-breakdown"),chartElement=document.getElementById("chart"),handleUpload=()=>{fileInput&&fileInput.addEventListener("change",async e=>{loadingAnimation.classList.remove("d-none"),loadingText.classList.remove("d-none"),fileInput.disabled=!0;var s=new FormData;s.set("archive",fileInput.files[0]);s=await(await fetch("/extract-data",{method:"POST",body:s})).json();if(s&&s.data){introElement.classList.add("d-none"),resultsElement.classList.remove("d-none");s=s.data;let e="",t="",a=(s.actor?(e+=` +import sortArrayOfObjects from"/js/modules/sortArrayOfObjects.min.js";import getDomain from"/js/modules/getDomain.min.js";import loadEmbedScript from"/js/modules/loadEmbedScript.min.js";import Cookie from"/js/cookies/main.min.js";const cookieManager=new Cookie,fileInput=document.getElementById("file-input"),introElement=document.getElementById("intro"),loadingAnimation=document.getElementById("loading-animation"),loadingText=document.getElementById("loading-text"),resultsElement=document.getElementById("results"),userInfo=document.getElementById("user-info"),userAvatar=document.getElementById("user-avatar"),userDescription=document.getElementById("user-description"),userDataBreakdown=document.getElementById("user-data-breakdown"),chartElement=document.getElementById("chart"),handleUpload=()=>{fileInput&&fileInput.addEventListener("change",async e=>{loadingAnimation.classList.remove("d-none"),loadingText.classList.remove("d-none"),fileInput.disabled=!0;var s=new FormData;s.set("archive",fileInput.files[0]);s=await(await fetch("/extract-data",{method:"POST",body:s})).json();if(s&&s.data){introElement.classList.add("d-none"),resultsElement.classList.remove("d-none");s=s.data;let e="",t="",r=(s.actor?(e+=`

${s.actor.name||s.actor.preferredUsername}

@@ -13,26 +13,30 @@ import sortArrayOfObjects from"/js/modules/sortArrayOfObjects.min.js";import get `:s.avatar&&(userAvatar.innerHTML=` - `)):(userInfo.remove(),userDescription.remove()),[]),o,r=0;s?.outbox?.orderedItems?a=s.outbox.orderedItems:s?.outbox&&(a=s.outbox);var i=[];if(r=a.length){var l=Math.ceil(Math.pow(a.length,.1));if(o=a[0],10<=a.length)for(let t=1;t<=l;t++){var d=a[Math.pow(10,t)],m=d.id.replace("/activity","");let e=!1;d.object.id||(e=!0),d={label:[Math.pow(10,t).toLocaleString()+"th post"],url:m,isBoost:e},i.push(d)}}var c={weekday:"long",year:"numeric",month:"long",day:"numeric"};s.actor&&(u=moment(s.actor.published),u=moment().diff(u,"days"),t+=` + `)):(userInfo.remove(),userDescription.remove()),[]),o;s?.outbox?.orderedItems?r=s.outbox.orderedItems:s?.outbox&&(r=s.outbox),i=r.length;let n=[],l={posts:0,replies:0,reblogs:0,total:0};if(i){const m=Math.ceil(Math.pow(r.length,.1));let s=0;o=r[0],r.forEach(t=>{let o=!1;if([...t.to,...t.cc].forEach(e=>{e.endsWith("/followers")&&(o=!0)}),o){if(s++,10<=r.length&&s<=m){const t=r[Math.pow(10,s)];var a=t.id.replace("/activity","");let e=!1;t.object.id||(e=!0),a={label:[Math.pow(10,s).toLocaleString()+"th post"],url:a,isBoost:e},n.push(a)}l.total++,"Create"===t.type?t.object.inReplyTo?l.replies++:l.posts++:l.reblogs++}})}var i={weekday:"long",year:"numeric",month:"long",day:"numeric"};s.actor&&(d=moment(s.actor.published),d=moment().diff(d,"days"),t+=`

- You created your account on ${new Date(s.actor.published).toLocaleDateString(void 0,c)}, which is ${u.toLocaleString()} day(s) ago. Since then, you posted ${r.toLocaleString()} times, or about ${Math.round(r/u).toLocaleString()} time(s) a day on average. + You created your account on ${new Date(s.actor.published).toLocaleDateString(void 0,i)}, which is ${d.toLocaleString()} day(s) ago. Since then, you posted ${l.total.toLocaleString()} times, or about ${Math.round(l.total/d).toLocaleString()} time(s) a day on average.

- `);let n;if(o){let e;if(!["firefish","calckey","misskey"].includes(s.format)){c=o?.uri||o?.object?.id||o?.id;try{e=new URL(c)}catch(e){console.log("error parsing data file",e)}e&&e.protocol&&e.hostname&&(n=e.protocol+"//"+e.hostname),t+=` + `),(0 + You have reblogged ${l.reblogs.toLocaleString()} post(s), replied ${l.replies.toLocaleString()} time(s), and posted ${l.posts.toLocaleString()} new post(s). +

+ `);let a;if(o){let e;if(!["firefish","calckey","misskey"].includes(s.format)){i=o?.uri||o?.object?.id||o?.id;try{e=new URL(i)}catch(e){console.log("error parsing data file",e)}e&&e.protocol&&e.hostname&&(a=e.protocol+"//"+e.hostname),t+=`

- Here's your first post! + Here's your first post!

`,"mastodon"===s.format&&(t+=` - `),i&&i.length&&(t+=` + `),n&&n.length&&(t+=`

Here are more of your milestones:

    - ${i.map(e=>` + ${n.map(e=>`
  • ${e.label}${e.isBoost?" (boost)":""}
  • @@ -42,5 +46,5 @@ import sortArrayOfObjects from"/js/modules/sortArrayOfObjects.min.js";import get

    And this is what your posting history looks like.

    - `}}userDataBreakdown.innerHTML=t,"mastodon"===s.format&&loadEmbedScript(n);var u={labels:a.map(e=>moment(e.published||e.createdAt||e.created)),datasets:[{label:"Your posts in time",data:a.map((e,t)=>({x:moment(e.published||e.createdAt||e.created),y:new Date(e.published||e.createdAt||e.created).getHours()})),backgroundColor:["#ff6384"]}]};new Chart(chartElement,{type:"scatter",data:u,options:{scales:{x:{type:"time",position:"bottom",ticks:{beginAtZero:!1,stepSize:10}},y:{ticks:{beginAtZero:!1,display:!1},scaleLabel:{display:!1},minorTickInterval:null}},plugins:{tooltip:{callbacks:{label:e=>e.label}}}}})}else loadingAnimation.classList.add("d-none"),loadingText.classList.add("d-none"),fileInput.disabled=!1})};export default handleUpload; + `}}userDataBreakdown.innerHTML=t,"mastodon"===s.format&&loadEmbedScript(a);var d={labels:r.map(e=>moment(e.published||e.createdAt||e.created)),datasets:[{label:"Your posts in time",data:r.map((e,t)=>({x:moment(e.published||e.createdAt||e.created),y:new Date(e.published||e.createdAt||e.created).getHours()})),backgroundColor:["#ff6384"]}]};new Chart(chartElement,{type:"scatter",data:d,options:{scales:{x:{type:"time",position:"bottom",ticks:{beginAtZero:!1,stepSize:10}},y:{ticks:{beginAtZero:!1,display:!1},scaleLabel:{display:!1},minorTickInterval:null}},plugins:{tooltip:{callbacks:{label:e=>e.label}}}}})}else loadingAnimation.classList.add("d-none"),loadingText.classList.add("d-none"),fileInput.disabled=!1})};export default handleUpload; //# sourceMappingURL=handleUpload.min.js.map diff --git a/public/js/modules/handleUpload.min.js.map b/public/js/modules/handleUpload.min.js.map index bbee363..f05bb90 100644 --- a/public/js/modules/handleUpload.min.js.map +++ b/public/js/modules/handleUpload.min.js.map @@ -1 +1 @@ -{"version":3,"file":"handleUpload.min.js","sources":["modules/handleUpload.js"],"sourcesContent":["import sortArrayOfObjects from \"/js/modules/sortArrayOfObjects.min.js\";\r\nimport getDomain from \"/js/modules/getDomain.min.js\";\r\nimport loadEmbedScript from \"/js/modules/loadEmbedScript.min.js\";\r\nimport Cookie from \"/js/cookies/main.min.js\";\r\n\r\nconst cookieManager = new Cookie();\r\nconst fileInput = document.getElementById(\"file-input\");\r\nconst introElement = document.getElementById(\"intro\");\r\nconst loadingAnimation = document.getElementById(\"loading-animation\");\r\nconst loadingText = document.getElementById(\"loading-text\");\r\nconst resultsElement = document.getElementById(\"results\");\r\nconst userInfo = document.getElementById(\"user-info\");\r\nconst userAvatar = document.getElementById(\"user-avatar\");\r\nconst userDescription = document.getElementById(\"user-description\");\r\nconst userDataBreakdown = document.getElementById(\"user-data-breakdown\");\r\nconst chartElement = document.getElementById(\"chart\");\r\n\r\nconst handleUpload = () => {\r\n if (fileInput) {\r\n fileInput.addEventListener(\"change\", async (ev) => {\r\n loadingAnimation.classList.remove(\"d-none\");\r\n loadingText.classList.remove(\"d-none\");\r\n fileInput.disabled = true;\r\n const formData = new FormData();\r\n formData.set(\"archive\", fileInput.files[0]);\r\n\r\n const resp = await fetch(\"/extract-data\", {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n const response = await resp.json();\r\n\r\n if (response && response.data) {\r\n introElement.classList.add(\"d-none\");\r\n resultsElement.classList.remove(\"d-none\");\r\n const userData = response.data;\r\n\r\n // let userDomain = getDomain(userData.actor.id);\r\n let userDescriptionHTML = \"\";\r\n let userDataBreakdownHTML = \"\";\r\n\r\n if (userData.actor) {\r\n userDescriptionHTML += `\r\n

    \r\n ${\r\n userData.actor.name || userData.actor.preferredUsername\r\n }\r\n

    \r\n ${userData.actor.summary.replaceAll('class=\"invisible\"', \"\")}\r\n `;\r\n\r\n if (userData.actor.attachment) {\r\n userDescriptionHTML += `\r\n
      \r\n ${userData.actor.attachment\r\n .map(\r\n (attachment) => `\r\n
    • ${\r\n attachment.name\r\n }: ${attachment.value.replace('class=\"invisible\"', \"\")}
    • \r\n `\r\n )\r\n .join(\"\")}\r\n
    \r\n `;\r\n }\r\n\r\n userDescription.innerHTML = `
    ${userDescriptionHTML}
    `;\r\n\r\n if (userData.avatar_url) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n } else if (userData.avatar) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n }\r\n } else {\r\n userInfo.remove();\r\n userDescription.remove();\r\n }\r\n\r\n let posts = [],\r\n firstPost,\r\n postCount = 0;\r\n\r\n if (userData?.outbox?.orderedItems) {\r\n posts = userData.outbox.orderedItems;\r\n } else if (userData?.outbox) {\r\n posts = userData.outbox;\r\n }\r\n\r\n postCount = posts.length;\r\n let milestones = [];\r\n\r\n if (postCount) {\r\n // posts = sortArrayOfObjects(posts, key, desc)\r\n const maxRoot = Math.ceil(Math.pow(posts.length, 1 / 10));\r\n firstPost = posts[0];\r\n\r\n if (posts.length >= 10) {\r\n for (let i = 1; i <= maxRoot; i++) {\r\n const post = posts[Math.pow(10, i)];\r\n const url = post.id.replace(\"/activity\", \"\");\r\n\r\n let milestone = {};\r\n let isBoost = false;\r\n\r\n if (!post.object.id) {\r\n isBoost = true;\r\n }\r\n\r\n milestone = {\r\n label: [`${Math.pow(10, i).toLocaleString()}th post`],\r\n url,\r\n isBoost,\r\n };\r\n\r\n milestones.push(milestone);\r\n }\r\n }\r\n }\r\n\r\n const options = {\r\n weekday: \"long\",\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n };\r\n\r\n if (userData.actor) {\r\n const accountCreationDate = moment(userData.actor.published);\r\n const today = moment();\r\n const timeAgo = today.diff(accountCreationDate, \"days\");\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n You created your account on ${new Date(\r\n userData.actor.published\r\n ).toLocaleDateString(\r\n undefined,\r\n options\r\n )}, which is ${timeAgo.toLocaleString()} day(s) ago. Since then, you posted ${postCount.toLocaleString()} times, or about ${Math.round(\r\n postCount / timeAgo\r\n ).toLocaleString()} time(s) a day on average.\r\n

    \r\n `;\r\n }\r\n\r\n let instanceURL;\r\n\r\n if (firstPost) {\r\n let postURL;\r\n let url;\r\n\r\n if ([\"firefish\", \"calckey\", \"misskey\"].includes(userData.format)) {\r\n // Export file doesn't contain server name.\r\n } else {\r\n postURL = firstPost?.uri || firstPost?.object?.id || firstPost?.id;\r\n\r\n try {\r\n url = new URL(postURL);\r\n } catch (err) {\r\n console.log(\"error parsing data file\", err);\r\n }\r\n\r\n if (url && url.protocol && url.hostname) {\r\n instanceURL = `${url.protocol}//${url.hostname}`;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n Here's your first post!\r\n

    \r\n `;\r\n\r\n if (userData.format === \"mastodon\") {\r\n userDataBreakdownHTML += `\r\n \r\n `;\r\n }\r\n\r\n if (milestones && milestones.length) {\r\n userDataBreakdownHTML += `\r\n

    \r\n Here are more of your milestones:\r\n

    \r\n
      \r\n ${milestones\r\n .map(\r\n (milestone) => `\r\n
    • \r\n ${\r\n milestone.label\r\n }${milestone.isBoost ? ` (boost)` : \"\"}\r\n
    • \r\n `\r\n )\r\n .join(\"\")}\r\n
    \r\n `;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n And this is what your posting history looks like.\r\n

    \r\n `;\r\n }\r\n }\r\n\r\n userDataBreakdown.innerHTML = userDataBreakdownHTML;\r\n\r\n if (userData.format === \"mastodon\") {\r\n loadEmbedScript(instanceURL);\r\n }\r\n\r\n // chartOptions.options.legend = {\r\n // display: false\r\n // };\r\n\r\n const data = {\r\n labels: posts.map((post) =>\r\n moment(post.published || post.createdAt || post.created)\r\n ),\r\n datasets: [\r\n {\r\n label: \"Your posts in time\",\r\n data: posts.map((post, index) => {\r\n return {\r\n x: moment(post.published || post.createdAt || post.created),\r\n // y: (new Date(post.published || post.createdAt)).getHour() + 1,\r\n y: new Date(\r\n post.published || post.createdAt || post.created\r\n ).getHours(),\r\n };\r\n }),\r\n backgroundColor: [\"#ff6384\"],\r\n },\r\n ],\r\n };\r\n\r\n new Chart(chartElement, {\r\n type: \"scatter\",\r\n data: data,\r\n options: {\r\n scales: {\r\n x: {\r\n type: \"time\",\r\n position: \"bottom\",\r\n ticks: {\r\n beginAtZero: false,\r\n stepSize: 10,\r\n },\r\n },\r\n y: {\r\n ticks: {\r\n beginAtZero: false,\r\n display: false,\r\n },\r\n scaleLabel: {\r\n display: false,\r\n // labelString: chartEl.dataset.axisLabelData\r\n // labelString: chartEl.dataset.sourceId ? window.ftfDataviz[parseInt( chartEl.dataset.sourceId )].axis_label_title : ''\r\n // labelString: 'Day of the month'\r\n },\r\n minorTickInterval: null,\r\n },\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n // label: (ctx) => ctx.label\r\n label: (ctx) => {\r\n // console.log(ctx);\r\n // console.log(posts[ctx.dataIndex].object.content);\r\n return ctx.label;\r\n },\r\n },\r\n },\r\n },\r\n },\r\n });\r\n } else {\r\n loadingAnimation.classList.add(\"d-none\");\r\n loadingText.classList.add(\"d-none\");\r\n fileInput.disabled = false;\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default handleUpload;\r\n"],"names":["sortArrayOfObjects","getDomain","loadEmbedScript","Cookie","cookieManager","fileInput","document","getElementById","introElement","loadingAnimation","loadingText","resultsElement","userInfo","userAvatar","userDescription","userDataBreakdown","chartElement","handleUpload","addEventListener","async","ev","classList","remove","disabled","formData","FormData","set","files","response","await","fetch","method","body","json","data","add","userData","let","userDescriptionHTML","userDataBreakdownHTML","posts","actor","name","preferredUsername","summary","replaceAll","attachment","map","value","replace","join","innerHTML","avatar_url","avatar","firstPost","postCount","outbox","orderedItems","milestones","length","maxRoot","Math","ceil","pow","i","post","url","id","isBoost","object","milestone","label","toLocaleString","push","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","err","console","log","protocol","hostname","labels","createdAt","created","datasets","index","x","y","getHours","backgroundColor","Chart","type","scales","position","ticks","beginAtZero","stepSize","display","scaleLabel","minorTickInterval","plugins","tooltip","callbacks","ctx"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"handleUpload.min.js","sources":["modules/handleUpload.js"],"sourcesContent":["import sortArrayOfObjects from \"/js/modules/sortArrayOfObjects.min.js\";\r\nimport getDomain from \"/js/modules/getDomain.min.js\";\r\nimport loadEmbedScript from \"/js/modules/loadEmbedScript.min.js\";\r\nimport Cookie from \"/js/cookies/main.min.js\";\r\n\r\nconst cookieManager = new Cookie();\r\nconst fileInput = document.getElementById(\"file-input\");\r\nconst introElement = document.getElementById(\"intro\");\r\nconst loadingAnimation = document.getElementById(\"loading-animation\");\r\nconst loadingText = document.getElementById(\"loading-text\");\r\nconst resultsElement = document.getElementById(\"results\");\r\nconst userInfo = document.getElementById(\"user-info\");\r\nconst userAvatar = document.getElementById(\"user-avatar\");\r\nconst userDescription = document.getElementById(\"user-description\");\r\nconst userDataBreakdown = document.getElementById(\"user-data-breakdown\");\r\nconst chartElement = document.getElementById(\"chart\");\r\n\r\nconst handleUpload = () => {\r\n if (fileInput) {\r\n fileInput.addEventListener(\"change\", async (ev) => {\r\n loadingAnimation.classList.remove(\"d-none\");\r\n loadingText.classList.remove(\"d-none\");\r\n fileInput.disabled = true;\r\n const formData = new FormData();\r\n formData.set(\"archive\", fileInput.files[0]);\r\n\r\n const resp = await fetch(\"/extract-data\", {\r\n method: \"POST\",\r\n body: formData,\r\n });\r\n\r\n const response = await resp.json();\r\n\r\n if (response && response.data) {\r\n introElement.classList.add(\"d-none\");\r\n resultsElement.classList.remove(\"d-none\");\r\n const userData = response.data;\r\n\r\n // let userDomain = getDomain(userData.actor.id);\r\n let userDescriptionHTML = \"\";\r\n let userDataBreakdownHTML = \"\";\r\n\r\n if (userData.actor) {\r\n userDescriptionHTML += `\r\n

    \r\n ${\r\n userData.actor.name || userData.actor.preferredUsername\r\n }\r\n

    \r\n ${userData.actor.summary.replaceAll('class=\"invisible\"', \"\")}\r\n `;\r\n\r\n if (userData.actor.attachment) {\r\n userDescriptionHTML += `\r\n
      \r\n ${userData.actor.attachment\r\n .map(\r\n (attachment) => `\r\n
    • ${\r\n attachment.name\r\n }: ${attachment.value.replace('class=\"invisible\"', \"\")}
    • \r\n `\r\n )\r\n .join(\"\")}\r\n
    \r\n `;\r\n }\r\n\r\n userDescription.innerHTML = `
    ${userDescriptionHTML}
    `;\r\n\r\n if (userData.avatar_url) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n } else if (userData.avatar) {\r\n userAvatar.innerHTML = `\r\n \r\n `;\r\n }\r\n } else {\r\n userInfo.remove();\r\n userDescription.remove();\r\n }\r\n\r\n let posts = [];\r\n let firstPost;\r\n let postCount = 0;\r\n\r\n if (userData?.outbox?.orderedItems) {\r\n posts = userData.outbox.orderedItems;\r\n } else if (userData?.outbox) {\r\n posts = userData.outbox;\r\n }\r\n\r\n postCount = posts.length;\r\n let milestones = [];\r\n\r\n let counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\r\n total: 0,\r\n };\r\n\r\n if (postCount) {\r\n // posts = sortArrayOfObjects(posts, key, desc)\r\n const maxRoot = Math.ceil(Math.pow(posts.length, 1 / 10));\r\n let index = 0;\r\n firstPost = posts[0];\r\n\r\n posts.forEach((post) => {\r\n let isSemiPublic = false;\r\n const recipients = [...post.to, ...post.cc];\r\n\r\n recipients.forEach(recipient => {\r\n if (recipient.endsWith(\"/followers\")){\r\n isSemiPublic = true;\r\n }\r\n });\r\n \r\n if (isSemiPublic) {\r\n index++;\r\n if (posts.length >= 10 && index <= maxRoot) {\r\n const post = posts[Math.pow(10, index)];\r\n const url = post.id.replace(\"/activity\", \"\");\r\n \r\n let milestone = {};\r\n let isBoost = false;\r\n \r\n if (!post.object.id) {\r\n isBoost = true;\r\n }\r\n \r\n milestone = {\r\n label: [`${Math.pow(10, index).toLocaleString()}th post`],\r\n url,\r\n isBoost,\r\n };\r\n \r\n milestones.push(milestone);\r\n }\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n counter.total++;\r\n if (post.type === \"Create\") {\r\n if (post.object.inReplyTo) {\r\n counter.replies++;\r\n } else {\r\n counter.posts++;\r\n }\r\n } else {\r\n counter.reblogs++;\r\n }\r\n } else {\r\n // console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"), recipients);\r\n // console.log(recipients);\r\n // if (recipients.length === 0){\r\n // console.log(post.id.replace(\"users/\", \"@\").replace(\"statuses/\", \"\").replace(\"/activity\", \"\"));\r\n // }\r\n }\r\n });\r\n // console.log({ counter });\r\n }\r\n\r\n const options = {\r\n weekday: \"long\",\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n };\r\n\r\n if (userData.actor) {\r\n const accountCreationDate = moment(userData.actor.published);\r\n const today = moment();\r\n const timeAgo = today.diff(accountCreationDate, \"days\");\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n You created your account on ${new Date(\r\n userData.actor.published\r\n ).toLocaleDateString(\r\n undefined,\r\n options\r\n )}, which is ${timeAgo.toLocaleString()} day(s) ago. Since then, you posted ${counter.total.toLocaleString()} times, or about ${Math.round(\r\n counter.total / timeAgo\r\n ).toLocaleString()} time(s) a day on average.\r\n

    \r\n `;\r\n }\r\n\r\n /*\r\n counter = {\r\n posts: 0,\r\n replies: 0,\r\n reblogs: 0,\r\n*/\r\n\r\n if (counter.reblogs > 0 || counter.replies > 0) {\r\n userDataBreakdownHTML += `\r\n

    \r\n You have reblogged ${counter.reblogs.toLocaleString()} post(s), replied ${counter.replies.toLocaleString()} time(s), and posted ${counter.posts.toLocaleString()} new post(s).\r\n

    \r\n `;\r\n }\r\n\r\n let instanceURL;\r\n\r\n if (firstPost) {\r\n let postURL;\r\n let url;\r\n\r\n if ([\"firefish\", \"calckey\", \"misskey\"].includes(userData.format)) {\r\n // Export file doesn't contain server name.\r\n } else {\r\n postURL = firstPost?.uri || firstPost?.object?.id || firstPost?.id;\r\n\r\n try {\r\n url = new URL(postURL);\r\n } catch (err) {\r\n console.log(\"error parsing data file\", err);\r\n }\r\n\r\n if (url && url.protocol && url.hostname) {\r\n instanceURL = `${url.protocol}//${url.hostname}`;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n Here's your first post!\r\n

    \r\n `;\r\n\r\n if (userData.format === \"mastodon\") {\r\n userDataBreakdownHTML += `\r\n \r\n `;\r\n }\r\n\r\n if (milestones && milestones.length) {\r\n userDataBreakdownHTML += `\r\n

    \r\n Here are more of your milestones:\r\n

    \r\n
      \r\n ${milestones\r\n .map(\r\n (milestone) => `\r\n
    • \r\n ${\r\n milestone.label\r\n }${milestone.isBoost ? ` (boost)` : \"\"}\r\n
    • \r\n `\r\n )\r\n .join(\"\")}\r\n
    \r\n `;\r\n }\r\n\r\n userDataBreakdownHTML += `\r\n

    \r\n And this is what your posting history looks like.\r\n

    \r\n `;\r\n }\r\n }\r\n\r\n userDataBreakdown.innerHTML = userDataBreakdownHTML;\r\n\r\n if (userData.format === \"mastodon\") {\r\n loadEmbedScript(instanceURL);\r\n }\r\n\r\n // chartOptions.options.legend = {\r\n // display: false\r\n // };\r\n\r\n const data = {\r\n labels: posts.map((post) =>\r\n moment(post.published || post.createdAt || post.created)\r\n ),\r\n datasets: [\r\n {\r\n label: \"Your posts in time\",\r\n data: posts.map((post, index) => {\r\n return {\r\n x: moment(post.published || post.createdAt || post.created),\r\n // y: (new Date(post.published || post.createdAt)).getHour() + 1,\r\n y: new Date(\r\n post.published || post.createdAt || post.created\r\n ).getHours(),\r\n };\r\n }),\r\n backgroundColor: [\"#ff6384\"],\r\n },\r\n ],\r\n };\r\n\r\n new Chart(chartElement, {\r\n type: \"scatter\",\r\n data: data,\r\n options: {\r\n scales: {\r\n x: {\r\n type: \"time\",\r\n position: \"bottom\",\r\n ticks: {\r\n beginAtZero: false,\r\n stepSize: 10,\r\n },\r\n },\r\n y: {\r\n ticks: {\r\n beginAtZero: false,\r\n display: false,\r\n },\r\n scaleLabel: {\r\n display: false,\r\n // labelString: chartEl.dataset.axisLabelData\r\n // labelString: chartEl.dataset.sourceId ? window.ftfDataviz[parseInt( chartEl.dataset.sourceId )].axis_label_title : ''\r\n // labelString: 'Day of the month'\r\n },\r\n minorTickInterval: null,\r\n },\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n // label: (ctx) => ctx.label\r\n label: (ctx) => {\r\n // console.log(ctx);\r\n // console.log(posts[ctx.dataIndex].object.content);\r\n return ctx.label;\r\n },\r\n },\r\n },\r\n },\r\n },\r\n });\r\n } else {\r\n loadingAnimation.classList.add(\"d-none\");\r\n loadingText.classList.add(\"d-none\");\r\n fileInput.disabled = false;\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default handleUpload;\r\n"],"names":["sortArrayOfObjects","getDomain","loadEmbedScript","Cookie","cookieManager","fileInput","document","getElementById","introElement","loadingAnimation","loadingText","resultsElement","userInfo","userAvatar","userDescription","userDataBreakdown","chartElement","handleUpload","addEventListener","async","ev","classList","remove","disabled","formData","FormData","set","files","response","await","fetch","method","body","json","data","add","userData","let","userDescriptionHTML","userDataBreakdownHTML","posts","actor","name","preferredUsername","summary","replaceAll","attachment","map","value","replace","join","innerHTML","avatar_url","avatar","firstPost","outbox","orderedItems","postCount","length","milestones","counter","replies","reblogs","total","maxRoot","Math","ceil","pow","index","forEach","isSemiPublic","post","to","cc","recipient","endsWith","url","id","isBoost","object","milestone","label","toLocaleString","push","type","inReplyTo","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","err","console","log","protocol","hostname","labels","createdAt","created","datasets","x","y","getHours","backgroundColor","Chart","scales","position","ticks","beginAtZero","stepSize","display","scaleLabel","minorTickInterval","plugins","tooltip","callbacks","ctx"],"mappings":"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"} \ No newline at end of file diff --git a/public/js/modules/isBoost.min.js b/public/js/modules/isBoost.min.js new file mode 100644 index 0000000..8106b53 --- /dev/null +++ b/public/js/modules/isBoost.min.js @@ -0,0 +1,2 @@ +const isBoost=o=>{return o.object&&o.object.id,isBoost};export default isBoost; +//# sourceMappingURL=isBoost.min.js.map diff --git a/public/js/modules/isBoost.min.js.map b/public/js/modules/isBoost.min.js.map new file mode 100644 index 0000000..2d4fc17 --- /dev/null +++ b/public/js/modules/isBoost.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"isBoost.min.js","sources":["modules/isBoost.js"],"sourcesContent":["const isBoost = (post) => {\r\n let isPostBoost = false;\r\n\r\n if (post.object && !post.object.id) {\r\n isPostBoost = true;\r\n }\r\n\r\n return isBoost;\r\n};\r\n\r\nexport default isBoost;\r\n"],"names":["isBoost","post","object","id"],"mappings":"AAAA,MAAMA,QAAU,IAOd,OAJIC,EAAKC,QAAWD,EAAKC,OAAOC,GAIzBH,OACT,iBAEeA"} \ No newline at end of file diff --git a/src/scripts/modules/handleUpload.js b/src/scripts/modules/handleUpload.js index e5dd97b..e5c6d89 100644 --- a/src/scripts/modules/handleUpload.js +++ b/src/scripts/modules/handleUpload.js @@ -82,9 +82,9 @@ const handleUpload = () => { userDescription.remove(); } - let posts = [], - firstPost, - postCount = 0; + let posts = []; + let firstPost; + let postCount = 0; if (userData?.outbox?.orderedItems) { posts = userData.outbox.orderedItems; @@ -95,32 +95,76 @@ const handleUpload = () => { postCount = posts.length; let milestones = []; + let counter = { + posts: 0, + replies: 0, + reblogs: 0, + total: 0, + }; + if (postCount) { // posts = sortArrayOfObjects(posts, key, desc) const maxRoot = Math.ceil(Math.pow(posts.length, 1 / 10)); + let index = 0; firstPost = posts[0]; - if (posts.length >= 10) { - for (let i = 1; i <= maxRoot; i++) { - const post = posts[Math.pow(10, i)]; - const url = post.id.replace("/activity", ""); + posts.forEach((post) => { + let isSemiPublic = false; + const recipients = [...post.to, ...post.cc]; - let milestone = {}; - let isBoost = false; - - if (!post.object.id) { - isBoost = true; + recipients.forEach(recipient => { + if (recipient.endsWith("/followers")){ + isSemiPublic = true; } + }); + + if (isSemiPublic) { + index++; + if (posts.length >= 10 && index <= maxRoot) { + const post = posts[Math.pow(10, index)]; + const url = post.id.replace("/activity", ""); + + let milestone = {}; + let isBoost = false; + + if (!post.object.id) { + isBoost = true; + } + + milestone = { + label: [`${Math.pow(10, index).toLocaleString()}th post`], + url, + isBoost, + }; + + milestones.push(milestone); + } + + - milestone = { - label: [`${Math.pow(10, i).toLocaleString()}th post`], - url, - isBoost, - }; - milestones.push(milestone); + + + + counter.total++; + if (post.type === "Create") { + if (post.object.inReplyTo) { + counter.replies++; + } else { + counter.posts++; + } + } else { + counter.reblogs++; + } + } else { + // console.log(post.id.replace("users/", "@").replace("statuses/", "").replace("/activity", ""), recipients); + // console.log(recipients); + // if (recipients.length === 0){ + // console.log(post.id.replace("users/", "@").replace("statuses/", "").replace("/activity", "")); + // } } - } + }); + // console.log({ counter }); } const options = { @@ -142,13 +186,28 @@ const handleUpload = () => { ).toLocaleDateString( undefined, options - )}, which is ${timeAgo.toLocaleString()} day(s) ago. Since then, you posted ${postCount.toLocaleString()} times, or about ${Math.round( - postCount / timeAgo + )}, which is ${timeAgo.toLocaleString()} day(s) ago. Since then, you posted ${counter.total.toLocaleString()} times, or about ${Math.round( + counter.total / timeAgo ).toLocaleString()} time(s) a day on average.

    `; } + /* + counter = { + posts: 0, + replies: 0, + reblogs: 0, +*/ + + if (counter.reblogs > 0 || counter.replies > 0) { + userDataBreakdownHTML += ` +

    + You have reblogged ${counter.reblogs.toLocaleString()} post(s), replied ${counter.replies.toLocaleString()} time(s), and posted ${counter.posts.toLocaleString()} new post(s). +

    + `; + } + let instanceURL; if (firstPost) { diff --git a/src/scripts/modules/isBoost.js b/src/scripts/modules/isBoost.js new file mode 100644 index 0000000..9fb19ea --- /dev/null +++ b/src/scripts/modules/isBoost.js @@ -0,0 +1,11 @@ +const isBoost = (post) => { + let isPostBoost = false; + + if (post.object && !post.object.id) { + isPostBoost = true; + } + + return isBoost; +}; + +export default isBoost;