diff options
| author | stonedDiscord <Tukz@gmx.de> | 2025-09-03 17:37:36 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-03 17:37:36 +0200 |
| commit | 0d2a3994e203755702ebe4afbd0f3c721ee8ce38 (patch) | |
| tree | 9347303eaa9daad5e10420ab1d90e24593c70df1 /webAO | |
| parent | 8e46e304f4defc7f9f4eb01922812b28a8585307 (diff) | |
| parent | 035951baf3819f56093f7156b345689aa5093f28 (diff) | |
Merge pull request #270 from AttorneyOnline/ext
Let the webhost specify the extensions use
Diffstat (limited to 'webAO')
| -rw-r--r-- | webAO/__tests__/tryUrls.test.ts | 28 | ||||
| -rw-r--r-- | webAO/client.ts | 13 | ||||
| -rw-r--r-- | webAO/client/fetchLists.ts | 19 | ||||
| -rw-r--r-- | webAO/client/handleCharacterInfo.ts | 6 | ||||
| -rw-r--r-- | webAO/client/setEmote.ts | 3 | ||||
| -rw-r--r-- | webAO/dom/updateBackgroundPreview.ts | 19 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleBN.ts | 76 | ||||
| -rw-r--r-- | webAO/packets/handlers/handlePV.ts | 3 | ||||
| -rw-r--r-- | webAO/utils/tryUrls.ts | 15 | ||||
| -rw-r--r-- | webAO/viewport/utils/setSide.ts | 3 |
10 files changed, 85 insertions, 100 deletions
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) { |
