Initial commit

This commit is contained in:
2026-01-01 00:15:52 -05:00
commit d4a5c1d480
5 changed files with 388 additions and 0 deletions

9
deno.json Normal file
View File

@@ -0,0 +1,9 @@
{
"tasks": {
"dev": "deno run -A main.ts"
},
"imports": {
"@std/assert": "jsr:@std/assert@1",
"@std/media-types": "jsr:@std/media-types@^1.1.0"
}
}

28
deno.lock generated Normal file
View File

@@ -0,0 +1,28 @@
{
"version": "5",
"specifiers": {
"jsr:@std/assert@1": "1.0.16",
"jsr:@std/internal@^1.0.12": "1.0.12",
"jsr:@std/media-types@^1.1.0": "1.1.0"
},
"jsr": {
"@std/assert@1.0.16": {
"integrity": "6a7272ed1eaa77defe76e5ff63ca705d9c495077e2d5fd0126d2b53fc5bd6532",
"dependencies": [
"jsr:@std/internal"
]
},
"@std/internal@1.0.12": {
"integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027"
},
"@std/media-types@1.1.0": {
"integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4"
}
},
"workspace": {
"dependencies": [
"jsr:@std/assert@1",
"jsr:@std/media-types@^1.1.0"
]
}
}

42
main.ts Normal file
View File

@@ -0,0 +1,42 @@
import { contentType } from "@std/media-types";
import path from "node:path";
const NET_PORT = 4536;
const NET_HOST = '10.0.1.39';
const WEB_ROOT = './res/';
Deno.serve({
hostname: NET_HOST,
port: NET_PORT,
onListen: addr => console.log(`Listening on http://${addr.hostname}:${addr.port}`)
}, req => {
const url = new URL(req.url);
if (url.pathname == '/') url.pathname = '/index.html';
return new Promise<Response>(resolve => {
Deno.readFile(path.join(WEB_ROOT, url.pathname)).then(data => {
const pathParts = url.pathname.split('/');
const lastPart = pathParts[pathParts.length - 1];
const extensionParts = lastPart.split('.');
const extension = extensionParts[extensionParts.length - 1];
const mime = contentType(extension);
if (!mime) throw new Error("No mime-type found");
console.log(`${req.method} ${url}`);
resolve(new Response(data, { headers: { "Content-Type": mime }}))
}).catch(() => {
console.log(`404 ${req.method} ${url}`);
resolve(new Response("Not Found. Did you try thinking Miku?", {
status: 404,
statusText: "Not Found (oo-ee-oo)",
headers: { "Content-Type": "text/plain" }
}));
});
})
});

267
res/index.html Normal file
View File

@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html>
<head>
<title>webpage</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&icon_names=arrow_downward" />
</head>
<body>
<!-- eye-catcher -->
<header class="column-display" style="min-height: 100svh;">
<div style="flex: 0.2;"></div>
<h1 style="text-align: left; font-size: 1.5vw; font-style: italic;">From The Hatsune Discord staff team</h1>
<h1 style="font-size: 6vw;" class="attention">LOTS HAPPENED IN 2025.</h1>
<h1 style="text-align: right; font-size: 2vw;">We would like to present the highlights.</h1>
<div style="flex: 1;"></div>
<h1 style="font-size: 2vw;">See Below</h1>
<span class="material-symbols-outlined" style="text-align: center; user-select: none; font-size: 2vw;">arrow_downward</span>
<div style="flex: 0.2;"></div>
</header>
<hr class="break"></hr>
<!-- top reactions -->
<div style="padding: 0 5vw 0 5vw">
<h2 style="font-size: 4vw; margin-bottom: 0;"><span style="font-weight: 300;">Is it just me,</span> or is it comfy in here?</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are the top 10 most used reactions:</h2>
<ul>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1136028749557678103.webp?size=128&animated=true" title=":squishycomfy:">
<span style="padding-left: 10px;">x13,594</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1152034831392317483.webp?size=128" title=":comfypog:">
<span style="padding-left: 10px;">x9,723</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/960550152689582171.webp?size=128" title=":mikukek:">
<span style="padding-left: 10px;">x6,471</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1173629360276787222.webp?size=128" title=":39:">
<span style="padding-left: 10px;">x5,275</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1336108168564052008.webp?size=128" title=":MikuTrue:">
<span style="padding-left: 10px;">x3,885</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/961556069623148614.webp?size=128" title=":MikuLogo:">
<span style="padding-left: 10px;">x3,704</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1224530638095519804.webp?size=128" title=":comfypat:">
<span style="padding-left: 10px;">x2,809</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1049144884004659291.webp?size=128" title=":mikuwave:">
<span style="padding-left: 10px;">x2,742</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1173317846676275230.webp?size=128" title=":Miku39Sekai:">
<span style="padding-left: 10px;">x2,610</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1175603450852147262.webp?size=128" title=":40Sekai:">
<span style="padding-left: 10px;">x2,460</span>
</li>
</ul>
</div>
<hr class="break"></hr>
<!-- top emotes -->
<div style="padding: 0 5vw 0 5vw">
<h2 style="font-size: 4vw; margin-bottom: 0;">Add some spice to your message.</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are the top 10 most used emojis:</h2>
<ul>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/960550152689582171.webp?size=128" title=":mikukek:">
<span style="padding-left: 10px;">x10,285</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1158974570699685988.webp?size=128" title=":mikulaugh:">
<span style="padding-left: 10px;">x9,442</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1184633291970711552.webp?size=128" title=":Comfymiku:">
<span style="padding-left: 10px;">x7,687</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1152034831392317483.webp?size=128" title=":comfypog:">
<span style="padding-left: 10px;">x5,466</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1173629360276787222.webp?size=128" title=":39:">
<span style="padding-left: 10px;">x5,151</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/959890966318305311.webp?size=128" title=":mikucrying:">
<span style="padding-left: 10px;">x3,686</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1172969588527476896.webp?size=128" title=":MikuPeek:">
<span style="padding-left: 10px;">x3,179</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/973881754718973982.webp?size=44" title=":mikuthink:">
<span style="padding-left: 10px;">x2,664</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1017123249802444911.webp?size=44&animated=true" title=":Mikulaugh:">
<span style="padding-left: 10px;">x2,626</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://cdn.discordapp.com/emojis/1173317846676275230.webp?size=44" title=":Miku39Sekai:">
<span style="padding-left: 10px;">x2,394</span>
</li>
</ul>
</div>
<hr class="break"></hr>
<!-- top stickers -->
<div style="padding: 0 5vw 0 5vw">
<h2 style="font-size: 4vw; margin-bottom: 0;">Stickerbomb!</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are the top 10 most used stickers:</h2>
<ul>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1421313906953158848.png?size=128&quality=lossless" title="Best Friend 39">
<span style="padding-left: 10px;">x624</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1143787295758106734.png?size=128&quality=lossless" title="MikuHiiiiiiiiii">
<span style="padding-left: 10px;">x311</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1014423095135698994.png?size=128&quality=lossless" title="mikumouth">
<span style="padding-left: 10px;">x250</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1338655635532939368.png?size=128&quality=lossless" title="MikuPleading">
<span style="padding-left: 10px;">x216</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/961195007291842620.png?size=128&quality=lossless" title="Miku gun">
<span style="padding-left: 10px;">x194</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1364439643734671461.png?size=128&quality=lossless" title="VampireMiku39">
<span style="padding-left: 10px;">x168</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1104841444092559502.png?size=128&quality=lossless" title="MikuDepressed">
<span style="padding-left: 10px;">x148</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1151384489260499004.png?size=128" title="Comfy Sleep">
<span style="padding-left: 10px;">x111</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1106428089866649650.png?size=128&quality=lossless" title="MikuWithAGunWithoutAGun">
<span style="padding-left: 10px;">x110</span>
</li>
<li class="emoji-line-center">
<img class="emoji" src="https://media.discordapp.net/stickers/1152286791706083389.png?size=128&quality=lossless" title="Show">
<span style="padding-left: 10px;">x110</span>
</li>
</ul>
</div>
<hr class="break"></hr>
<!-- # of messages -->
<div class="column-display" style="min-height: 75svh;">
<div style="flex: 0.2;"></div>
<h1 style="font-size: 5vw; text-align: center; margin-bottom: 0;">Let's talk messages.</h1>
<h1 style="font-size: 6vw; text-align: center; font-weight: 300; margin-top: 0;">We sent <span style="font-weight: 900;">1,091,742 of them.</span></h1>
<h1 style="font-size: 2vw; text-align: center;">Jeez.</h1>
<div style="flex: 0.2;"></div>
</div>
<hr class="break"></hr>
<!-- top message reactions -->
<div style="padding: 0 5vw 0 5vw; font-size: 1.5vw;">
<h2 style="font-size: 3.2vw; margin-bottom: 0;">Some of those messages were pretty popular.</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are each month's most reacted messages:</h2>
<ul>
<li>January: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1327391825639506022" style="color: white;">#general-01 by powerblade3</a> - 220</li>
<li>February: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1336869960051462214" style="color: white;">#general-01 by mikuoctoling39</a> - 119</li>
<li>March: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1349444678029938739" style="color: white;">#general-01 by miku.hatsune</a> - 99</li>
<li>April: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1356428710395383900" style="color: white;">#general-01 by bready_todie</a> - 93</li>
<li>May: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1370759579377467523" style="color: white;">#general-01 by powerblade3</a> - 95</li>
<li>June: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1384016890619498539" style="color: white;">#general-01 by .metalgoosesolid</a> - 60</li>
<li>July: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1394904034338672742" style="color: white;">#general-01 by kelcody</a> - 132</li>
<li>August: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1410694444570644590" style="color: white;">#general-01 by miku.hatsune</a> - 111</li>
<li>September: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1413968705410564146" style="color: white;">#general-01 by miku.hatsune</a> - 95</li>
<li>October: <a href="https://discord.com/channels/959218185356328960/960713007955079218/1424936706376863764" style="color: white;">#randomness-and-memes by yokoo99</a> - 95</li>
<li>November: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1440808203137847446" style="color: white;">#general-01 by iam_stove</a> - 52</li>
<li>December: <a href="https://discord.com/channels/959218185356328960/960712970831278180/1453468290897809510" style="color: white;">#general-01 by zunda_nectar</a> - 66</li>
</ul>
</div>
<hr class="break"></hr>
<!-- top message counts -->
<div style="padding: 0 5vw 0 5vw; font-size: 1.5vw;">
<h2 style="font-size: 3.2vw; margin-bottom: 0;">We had several keyboard warriors.</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are the top 10 users with the most messages:</h2>
<ul>
<li>@miraigummies - 52746</li>
<li>@koolaidkan - 42391</li>
<li>@iam_stove - 35365</li>
<li>@39.mik - 31435</li>
<li>@ballisticchillz - 30283</li>
<li>@powerblade3 - 29304</li>
<li>@miku.hatsune - 28421</li>
<li>@zunda_nectar - 28119</li>
<li>@simplename21 - 23234</li>
<li>@kelcody - 22782</li>
</ul>
</div>
<hr class="break"></hr>
<!-- top 39 interactions -->
<div style="padding: 0 5vw 0 5vw; font-size: 1.5vw;">
<h2 style="font-size: 3.2vw; margin-bottom: 0;">You were always here with us.</h2>
<h2 style="font-size: 2vw; margin-top: 0;">Here are the top 10 users with the most '39' messages:</h2>
<ul>
<li>@iam_stove - 3790</li>
<li>@aozora39 - 3445</li>
<li>@cfm_megurine_luka - 3325</li>
<li>@starlitsleep - 2707</li>
<li>@miku.hatsune - 2371</li>
<li>@powerblade3 - 1883</li>
<li>@the_apricity_effect - 1706</li>
<li>@yokoo99 - 1354</li>
<li>@_1v40_ - 1294</li>
<li>@iam_stove - 1262</li>
</ul>
</div>
<hr class="break"></hr>
<h2 style="font-size: 2.6vw; text-align: center;">Thank you all for a great year! We're here to share the next with you.</h2>
<footer style="padding: 3vh 0 3vh;">
<div style="text-align: center;">
<a href="https://gitea.proxnet.dev/zombieb/hatsune-2025-stats" style="color: white;">Open-source.</a>
100% human-generated. Page design by (@zombieb). Data by (@poco0317).
</div>
</footer>
<link rel="stylesheet" href="./style.css">
</body>
</html>

42
res/style.css Normal file
View File

@@ -0,0 +1,42 @@
.attention {
font-optical-sizing: auto;
font-weight: 800;
font-style: normal;
}
body {
margin: 0;
padding: 0 5vw 0 5vw;
font-family: "DM Sans", sans-serif;
-webkit-font-smoothing: antialiased;
background: #12db9f;
background: linear-gradient(180deg,rgba(18, 219, 159, 1) 0%, rgba(87, 184, 199, 1) 79%);
color: white;
}
.column-display {
display: flex;
flex-direction: column;
text-align: center;
}
.break {
color: white;
opacity: 50%;
width: 75vw;
}
.emoji-line-center {
padding: 15px;
display: flex;
align-items: center;
font-size: 3vw;
}
.emoji {
width: 128px;
}