From dcd6bfc3d7bce9f9afaf9abfa3e7eda51cdcc14b Mon Sep 17 00:00:00 2001
From: seth
Date: Mon, 5 May 2025 20:31:59 -0400
Subject: [PATCH 01/62] lint
---
src/front/App.tsx | 4 ++--
src/front/components/Lanyard/index.tsx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/front/App.tsx b/src/front/App.tsx
index 7e0a8cb..9f1dc68 100644
--- a/src/front/App.tsx
+++ b/src/front/App.tsx
@@ -56,7 +56,7 @@ export default () => {
),
"/tmp/discord-ipc": () => lanyardInstance,
"/tmp/heartrate": () => Hyperate(),
- };
+ };
const history: string[] = [];
let historyIndex = -1;
@@ -119,7 +119,7 @@ export default () => {
].join("\n");
} else {
out = `bash: ${cmd}: command not found`;
- }
+ }
appendLine(out);
inputBox.value = "";
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index 9b58d6a..a47021c 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -48,7 +48,7 @@ export default () => {
}),
},
null,
- 2
+ 2,
);
highlightElement(container.current);
}
From bf32c3fd350b83c00073a76b92542330b515354e Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 9 May 2025 14:57:10 -0400
Subject: [PATCH 02/62] Add logging for client IP in postAnalytics and update
Lanyard styles to use RGB format
---
config.yml | 1 +
src/back/index.ts | 17 ++++++++++-----
src/front/components/Lanyard/index.tsx | 30 ++++++++++++--------------
3 files changed, 27 insertions(+), 21 deletions(-)
create mode 100644 config.yml
diff --git a/config.yml b/config.yml
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/config.yml
@@ -0,0 +1 @@
+{}
diff --git a/src/back/index.ts b/src/back/index.ts
index f010df2..8c63b40 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -47,6 +47,13 @@ const postAnalytics = async (
req: Request | Bun.BunRequest,
server: Bun.Server,
) => {
+ console.log(String(
+ req.headers.get("CF-Connecting-IP") ||
+ req.headers.get("X-Real-IP") ||
+ req.headers.get("X-Forwarded-For")?.split(",")[0] ||
+ (typeof server.requestIP(req) === "string"
+ ? server.requestIP(req)
+ : server.requestIP(req)?.address || "")));
return await fetch("https://plausible.creations.works/api/event", {
method: "POST",
headers: {
@@ -54,11 +61,11 @@ const postAnalytics = async (
"User-Agent": req.headers.get("user-agent") || "",
"X-Forwarded-For": String(
req.headers.get("CF-Connecting-IP") ||
- req.headers.get("X-Real-IP") ||
- req.headers.get("X-Forwarded-For")?.split(",")[0] ||
- (typeof server.requestIP(req) === "string"
- ? server.requestIP(req)
- : server.requestIP(req)?.address || ""),
+ req.headers.get("X-Real-IP") ||
+ req.headers.get("X-Forwarded-For")?.split(",")[0] ||
+ (typeof server.requestIP(req) === "string"
+ ? server.requestIP(req)
+ : server.requestIP(req)?.address || ""),
),
},
body: JSON.stringify({
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index a47021c..ca5d211 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -3,17 +3,17 @@ import { createRef } from "tsx-dom";
import socket from "../../Socket";
const statusTypes = {
- online: "rgb(0, 150, 0)",
- idle: "rgb(150, 150, 0)",
- dnd: "rgb(150, 0, 0)",
- offline: "rgb(150, 150, 150)",
+ online: "0, 150, 0",
+ idle: "150, 150, 0",
+ dnd: "150, 0, 0",
+ offline: "150, 150, 150",
};
const gradientTypes = {
- online: "rgba(0, 150, 0, 0.1)",
- idle: "rgba(150, 150, 0, 0.1)",
- dnd: "rgba(150, 0, 0, 0.1)",
- offline: "rgba(150, 150, 150, 0.1)",
+ online: "0, 150, 0",
+ idle: "150, 150, 0",
+ dnd: "150, 0, 0",
+ offline: "150, 150, 150",
};
const activityTypes: Record = {
@@ -31,21 +31,19 @@ export default () => {
socket.addEventListener("lanyard", (event: Event) => {
const lanyard = (event as CustomEvent).detail;
- document.body.style = `--status-color: ${statusTypes[lanyard.discord_status]}; --gradient-color: ${gradientTypes[lanyard.discord_status]};`;
+ document.body.style = `--status-color: rgb(${statusTypes[lanyard.discord_status]}); --gradient-color: rgba(${gradientTypes[lanyard.discord_status]}, 0.1);`;
if (container.current) {
- container.current.className = "shj-lang-json";
container.current.textContent = JSON.stringify(
{
status: lanyard.discord_status,
- activities: lanyard.activities.map((act) => {
+ activities: [... new Set(lanyard.activities.map((act) => {
const type = activityTypes[act.type];
- const parts = [type];
- if (act.name !== type) parts.push(act.name);
- if (act.details) parts.push(act.details);
- if (act.state) parts.push(act.state);
+ const parts = [`${type} ${act.name}`];
+ if (act.details && act.details !== act.name) parts.push(act.details);
+ if (act.state && act.state !== act.name) parts.push(act.state);
return parts;
- }),
+ }))],
},
null,
2,
From 17bee43782050a3154a7a574ff8688e7d7b8e91d Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 9 May 2025 14:58:29 -0400
Subject: [PATCH 03/62] Remove console log for client IP in postAnalytics
function
---
src/back/index.ts | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/back/index.ts b/src/back/index.ts
index 8c63b40..00ce212 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -47,13 +47,6 @@ const postAnalytics = async (
req: Request | Bun.BunRequest,
server: Bun.Server,
) => {
- console.log(String(
- req.headers.get("CF-Connecting-IP") ||
- req.headers.get("X-Real-IP") ||
- req.headers.get("X-Forwarded-For")?.split(",")[0] ||
- (typeof server.requestIP(req) === "string"
- ? server.requestIP(req)
- : server.requestIP(req)?.address || "")));
return await fetch("https://plausible.creations.works/api/event", {
method: "POST",
headers: {
From 281e34bbd92bce13966b440b0af582b83396523f Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 9 May 2025 14:59:22 -0400
Subject: [PATCH 04/62] Adjust heartbeat intervals in Hyperate and Lanyard
sockets to reduce latency
---
src/back/Sockets/Hyperate.ts | 2 +-
src/back/Sockets/Lanyard.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/back/Sockets/Hyperate.ts b/src/back/Sockets/Hyperate.ts
index d4154a2..60b103a 100644
--- a/src/back/Sockets/Hyperate.ts
+++ b/src/back/Sockets/Hyperate.ts
@@ -37,7 +37,7 @@ export default class {
ref: 0,
}),
);
- }, 10000);
+ }, 10000 - 1000);
};
this._socket.onmessage = ({ data }: MessageEvent) => {
diff --git a/src/back/Sockets/Lanyard.ts b/src/back/Sockets/Lanyard.ts
index 7d92430..7f41573 100644
--- a/src/back/Sockets/Lanyard.ts
+++ b/src/back/Sockets/Lanyard.ts
@@ -41,7 +41,7 @@ export default class {
op: 3,
}),
);
- }, data.d.heartbeat_interval);
+ }, data.d.heartbeat_interval - 1000);
break;
}
}
From a8d8f7014a2acfed76637492ce766aa50befac3b Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:14:14 -0400
Subject: [PATCH 05/62] Update Lanyard socket URL, enhance IP logging in
postAnalytics, and refactor App component structure
---
src/back/Sockets/Lanyard.ts | 4 +-
src/back/index.ts | 24 ++++--
src/front/App.tsx | 160 +++++-------------------------------
src/front/Socket.ts | 3 -
src/front/index.css | 32 +-------
src/front/index.html | 2 +-
src/index.ts | 7 +-
7 files changed, 49 insertions(+), 183 deletions(-)
diff --git a/src/back/Sockets/Lanyard.ts b/src/back/Sockets/Lanyard.ts
index 7f41573..e20e5d9 100644
--- a/src/back/Sockets/Lanyard.ts
+++ b/src/back/Sockets/Lanyard.ts
@@ -7,7 +7,7 @@ export default class {
constructor(callback: (data: LanyardData) => void) {
this._socket = new ReconnectingWebSocket(
- "wss://lanyard.creations.works/socket",
+ "wss://lanyard.atums.world/socket",
);
this._keepAlive = null;
this._callback = callback;
@@ -55,7 +55,7 @@ export default class {
}
};
- this._socket.onclose = () => {
+ this._socket.onclose = (e) => {
console.log("Lanyard socket closed");
if (this._keepAlive) {
clearInterval(this._keepAlive);
diff --git a/src/back/index.ts b/src/back/index.ts
index 00ce212..5dcc0e4 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -10,7 +10,7 @@ const build = async () => {
minify: !development,
sourcemap: development ? "inline" : "none",
splitting: true,
- publicPath: "/assets/",
+ publicPath: "/assets/"
});
};
@@ -47,18 +47,28 @@ const postAnalytics = async (
req: Request | Bun.BunRequest,
server: Bun.Server,
) => {
+ const cfIp = req.headers.get("CF-Connecting-IP");
+ const realIp = req.headers.get("X-Real-IP");
+ const forwardedIp = req.headers.get("X-Forwarded-For");
+ const serverIp = server.requestIP(req)?.address;
+
+ console.log({
+ cfIp,
+ realIp,
+ forwardedIp,
+ serverIp,
+ });
+
return await fetch("https://plausible.creations.works/api/event", {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": req.headers.get("user-agent") || "",
"X-Forwarded-For": String(
- req.headers.get("CF-Connecting-IP") ||
- req.headers.get("X-Real-IP") ||
- req.headers.get("X-Forwarded-For")?.split(",")[0] ||
- (typeof server.requestIP(req) === "string"
- ? server.requestIP(req)
- : server.requestIP(req)?.address || ""),
+ cfIp ||
+ realIp ||
+ forwardedIp?.split(",")[0] ||
+ serverIp,
),
},
body: JSON.stringify({
diff --git a/src/front/App.tsx b/src/front/App.tsx
index 9f1dc68..8a30ad6 100644
--- a/src/front/App.tsx
+++ b/src/front/App.tsx
@@ -1,145 +1,27 @@
import Hyperate from "./components/Hyperate";
import Lanyard from "./components/Lanyard";
-let latestLanyard: LanyardData | null = null;
-
-window.addEventListener("lanyard-update", (e) => {
- latestLanyard = (e as CustomEvent).detail;
-});
-
export default () => {
- const container = document.createElement("div");
- container.className = "app terminal";
+ return (
+
+
[seth@ipv4 ~]$ cat ./about.txt
+
+ A Dedicated Backend Developer,
+
+ with a passion for high-fidelity audio,
+
+ gaming, and web development.
+
- const renderElement = (content: string | Node) => {
- const p = document.createElement("p");
- if (typeof content === "string") {
- p.textContent = content;
- } else {
- p.appendChild(content);
- }
- return p;
- };
+
[seth@ipv4 ~]$ cat /tmp/discord-ipc
+
+
+
- const prompt = "[seth@ipv4 ~]$";
-
- const staticLines: (string | (() => Node))[] = [
- `${prompt} cat ./about.txt`,
- () =>
- document
- .createRange()
- .createContextualFragment(
- "A Dedicated Backend Developer,
with a passion for high-fidelity audio,
gaming, and web development.",
- ),
- `${prompt} cat /tmp/discord-ipc`,
- () => Lanyard(),
- `${prompt} cat /tmp/heartrate`,
- () => Hyperate(),
- ];
-
- const renderStatic = () => {
- for (const line of staticLines) {
- const content = typeof line === "function" ? line() : line;
- container.appendChild(renderElement(content));
- }
- };
-
- renderStatic();
-
- const lanyardInstance = Lanyard();
- const files: Record
Node> = {
- "./about.txt": () =>
- document
- .createRange()
- .createContextualFragment(
- "A Dedicated Backend Developer,
with a passion for high-fidelity audio,
gaming, and web development.",
- ),
- "/tmp/discord-ipc": () => lanyardInstance,
- "/tmp/heartrate": () => Hyperate(),
- };
-
- const history: string[] = [];
- let historyIndex = -1;
-
- const inputBox = document.createElement("input");
- inputBox.className = "terminal-input";
- inputBox.autofocus = true;
-
- const inputLine = document.createElement("div");
- inputLine.className = "terminal-line";
-
- const promptSpan = document.createElement("span");
- promptSpan.textContent = `${prompt} `;
-
- inputLine.appendChild(promptSpan);
- inputLine.appendChild(inputBox);
- container.appendChild(inputLine);
-
- const appendLine = (line: string | Node) => {
- container.insertBefore(renderElement(line), inputLine);
- };
-
- inputBox.addEventListener("keydown", (e) => {
- if (e.key === "Enter") {
- const cmd = inputBox.value.trim();
- if (!cmd) return;
-
- history.push(cmd);
- historyIndex = history.length;
-
- appendLine(`${prompt} ${cmd}`);
-
- let out: string | Node;
-
- if (cmd.startsWith("cat ")) {
- const file = cmd.slice(4).trim();
- out = files[file]?.() ?? `cat: ${file}: No such file`;
- } else if (cmd === "ls") {
- out = Object.keys(files)
- .filter((f) => f.startsWith("./"))
- .map((f) => f.slice(2))
- .join("\n");
- } else if (cmd.startsWith("ls ")) {
- const dir = cmd.slice(3).trim();
- if (dir === "/tmp") {
- out = Object.keys(files)
- .filter((f) => f.startsWith("/tmp/"))
- .map((f) => f.slice("/tmp/".length))
- .join("\n");
- } else {
- out = `ls: cannot access '${dir}': No such file or directory`;
- }
- } else if (cmd === "help") {
- out = [
- "Available commands:",
- " cat [file] View contents of a file",
- " ls List files in current directory",
- " ls /tmp List files in /tmp directory",
- " help Show this message",
- ].join("\n");
- } else {
- out = `bash: ${cmd}: command not found`;
- }
-
- appendLine(out);
- inputBox.value = "";
- } else if (e.key === "ArrowUp") {
- if (historyIndex > 0) {
- historyIndex--;
- inputBox.value = history[historyIndex] || "";
- }
- e.preventDefault();
- } else if (e.key === "ArrowDown") {
- if (historyIndex < history.length - 1) {
- historyIndex++;
- inputBox.value = history[historyIndex] || "";
- } else {
- historyIndex = history.length;
- inputBox.value = "";
- }
- e.preventDefault();
- }
- });
-
- return container;
-};
+ [seth@ipv4 ~]$ cat /tmp/heartrate
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/src/front/Socket.ts b/src/front/Socket.ts
index 334effc..9e41348 100644
--- a/src/front/Socket.ts
+++ b/src/front/Socket.ts
@@ -41,9 +41,6 @@ class Socket extends EventTarget {
emitLanyard(lanyard: LanyardData) {
this.dispatchEvent(new CustomEvent("lanyard", { detail: lanyard }));
- window.dispatchEvent(
- new CustomEvent("lanyard-update", { detail: lanyard }),
- );
}
emitHyperate(heartRate: number) {
this.dispatchEvent(new CustomEvent("hyperate", { detail: heartRate }));
diff --git a/src/front/index.css b/src/front/index.css
index f52e3e0..846d489 100644
--- a/src/front/index.css
+++ b/src/front/index.css
@@ -14,11 +14,9 @@ body {
body {
color: #dedede;
text-shadow: 0 0 5px #c8c8c8;
- background: radial-gradient(
- at bottom right,
- var(--gradient-color, rgba(150, 150, 150, 0.1)) 0%,
- rgba(0, 0, 0, 1) 100%
- );
+ background: radial-gradient(at bottom right,
+ var(--gradient-color, rgba(150, 150, 150, 0.1)) 0%,
+ rgba(0, 0, 0, 1) 100%);
display: flex;
height: 100vh;
width: 100vw;
@@ -40,27 +38,5 @@ p {
display: flex;
flex-direction: column;
box-sizing: border-box;
-
gap: 0.4em;
-}
-
-.terminal-input {
- background: transparent;
- border: none;
- color: inherit;
- font: inherit;
- outline: none;
- display: inline-block;
- width: 100%;
-}
-
-.terminal-line {
- display: flex;
- align-items: baseline;
- flex-direction: row;
- width: 100%;
-}
-
-.terminal-line > span {
- white-space: pre;
-}
+}
\ No newline at end of file
diff --git a/src/front/index.html b/src/front/index.html
index b3b4c13..cc8843c 100644
--- a/src/front/index.html
+++ b/src/front/index.html
@@ -10,7 +10,7 @@
Seth @ IPv4 dot Army
-
+
diff --git a/src/index.ts b/src/index.ts
index 65da033..158beb8 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -9,7 +9,7 @@ let lanyard: LanyardData = {
activities: [],
};
-await fs.rm("./dist", { recursive: true, force: true }).catch(() => {});
+await fs.rm("./dist", { recursive: true, force: true }).catch(() => { });
if (!Backend.development) {
await Backend.build();
@@ -30,8 +30,9 @@ const server = serve({
"/assets/:file": async (req) =>
Backend.Responses.file(file(`./dist/${req.params.file}`)),
- "/public/:file": async (req) =>
- Backend.Responses.file(file(`./public/${req.params.file}`)),
+ "/robots.txt": async () => Backend.Responses.file(file("./public/robots.txt")),
+ "/favicon.svg": async () =>
+ Backend.Responses.file(file("./public/favicon.svg")),
"/api/server": () => {
const safeProcess = JSON.parse(JSON.stringify(process));
From e6b81756625677179f40730ff4523485f0913626 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:15:22 -0400
Subject: [PATCH 06/62] Fix linting
---
src/back/index.ts | 7 ++-----
src/front/App.tsx | 2 +-
src/front/components/Lanyard/index.tsx | 19 ++++++++++++-------
src/front/index.css | 10 ++++++----
src/index.ts | 5 +++--
5 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/src/back/index.ts b/src/back/index.ts
index 5dcc0e4..2ddeb38 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -10,7 +10,7 @@ const build = async () => {
minify: !development,
sourcemap: development ? "inline" : "none",
splitting: true,
- publicPath: "/assets/"
+ publicPath: "/assets/",
});
};
@@ -65,10 +65,7 @@ const postAnalytics = async (
"Content-Type": "application/json",
"User-Agent": req.headers.get("user-agent") || "",
"X-Forwarded-For": String(
- cfIp ||
- realIp ||
- forwardedIp?.split(",")[0] ||
- serverIp,
+ cfIp || realIp || forwardedIp?.split(",")[0] || serverIp,
),
},
body: JSON.stringify({
diff --git a/src/front/App.tsx b/src/front/App.tsx
index 8a30ad6..858223c 100644
--- a/src/front/App.tsx
+++ b/src/front/App.tsx
@@ -24,4 +24,4 @@ export default () => {
);
-};
\ No newline at end of file
+};
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index ca5d211..a6ace73 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -37,13 +37,18 @@ export default () => {
container.current.textContent = JSON.stringify(
{
status: lanyard.discord_status,
- activities: [... new Set(lanyard.activities.map((act) => {
- const type = activityTypes[act.type];
- const parts = [`${type} ${act.name}`];
- if (act.details && act.details !== act.name) parts.push(act.details);
- if (act.state && act.state !== act.name) parts.push(act.state);
- return parts;
- }))],
+ activities: [
+ ...new Set(
+ lanyard.activities.map((act) => {
+ const type = activityTypes[act.type];
+ const parts = [`${type} ${act.name}`];
+ if (act.details && act.details !== act.name)
+ parts.push(act.details);
+ if (act.state && act.state !== act.name) parts.push(act.state);
+ return parts;
+ }),
+ ),
+ ],
},
null,
2,
diff --git a/src/front/index.css b/src/front/index.css
index 846d489..54dd0fb 100644
--- a/src/front/index.css
+++ b/src/front/index.css
@@ -14,9 +14,11 @@ body {
body {
color: #dedede;
text-shadow: 0 0 5px #c8c8c8;
- background: radial-gradient(at bottom right,
- var(--gradient-color, rgba(150, 150, 150, 0.1)) 0%,
- rgba(0, 0, 0, 1) 100%);
+ background: radial-gradient(
+ at bottom right,
+ var(--gradient-color, rgba(150, 150, 150, 0.1)) 0%,
+ rgba(0, 0, 0, 1) 100%
+ );
display: flex;
height: 100vh;
width: 100vw;
@@ -39,4 +41,4 @@ p {
flex-direction: column;
box-sizing: border-box;
gap: 0.4em;
-}
\ No newline at end of file
+}
diff --git a/src/index.ts b/src/index.ts
index 158beb8..68e5f9e 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -9,7 +9,7 @@ let lanyard: LanyardData = {
activities: [],
};
-await fs.rm("./dist", { recursive: true, force: true }).catch(() => { });
+await fs.rm("./dist", { recursive: true, force: true }).catch(() => {});
if (!Backend.development) {
await Backend.build();
@@ -30,7 +30,8 @@ const server = serve({
"/assets/:file": async (req) =>
Backend.Responses.file(file(`./dist/${req.params.file}`)),
- "/robots.txt": async () => Backend.Responses.file(file("./public/robots.txt")),
+ "/robots.txt": async () =>
+ Backend.Responses.file(file("./public/robots.txt")),
"/favicon.svg": async () =>
Backend.Responses.file(file("./public/favicon.svg")),
From 29da0ce6a46d6cb5249e2c5b60ea81377b42d46c Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:18:29 -0400
Subject: [PATCH 07/62] fix ip stuff
---
src/back/index.ts | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/src/back/index.ts b/src/back/index.ts
index 2ddeb38..392e6e6 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -48,16 +48,9 @@ const postAnalytics = async (
server: Bun.Server,
) => {
const cfIp = req.headers.get("CF-Connecting-IP");
- const realIp = req.headers.get("X-Real-IP");
+ //const realIp = req.headers.get("X-Real-IP");
const forwardedIp = req.headers.get("X-Forwarded-For");
- const serverIp = server.requestIP(req)?.address;
-
- console.log({
- cfIp,
- realIp,
- forwardedIp,
- serverIp,
- });
+ //const serverIp = server.requestIP(req)?.address;
return await fetch("https://plausible.creations.works/api/event", {
method: "POST",
@@ -65,7 +58,7 @@ const postAnalytics = async (
"Content-Type": "application/json",
"User-Agent": req.headers.get("user-agent") || "",
"X-Forwarded-For": String(
- cfIp || realIp || forwardedIp?.split(",")[0] || serverIp,
+ cfIp || forwardedIp?.split(",")[0],
),
},
body: JSON.stringify({
From 26d907d57980b14b2a2a35c984a8871b047aa833 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:18:50 -0400
Subject: [PATCH 08/62] fix lint
---
src/back/index.ts | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/back/index.ts b/src/back/index.ts
index 392e6e6..47974a7 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -57,9 +57,7 @@ const postAnalytics = async (
headers: {
"Content-Type": "application/json",
"User-Agent": req.headers.get("user-agent") || "",
- "X-Forwarded-For": String(
- cfIp || forwardedIp?.split(",")[0],
- ),
+ "X-Forwarded-For": String(cfIp || forwardedIp?.split(",")[0]),
},
body: JSON.stringify({
domain: "ipv4.army",
From 6bac1bf833550960a5681559dcc691be9ff570c2 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:22:12 -0400
Subject: [PATCH 09/62] Fix activity display for Custom Status in Lanyard
component
---
src/front/components/Lanyard/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index a6ace73..cc663b2 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -41,7 +41,7 @@ export default () => {
...new Set(
lanyard.activities.map((act) => {
const type = activityTypes[act.type];
- const parts = [`${type} ${act.name}`];
+ const parts = [`${type} ${act.name === "Custom Status" ? "" : act.name}`];
if (act.details && act.details !== act.name)
parts.push(act.details);
if (act.state && act.state !== act.name) parts.push(act.state);
From b9ce5181911b4c7a8bdfc981b1bb89a3269a74b9 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:22:42 -0400
Subject: [PATCH 10/62] fix linting
---
src/front/components/Lanyard/index.tsx | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index cc663b2..871807c 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -41,7 +41,9 @@ export default () => {
...new Set(
lanyard.activities.map((act) => {
const type = activityTypes[act.type];
- const parts = [`${type} ${act.name === "Custom Status" ? "" : act.name}`];
+ const parts = [
+ `${type} ${act.name === "Custom Status" ? "" : act.name}`,
+ ];
if (act.details && act.details !== act.name)
parts.push(act.details);
if (act.state && act.state !== act.name) parts.push(act.state);
From 43306fbb6d0cdfc91d4adfc12101547628675c65 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:23:51 -0400
Subject: [PATCH 11/62] fix: add dist folder to ignore list in biome
configuration
---
biome.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/biome.json b/biome.json
index 46ee8c9..d4da482 100644
--- a/biome.json
+++ b/biome.json
@@ -7,7 +7,7 @@
},
"files": {
"ignoreUnknown": true,
- "ignore": []
+ "ignore": ["dist/**"]
},
"formatter": {
"enabled": true,
From 9ace0c945798134df042e30a102a7dbb15428349 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:25:00 -0400
Subject: [PATCH 12/62] upgrade biome to 2x
---
biome.json | 21 ++++++++++++++++-----
bun.lock | 20 ++++++++++----------
package.json | 2 +-
3 files changed, 27 insertions(+), 16 deletions(-)
diff --git a/biome.json b/biome.json
index d4da482..d81aa89 100644
--- a/biome.json
+++ b/biome.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
+ "$schema": "https://biomejs.dev/schemas/2.0.0-beta.4/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
@@ -7,16 +7,14 @@
},
"files": {
"ignoreUnknown": true,
- "ignore": ["dist/**"]
+ "includes": ["**", "!**/dist/**"]
},
"formatter": {
"enabled": true,
"indentStyle": "tab",
"lineEnding": "lf"
},
- "organizeImports": {
- "enabled": true
- },
+ "assist": { "actions": { "source": { "organizeImports": "on" } } },
"css": {
"formatter": {
"indentStyle": "tab",
@@ -29,6 +27,19 @@
"recommended": true,
"correctness": {
"noUnusedImports": "error"
+ },
+ "style": {
+ "noParameterAssign": "error",
+ "useAsConstAssertion": "error",
+ "useDefaultParameterLast": "error",
+ "useEnumInitializers": "error",
+ "useSelfClosingElements": "error",
+ "useConst": "error",
+ "useSingleVarDeclarator": "error",
+ "noUnusedTemplateLiteral": "error",
+ "useNumberNamespace": "error",
+ "noInferrableTypes": "error",
+ "noUselessElse": "error"
}
}
},
diff --git a/bun.lock b/bun.lock
index 7d6e32e..4ab9626 100644
--- a/bun.lock
+++ b/bun.lock
@@ -9,7 +9,7 @@
"tsx-dom": "latest",
},
"devDependencies": {
- "@biomejs/biome": "^1.9.4",
+ "@biomejs/biome": "^2.0.0-beta.4",
"@types/bun": "latest",
},
"peerDependencies": {
@@ -18,23 +18,23 @@
},
},
"packages": {
- "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="],
+ "@biomejs/biome": ["@biomejs/biome@2.0.0-beta.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0-beta.4", "@biomejs/cli-darwin-x64": "2.0.0-beta.4", "@biomejs/cli-linux-arm64": "2.0.0-beta.4", "@biomejs/cli-linux-arm64-musl": "2.0.0-beta.4", "@biomejs/cli-linux-x64": "2.0.0-beta.4", "@biomejs/cli-linux-x64-musl": "2.0.0-beta.4", "@biomejs/cli-win32-arm64": "2.0.0-beta.4", "@biomejs/cli-win32-x64": "2.0.0-beta.4" }, "bin": { "biome": "bin/biome" } }, "sha512-xKdyKTTveVfNthvoyNPEsp+PXU3Iz1n4wgTQKWBEdqxgw4JpQ/W7gBBiLqjVtegEBCc4+sAp+MOA2UH9Tqfxpg=="],
- "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="],
+ "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0-beta.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gELCMhP72d2ADWBev3Fc11YO9j7LdfMBGrPetwWtsYSNMiqP/ww5rXxHkodqu/J63PSw0M8oGJ1slZbF4QsuRA=="],
- "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="],
+ "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0-beta.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-OnbNtCoG+Vhh3xuQcxnbeg1e54eBlyH6bhNc+7i2HS+diC3ntOtBttkV5menBzabktEGrE0d0L9ftwzuCL0zwQ=="],
- "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="],
+ "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0-beta.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-IzSohzD68di/uoGzXMK9B8gJrhU7v2czPCJOLuZH1WgRmK4ejUzaGyi1JpNpFlP1mRtfAWfbJkYP57BUD+4mSA=="],
- "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="],
+ "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0-beta.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wZWLwJu/rwG5Z791lyhJI3Cu5JdkzIddU0wrIygFbYOIu4KyGPYIzAWX33HgtlmNfH0hVxByUke3J1Szzx9CjQ=="],
- "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="],
+ "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0-beta.4", "", { "os": "linux", "cpu": "x64" }, "sha512-71NQPwTg9T/p/cE/k6P7tCBJmeg8vR1+bP4w6ADBT55SVL4pSEyaOsZ3LDIUrV5jkISh8UQsuwxy9F29pHpeqg=="],
- "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="],
+ "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0-beta.4", "", { "os": "linux", "cpu": "x64" }, "sha512-OX6qS1jUYmk6+VtV1XWyDj2z5RS13JFv6ujEXLq1a3Cn86nzN5v/Dw/MuZYko3zAJ4BDNwlbNztvFVxmL1uWiA=="],
- "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="],
+ "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0-beta.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-SBYQqhJ19EcPbGshEd8k98du9gbfBFUqbmgqnTT/METPn+WyqIEnYcWLudjd+ujYHuMHYpXqSYxh+NYfL331eg=="],
- "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="],
+ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0-beta.4", "", { "os": "win32", "cpu": "x64" }, "sha512-2eGsMOwtm8mvicKMkegV2DW2EH0vQPF0Skt9n4enoFk8ABFtoxherTG8Us1fwlBrk9tA7gcshrdUilu35BmZdA=="],
"@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="],
diff --git a/package.json b/package.json
index 10fdfd5..e0369dd 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"lint:fix": "bunx biome check --fix"
},
"devDependencies": {
- "@biomejs/biome": "^1.9.4",
+ "@biomejs/biome": "^2.0.0-beta.4",
"@types/bun": "latest"
},
"peerDependencies": {
From 723edde53ff764a0a7f1902be7576c6cf7bb37b6 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:25:21 -0400
Subject: [PATCH 13/62] fix: update parameter naming for consistency in Lanyard
and index files
---
src/back/Sockets/Lanyard.ts | 2 +-
src/back/index.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/back/Sockets/Lanyard.ts b/src/back/Sockets/Lanyard.ts
index e20e5d9..83ba8a2 100644
--- a/src/back/Sockets/Lanyard.ts
+++ b/src/back/Sockets/Lanyard.ts
@@ -55,7 +55,7 @@ export default class {
}
};
- this._socket.onclose = (e) => {
+ this._socket.onclose = (_e) => {
console.log("Lanyard socket closed");
if (this._keepAlive) {
clearInterval(this._keepAlive);
diff --git a/src/back/index.ts b/src/back/index.ts
index 47974a7..39cdaf7 100644
--- a/src/back/index.ts
+++ b/src/back/index.ts
@@ -45,7 +45,7 @@ const Responses = {
const postAnalytics = async (
req: Request | Bun.BunRequest,
- server: Bun.Server,
+ _server: Bun.Server,
) => {
const cfIp = req.headers.get("CF-Connecting-IP");
//const realIp = req.headers.get("X-Real-IP");
From 8c000ba0b74fde0a321914c72922e16af7e0f190 Mon Sep 17 00:00:00 2001
From: seth
Date: Fri, 16 May 2025 00:26:30 -0400
Subject: [PATCH 14/62] fix: correct string interpolation for activity display
in Lanyard component
---
src/front/components/Lanyard/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/front/components/Lanyard/index.tsx b/src/front/components/Lanyard/index.tsx
index 871807c..ffb83e1 100644
--- a/src/front/components/Lanyard/index.tsx
+++ b/src/front/components/Lanyard/index.tsx
@@ -42,7 +42,7 @@ export default () => {
lanyard.activities.map((act) => {
const type = activityTypes[act.type];
const parts = [
- `${type} ${act.name === "Custom Status" ? "" : act.name}`,
+ `${type}${act.name === "Custom Status" ? "" : ` ${act.name}`}`,
];
if (act.details && act.details !== act.name)
parts.push(act.details);
From b76e879350c0b6dcb17e58edebd41052925bb749 Mon Sep 17 00:00:00 2001
From: seth
Date: Sat, 17 May 2025 16:08:59 -0400
Subject: [PATCH 15/62] send help
---
.vscode/settings.json | 4 +
bun.lock | 42 +
package.json | 4 +
public/Abyssinian/Clean/Clean0.png | Bin 0 -> 3090 bytes
public/Abyssinian/Clean/Clean1.png | Bin 0 -> 2949 bytes
public/Abyssinian/Clean/Clean_cf0.png | Bin 0 -> 8445 bytes
public/Abyssinian/Clean/Clean_cf1.png | Bin 0 -> 8579 bytes
public/Abyssinian/Cute/Cute0.png | Bin 0 -> 2718 bytes
public/Abyssinian/Cute/Cute1.png | Bin 0 -> 2631 bytes
public/Abyssinian/Cute/Cute_cf0.png | Bin 0 -> 9296 bytes
public/Abyssinian/Cute/Cute_cf1.png | Bin 0 -> 9189 bytes
public/Abyssinian/Expected/Expected0.png | Bin 0 -> 2940 bytes
public/Abyssinian/Expected/Expected1.png | Bin 0 -> 2909 bytes
public/Abyssinian/Expected/Expected_cf0.png | Bin 0 -> 9436 bytes
public/Abyssinian/Expected/Expected_cf1.png | Bin 0 -> 8904 bytes
.../Abyssinian/GoodMorning/GoodMorning0.png | Bin 0 -> 2968 bytes
.../Abyssinian/GoodMorning/GoodMorning1.png | Bin 0 -> 2977 bytes
.../GoodMorning/GoodMorning_cf0.png | Bin 0 -> 10927 bytes
.../GoodMorning/GoodMorning_cf1.png | Bin 0 -> 8263 bytes
public/Abyssinian/GoodNight/GoodNight0.png | Bin 0 -> 2368 bytes
public/Abyssinian/GoodNight/GoodNight1.png | Bin 0 -> 2381 bytes
public/Abyssinian/GoodNight/GoodNight_cf0.png | Bin 0 -> 7458 bytes
public/Abyssinian/GoodNight/GoodNight_cf1.png | Bin 0 -> 7432 bytes
public/Abyssinian/Greet/Greet0.png | Bin 0 -> 2686 bytes
public/Abyssinian/Greet/Greet1.png | Bin 0 -> 2610 bytes
public/Abyssinian/Greet/Greet_cf0.png | Bin 0 -> 6767 bytes
public/Abyssinian/Greet/Greet_cf1.png | Bin 0 -> 6407 bytes
public/Abyssinian/HandSome/HandSome0.png | Bin 0 -> 2824 bytes
public/Abyssinian/HandSome/HandSome1.png | Bin 0 -> 2652 bytes
public/Abyssinian/HandSome/HandSome_cf0.png | Bin 0 -> 10324 bytes
public/Abyssinian/HandSome/HandSome_cf1.png | Bin 0 -> 10195 bytes
public/Abyssinian/Happy/Happy0.png | Bin 0 -> 3043 bytes
public/Abyssinian/Happy/Happy1.png | Bin 0 -> 2846 bytes
public/Abyssinian/Happy/Happy_cf0.png | Bin 0 -> 10813 bytes
public/Abyssinian/Happy/Happy_cf1.png | Bin 0 -> 9911 bytes
public/Abyssinian/Hungry/Hungry0.png | Bin 0 -> 3155 bytes
public/Abyssinian/Hungry/Hungry1.png | Bin 0 -> 3117 bytes
public/Abyssinian/Hungry/Hungry_cf0.png | Bin 0 -> 8396 bytes
public/Abyssinian/Hungry/Hungry_cf1.png | Bin 0 -> 8224 bytes
public/Abyssinian/LoveYou/LoveYou0.png | Bin 0 -> 2949 bytes
public/Abyssinian/LoveYou/LoveYou1.png | Bin 0 -> 2968 bytes
public/Abyssinian/LoveYou/LoveYou_cf0.png | Bin 0 -> 8499 bytes
public/Abyssinian/LoveYou/LoveYou_cf1.png | Bin 0 -> 8278 bytes
public/Abyssinian/Play/Play0.png | Bin 0 -> 3358 bytes
public/Abyssinian/Play/Play1.png | Bin 0 -> 3363 bytes
public/Abyssinian/Play/Play_cf0.png | Bin 0 -> 11971 bytes
public/Abyssinian/Play/Play_cf1.png | Bin 0 -> 11770 bytes
public/Abyssinian/Sick/Sick0.png | Bin 0 -> 3458 bytes
public/Abyssinian/Sick/Sick1.png | Bin 0 -> 3424 bytes
public/Abyssinian/Sick/Sick_cf0.png | Bin 0 -> 10422 bytes
public/Abyssinian/Sick/Sick_cf1.png | Bin 0 -> 10324 bytes
public/Abyssinian/Sleeping/Sleeping0.png | Bin 0 -> 2041 bytes
public/Abyssinian/Sleeping/Sleeping1.png | Bin 0 -> 1979 bytes
public/Abyssinian/Sleeping/Sleeping_cf0.png | Bin 0 -> 4016 bytes
public/Abyssinian/Sleeping/Sleeping_cf1.png | Bin 0 -> 4079 bytes
public/Abyssinian/Sleepy/Sleepy0.png | Bin 0 -> 2216 bytes
public/Abyssinian/Sleepy/Sleepy1.png | Bin 0 -> 2163 bytes
public/Abyssinian/Sleepy/Sleepy_cf0.png | Bin 0 -> 5632 bytes
public/Abyssinian/Sleepy/Sleepy_cf1.png | Bin 0 -> 5648 bytes
public/Abyssinian/Sue/Sue0.png | Bin 0 -> 3090 bytes
public/Abyssinian/Sue/Sue1.png | Bin 0 -> 2949 bytes
public/Abyssinian/Sue/Sue_cf0.png | Bin 0 -> 8445 bytes
public/Abyssinian/Sue/Sue_cf1.png | Bin 0 -> 8579 bytes
public/Abyssinian/Tired/Tired0.png | Bin 0 -> 2969 bytes
public/Abyssinian/Tired/Tired1.png | Bin 0 -> 2895 bytes
public/Abyssinian/Tired/Tired_cf0.png | Bin 0 -> 10379 bytes
public/Abyssinian/Tired/Tired_cf1.png | Bin 0 -> 10458 bytes
public/Abyssinian/Toilet/Toilet_cf0.png | Bin 0 -> 13149 bytes
public/Abyssinian/Toilet/Toilet_cf1.png | Bin 0 -> 14581 bytes
public/Abyssinian/WantSleep/WantSleep0.png | Bin 0 -> 1919 bytes
public/Abyssinian/WantSleep/WantSleep1.png | Bin 0 -> 1954 bytes
public/Abyssinian/WantSleep/WantSleep_cf0.png | Bin 0 -> 5170 bytes
public/Abyssinian/WantSleep/WantSleep_cf1.png | Bin 0 -> 5253 bytes
public/Abyssinian/Weather/Weather0.png | Bin 0 -> 2686 bytes
public/Abyssinian/Weather/Weather1.png | Bin 0 -> 2610 bytes
public/Abyssinian/Weather/Weather_cf0.png | Bin 0 -> 6767 bytes
public/Abyssinian/Weather/Weather_cf1.png | Bin 0 -> 6407 bytes
public/Abyssinian/back.png | Bin 0 -> 5791 bytes
public/Abyssinian/chat.png | Bin 0 -> 9505 bytes
public/Abyssinian/default.json | 389 ++++++
public/Abyssinian/default.png | Bin 0 -> 8235 bytes
public/Abyssinian/drink.png | Bin 0 -> 10141 bytes
public/Abyssinian/eat.json | 921 +++++++++++++
public/Abyssinian/outline.png | Bin 0 -> 3356 bytes
public/Abyssinian/sad.json | 389 ++++++
public/Abyssinian/sent.png | Bin 0 -> 12744 bytes
public/Abyssinian/sleeping.json | 660 ++++++++++
public/Abyssinian/sleepy.json | 299 +++++
public/Abyssinian/transport.png | Bin 0 -> 5991 bytes
public/Abyssinian/wantSleep.json | 1172 +++++++++++++++++
public/Abyssinian/wash.png | Bin 0 -> 6881 bytes
src/front/App.css | 61 -
src/front/App.tsx | 47 +-
src/front/components/Hyperate/index.tsx | 2 +-
src/front/components/Lanyard/index.tsx | 18 +-
src/front/components/NavigationBar/index.tsx | 29 +
src/front/components/TopAppBar/index.tsx | 11 +
src/front/index.css | 195 ++-
src/front/index.html | 9 +-
src/front/index.tsx | 2 +
src/front/utilities/clicker/index.ts | 21 +
src/front/utilities/snackbar/index.ts | 108 ++
.../{Socket.ts => utilities/socket/index.ts} | 7 +-
src/index.ts | 12 +-
104 files changed, 4260 insertions(+), 142 deletions(-)
create mode 100644 .vscode/settings.json
create mode 100644 public/Abyssinian/Clean/Clean0.png
create mode 100644 public/Abyssinian/Clean/Clean1.png
create mode 100644 public/Abyssinian/Clean/Clean_cf0.png
create mode 100644 public/Abyssinian/Clean/Clean_cf1.png
create mode 100644 public/Abyssinian/Cute/Cute0.png
create mode 100644 public/Abyssinian/Cute/Cute1.png
create mode 100644 public/Abyssinian/Cute/Cute_cf0.png
create mode 100644 public/Abyssinian/Cute/Cute_cf1.png
create mode 100644 public/Abyssinian/Expected/Expected0.png
create mode 100644 public/Abyssinian/Expected/Expected1.png
create mode 100644 public/Abyssinian/Expected/Expected_cf0.png
create mode 100644 public/Abyssinian/Expected/Expected_cf1.png
create mode 100644 public/Abyssinian/GoodMorning/GoodMorning0.png
create mode 100644 public/Abyssinian/GoodMorning/GoodMorning1.png
create mode 100644 public/Abyssinian/GoodMorning/GoodMorning_cf0.png
create mode 100644 public/Abyssinian/GoodMorning/GoodMorning_cf1.png
create mode 100644 public/Abyssinian/GoodNight/GoodNight0.png
create mode 100644 public/Abyssinian/GoodNight/GoodNight1.png
create mode 100644 public/Abyssinian/GoodNight/GoodNight_cf0.png
create mode 100644 public/Abyssinian/GoodNight/GoodNight_cf1.png
create mode 100644 public/Abyssinian/Greet/Greet0.png
create mode 100644 public/Abyssinian/Greet/Greet1.png
create mode 100644 public/Abyssinian/Greet/Greet_cf0.png
create mode 100644 public/Abyssinian/Greet/Greet_cf1.png
create mode 100644 public/Abyssinian/HandSome/HandSome0.png
create mode 100644 public/Abyssinian/HandSome/HandSome1.png
create mode 100644 public/Abyssinian/HandSome/HandSome_cf0.png
create mode 100644 public/Abyssinian/HandSome/HandSome_cf1.png
create mode 100644 public/Abyssinian/Happy/Happy0.png
create mode 100644 public/Abyssinian/Happy/Happy1.png
create mode 100644 public/Abyssinian/Happy/Happy_cf0.png
create mode 100644 public/Abyssinian/Happy/Happy_cf1.png
create mode 100644 public/Abyssinian/Hungry/Hungry0.png
create mode 100644 public/Abyssinian/Hungry/Hungry1.png
create mode 100644 public/Abyssinian/Hungry/Hungry_cf0.png
create mode 100644 public/Abyssinian/Hungry/Hungry_cf1.png
create mode 100644 public/Abyssinian/LoveYou/LoveYou0.png
create mode 100644 public/Abyssinian/LoveYou/LoveYou1.png
create mode 100644 public/Abyssinian/LoveYou/LoveYou_cf0.png
create mode 100644 public/Abyssinian/LoveYou/LoveYou_cf1.png
create mode 100644 public/Abyssinian/Play/Play0.png
create mode 100644 public/Abyssinian/Play/Play1.png
create mode 100644 public/Abyssinian/Play/Play_cf0.png
create mode 100644 public/Abyssinian/Play/Play_cf1.png
create mode 100644 public/Abyssinian/Sick/Sick0.png
create mode 100644 public/Abyssinian/Sick/Sick1.png
create mode 100644 public/Abyssinian/Sick/Sick_cf0.png
create mode 100644 public/Abyssinian/Sick/Sick_cf1.png
create mode 100644 public/Abyssinian/Sleeping/Sleeping0.png
create mode 100644 public/Abyssinian/Sleeping/Sleeping1.png
create mode 100644 public/Abyssinian/Sleeping/Sleeping_cf0.png
create mode 100644 public/Abyssinian/Sleeping/Sleeping_cf1.png
create mode 100644 public/Abyssinian/Sleepy/Sleepy0.png
create mode 100644 public/Abyssinian/Sleepy/Sleepy1.png
create mode 100644 public/Abyssinian/Sleepy/Sleepy_cf0.png
create mode 100644 public/Abyssinian/Sleepy/Sleepy_cf1.png
create mode 100644 public/Abyssinian/Sue/Sue0.png
create mode 100644 public/Abyssinian/Sue/Sue1.png
create mode 100644 public/Abyssinian/Sue/Sue_cf0.png
create mode 100644 public/Abyssinian/Sue/Sue_cf1.png
create mode 100644 public/Abyssinian/Tired/Tired0.png
create mode 100644 public/Abyssinian/Tired/Tired1.png
create mode 100644 public/Abyssinian/Tired/Tired_cf0.png
create mode 100644 public/Abyssinian/Tired/Tired_cf1.png
create mode 100644 public/Abyssinian/Toilet/Toilet_cf0.png
create mode 100644 public/Abyssinian/Toilet/Toilet_cf1.png
create mode 100644 public/Abyssinian/WantSleep/WantSleep0.png
create mode 100644 public/Abyssinian/WantSleep/WantSleep1.png
create mode 100644 public/Abyssinian/WantSleep/WantSleep_cf0.png
create mode 100644 public/Abyssinian/WantSleep/WantSleep_cf1.png
create mode 100644 public/Abyssinian/Weather/Weather0.png
create mode 100644 public/Abyssinian/Weather/Weather1.png
create mode 100644 public/Abyssinian/Weather/Weather_cf0.png
create mode 100644 public/Abyssinian/Weather/Weather_cf1.png
create mode 100644 public/Abyssinian/back.png
create mode 100644 public/Abyssinian/chat.png
create mode 100644 public/Abyssinian/default.json
create mode 100644 public/Abyssinian/default.png
create mode 100644 public/Abyssinian/drink.png
create mode 100644 public/Abyssinian/eat.json
create mode 100644 public/Abyssinian/outline.png
create mode 100644 public/Abyssinian/sad.json
create mode 100644 public/Abyssinian/sent.png
create mode 100644 public/Abyssinian/sleeping.json
create mode 100644 public/Abyssinian/sleepy.json
create mode 100644 public/Abyssinian/transport.png
create mode 100644 public/Abyssinian/wantSleep.json
create mode 100644 public/Abyssinian/wash.png
delete mode 100644 src/front/App.css
create mode 100644 src/front/components/NavigationBar/index.tsx
create mode 100644 src/front/components/TopAppBar/index.tsx
create mode 100644 src/front/utilities/clicker/index.ts
create mode 100644 src/front/utilities/snackbar/index.ts
rename src/front/{Socket.ts => utilities/socket/index.ts} (88%)
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..efbbd0c
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
+{
+ "html.customData": ["./node_modules/mdui/html-data.en.json"],
+ "css.customData": ["./node_modules/mdui/css-data.en.json"]
+}
diff --git a/bun.lock b/bun.lock
index 4ab9626..377f072 100644
--- a/bun.lock
+++ b/bun.lock
@@ -4,7 +4,11 @@
"": {
"name": "ipv4.army",
"dependencies": {
+ "@fontsource/roboto": "^5.2.5",
+ "@fontsource/roboto-mono": "^5.2.5",
+ "@mdui/icons": "^1.0.3",
"@speed-highlight/core": "latest",
+ "mdui": "^2.1.4",
"reconnecting-websocket": "latest",
"tsx-dom": "latest",
},
@@ -36,16 +40,54 @@
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0-beta.4", "", { "os": "win32", "cpu": "x64" }, "sha512-2eGsMOwtm8mvicKMkegV2DW2EH0vQPF0Skt9n4enoFk8ABFtoxherTG8Us1fwlBrk9tA7gcshrdUilu35BmZdA=="],
+ "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
+
+ "@fontsource/roboto": ["@fontsource/roboto@5.2.5", "", {}, "sha512-70r2UZ0raqLn5W+sPeKhqlf8wGvUXFWlofaDlcbt/S3d06+17gXKr3VNqDODB0I1ASme3dGT5OJj9NABt7OTZQ=="],
+
+ "@fontsource/roboto-mono": ["@fontsource/roboto-mono@5.2.5", "", {}, "sha512-P1wrUBMFWfr+tuUIY10MzdRTBcl9f011CbZV1fXqcCk40Xmtn91l1V1daVuQ+JPctYEVYazabvaK+sUEThgnyw=="],
+
+ "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.3.0", "", {}, "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ=="],
+
+ "@lit/localize": ["@lit/localize@0.12.2", "", { "dependencies": { "lit": "^3.2.0" } }, "sha512-Qv9kvgJKDq/JVSwXOxuWvQnnOBysHA99ti9im9a4fImCmx+fto+XXcUYQbjZHqiueEEc4V20PcRDPO+1g/6seQ=="],
+
+ "@lit/reactive-element": ["@lit/reactive-element@2.1.0", "", { "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA=="],
+
+ "@material/material-color-utilities": ["@material/material-color-utilities@0.3.0", "", {}, "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g=="],
+
+ "@mdui/icons": ["@mdui/icons@1.0.3", "", { "dependencies": { "@mdui/shared": "^1.0.8", "lit": "^3.3.0", "tslib": "^2.8.1" } }, "sha512-Jq9juUqIJMBvIRSTr0qBKiqnlbY5pVUzUP20EHSN8dT7GcqN7bq0AL8MASL5DxKs09kgcERq+z5bHJOkz/VDlA=="],
+
+ "@mdui/jq": ["@mdui/jq@3.0.3", "", { "dependencies": { "ssr-window": "^5.0.0", "tslib": "^2.8.1" } }, "sha512-nI8QK9UPHhiIbECrC1aMdLXNxP6WgUtC9XwRPs/e56FtwduePyxPyloXmgU8VYw85i6TtYdgClHS9tW8JweNZA=="],
+
+ "@mdui/shared": ["@mdui/shared@1.0.8", "", { "dependencies": { "@lit/reactive-element": "^2.1.0", "@mdui/jq": "^3.0.3", "lit": "^3.3.0", "ssr-window": "^5.0.0", "tslib": "^2.8.1" } }, "sha512-YY863fjHBuk8KtiO4uLDm1YyIVdGrWv4xUxfv8jP32WqIQBkSTbV7HN8jnKXXIej0NFP7pU89yGr4GJYzVszPg=="],
+
"@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="],
"@types/bun": ["@types/bun@1.2.12", "", { "dependencies": { "bun-types": "1.2.12" } }, "sha512-lY/GQTXDGsolT/TiH72p1tuyUORuRrdV7VwOTOjDOt8uTBJQOJc5zz3ufwwDl0VBaoxotSk4LdP0hhjLJ6ypIQ=="],
"@types/node": ["@types/node@22.14.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw=="],
+ "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
+
"bun-types": ["bun-types@1.2.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-tvWMx5vPqbRXgE8WUZI94iS1xAYs8bkqESR9cxBB1Wi+urvfTrF1uzuDgBHFAdO0+d2lmsbG3HmeKMvUyj6pWA=="],
+ "classcat": ["classcat@5.0.5", "", {}, "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w=="],
+
+ "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
+
+ "lit": ["lit@3.3.0", "", { "dependencies": { "@lit/reactive-element": "^2.1.0", "lit-element": "^4.2.0", "lit-html": "^3.3.0" } }, "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw=="],
+
+ "lit-element": ["lit-element@4.2.0", "", { "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.1.0", "lit-html": "^3.3.0" } }, "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q=="],
+
+ "lit-html": ["lit-html@3.3.0", "", { "dependencies": { "@types/trusted-types": "^2.0.2" } }, "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw=="],
+
+ "mdui": ["mdui@2.1.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.9", "@lit/localize": "^0.12.2", "@lit/reactive-element": "^2.1.0", "@material/material-color-utilities": "^0.3.0", "@mdui/jq": "^3.0.3", "@mdui/shared": "^1.0.8", "classcat": "^5.0.5", "is-promise": "^4.0.0", "lit": "^3.3.0", "ssr-window": "^5.0.0", "tslib": "^2.8.1" } }, "sha512-QtK5xia5HXtVO7yH30QjwvvNruw5JdrJL1MEc1k6S/ZfsbHOj6BxxdYjrdv2HiN5ikkGqt5CIbZdFyq6shaZyw=="],
+
"reconnecting-websocket": ["reconnecting-websocket@4.4.0", "", {}, "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng=="],
+ "ssr-window": ["ssr-window@5.0.0", "", {}, "sha512-3Iqawoo0DkAaUEScd80SYq3I5clEFDVy//DdzjHXACj/hqcKzsnMzRZ1yHRj+r5dW3UeXNs30ofnhP6YSWg5iA=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
"tsx-dom": ["tsx-dom@3.1.0", "", { "dependencies": { "tsx-dom-types": "2.1.0" } }, "sha512-PGN7iL6zNC4Jj7bA1groSIz5mFB3Rr+SeoywZk2g4+c9uV8wwzCf+5tFQ8SyZxQIBHech3ueB0KxV3OFieqhOA=="],
"tsx-dom-types": ["tsx-dom-types@2.1.0", "", {}, "sha512-pZaMTrMRNom+D1b82K+1cWVMuogXrD/ANI42UYxilw27tF+tDCgj7GrD1XLmCxbHPDO2zxfmFuaz04KIEfWydQ=="],
diff --git a/package.json b/package.json
index e0369dd..b0096d9 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,11 @@
"private": true,
"type": "module",
"dependencies": {
+ "@fontsource/roboto": "^5.2.5",
+ "@fontsource/roboto-mono": "^5.2.5",
+ "@mdui/icons": "^1.0.3",
"@speed-highlight/core": "latest",
+ "mdui": "^2.1.4",
"reconnecting-websocket": "latest",
"tsx-dom": "latest"
}
diff --git a/public/Abyssinian/Clean/Clean0.png b/public/Abyssinian/Clean/Clean0.png
new file mode 100644
index 0000000000000000000000000000000000000000..e347666683839bcd608bbe24094706fba55594bd
GIT binary patch
literal 3090
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
C0IkLV
literal 0
HcmV?d00001
diff --git a/public/Abyssinian/Clean/Clean_cf0.png b/public/Abyssinian/Clean/Clean_cf0.png
new file mode 100644
index 0000000000000000000000000000000000000000..f955d8f4ec201bfe0847c9fa103f8a58bfca34bf
GIT binary patch
literal 8445
zcmaKxWm6kYw8pUj!P=&{OH$k^Zoz{Tr|`$!rMMM`0>!OBfI@J$;_k&MZo%CPv^d<}
z`vLCGoU_mV&hu)|%+Ahkl-dV*d>nEd6ciMEn1YN33JR*?{{}YtKcalIC-85=u!gEY
zQBZ2*aUV?q|JJB(8uC&oRTGql|1_?evX-o}?I%h~N(u@JGBUD%`QIQXr}#&-QBY`U
zX-P;($jQn7mHuVr|1K-v|UXHT4V9o{y93<>iH*mX?)?=^Yp>!pASj{hpJJRY^wtX}R}yzBAs>CD6%y
zZ>UyJRRJF9+f$NS2ai6RXp$5Wm~APr`cD=_5RWBpNf+8
z9+Q0$kwkWOM|Y2_z4_)`Z5|pLEikyIqw8wMx`mhb?(S|SHRZ0Weq?dQnTaXrlXPYt
z;#Z@=q<}zgc(?=|U1o$zWK4_)5jFhZ9#Ob!e9%NuSaU*Lc08k#+#N(S;u!ExJqweZ
zP6wJbWHy?5`=g-H*urF>THebi*+9(|If|j*?3?HmZh$Nd?R@m%*3Umb{)a|KM>Rbi
zRdkyU6{o~EQQ6Mx)}`YFXFg-}HRcXxV#SDS@q
zmST2~Dc@;^FD4ToJ12UZoROb1SO-HQbkS%+0uTdtA|ae@Lc?isj>&d>daMP?QtK
zHfm&88wZXe!H8?Yo)75MUFXuF{{FoIDW;nLS;~N0=2y7C!i9MPhLKrye-j-@FHK&C
zOkzf{7A9+X(dPvf76N2i7o;Az=V=4ErK13miLJeo3s3FDHW|N&CO1dEQtXG3K@8V!
zG~K^;1awP06FMN-%0#xEdPDXj6)(do;<0B;)B1tPv}Z-8s?bYd45daPdbs
zKcHSOn)8DN^3D{<(ZF(I9*6eu*Al=rdX35UY9+yW)ni)y{&<-D9dnek@qhHJY>HzB
zGP2i$&MD730cfT?9d;XP%qYVovvVPq+;*j>{^N=9kC1%|?Br^ENX<@--gF{c{1a2h
zu`Egw3f6wrnv*Pue>C)`^VNw3vS$*T2d0+C6Q8Ot#cY<+klx`UFv_dy7oa=^?m;!u
zG+%d;$D7#n%jIIks>ewAvIdHbX-!%ODN?fO`{n8~N;tEr=OnyemD>MQvkFo~Rg;UB
z3MHKq%rPzEs)I%l$L2Tlrl^@wb0&MQEDb@N^BY}i$4!PIk*OQIxar06Lp64=gae!^
zwx&>!-8ERa*Ia5SmS0N}TpF%Fbb2j9YH1ppgBq&|5(%w6=xy5CWRuHS@uM0U7i*_?
zM2EzyPge&sq)4|nH&kdM{n(jCxmn2(k+So{ci~&NG*q6Br$rXtefzQQPeqxB{|&7Y=f|CETV(wQ>beQmVG${X5_HE_
zN=BTTrYm8Y&GtS(^2YPiC8yN=-QM0F@9TAoHywYY3HS+XI{+;LQn$a6L-0xCfZT|)
zAreLdBggda8)KFE-~dK0+f_zKB%u^Or8713lYJqXq#5DqJeESsqzrg
zkY{&;EY-L=P*jp@5z;pLCyRfVcEzp@OMj1$5DMgGqLL=)vV~x+yO?8SS1PoEzYSw%
z>u&45#`~?c%iaA0GM_v0hay3AkuE--e&$Q!^AG8LyGnoHWO&LE7!me+j}l+-nEkOl
zzDwxd_w&uwFD?r`YRL+NgY9)7aTL~pJpRKz^3TG0C%HF%_TQL+`Ht6>5FW0H`B0sRcpb!?wV%(q|f{PZ60kF2JLTGb{47^BrM;Z*qaLm09%wT0(112
zAwzXsY-ev6hW|1s(l4M~FGoO>w*Ba1*42d|xTchV{R@Cw6SPHUq;
z^K4@@6PLGo#8IYtE3Z^a5a)!X
z!YAVrqw8c&MrV5ZIb+hrqhF1gAKmhUNpS5*oZImdCoVI
z+9qxK(EX*ky?u7Wor4a(Iz6)sF>9Hf;tOlAc;gBkyo!%-v!}J3JMv0sUFS&55p?DE
z)?e)S_40>C(`4!N)le3vkL1To9!ei$^N}T;u9XbjL>b?NpU^1j-P`HJK2X65+gpQi
z1-7{Gu9Mjw_7qyXd;-uSSZX+lwz1GMI{kGPD*&)AxlI)A8>hu{j#)yB!xh0>o5oi*pTG5
z=r+=g2prBymmrKJC9yXtJ--zrK9hBW$`~}0!ySWnEQnIY1Cn%Eb&j}{|&ISnB`
zPtn|=#M=GNVXh}Nyu_>R=z!;awm^G{;MN&mdu=wHsS-j>n!c{kk?DrMJ*z}A>cpsH
z2>5f%fT3M)nYhm~e4^Iauw=nE{czzJo*1SUBA%Dq}oTgy8u}vD(!pBbA*w)t(9mXP#TYKyFgx@6z^lZUpc1y}-q?UpR
zeHoZlitqIBk_Q!VyR61!^_dM8#_vwR#JhF5)ETq7`@D9x4QYY)WO32>y&UA~Ua=qz
zf)uH+>_o(kSO){&_R2?-WBjB~=thhOcno}^w2L{58DAv0r{04Q=>DEYSEQE3^=@hA
z&FA4Ynj@EeAMD)&U)ZLf|rqD|)NSKO0
zt;VnPRa*%=MTFoRX2tinKB}lU7{RVho0qWOXCy5FL|Zp~*9je>b(Cox7}M_?nc+U2
z>-?%F33}9_9J2-scbP6Fq}chda257t&}A@jmUqnVKegVH*FLt^G*bWWfLF*pndPl1
zNmby;oAWbrSUdGlP7#LXI_+QaL0{Xmbvs6g1|N?zbC3@|D^!2sW8*Y?m5Sa(bIX_g
zpVCp~iu~eQN9Lb${}``gTi4lmYpki!|5&kQTORaIy5f*I>0lZ=vW%%`XX$Za9OytC8N%}F=gDcXEa)C!FTtSt|L97sL--)OoQWoMFE2$$DJi!>7r>~!CTQ^
zD|Tcq{2}e*D@Ke)_vyi3_G31AKR=*>U$q%w1$9tut$}*tlPrOHE!zWEK
z_k5`-TrrGV6-a9Ju9F7^GEg!9a#jT$WTNCrX~{pYa|LZGPLsQ+!2atzD8dc3@DzdD
z^SA(_KW)I6DC7d7)TuaYGT;@fizvx6_i!(PDw=PV3B6x~DN2SNySLw;l8xaE>aHgg
z;M`f6L_E2~Gde#sV&mUpPS2%Uau3RRF3mO1sfIW|@R>!yE%M8{nk#t|TOe;#mV$Oh
z+Q>ZTV{boyHI$FeRrC2>z9RgTnvXM&`N^{e2d@uoXqVjlvGzZBc-yZ60bXqfLHN>-
z){_>!aX!C!7jnBlQxVDUeG9=Vg7;IDul)DFp(F`
zLct={Bp0O~O@eBMPt-2fj?Wm#j;^pwH+0x?D@=s~h)xWK0K+T@$|7`A@~ZXD3#^5$j~HiyOho?Hy5#6<1D$Cllyv2bC2EZmUDi$LXWs4FkG|I`&l;-{OMux$@n}`N?>O7j>#-_=jJBv
zx%IrXk&T>pfCxkGtv$ls>g#(Y9^LtJI6Lki4=U5F>aKW#dzlzc4&tSZjW|gAL*+V_dmMB4I~sHQpL~YEOK>!
z|4n|L^e7@)IKk1w>JVw7)EiGThky(2dtZ6=fAL8NqU-ZkCWc7y>N4|>%PEpfKoMv7
zo~zRmSeU*gn+oTuo0~mMeeY4tRSDUix3l$U_Ki3Cp8$VlYUbVJv`9GGd0K;g(9gp7
zPso}J@?T|tlLW4hN$}e9WZsV!F`2uFL9{^vb0c%0OOg
z6<#YlI>0YhxzF(177;nQKhV;C&v3~K$2w1zwSH{cn$<4)ckrH3@fuk4=f%X6wVp1!
zVI`GnbhM9b)tHiAO~H`*wYRc~mdwM3j{zmD&j1aS4As*qT*IH7r>;pQqp*{;k(e*P
zdIB^^x^_u@L@8LFhv_O@lNFu!Ba>BU@hDQjdwjKi+w(rTWhal#ok>${y8{%rS~m)C
zz+vrwxzkE@csgVmURuTFZJ)o-GI@k0{8Eb*oWsDdo{ySA)TN~F>cU%H|0GKGmWLgW
ze#HFPYhK8c#eRO#2}lAGFvUGIqsoFY#7tjzzU+H0t+-rnd4O<~T?@PjzxIOj?r~4}
z7I%{)Z=&j(P|+izao~wCo=M{ya=&0p&M(Op?@l@AM_P)#7!{`|ana8~t??etQwsb+
zIV^D4{OQIv5pI`lkC9MB?d659-4`Co#|jFbI?XqZGe>>(A?gw3D;_UO)55qom7SJx
zLw(`aHq#?aqwc=z1%M-!qs}bVOdi2aVp3bqBwBh?DgzHKuTa{JL
zPdfFjsB-my;IDqq*o8x_mtN%=YkFwKNK{ydQ_}v4gZzaf6z|ti2&-SQPjw8!t-%#{
zjeP7&9Ke^|s?7?Bd(E)4y8_5md{Kbrca}vD`pQtEhc0#M1-K}Xm%D4SC-Ee7nhlfc
zobWoS(uf95s72sY1-8OGu%ZU+HD4HsQX~Cc8x+emJ6W(QC>gzQfUKS-ck!J9Vcug&^gU{
zKPi_*W|-bqFvRwqxHp$jJmT@j>TX7A01Q0xIQDKTzvniw4PDT
zX!{mnEl5bA-ASbVG!j{@zgXGB)S}k1N?KM%M%+L}n#W@=wyuV-kT}e}V$xki52qn%*jws9^+G4^_CeuHJJLAfnViq^+&x
zMQXxh1vE+|u#uDnzn1!F0=r!BQ{I`K@8Q1Eh})}D(Mm!50X8%lk0Ht8daFDOxnPSN
zN1ifIPKaQ^!IDTeLaH
zmpf!48*d}I@TmP!%rGGGcd#RZL*X#q!-4-fNoj#K$!!vZLM6te+-e+tZR&
ziVTmZKN($z&_b|MyigUbn#mb)XO5Gx(+k7E<(tz}1q*p>R$^UdF##Q+UgiuxklzGH
zzq#B4aU_;!^Ek^Lj$%V@EvM|&YWQ2?p(s#j)65~f5l{boYG9@-3a|INm^8hf<#aI{rIyU
z9;gWGG*2d2qvQ2#$fy0IGb8z2EIH7%RlmUdfDX}j;@XsA!Mh{$w
z4BwyK-K!zz*8N>Hi*NaUG$!OYWyYkvhTv@>i`dNLaL%#`S7c{^1PE&0?Il);@`B%U
zjZyJ@9wF=(o^*;8QjRvYbF!syf!Tgyp^@IAsQ5se*#xHZ%^vdA=+3~DJOnP&=FCwj
zBAF6XF3KDa$Sv5US&{SMa2571T7^6wW={%+#mP#Yj6?{hO$_vXL~l#8WrRI!%4>>*x{!gu=p@F
zgp+Iq4Z|dvnL94YyQX~rF~>iTmH=lrkO%uJM?BF1NDC1dhk~wb`Oq4Ft3XpA5*GyFU$FHpl%D1w
zb!KzH9EIHdFY(C_ytZ3}7Xm-&jlf=fv%fhBZRx~LNN#^Nj(zd8s~w^`V1!Pqhy2|+
zfnS6@;pFj{B6Sm{x@dbdM1K&o-=4LkuC9Doo^da}97Ui2uP#1PREPxgEVq;Q1#-X9
zE(aK$<1KGEF*8BMVZO~ho?q7b>lK4TIZL^Qf(So%%v97anUIgPlvo#1>xt9>ChO^3
z^~>Hlx8(#qUDn}rq!LsLU4LbQ!Z$uJ2HcCaJ;C?Tw(Dr`dX1E~Xb{5@b=BQrdSREe
zM{HsAJxPzUceHE8efzGZ9_^=isd$#EBnYy2|hRo2F?~
z8V8Z}$;L0lN|vu#{o=+GYzLIUnm^}V$auiIP1wO+OCsK-CxZBYe)^N89HjYH&qPdB
z!6nz;G)4snwJ`lku^F#CCz?ly0b@PJid^*j4Uh6B5FX6|69EE_h-c~TPeQVkm`rOn
z_u5429_nZMv;U4?+dte`EcwqtRNJr#pg4<+A{Dr~IMW3A|5
zp09r@KuaC-BK$;#=x)K}E|1mS6@Q~Mm(iwGxD~VW3^)iTFw67aklX4;GVesPOHazw
zB{Zn@v7klGZ=?i7F9f
zzmMYsLp>Yvn2=7D(=2YytR&0?}ode81PpQBiwA3e1H?z@m4rS5pSOe$t65
zMaS;2V)nQ<)H(V!^m2zflH4>FnH>91##K(N&(X@0MLZ`8*-lBKXZD|9*C=~8nx0bz
z)*5~YwXgmA?BBG-n?&9h;#A44;|^s1!V$fz3~?fg=`+ag={NdLHIGMMUE1UY6y;;F
z>UN+f*!7O*9N<=AeB(U#@k)?L7oRM|f#9J=**P8MX1H9jtDB6>8&nhN^H=Wj+vZA!B6b57@RY$pEdaV2bSDjbJOKFNx7dqXw!Oq+ojbfj$t?k
zL~F7J#>ZkX-v;6$ML1^ez|IxovAhhZ!f}p$4ZflzRg_|mO=VO^SROxNXEw7~SXj)7Gm)M0
z;~G%5E~^e=8D{17hzNY*^h+7lWhjsV;hS$<
zuGYl)W|eLoeDVVym`Pc*bBn?~^0Hvd&lXwwya%lrhWc6;GT#EKF}cQNpg9kvRd3oR
zbF)lx)nV
zKj{HZOSy>!^?M9J=Dz>0gzY2|K;f&lJ1nyzy|s18IHkZZrzRg-EHczrP8mOchHiv0
z?8B3C9r$~3%M6CHE4c>U>tEapEHpYMa~=FyTO&LOza<9JiGO-s{A6ur*>J%`_lu@L
z$Vcytz5g)58RHuUB<1@>o$J}zs)JVl@ZFe&LgJS2d4XZ;-PrWPn`*<(xi}on>)!ep
zE3zHqT5m#7iQ8mE5l=J95RyVG`tFVbJc(ZV}HnIzVlL
z&n4Ycua>qea5VE?yehJUnUcico0w$9taXUR>uNN1j`N17?vqDf(~y_3i7NAE>|`k-
zS=;9)I^T+CP+*tIHcx-{%RnuV_Q0qf{R-j~M{xgnRH1;@Vh4tmPVV_R3uPBPqG>uG
zPm;B;yEfI;pjY?k9f^cs8c@|
zs>C5nSw52Mb%sVv%MTBREQkC;A?(B27dm|q{?|MxeK
N0+an9Qzc~*@;|~|C941c
literal 0
HcmV?d00001
diff --git a/public/Abyssinian/Clean/Clean_cf1.png b/public/Abyssinian/Clean/Clean_cf1.png
new file mode 100644
index 0000000000000000000000000000000000000000..04d8f72ac50fb94315bb719cd2e1d85d2ef7ac9d
GIT binary patch
literal 8579
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
literal 0
HcmV?d00001
diff --git a/public/Abyssinian/Cute/Cute0.png b/public/Abyssinian/Cute/Cute0.png
new file mode 100644
index 0000000000000000000000000000000000000000..72a950512dd34c291d91381f01d41c2f7c9b8ba5
GIT binary patch
literal 2718
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
literal 0
HcmV?d00001
diff --git a/public/Abyssinian/Cute/Cute1.png b/public/Abyssinian/Cute/Cute1.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff4a3dad3bbde762b55bb6dd9e7df7bd9b7288c1
GIT binary patch
literal 2631
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 qMDf-a^KYe;^6Vxg=uyGL#nVe}rDk*_
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