diff --git a/public/js/modules/handleUpload.min.js b/public/js/modules/handleUpload.min.js index d6e5182..5af3892 100644 --- a/public/js/modules/handleUpload.min.js +++ b/public/js/modules/handleUpload.min.js @@ -13,7 +13,7 @@ import sortArrayOfObjects from"/js/modules/sortArrayOfObjects.min.js";import get `:s.avatar&&(userAvatar.innerHTML=` - `)):(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+=` + `)):(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 c=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<=c){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)}if(l.total++,"Create"===t.type)t.object.inReplyTo?l.replies++:l.posts++;else try{t.id&&t.object&&t.id.split("/users/")[0]===t.object.split("/users/")[0]?(console.log(t),l.posts++,l.total++):l.reblogs++}catch(e){}}})}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,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.

diff --git a/public/js/modules/handleUpload.min.js.map b/public/js/modules/handleUpload.min.js.map index f05bb90..1f5657f 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 `;\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 `;\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 +{"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 `;\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 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 try {\r\n if (\r\n post.id &&\r\n post.object &&\r\n post.id.split(\"/users/\")[0] ===\r\n post.object.split(\"/users/\")[0]\r\n ) {\r\n console.log(post);\r\n counter.posts++;\r\n counter.total++;\r\n } else {\r\n counter.reblogs++;\r\n }\r\n } catch (err) {\r\n /*noop*/\r\n }\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 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\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","split","console","log","err","options","weekday","year","month","day","accountCreationDate","moment","published","timeAgo","diff","Date","toLocaleDateString","undefined","round","instanceURL","includes","format","postURL","uri","URL","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/src/scripts/modules/handleUpload.js b/src/scripts/modules/handleUpload.js index e5c6d89..71d948f 100644 --- a/src/scripts/modules/handleUpload.js +++ b/src/scripts/modules/handleUpload.js @@ -112,40 +112,33 @@ const handleUpload = () => { let isSemiPublic = false; const recipients = [...post.to, ...post.cc]; - recipients.forEach(recipient => { - if (recipient.endsWith("/followers")){ + 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); } - - - - - - - counter.total++; if (post.type === "Create") { if (post.object.inReplyTo) { @@ -154,7 +147,22 @@ const handleUpload = () => { counter.posts++; } } else { - counter.reblogs++; + try { + if ( + post.id && + post.object && + post.id.split("/users/")[0] === + post.object.split("/users/")[0] + ) { + console.log(post); + counter.posts++; + counter.total++; + } else { + counter.reblogs++; + } + } catch (err) { + /*noop*/ + } } } else { // console.log(post.id.replace("users/", "@").replace("statuses/", "").replace("/activity", ""), recipients); @@ -193,13 +201,6 @@ const handleUpload = () => { `; } - /* - counter = { - posts: 0, - replies: 0, - reblogs: 0, -*/ - if (counter.reblogs > 0 || counter.replies > 0) { userDataBreakdownHTML += `