Inital commit
This commit is contained in:
commit
dfa58e883b
1 changed files with 158 additions and 0 deletions
158
src/main.js
Normal file
158
src/main.js
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
// User Config starts here
|
||||||
|
const username = 'Leon'; // Leave string empty to disable filter.
|
||||||
|
const mediaAttributes = 'loop autoplay controls';
|
||||||
|
const locale = 'de-DE';
|
||||||
|
// User Config ends here
|
||||||
|
|
||||||
|
const fs = require('node:fs/promises');
|
||||||
|
const path = require('node:path');
|
||||||
|
const http = require('node:http');
|
||||||
|
const url = require('node:url');
|
||||||
|
const chatData = require(path.join(process.cwd(), 'result.json'));
|
||||||
|
|
||||||
|
console.log('Starting data generation...');
|
||||||
|
|
||||||
|
const stickerScores = chatData.messages
|
||||||
|
.filter(message => message.media_type === 'sticker' && message.from.includes(username))
|
||||||
|
.reduce((scores, message) => {
|
||||||
|
if (!scores.hasOwnProperty(message.file)) {
|
||||||
|
scores[message.file] = {score: 1, lastUsed: message.date_unixtime};
|
||||||
|
return scores;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scores[message.file].lastUsed < message.date_unixtime) {
|
||||||
|
scores[message.file].lastUsed = message.date_unixtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
scores[message.file].score++;
|
||||||
|
return scores;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
let file = await fs.open('./index.html', 'w');
|
||||||
|
file.write(`
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<title>Sticker Summarry</title>
|
||||||
|
<style>
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
|
||||||
|
h1 {text-align: center;}
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 100vw;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 1024px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container,
|
||||||
|
.sticker {
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sticker {
|
||||||
|
flex: 0 0 25%;
|
||||||
|
align-items: flex-end;
|
||||||
|
padding: 1rem;
|
||||||
|
border: 1px solid #00000055;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sticker p {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
img, video, tgs-player {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 0 auto;
|
||||||
|
aspect-ratio: 1 / 1;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="https://unpkg.com/@lottiefiles/lottie-player@0.4.0/dist/tgs-player.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Sticker Gallery</h1>
|
||||||
|
<div class="container">
|
||||||
|
`);
|
||||||
|
let stickerScoreEntries = Object.entries(stickerScores);
|
||||||
|
stickerScoreEntries
|
||||||
|
.sort((a, b) => b[1].score - a[1].score);
|
||||||
|
|
||||||
|
stickerScoreEntries
|
||||||
|
.forEach(entry => {
|
||||||
|
const formattedDate = new Date(entry[1].lastUsed * 1000).toLocaleString(locale);
|
||||||
|
if (entry[0].endsWith('tgs')) {
|
||||||
|
file.write(`<div class="sticker animated">
|
||||||
|
<tgs-player loading="lazy" ${mediaAttributes} src="${entry[0]}"></tgs-player>
|
||||||
|
<p>${entry[1].score} (Lottie)<br />
|
||||||
|
${formattedDate}
|
||||||
|
</p>
|
||||||
|
</div>`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry[0].endsWith('webm')) {
|
||||||
|
file.write(`<div class="sticker video">
|
||||||
|
<video loading="lazy" ${mediaAttributes} src="${entry[0]}"></video>
|
||||||
|
<p>${entry[1].score} (Video)<br />
|
||||||
|
${formattedDate}
|
||||||
|
</p>
|
||||||
|
</div>`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.write(`<div class="sticker">
|
||||||
|
<img loading="lazy" src="${entry[0]}"/>
|
||||||
|
<p>${entry[1].score} (Image)<br />
|
||||||
|
${formattedDate}
|
||||||
|
</p>
|
||||||
|
</div>`);
|
||||||
|
});
|
||||||
|
file.write('</div></body>');
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
|
||||||
|
console.log('Starting webserver!');
|
||||||
|
let server = http.createServer({}, async (req, res) => {
|
||||||
|
let uri = url.parse(req.url);
|
||||||
|
|
||||||
|
try {
|
||||||
|
let data;
|
||||||
|
if (req.url === '/') {
|
||||||
|
data = await fs.readFile(path.join(process.cwd(), './index.html'));
|
||||||
|
res.writeHead(200);
|
||||||
|
res.write(data);
|
||||||
|
} else {
|
||||||
|
data = await fs.readFile(path.join(process.cwd(), decodeURI(uri.path)));
|
||||||
|
res.writeHead(200);
|
||||||
|
res.write(data);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
|
||||||
|
if (e.code === 'ENOENT') {
|
||||||
|
console.warn('404: ' + uri.path);
|
||||||
|
res.writeHead(404);
|
||||||
|
} else {
|
||||||
|
console.error(e);
|
||||||
|
res.writeHead(500);
|
||||||
|
}
|
||||||
|
res.write(e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
res.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(3000, 'localhost');
|
||||||
|
console.log('Done...');
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue