<feed xmlns='http://www.w3.org/2005/Atom'>
<title>webao/webAO/viewport/utils/handleICSpeaking.ts, branch master</title>
<subtitle>WebAO fork</subtitle>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/'/>
<entry>
<title>Remove attorneyMarkdown</title>
<updated>2026-04-18T16:52:23+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-04-06T22:06:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=3e5eda1fd61ab057472c4e8734ba57e1a0c84a33'/>
<id>3e5eda1fd61ab057472c4e8734ba57e1a0c84a33</id>
<content type='text'>
It only caused chat_config.ini to be requested a lot.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
It only caused chat_config.ini to be requested a lot.
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove toLowerCase mangling</title>
<updated>2026-04-18T16:52:22+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-16T14:35:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=8538104fd5573ba5eeade30ee4a20893224960f9'/>
<id>8538104fd5573ba5eeade30ee4a20893224960f9</id>
<content type='text'>
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):

&gt; When a URI uses components of the generic syntax, the component syntax
&gt; equivalence rules always apply; namely, that the scheme and host are
&gt; case-insensitive and therefore should be normalized to lowercase. For
&gt; example, the URI &lt;HTTP://www.EXAMPLE.com/&gt; is equivalent to
&gt; &lt;http://www.example.com/&gt;. The other generic syntax components are
&gt; assumed to be case-sensitive unless specifically defined otherwise by
&gt; 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.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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):

&gt; When a URI uses components of the generic syntax, the component syntax
&gt; equivalence rules always apply; namely, that the scheme and host are
&gt; case-insensitive and therefore should be normalized to lowercase. For
&gt; example, the URI &lt;HTTP://www.EXAMPLE.com/&gt; is equivalent to
&gt; &lt;http://www.example.com/&gt;. The other generic syntax components are
&gt; assumed to be case-sensitive unless specifically defined otherwise by
&gt; 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.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add asset preloading system for IC message rendering</title>
<updated>2026-04-01T11:59:13+00:00</updated>
<author>
<name>David Skoland</name>
<email>davidskoland@gmail.com</email>
</author>
<published>2026-04-01T11:59:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=10b413c0f0a31bc9476eed86812b6bb90f82caed'/>
<id>10b413c0f0a31bc9476eed86812b6bb90f82caed</id>
<content type='text'>
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) &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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) &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Catch rejected play() promises from browser autoplay policy</title>
<updated>2026-02-07T12:10:27+00:00</updated>
<author>
<name>David Skoland</name>
<email>davidskoland@gmail.com</email>
</author>
<published>2026-02-07T12:10:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=0c76b200cc68c59772df930acd34a58bd6272c7f'/>
<id>0c76b200cc68c59772df930acd34a58bd6272c7f</id>
<content type='text'>
Browsers reject .play() with a DOMException when the user hasn't
interacted with the document yet. Add .catch(() =&gt; {}) to all 9
play() call sites to suppress the uncaught promise rejection.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Browsers reject .play() with a DOMException when the user hasn't
interacted with the document yet. Add .catch(() =&gt; {}) to all 9
play() call sites to suppress the uncaught promise rejection.

Co-Authored-By: Claude Opus 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>bring back objection sounds for chars that dont have their own</title>
<updated>2026-01-01T16:46:49+00:00</updated>
<author>
<name>stonedDiscord</name>
<email>Tukz@gmx.de</email>
</author>
<published>2026-01-01T16:46:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=89d7319e4ae2d6466902cc3cea0c221b33f0e9dc'/>
<id>89d7319e4ae2d6466902cc3cea0c221b33f0e9dc</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>dont use opacity</title>
<updated>2026-01-01T16:44:40+00:00</updated>
<author>
<name>stonedDiscord</name>
<email>Tukz@gmx.de</email>
</author>
<published>2026-01-01T16:44:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=19855fa729af4551d17672e2be3f57884f3d5e0c'/>
<id>19855fa729af4551d17672e2be3f57884f3d5e0c</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>deal with this properly</title>
<updated>2026-01-01T15:56:17+00:00</updated>
<author>
<name>stonedDiscord</name>
<email>Tukz@gmx.de</email>
</author>
<published>2026-01-01T15:56:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=01ecb948edb015613e05bc2b6da4021137957745'/>
<id>01ecb948edb015613e05bc2b6da4021137957745</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>IC: treat empty preanim string as no preanim</title>
<updated>2025-10-25T22:56:03+00:00</updated>
<author>
<name>Bumaire</name>
<email>194399581+Bruma1re@users.noreply.github.com</email>
</author>
<published>2025-10-25T22:56:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=99d6cd425e9f98f25e4c1929e7123ad6f9adad4b'/>
<id>99d6cd425e9f98f25e4c1929e7123ad6f9adad4b</id>
<content type='text'>
When an emote is defined with empty preanimation string, such as EmoteName##emote#, and a user selects "Preanim," WebAO tries to look up a file with an empty name instead of disabling preanimation.
This commit fixes this, matching AO2 client behavior and not requiring character makers to put a magic "-" preanimation in char.ini.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When an emote is defined with empty preanimation string, such as EmoteName##emote#, and a user selects "Preanim," WebAO tries to look up a file with an empty name instead of disabling preanimation.
This commit fixes this, matching AO2 client behavior and not requiring character makers to put a magic "-" preanimation in char.ini.</pre>
</div>
</content>
</entry>
<entry>
<title>Prettified Code!</title>
<updated>2024-11-20T13:31:50+00:00</updated>
<author>
<name>stonedDiscord</name>
<email>stonedDiscord@users.noreply.github.com</email>
</author>
<published>2024-11-20T13:31:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=6684f3fce6e90fd0574d7bab63b629554ab03ef6'/>
<id>6684f3fce6e90fd0574d7bab63b629554ab03ef6</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Dont clear the text box if the message is an additive</title>
<updated>2024-09-29T17:28:51+00:00</updated>
<author>
<name>Caleb Mabry</name>
<email>36182383+caleb-mabry@users.noreply.github.com</email>
</author>
<published>2024-09-29T17:28:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/webao/commit/?id=7ef85f836cd75f668d4c555a88d791f35574b38d'/>
<id>7ef85f836cd75f668d4c555a88d791f35574b38d</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
