diff options
Diffstat (limited to 'webAO')
| -rw-r--r-- | webAO/client.ts | 4 | ||||
| -rw-r--r-- | webAO/client/createArea.ts | 2 | ||||
| -rw-r--r-- | webAO/client/fetchLists.ts | 6 | ||||
| -rw-r--r-- | webAO/client/handleBans.ts | 6 | ||||
| -rw-r--r-- | webAO/client/saveChatLogHandle.ts | 4 | ||||
| -rw-r--r-- | webAO/dom/changeCharacter.ts | 2 | ||||
| -rw-r--r-- | webAO/dom/musicListFilter.ts | 2 | ||||
| -rw-r--r-- | webAO/dom/renderPlayerList.ts | 2 | ||||
| -rw-r--r-- | webAO/master.ts | 36 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleARUP.ts | 2 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleCT.ts | 11 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleLE.ts | 2 | ||||
| -rw-r--r-- | webAO/packets/handlers/handlePV.ts | 12 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleSI.ts | 2 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleSM.ts | 4 | ||||
| -rw-r--r-- | webAO/packets/handlers/handleZZ.ts | 8 | ||||
| -rw-r--r-- | webAO/styles/client.css | 8 | ||||
| -rw-r--r-- | webAO/styles/master.css | 4 | ||||
| -rw-r--r-- | webAO/ui.js | 2 | ||||
| -rw-r--r-- | webAO/utils/aoml.ts | 6 | ||||
| -rw-r--r-- | webAO/viewport/utils/handleICSpeaking.ts | 8 | ||||
| -rw-r--r-- | webAO/viewport/viewport.ts | 16 |
22 files changed, 92 insertions, 57 deletions
diff --git a/webAO/client.ts b/webAO/client.ts index 43b04f0c..f013f0a4 100644 --- a/webAO/client.ts +++ b/webAO/client.ts @@ -415,12 +415,12 @@ class Client extends EventEmitter { resetMusicList() { this.musics = []; - document.getElementById("client_musiclist").innerHTML = ""; + document.getElementById("client_musiclist").replaceChildren(); } resetAreaList() { this.areas = []; - document.getElementById("areas").innerHTML = ""; + document.getElementById("areas").replaceChildren(); fetchBackgroundList(); fetchEvidenceList(); fetchCharacterList(); diff --git a/webAO/client/createArea.ts b/webAO/client/createArea.ts index 9a40bef4..a90b49ad 100644 --- a/webAO/client/createArea.ts +++ b/webAO/client/createArea.ts @@ -18,7 +18,7 @@ export const createArea = (id: number, aname: string) => { const newarea = document.createElement("SPAN"); newarea.className = "area-button area-default"; newarea.id = `area${id}`; - newarea.innerText = thisarea.name; + newarea.textContent = thisarea.name; newarea.title = `Players: ${thisarea.players}\n` + `Status: ${thisarea.status}\n` + diff --git a/webAO/client/fetchLists.ts b/webAO/client/fetchLists.ts index 4e32abc9..710bc0e1 100644 --- a/webAO/client/fetchLists.ts +++ b/webAO/client/fetchLists.ts @@ -9,7 +9,7 @@ export const fetchBackgroundList = async () => { // the try catch will fail before here when there is no file const bg_select = <HTMLSelectElement>document.getElementById("bg_select"); - bg_select.innerHTML = ""; + bg_select.replaceChildren(); bg_select.add(new Option("Custom", "0")); bg_array.forEach((background: string) => { @@ -24,7 +24,7 @@ export const fetchCharacterList = async () => { const char_select = <HTMLSelectElement>( document.getElementById("client_iniselect") ); - char_select.innerHTML = ""; + char_select.replaceChildren(); char_select.add(new Option("Custom", "0")); @@ -43,7 +43,7 @@ export const fetchCharacterList = async () => { export const fetchEvidenceList = async () => { const evi_select = <HTMLSelectElement>document.getElementById("evi_select"); - evi_select.innerHTML = ""; + evi_select.replaceChildren(); evi_select.add(new Option("Custom", "0")); diff --git a/webAO/client/handleBans.ts b/webAO/client/handleBans.ts index 004b27ee..4abd1f07 100644 --- a/webAO/client/handleBans.ts +++ b/webAO/client/handleBans.ts @@ -7,8 +7,6 @@ import { safeTags } from "../encoding"; */ export const handleBans = (type: string, reason: string) => { document.getElementById("client_error_overlay")!.style.display = "flex"; - document.getElementById("client_errortext")!.innerHTML = - `${type}:<br>${safeTags(reason).replace(/\n/g, "<br />")}`; - (<HTMLElement>document.getElementById("client_reconnect")).style.display = - "none"; + document.getElementById("client_errortext")!.textContent = `${type}:\n${reason}`; + document.getElementById("client_reconnect")!.style.display = "none"; }; diff --git a/webAO/client/saveChatLogHandle.ts b/webAO/client/saveChatLogHandle.ts index 5e6b277b..b184e09d 100644 --- a/webAO/client/saveChatLogHandle.ts +++ b/webAO/client/saveChatLogHandle.ts @@ -8,8 +8,8 @@ export const saveChatlogHandle = async () => { for (let i = 0; i < icMessageLogs.length; i++) { const SHOWNAME_POSITION = 0; const TEXT_POSITION = 2; - const showname = icMessageLogs[i].children[SHOWNAME_POSITION].innerHTML; - const text = icMessageLogs[i].children[TEXT_POSITION].innerHTML; + const showname = icMessageLogs[i].children[SHOWNAME_POSITION].textContent; + const text = icMessageLogs[i].children[TEXT_POSITION].textContent; const message = `${showname}: ${text}`; messages.push(message); } diff --git a/webAO/dom/changeCharacter.ts b/webAO/dom/changeCharacter.ts index abf6f71e..586b1446 100644 --- a/webAO/dom/changeCharacter.ts +++ b/webAO/dom/changeCharacter.ts @@ -5,6 +5,6 @@ export function changeCharacter(_event: Event) { document.getElementById("client_waiting")!.style.display = "block"; document.getElementById("client_charselect")!.style.display = "block"; - document.getElementById("client_emo")!.innerHTML = ""; + document.getElementById("client_emo")!.replaceChildren(); } window.changeCharacter = changeCharacter; diff --git a/webAO/dom/musicListFilter.ts b/webAO/dom/musicListFilter.ts index b0a8c3ba..ce6b2f67 100644 --- a/webAO/dom/musicListFilter.ts +++ b/webAO/dom/musicListFilter.ts @@ -11,7 +11,7 @@ export function musiclist_filter(_event: Event) { document.getElementById("client_musicsearch") )).value; - musiclist_element.innerHTML = ""; + musiclist_element.replaceChildren(); for (const trackname of client.musics) { if (trackname.toLowerCase().indexOf(searchname.toLowerCase()) !== -1) { diff --git a/webAO/dom/renderPlayerList.ts b/webAO/dom/renderPlayerList.ts index c238f28b..6c696acc 100644 --- a/webAO/dom/renderPlayerList.ts +++ b/webAO/dom/renderPlayerList.ts @@ -3,7 +3,7 @@ import { AO_HOST } from "../client/aoHost"; export function renderPlayerList() { const list = document.getElementById("client_playerlist") as HTMLTableElement; - list.innerHTML = ""; + list.replaceChildren(); const header = list.createTHead().insertRow(); for (const label of ["Icon", "Character", "Showname", "OOC Name"]) { diff --git a/webAO/master.ts b/webAO/master.ts index b40763de..569795e9 100644 --- a/webAO/master.ts +++ b/webAO/master.ts @@ -167,13 +167,31 @@ function addServer(server: AOServer) { servers.push(server); - document.getElementById("masterlist").innerHTML += - `<details name="servers">` + - `<summary><p>${safeTags(server.name)} (${server.players})</p>` + - `<a class="button" href="${fullClientJoinURL}" target="_blank">Join</a>` + - `<a class="button" href="${fullClientWatchURL}" target="_blank">Watch</a></summary>` + - `<p>${safeTags(server.description)}</p>` + - `</details>`; + const masterlist = document.getElementById("masterlist"); + const details = document.createElement("details"); + details.name = "servers"; + const summary = document.createElement("summary"); + const title = document.createElement("p"); + title.textContent = `${server.name} (${server.players})`; + + const join = document.createElement("a"); + join.className = "button"; + join.href = fullClientJoinURL; + join.target = "_blank"; + join.textContent = "Join"; + + const watch = document.createElement("a"); + watch.className = "button"; + watch.href = fullClientWatchURL; + watch.target = "_blank"; + watch.textContent = "Watch"; + + summary.append(title, join, watch); + const desc = document.createElement("p"); + desc.className = "server-description"; + desc.textContent = server.description; + details.append(summary, desc); + masterlist.appendChild(details); } function processServerlist(serverlist: AOServer[]) { @@ -196,10 +214,10 @@ async function getMasterVersion(): Promise<string> { } function processClientVersion(data: string) { - document.getElementById("clientinfo").innerHTML = `Client version: ${data}`; + document.getElementById("clientinfo").textContent = `Client version: ${data}`; } function processMasterVersion(data: string) { - document.getElementById("serverinfo").innerHTML = + document.getElementById("serverinfo").textContent = `Master server version: ${data}`; } diff --git a/webAO/packets/handlers/handleARUP.ts b/webAO/packets/handlers/handleARUP.ts index 7f72b156..7f1c701d 100644 --- a/webAO/packets/handlers/handleARUP.ts +++ b/webAO/packets/handlers/handleARUP.ts @@ -30,7 +30,7 @@ export const handleARUP = (args: string[]) => { i ].status.toLowerCase()}`; - thisarea.innerText = `${client.areas[i].name} (${client.areas[i].players}) [${client.areas[i].status}]`; + thisarea.textContent = `${client.areas[i].name} (${client.areas[i].players}) [${client.areas[i].status}]`; thisarea.title = `Players: ${client.areas[i].players}\n` + diff --git a/webAO/packets/handlers/handleCT.ts b/webAO/packets/handlers/handleCT.ts index 29ec94c0..d4868bd4 100644 --- a/webAO/packets/handlers/handleCT.ts +++ b/webAO/packets/handlers/handleCT.ts @@ -9,12 +9,13 @@ const { mode } = queryParser(); export const handleCT = (args: string[]) => { if (mode !== "replay") { const oocLog = document.getElementById("client_ooclog")!; - const username = prepChat(args[1]); - let message = addLinks(prepChat(args[2])); - // Replace newlines with br - message = message.replace(/\n/g, "<br>"); + const username = unescapeChat(args[1]); + let message = addLinks(unescapeChat(args[2])); - oocLog.innerHTML += `${username}: ${message}<br>`; + const line = document.createElement("div"); + line.className = "ooc-line"; + line.textContent = `${username}: ${message}`; + oocLog.appendChild(line); if (oocLog.scrollTop + oocLog.offsetHeight + 120 > oocLog.scrollHeight) oocLog.scrollTo(0, oocLog.scrollHeight); } diff --git a/webAO/packets/handlers/handleLE.ts b/webAO/packets/handlers/handleLE.ts index ae1bb02c..dd2a2f13 100644 --- a/webAO/packets/handlers/handleLE.ts +++ b/webAO/packets/handlers/handleLE.ts @@ -22,7 +22,7 @@ export const handleLE = (args: string[]) => { } const evidence_box = document.getElementById("evidences"); - evidence_box.innerHTML = ""; + evidence_box.replaceChildren(); for (let i = 0; i <= client.evidences.length - 1; i++) { const evi_item = new Image(); evi_item.id = "evi_" + i; diff --git a/webAO/packets/handlers/handlePV.ts b/webAO/packets/handlers/handlePV.ts index ba48f36f..2e14ad2f 100644 --- a/webAO/packets/handlers/handlePV.ts +++ b/webAO/packets/handlers/handlePV.ts @@ -34,15 +34,17 @@ export const handlePV = async (args: string[]) => { const { emotes } = client; const emotesList = document.getElementById("client_emo"); emotesList.style.display = ""; - emotesList.innerHTML = ""; // Clear emote box + emotesList.replaceChildren(); const ini = await ensureCharIni(client.charID); me.side = ini.options.side; updateActionCommands(me.side); if (ini.emotions.number === 0) { - emotesList.innerHTML = `<span - id="emo_0" - alt="unavailable" - class="emote_button">No emotes available</span>`; + let emotesUnavail = document.createElement("span"); + emotesUnavail.id = "emo_0"; + emotesUnavail.className = "emote_button"; + emotesUnavail.textContent = "No emotes available"; + + emotesList.replaceChildren(emotesUnavail); } else { // Probe extensions once using button1_off, then reuse for all emotes const charPath = `${AO_HOST}characters/${encodeURI(me.name)}/emotions/`; diff --git a/webAO/packets/handlers/handleSI.ts b/webAO/packets/handlers/handleSI.ts index eac84e03..369806ba 100644 --- a/webAO/packets/handlers/handleSI.ts +++ b/webAO/packets/handlers/handleSI.ts @@ -14,7 +14,7 @@ export const handleSI = (args: string[]) => { fetchExtensions(); // create the charselect grid, to be filled by the character loader - document.getElementById("client_chartable")!.innerHTML = ""; + document.getElementById("client_chartable")!.replaceChildren(); for (let i = 0; i < client.char_list_length; i++) { const demothing = document.createElement("img"); diff --git a/webAO/packets/handlers/handleSM.ts b/webAO/packets/handlers/handleSM.ts index 1c3fd5e2..21f6ca59 100644 --- a/webAO/packets/handlers/handleSM.ts +++ b/webAO/packets/handlers/handleSM.ts @@ -8,13 +8,13 @@ import { createArea } from "../../client/createArea"; * @param {Array} args packet arguments */ export const handleSM = (args: string[]) => { - document.getElementById("client_loadingtext")!.innerHTML = "Loading Music "; + document.getElementById("client_loadingtext")!.textContent = "Loading Music "; client.resetMusicList(); client.resetAreaList(); client.musics_time = false; - document.getElementById("client_loadingtext")!.innerHTML = `Loading Music`; + document.getElementById("client_loadingtext")!.textContent = `Loading Music`; for (let i = 1; i < args.length - 1; i++) { // Check when found the song for the first time diff --git a/webAO/packets/handlers/handleZZ.ts b/webAO/packets/handlers/handleZZ.ts index 0496d420..66e7d15a 100644 --- a/webAO/packets/handlers/handleZZ.ts +++ b/webAO/packets/handlers/handleZZ.ts @@ -8,8 +8,12 @@ import { prepChat } from "../../encoding"; */ export const handleZZ = (args: string[]) => { const oocLog = document.getElementById("client_ooclog")!; - const message = args[1].replace(/\n/g, "<br>"); - oocLog.innerHTML += `$Alert: ${prepChat(message)}<br>`; + + const modAlert = document.createElement("div"); + modAlert.textContent = `$Alert: ${unescapeChat(args[1])}`; + modAlert.className = "ooc-line"; + oocLog.appendChild(modAlert); + if (oocLog.scrollTop > oocLog.scrollHeight - 60) { oocLog.scrollTop = oocLog.scrollHeight; } diff --git a/webAO/styles/client.css b/webAO/styles/client.css index 1c1b5c20..fa01ddc6 100644 --- a/webAO/styles/client.css +++ b/webAO/styles/client.css @@ -809,3 +809,11 @@ left: 0.5em; margin-right: -50%; } + +.ooc-line { + white-space: pre-wrap; +} + +#client_errortext { + white-space: pre-wrap; +} diff --git a/webAO/styles/master.css b/webAO/styles/master.css index cf9a7035..add9ed21 100644 --- a/webAO/styles/master.css +++ b/webAO/styles/master.css @@ -375,3 +375,7 @@ ul.navbar-nav.ml-auto { nav.navbar.fixed-top.navbar-expand-lg.navbar-dark.bg-dark.fixed-top { height: 65px; } + +.server-description { + white-space: pre-wrap; +} diff --git a/webAO/ui.js b/webAO/ui.js index c3a41585..1afd4615 100644 --- a/webAO/ui.js +++ b/webAO/ui.js @@ -194,7 +194,7 @@ golden.registerComponentFactoryFunction( "template", (container, componentState) => { const template = document.querySelector(`#${componentState.id}`); - container.element.innerHTML = template.innerHTML; + container.element.replaceChildren(template.content.cloneNode(true)); }, ); if (isMobileDevice) { diff --git a/webAO/utils/aoml.ts b/webAO/utils/aoml.ts index 76113990..79a5147d 100644 --- a/webAO/utils/aoml.ts +++ b/webAO/utils/aoml.ts @@ -75,7 +75,7 @@ const mlConfig = (iniContent: string) => { closingStack.pop(); colorStack.pop(); if (keepChar) { - currentSelector.innerHTML = letter; + currentSelector.textContent = letter; } } else if (startIdentifiers.has(letter)) { const color = identifiers.get(letter).color.split(","); @@ -87,10 +87,10 @@ const mlConfig = (iniContent: string) => { const currentColor = `color: rgb(${r},${g},${b});`; currentSelector.setAttribute("style", currentColor); if (keepChar) { - currentSelector.innerHTML = letter; + currentSelector.textContent = letter; } } else { - currentSelector.innerHTML = letter; + currentSelector.textContent = letter; if (colorStack.length === 0) { currentSelector.className = `text_${defaultColor}`; } else { diff --git a/webAO/viewport/utils/handleICSpeaking.ts b/webAO/viewport/utils/handleICSpeaking.ts index 84946d2d..79135548 100644 --- a/webAO/viewport/utils/handleICSpeaking.ts +++ b/webAO/viewport/utils/handleICSpeaking.ts @@ -317,7 +317,7 @@ export const handle_ic_speaking = async (playerChatMsg: ChatMsg) => { } else if (effectName.endsWith("strong")) { intensity = 400; } - if (intensity < fg.childElementCount) fg.innerHTML = ""; + if (intensity < fg.childElementCount) fg.replaceChildren(); else intensity = intensity - fg.childElementCount; for (let i = 0; i < intensity; i++) { @@ -331,11 +331,11 @@ export const handle_ic_speaking = async (playerChatMsg: ChatMsg) => { !badEffects.includes(effectName) ) { (<HTMLLinkElement>document.getElementById("effect_css")).href = ""; - fg.innerHTML = ""; + fg.replaceChildren(); const baseEffectUrl = `${AO_HOST}themes/default/effects/`; fg.src = `${baseEffectUrl}${encodeURI(effectName)}.webp`; } else { - fg.innerHTML = ""; + fg.replaceChildren(); fg.src = transparentPng; } @@ -353,7 +353,7 @@ export const handle_ic_speaking = async (playerChatMsg: ChatMsg) => { const output: HTMLSpanElement[] = []; for (const letter of client.viewport.getChatmsg().content) { const currentSelector = document.createElement("span"); - currentSelector.innerHTML = letter; + currentSelector.textContent = letter; currentSelector.className = `text_${COLORS[client.viewport.getChatmsg().color]}`; output.push(currentSelector); } diff --git a/webAO/viewport/viewport.ts b/webAO/viewport/viewport.ts index 1421c671..f13c3115 100644 --- a/webAO/viewport/viewport.ts +++ b/webAO/viewport/viewport.ts @@ -197,11 +197,11 @@ const viewport = (): Viewport => { const textSpeeds = new Set(["{", "}"]); // Changing Text Speed - if (textSpeeds.has(characterElement.innerHTML)) { + if (textSpeeds.has(characterElement.textContent)) { // Grab them all in a row const MAX_SLOW_CHATSPEED = 120; for (let i = textnow.length; i < chatmsg.content.length; i++) { - const currentCharacter = chatmsg.parsed[i - 1].innerHTML; + const currentCharacter = chatmsg.parsed[i - 1].textContent; if (currentCharacter === "}") { if (chatmsg.speed > 0) { chatmsg.speed -= 20; @@ -219,12 +219,12 @@ const viewport = (): Viewport => { } if ( - characterElement.innerHTML === COMMAND_IDENTIFIER && - (commands.has(nextCharacterElement?.innerHTML) || - nextCharacterElement?.innerHTML === "p") + characterElement.textContent === COMMAND_IDENTIFIER && + (commands.has(nextCharacterElement?.textContent) || + nextCharacterElement?.textContent === "p") ) { textnow = chatmsg.content.substring(0, textnow.length + 1); - const commandChar = nextCharacterElement.innerHTML; + const commandChar = nextCharacterElement.textContent; if (commandChar === "p") { // Collect digits after \p for pause duration @@ -233,9 +233,9 @@ const viewport = (): Viewport => { let offset = 1; while ( startPos + offset <= chatmsg.content.length && - /\d/.test(chatmsg.parsed[startPos + offset - 1]?.innerHTML || "") + /\d/.test(chatmsg.parsed[startPos + offset - 1]?.textContent || "") ) { - digits += chatmsg.parsed[startPos + offset - 1].innerHTML; + digits += chatmsg.parsed[startPos + offset - 1].textContent; textnow = chatmsg.content.substring(0, startPos + offset); offset++; } |
