aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
5 daysiniParse: fix case mangling and double regexOsmium Sorcerer
INI parser normalized everything in INI (except for "showname" value) and recomputed regex match twice for parameters and sections.
5 daysRemove toLowerCase manglingOsmium Sorcerer
For whatever reason, WebAO decides to normalize almost every string component in URLs, packets, and INI files to lower case. First, the glaring issue. In the URLs, this handling of paths is utterly broken and corrupts data. By mangling characters, you change the resource identity and break valid URLs. According to section 6.2.2.1 of RFC 3986 (Case Normalization): > When a URI uses components of the generic syntax, the component syntax > equivalence rules always apply; namely, that the scheme and host are > case-insensitive and therefore should be normalized to lowercase. For > example, the URI <HTTP://www.EXAMPLE.com/> is equivalent to > <http://www.example.com/>. The other generic syntax components are > assumed to be case-sensitive unless specifically defined otherwise by > the scheme (see Section 6.2.3) Scheme and host _are_ case-insensitive. Path is _not_, so isn't everything else. Section 6.2.3 doesn't define any normalization for the path component in HTTP schemes. Thus, example.com/item and example.com/Item are two different resources. I can only think of idiotic conventions of a particular poorly designed file system when it comes to this absurdity. There's no reason to drag them around in our developments. For these systems, case doesn't matter anyway, normalization is their job, not server hosts' who end up having to either rewrite every URL request for every asset, or mangle their asset directory and then rewrite almost every INI config (and spam "showname=Name" everywhere because now your character directory has to be "name"). So, instead of using absurd ad-hoc solutions to a broken implementation such as forcing everything to lower case on the server side, this commit attempts to fix the root issue and make URL handling conformant to relevant standards. Similar situation with strings within packets, although not as severe in practice. Case must be preserved, otherwise it's corrupting data for no reason. If a normalization is needed, it should be done at the call site of whatever requires it (like a filtering function), not by the parser. As for the INI, it's opinionated. While the values absolutely must not be normalized, a case can be made for keys and section names: why not allow "Options", "options", or even "oPtiOnS"? It's more convenient, and corresponds to the platform quirk of Windows (which Qt unfortunately inherits in AO2 Client). I don't think there's a good reason to allow such leniency in parsing, and removing superfluous normalization is a better move: less data transformations, less ambiguity, more strictness. In practice, INIs tend to be well-formed, and it's good discipline to write them this way. In several places, the case-folding does make sense: callwords, OOC commands, CSS class names for areas, and character list filters. These will behave weirdly and inconveniently without it. In most places, however, it only causes unnecessary breakage.
5 daysRemove CH-sending timerOsmium Sorcerer
CH is an application-level keepalive packet that clients periodically send for two reasons: 1. It tells the server they're still connected, preventing timeouts. 2. By measuring latency between sending CH and receiving CHECK, a client can display ping. Keepalive is redundant because WebSocket can handle that via PING frames on a transport layer. WebAO also completely ignores CHECK and sends CH every five seconds, which is superfluous (AO2 Client sends it once every 45 seconds, in comparison). Sending CH via `setInterval` was also problematic: browsers seem to throttle it when the tab becomes inactive, preventing periodic pings and leading to the server disconnecting inactive browser clients.
5 dayshide confusing text for banned playersstonedDiscord
13 daysbigger evidense descriptionstonedDiscord
14 daysfix layton sfxstonedDiscord
2026-04-06Merge pull request #301 from AttorneyOnline/rendering-fixstonedDiscord
Fix IC rendering race conditions with asset preloading
2026-04-06Merge pull request #298 from AttorneyOnline/reconnectstonedDiscord
Add reconnect UI
2026-04-03Merge pull request #304 from SyntaxNyah/masterstonedDiscord
Hide character name in music log when showname is set
2026-04-03Merge pull request #302 from AttorneyOnline/speedlines-fixstonedDiscord
Fix speedlines bug
2026-04-03Use nameplate/showname args for music log instead of manual string constructionSyntaxNyah
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03Hide character name in music log when showname is setSyntaxNyah
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02Fix preanims not playing on blank postsDavid Skoland
The early return guard `textnow === chatmsg.content` was firing on the first tick for empty messages ("" === ""), short-circuiting the entire animation timeline before the preanim or shout phases could run. Now the guard also checks that both tick phases have completed before allowing the early exit. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02Fix speedlines bugDavid Skoland
2026-04-01Merge pull request #300 from AttorneyOnline/pick-char-and-areastonedDiscord
Enable auto pick area and char
2026-04-01fix only area bugDavid Skoland
2026-04-01always hide charselectDavid Skoland
2026-04-01fix char select bugDavid Skoland
2026-04-01Add asset preloading system for IC message renderingDavid Skoland
Fix rendering race conditions where character sprites, pre-animations, and paired character assets were displayed before being downloaded. All assets referenced in an MS packet are now resolved and preloaded into the browser cache before the animation timeline starts. - Add unified assetCache module with session-wide promise caching - Add preloadMessageAssets orchestrator for parallel asset resolution - Cache fileExists HEAD requests so missing files aren't re-probed - Preload all SFX (emote, shout, realization, stab) alongside sprites - Use synchronous setEmoteFromUrl at all render transition points - Graceful fallback to legacy setEmote if preloading times out Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01Enable auto pick area and charDavid Skoland
2026-03-28remove UI related changesDavid Skoland
2026-03-24no initial textDavid Skoland
2026-03-24signatureDavid Skoland
2026-03-24typescript fixDavid Skoland
2026-03-24add comment explaining assumptionDavid Skoland
2026-03-24Merge branch 'master' into reconnectDavid Skoland
2026-03-24Merge pull request #297 from AttorneyOnline/type-fixesstonedDiscord
Fix all TypeScript errors with Window interface declarations
2026-03-24Add Connected and Disconnected noticesDavid Skoland
2026-03-24no double noticeDavid Skoland
2026-03-24Add reconnect UI, disconnect button, and visual cleanupDavid Skoland
- Redesign disconnect overlay as a full-screen modal with dark backdrop - Add working Reconnect button that properly re-establishes WebSocket connection - Add Disconnect button in Settings for testing - Separate disconnect and ban/kick codepaths (no reconnect on ban) - Log disconnect notice in IC log using hrtext style - Refactor area list rendering from client state (renderAreaList) - Extract appendICNotice for reusable IC log notices - Clean up charselect: hide during loading, simplify toolbar layout - Freshen loading screen and charselect styling - Remove loading progress text updates (just show "Loading...") - Guard against undefined client.chars and client.serv Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18dont skip empty descriptionsstonedDiscord
2026-02-27Add Window interface declarations to fix TypeScript errorsDavid Skoland
Extend the global Window interface with custom properties assigned at runtime (e.g. pickEmotion, resizeChatbox, area_click) to resolve 18 TS2339/TS2551 errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25Merge pull request #292 from AttorneyOnline/pausestonedDiscord
Pause
2026-02-12bump version because akashi thinks we're stupidstonedDiscord
2026-02-11Merge pull request #293 from OmniTroid/better-charloadingstonedDiscord
Better charloading
2026-02-11Merge pull request #294 from OmniTroid/better-emoteloadingstonedDiscord
Speed up emote icon loading by deducing extension from first button
2026-02-11Deduce emote icon extension from first button to speed up loadingDavid Skoland
Instead of probing extensions for every emote button (N*M HEAD requests), probe once using button1_off and reuse the result for all buttons. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11Clamp playerlist char icons to 60x60 pixelsDavid Skoland
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11Filter playerlist by area and remove Area columnDavid Skoland
Hide players not in the client's current area. Re-render playerlist on area switch. Remove the now-redundant Area column. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11Add area column to playerlistDavid Skoland
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10Use charName directly for playerlist rendering and add table stylingDavid Skoland
Render char icons and names from the character name string (PU type 1) instead of gating on charId lookup. Add header row and row separators to the playerlist table. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10Refactor playerlist to state-driven rendering with renderPlayerListDavid Skoland
handlePR and handlePU now only update client.playerlist state, and renderPlayerList handles all DOM rendering from that state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Use setAOhost return value instead of stale AO_HOST importDavid Skoland
setAOhost now returns the current AO_HOST so handleASS can use the freshly set value rather than the import captured before the update. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Fix playerlist icons using wrong asset URLDavid Skoland
PR/PU packets arrive before the ASS packet, so playerlist icon srcs were set with the default AO_HOST. Now handleASS re-applies the correct asset URL to existing playerlist images after AO_HOST updates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Prefetch char.ini for characters present in area via playerlistDavid Skoland
Store player data (charId, area) in an in-memory Map on the client, updated by PR/PU packet handlers. Use this to eagerly load char.ini when a player's character appears in our area or when switching areas, eliminating the lazy-load delay on first IC message. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Use charicon_extensions from extensions.json for char icon URLsDavid Skoland
Instead of hardcoding .png, read the preferred extension from client.charicon_extensions[0] (populated via extensions.json), falling back to .png if unavailable. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Catch rejected play() promises from browser autoplay policyDavid Skoland
Browsers reject .play() with a DOMException when the user hasn't interacted with the document yet. Add .catch(() => {}) to all 9 play() call sites to suppress the uncaught promise rejection. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07Defer char.ini loading and use direct img src for char iconsDavid Skoland
Instead of eagerly fetching char_icon (with HEAD requests per extension) and char.ini for every character on join, set img.src directly to char_icon.png and defer char.ini loading until actually needed (character selection via handlePV, or first IC message via handleMS). This eliminates thousands of HTTP requests on join for large character lists. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-03digit offsetsstonedDiscord
2026-02-03pstonedDiscord