aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstonedDiscord <Tukz@gmx.de>2025-09-03 17:37:36 +0200
committerGitHub <noreply@github.com>2025-09-03 17:37:36 +0200
commit0d2a3994e203755702ebe4afbd0f3c721ee8ce38 (patch)
tree9347303eaa9daad5e10420ab1d90e24593c70df1
parent8e46e304f4defc7f9f4eb01922812b28a8585307 (diff)
parent035951baf3819f56093f7156b345689aa5093f28 (diff)
Merge pull request #270 from AttorneyOnline/ext
Let the webhost specify the extensions use
-rw-r--r--public/index.html1
-rw-r--r--webAO/__tests__/tryUrls.test.ts28
-rw-r--r--webAO/client.ts13
-rw-r--r--webAO/client/fetchLists.ts19
-rw-r--r--webAO/client/handleCharacterInfo.ts6
-rw-r--r--webAO/client/setEmote.ts3
-rw-r--r--webAO/dom/updateBackgroundPreview.ts19
-rw-r--r--webAO/packets/handlers/handleBN.ts76
-rw-r--r--webAO/packets/handlers/handlePV.ts3
-rw-r--r--webAO/utils/tryUrls.ts15
-rw-r--r--webAO/viewport/utils/setSide.ts3
11 files changed, 85 insertions, 101 deletions
diff --git a/public/index.html b/public/index.html
index 89e7740..5078682 100644
--- a/public/index.html
+++ b/public/index.html
@@ -77,7 +77,6 @@
<link rel="stylesheet" type="text/css" href="styles/master.css" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<link rel="icon" href="favicon.ico" />
- <link rel="manifest" href="manifest.json" />
<script>
// Check that service workers are supported
if ("serviceWorker" in navigator) {
diff --git a/webAO/__tests__/tryUrls.test.ts b/webAO/__tests__/tryUrls.test.ts
deleted file mode 100644
index 4a32f32..0000000
--- a/webAO/__tests__/tryUrls.test.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import fileExists from "../utils/fileExists";
-import tryUrls from "../utils/tryUrls";
-import transparentPng from "../constants/transparentPng";
-jest.mock("../utils/fileExists");
-
-const mockFileExists = fileExists as jest.MockedFunction<typeof fileExists>;
-
-describe("tryUrls", () => {
- it("Should try multiple file extensions", async () => {
- const url = "localhost/stoneddiscord/assets";
- mockFileExists
- .mockReturnValueOnce(Promise.resolve(false))
- .mockReturnValueOnce(Promise.resolve(false))
- .mockReturnValueOnce(Promise.resolve(false))
- .mockReturnValueOnce(Promise.resolve(true));
- const actual = await tryUrls(url);
- const expected = "localhost/stoneddiscord/assets.apng";
- expect(actual).toBe(expected);
- });
-
- it("Should return a transparent png if it cant find any assets", async () => {
- const url = "localhost/stoneddiscord/assets";
- mockFileExists.mockReturnValue(Promise.resolve(false));
- const actual = await tryUrls(url);
- const expected = transparentPng;
- expect(actual).toBe(expected);
- });
-});
diff --git a/webAO/client.ts b/webAO/client.ts
index 4d8390a..40884ff 100644
--- a/webAO/client.ts
+++ b/webAO/client.ts
@@ -19,6 +19,7 @@ import {
fetchBackgroundList,
fetchEvidenceList,
fetchCharacterList,
+ fetchExtensions,
} from "./client/fetchLists";
import getCookie from "./utils/getCookie";
import setCookie from "./utils/setCookie";
@@ -97,6 +98,7 @@ fpPromise
}
client = new Client(connectionString);
+ fetchExtensions();
client.connect();
client.hdid = hdid;
isLowMemory();
@@ -143,7 +145,6 @@ class Client extends EventEmitter {
sender: ISender;
checkUpdater: any;
_lastTimeICReceived: any;
- manifest: string[];
viewport: Viewport;
partial_packet: boolean;
temp_packet: string;
@@ -151,6 +152,10 @@ class Client extends EventEmitter {
connect: () => void;
loadResources: () => void;
isLowMemory: () => void;
+ charicon_extensions: string[];
+ emote_extensions: string[];
+ emotions_extensions: string[];
+ background_extensions: string[];
constructor(connectionString: string) {
super();
@@ -197,7 +202,6 @@ class Client extends EventEmitter {
this.musics = [];
this.musics_time = false;
this.callwords = [];
- this.manifest = [];
this.resources = getResources(AO_HOST, theme);
this.selectedEmote = -1;
this.selectedEvidence = -1;
@@ -209,6 +213,10 @@ class Client extends EventEmitter {
this.temp_packet = "";
loadResources;
isLowMemory;
+ this.charicon_extensions = [".png", ".webp"];
+ this.emote_extensions = [".gif", ".png", ".apng", ".webp", ".webp.static"];
+ this.emotions_extensions = [".png", ".webp"];
+ this.background_extensions = [".png", ".gif"];;
}
/**
@@ -404,7 +412,6 @@ class Client extends EventEmitter {
resetAreaList() {
this.areas = [];
document.getElementById("areas").innerHTML = "";
-
fetchBackgroundList();
fetchEvidenceList();
fetchCharacterList();
diff --git a/webAO/client/fetchLists.ts b/webAO/client/fetchLists.ts
index 2489c97..2f2fd59 100644
--- a/webAO/client/fetchLists.ts
+++ b/webAO/client/fetchLists.ts
@@ -50,8 +50,6 @@ export const fetchEvidenceList = async () => {
try {
const evidata = await request(`${AO_HOST}evidence.json`);
const evi_array = JSON.parse(evidata);
- // the try catch will fail before here when there is no file
-
evi_array.forEach((evi: string) => {
evi_select.add(new Option(evi));
});
@@ -60,12 +58,19 @@ export const fetchEvidenceList = async () => {
}
};
-export const fetchManifest = async () => {
+export const fetchExtensions = async () => {
try {
- const manifestdata = await request(`${AO_HOST}manifest.txt`);
- client.manifest = manifestdata.split(/\r\n|\n\r|\n|\r/);
- // the try catch will fail before here when there is no file
+ const extensiondata = await request(`${AO_HOST}extensions.json`);
+ const allextensions = JSON.parse(extensiondata);
+ client.charicon_extensions = allextensions.charicon_extensions || [".png", ".webp"];
+ client.emote_extensions = allextensions.emote_extensions || [".gif", ".png", ".apng", ".webp", ".webp.static"];
+ client.emotions_extensions = allextensions.emotions_extensions || [".png", ".webp"];
+ client.background_extensions = allextensions.background_extensions || [".png", ".gif", ".webp", ".apng"];
+ console.log("charicons "+client.charicon_extensions)
+ console.log("emotes "+client.emote_extensions)
+ console.log("emotions "+client.emotions_extensions)
+ console.log("backgrounds "+client.background_extensions)
} catch (err) {
- console.warn("there was no manifest.txt file");
+ console.warn("there was no extensions.json file");
}
};
diff --git a/webAO/client/handleCharacterInfo.ts b/webAO/client/handleCharacterInfo.ts
index 3f81e57..a364b5e 100644
--- a/webAO/client/handleCharacterInfo.ts
+++ b/webAO/client/handleCharacterInfo.ts
@@ -6,13 +6,13 @@ import fileExists from "../utils/fileExists";
import { AO_HOST } from "./aoHost";
export const getCharIcon = async (img: HTMLImageElement, charname: string) => {
- const extensions = [".png", ".webp"];
+ const charicon_extensions = [".png", ".webp"];
img.alt = charname;
const charIconBaseUrl = `${AO_HOST}characters/${encodeURI(
charname.toLowerCase(),
)}/char_icon`;
- for (let i = 0; i < extensions.length; i++) {
- const fileUrl = charIconBaseUrl + extensions[i];
+ for (let i = 0; i < charicon_extensions.length; i++) {
+ const fileUrl = charIconBaseUrl + charicon_extensions[i];
const exists = await fileExists(fileUrl);
if (exists) {
img.alt = charname;
diff --git a/webAO/client/setEmote.ts b/webAO/client/setEmote.ts
index 70f23ac..4c05afc 100644
--- a/webAO/client/setEmote.ts
+++ b/webAO/client/setEmote.ts
@@ -23,9 +23,8 @@ const setEmote = async (
const emoteSelector = document.getElementById(
`client_${position}${pairID}_img`,
) as HTMLImageElement;
- const extensionsMap = [".gif", ".png", ".apng", ".webp", ".webp.static"];
- for (const extension of extensionsMap) {
+ for (const extension of client.emote_extensions) {
// Hides all sprites before creating a new sprite
if (
diff --git a/webAO/dom/updateBackgroundPreview.ts b/webAO/dom/updateBackgroundPreview.ts
index 61eec58..2b8a18b 100644
--- a/webAO/dom/updateBackgroundPreview.ts
+++ b/webAO/dom/updateBackgroundPreview.ts
@@ -1,5 +1,20 @@
import { AO_HOST } from "../client/aoHost";
-import tryUrls from "../utils/tryUrls";
+import fileExists from "../utils/fileExists";
+import transparentPng from "../constants/transparentPng";
+
+const urlExtensionsToTry = [".png", ".gif", ".webp", ".apng"];
+const tryBackgroundUrls = async (url: string) => {
+ for (let i = 0; i < urlExtensionsToTry.length; i++) {
+ const extension = urlExtensionsToTry[i];
+ const fullFileUrl = url + extension;
+ const exists = await fileExists(fullFileUrl);
+ if (exists) {
+ return fullFileUrl;
+ }
+ }
+ return transparentPng;
+};
+export default tryBackgroundUrls;
/**
* Update background preview.
@@ -20,7 +35,7 @@ export function updateBackgroundPreview() {
} else {
background_filename.style.display = "none";
}
- tryUrls(
+ tryBackgroundUrls(
`${AO_HOST}background/${encodeURI(
background_select.value.toLowerCase(),
)}/defenseempty`,
diff --git a/webAO/packets/handlers/handleBN.ts b/webAO/packets/handlers/handleBN.ts
index aeea03b..769a0dc 100644
--- a/webAO/packets/handlers/handleBN.ts
+++ b/webAO/packets/handlers/handleBN.ts
@@ -5,7 +5,29 @@ import { updateBackgroundPreview } from "../../dom/updateBackgroundPreview";
import { getIndexFromSelect } from "../../dom/getIndexFromSelect";
import { switchPanTilt } from "../../dom/switchPanTilt";
import transparentPng from "../../constants/transparentPng";
-import tryUrls from "../../utils/tryUrls";
+import fileExists from "../../utils/fileExists";
+
+function setBackgroundImage(elementid: string, bgname: string, bgpart: string): boolean {
+
+ let url;
+ let success = false;
+ for (const extension of client.background_extensions) {
+ url = `${AO_HOST}background/${encodeURI(bgname.toLowerCase())}/${bgpart}${extension}`;
+
+ const exists = fileExists(url);
+
+ if (exists) {
+ success = true;
+ break;
+ }
+ }
+ if (success)
+ (<HTMLImageElement>document.getElementById(elementid)).src = url;
+ else
+ (<HTMLImageElement>document.getElementById(elementid)).src = transparentPng;
+ return success;
+}
+
/**
* Handles a background change.
@@ -28,43 +50,25 @@ export const handleBN = (args: string[]) => {
client.viewport.getBackgroundName();
}
- tryUrls(
- `${AO_HOST}background/${encodeURI(args[1].toLowerCase())}/defenseempty`,
- ).then((resp) => {
- (<HTMLImageElement>document.getElementById("bg_preview")).src = resp;
- });
- tryUrls(`${bgfolder}defensedesk`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_def_bench")).src = resp;
- });
- tryUrls(`${bgfolder}stand`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_wit_bench")).src = resp;
- });
- tryUrls(`${bgfolder}prosecutiondesk`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_pro_bench")).src = resp;
- });
- tryUrls(`${bgfolder}court`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court")).src = resp;
- if (resp !== transparentPng) {
- (<HTMLInputElement>document.getElementById("client_pantilt")).checked =
+
+ setBackgroundImage("bg_preview",args[1],"defenseempty")
+
+ setBackgroundImage("client_def_bench",args[1],"defensedesk")
+ setBackgroundImage("client_wit_bench",args[1],"stand")
+ setBackgroundImage("client_pro_bench",args[1],"prosecutiondesk")
+
+ setBackgroundImage("client_court_def",args[1],"defenseempty")
+ setBackgroundImage("client_court_wit",args[1],"witnessempty")
+ setBackgroundImage("client_court_pro",args[1],"prosecutorempty")
+
+ setBackgroundImage("client_court_deft",args[1],"transition_def")
+ setBackgroundImage("client_court_prot",args[1],"transition_pro")
+
+ if(setBackgroundImage("client_court",args[1],"court")) {
+ (<HTMLInputElement>document.getElementById("client_pantilt")).checked =
true;
switchPanTilt();
- }
- });
- tryUrls(`${bgfolder}defenseempty`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court_def")).src = resp;
- });
- tryUrls(`${bgfolder}transition_def`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court_deft")).src = resp;
- });
- tryUrls(`${bgfolder}witnessempty`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court_wit")).src = resp;
- });
- tryUrls(`${bgfolder}transition_pro`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court_prot")).src = resp;
- });
- tryUrls(`${bgfolder}prosecutorempty`).then((resp) => {
- (<HTMLImageElement>document.getElementById("client_court_pro")).src = resp;
- });
+ }
if (client.charID === -1) {
client.viewport.set_side({
diff --git a/webAO/packets/handlers/handlePV.ts b/webAO/packets/handlers/handlePV.ts
index 900ea89..4ac747f 100644
--- a/webAO/packets/handlers/handlePV.ts
+++ b/webAO/packets/handlers/handlePV.ts
@@ -58,9 +58,8 @@ export const handlePV = async (args: string[]) => {
}
// Make sure the asset server is case insensitive, or that everything on it is lowercase
- const extensionsMap = [".png", ".webp"];
let url;
- for (const extension of extensionsMap) {
+ for (const extension of client.emotions_extensions) {
url = `${AO_HOST}characters/${encodeURI(
me.name.toLowerCase(),
)}/emotions/button${i}_off${extension}`;
diff --git a/webAO/utils/tryUrls.ts b/webAO/utils/tryUrls.ts
deleted file mode 100644
index 127bc5b..0000000
--- a/webAO/utils/tryUrls.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import fileExists from "./fileExists";
-import transparentPng from "../constants/transparentPng";
-const urlExtensionsToTry = [".png", ".gif", ".webp", ".apng"];
-const tryUrls = async (url: string) => {
- for (let i = 0; i < urlExtensionsToTry.length; i++) {
- const extension = urlExtensionsToTry[i];
- const fullFileUrl = url + extension;
- const exists = await fileExists(fullFileUrl);
- if (exists) {
- return fullFileUrl;
- }
- }
- return transparentPng;
-};
-export default tryUrls;
diff --git a/webAO/viewport/utils/setSide.ts b/webAO/viewport/utils/setSide.ts
index fd229e1..c9948e2 100644
--- a/webAO/viewport/utils/setSide.ts
+++ b/webAO/viewport/utils/setSide.ts
@@ -1,7 +1,6 @@
import { positions } from "../constants/positions";
import { AO_HOST } from "../../client/aoHost";
import { client } from "../../client";
-import tryUrls from "../../utils/tryUrls";
import findImgSrc from "../../utils/findImgSrc";
/**
@@ -55,7 +54,7 @@ export const set_side = async ({
if (showSpeedLines === true) {
court.src = `${AO_HOST}themes/default/${encodeURI(speedLines)}`;
} else {
- court.src = await tryUrls(client.viewport.getBackgroundFolder() + bg);
+ //court.src = await tryBackgroundUrls(client.viewport.getBackgroundFolder() + bg);
}
if (showDesk === true && desk) {