From e26d4147d4790b22a0af22e6ddfc20080363f5e9 Mon Sep 17 00:00:00 2001 From: Kenneth Date: Sat, 27 Jul 2024 12:56:22 +0100 Subject: [PATCH] feat: YWRkIGEgbGl0dGxlIGNoYXR0eSBhY2hpZXZlbWVudA== --- web/audio/achievement-unlocked.mp3 | Bin 0 -> 28800 bytes web/index.html | 7 ++++ web/script.js | 54 +++++++++++++++++++++++- web/style.css | 64 ++++++++++++++++++++++++----- 4 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 web/audio/achievement-unlocked.mp3 diff --git a/web/audio/achievement-unlocked.mp3 b/web/audio/achievement-unlocked.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..99403183dbd5c15ec68527e0e798ed764eb38fdd GIT binary patch literal 28800 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index 1ceb0e7..add0d6d 100644 --- a/web/index.html +++ b/web/index.html @@ -37,8 +37,14 @@ + + + @@ -54,6 +60,7 @@ + diff --git a/web/script.js b/web/script.js index f931f58..6e37fb1 100644 --- a/web/script.js +++ b/web/script.js @@ -8,10 +8,17 @@ const catImg = document.getElementById("cat"); const heartImg = document.getElementById("heart"); const volumeSlider = document.getElementById("volume-slider"); const currentVolumeLabel = document.getElementById("current-volume-label"); +const listenerCountLabel = document.getElementById("listener-count"); +const notificationContainer = document.getElementById("notification"); +const notificationTitle = document.getElementById("notification-title"); +const notificationBody = document.getElementById("notification-body"); + const clickAudio = document.getElementById("click-audio"); const clickReleaseAudio = document.getElementById("click-release-audio"); const meowAudio = document.getElementById("meow-audio"); -const listenerCountLabel = document.getElementById("listener-count"); +const achievementUnlockedAudio = document.getElementById( + "achievement-unlocked-audio", +); let isPlaying = false; let isFading = false; @@ -19,6 +26,7 @@ let currentAudio; let maxVolume = 100; let currentVolume = 0; let saveVolumeTimeout = null; +let meowCount = 0; let ws = connectToWebSocket(); function playAudio() { @@ -134,7 +142,9 @@ function enableSpaceBarControl() { } function connectToWebSocket() { - const ws = new WebSocket(`ws://${location.host}/ws`); + const ws = new WebSocket( + `${location.protocol === "https:" ? "wss:" : "ws:"}//${location.host}/ws`, + ); ws.onmessage = (event) => { console.log(event.data); @@ -189,6 +199,34 @@ function loadInitialVolume() { document.getElementById("volume-slider-container").style.display = "flex"; } +function loadMeowCount() { + const lastMeowCount = localStorage.getItem("meowCount"); + if (!lastMeowCount) { + meowCount = 0; + } else { + const n = Number.parseInt(lastMeowCount); + if (Number.isNaN(n)) { + meowCount = 0; + } else { + meowCount += n; + } + } +} + +function showNotification(title, content, duration) { + notificationTitle.innerText = title; + notificationBody.innerText = content; + notificationContainer.style.display = "block"; + notificationContainer.style.animation = "0.5s linear 0s notification-fade-in"; + setTimeout(() => { + notificationContainer.style.animation = + "0.5s linear 0s notification-fade-out"; + setTimeout(() => { + notificationContainer.style.display = "none"; + }, 450); + }, duration); +} + playBtn.onmousedown = () => { clickAudio.play(); document.addEventListener( @@ -231,8 +269,19 @@ meowAudio.onplay = () => { heartImg.style.display = "none"; heartImg.style.animation = ""; }, 900); + + meowCount += 1; + localStorage.setItem("meowCount", `${meowCount}`); + + if (meowCount === 100) { + showNotification("a little chatty", "make milo meow 100 times", 5000); + achievementUnlockedAudio.play(); + } }; +// don't wanna jumpscare ppl +achievementUnlockedAudio.volume = 0.05; + window.addEventListener("offline", () => { ws = null; }); @@ -241,6 +290,7 @@ window.addEventListener("online", () => { ws = connectToWebSocket(); }); +loadMeowCount(); loadInitialVolume(); animateCat(); enableSpaceBarControl(); diff --git a/web/style.css b/web/style.css index c9383c1..6698108 100644 --- a/web/style.css +++ b/web/style.css @@ -1,6 +1,7 @@ :root { font-family: monospace; --text: #4c4f69; + --surface0: #ccd0da; --surface1: #bcc0cc; --base: #eff1f5; --lavender: #7287fd; @@ -149,17 +150,6 @@ a { display: flex; } -#volume-slider-container { - display: none; - justify-content: start; - align-items: center; -} - -#volume-slider-container > output { - color: var(--text); - margin-right: 1rem; -} - @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="range"] { overflow: hidden; @@ -333,3 +323,55 @@ input[type="range"]::-ms-fill-upper { right: 50%; height: 15px; } + +#volume-slider-container { + display: none; + justify-content: start; + align-items: center; +} + +#volume-slider-container > output { + color: var(--text); + margin-right: 1rem; +} + +aside#notification { + display: none; + position: absolute; + top: 0; + right: 0; + background: var(--surface0); + padding: 1rem 2rem; + margin: 2rem; + border: 2px solid var(--text); +} + +aside#notification > p { + margin: 0; +} + +aside#notification > #notification-title { + font-weight: 700; + margin-bottom: 0.5rem; +} + +@keyframes notification-fade-in { + 0% { + display: block; + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes notification-fade-out { + 0% { + opactiy: 1; + } + + 100% { + opacity: 0; + } +}