<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ao2-client/src/packet_distribution.cpp, branch master</title>
<subtitle>AO2 client fork</subtitle>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/'/>
<entry>
<title>Constrain the lifetime of the demo server</title>
<updated>2026-03-30T13:07:11+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-24T23:10:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=14a48530d911e9d9d0539eb4c273ce1379534607'/>
<id>14a48530d911e9d9d0539eb4c273ce1379534607</id>
<content type='text'>
Demo server was being deleted and recreated every time the lobby was
constructed, so it was always active. This rendered the "are we playing
a demo" checks useless as they always assumed we did. Logs didn't work
because of it, for example.

Construct the demo server only when the user selects demo playback, and
destroy it during the destruction of courtroom.

Make log_filename based on the application path, so `logs` subdirectory
is created relative to the executable rather than the working directory.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Demo server was being deleted and recreated every time the lobby was
constructed, so it was always active. This rendered the "are we playing
a demo" checks useless as they always assumed we did. Logs didn't work
because of it, for example.

Construct the demo server only when the user selects demo playback, and
destroy it during the destruction of courtroom.

Make log_filename based on the application path, so `logs` subdirectory
is created relative to the executable rather than the working directory.
</pre>
</div>
</content>
</entry>
<entry>
<title>Handle extension packets using binary frames</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T18:56:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=d6352bc889638b82a887e0a1a138f2b8086dbbdb'/>
<id>d6352bc889638b82a887e0a1a138f2b8086dbbdb</id>
<content type='text'>
The subprotocol shall use binary frames, and AO protocol stays separated
within the text frames.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The subprotocol shall use binary frames, and AO protocol stays separated
within the text frames.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add authentication dialog</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T18:55:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=a124f46861d549ddc13485536962e34d80de939a'/>
<id>a124f46861d549ddc13485536962e34d80de939a</id>
<content type='text'>
Introduce start_auth_flow, a function invoked by typing `/auth username`
in OOC. It sends an public-key authentication request to the server,
starting the entire flow.

The flow invoves two dialogs: to select the key, and to enter the
passphrase to unlock the key. For convenience, each successful unlock
also remembers the key for that username on the server, storing this
in `saved_auth.json` (I chose JSON because I wanted it to stay
human-editable; INI would be better, but it suffers from bad platform
quirks in Qt).
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Introduce start_auth_flow, a function invoked by typing `/auth username`
in OOC. It sends an public-key authentication request to the server,
starting the entire flow.

The flow invoves two dialogs: to select the key, and to enter the
passphrase to unlock the key. For convenience, each successful unlock
also remembers the key for that username on the server, storing this
in `saved_auth.json` (I chose JSON because I wanted it to stay
human-editable; INI would be better, but it suffers from bad platform
quirks in Qt).
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove IL packet</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:50:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=5541e36f81d5d565f7a205ad1f7db2b2463ff553'/>
<id>5541e36f81d5d565f7a205ad1f7db2b2463ff553</id>
<content type='text'>
IL packet is a relic from pre-IPID days when moderators used it to get
the "IP list" of connected users.

Its function is to display a list of strings in the OOC chat box. That's
it. Not even some obscure feature that can be revived. Everything IL can
do, CT can do (the "OOC message" packet).
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
IL packet is a relic from pre-IPID days when moderators used it to get
the "IP list" of connected users.

Its function is to display a list of strings in the OOC chat box. That's
it. Not even some obscure feature that can be revived. Everything IL can
do, CT can do (the "OOC message" packet).
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove sending CT on server join</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:50:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=173c52f87d9519f2462c6f33a500cea005b71ada'/>
<id>173c52f87d9519f2462c6f33a500cea005b71ada</id>
<content type='text'>
Strange idea, no realization. Trying to set up a "username requirement"
is antithetical to AO's pseudonymous nature. At least, CT packet is not
the way to do this: nothing guarantees its uniqueness, it's prone to
spoofing if we can send arbitrary CT messages at some point during the
handshake, and not everyone has their OOC names preconfigured.

It was never meant to be. Delete it.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Strange idea, no realization. Trying to set up a "username requirement"
is antithetical to AO's pseudonymous nature. At least, CT packet is not
the way to do this: nothing guarantees its uniqueness, it's prone to
spoofing if we can send arbitrary CT messages at some point during the
handshake, and not everyone has their OOC names preconfigured.

It was never meant to be. Delete it.
</pre>
</div>
</content>
</entry>
<entry>
<title>Support passworded characters in character list</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:30:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=3b8bc386d316b6e177c814920f21f5ab5d798ee6'/>
<id>3b8bc386d316b6e177c814920f21f5ab5d798ee6</id>
<content type='text'>
This obscure feature has been present for years, from sending passwords
to the server to showing `char_passworded` image over character icons.

Servers could already exploit clients sending `PW` with a password every
time they select a character to implement passworded characters. The
clients had no way of knowing which ones were passworded, however, and
couldn't filter them despite "Passworded" checkbox being here all along.

The approach used by this commit is a hack. During loading, server sends
SC which is a list of characters, each one having name, description, and
evidence. In practice, only names were used. Descriptions were stored in
memory but unused, and evidence was ignored altogether. By adding a
magic value "P" in this "character evidence" field, server can mark
passworded characters without breaking Vanilla compatibility.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This obscure feature has been present for years, from sending passwords
to the server to showing `char_passworded` image over character icons.

Servers could already exploit clients sending `PW` with a password every
time they select a character to implement passworded characters. The
clients had no way of knowing which ones were passworded, however, and
couldn't filter them despite "Passworded" checkbox being here all along.

The approach used by this commit is a hack. During loading, server sends
SC which is a list of characters, each one having name, description, and
evidence. In practice, only names were used. Descriptions were stored in
memory but unused, and evidence was ignored altogether. By adding a
magic value "P" in this "character evidence" field, server can mark
passworded characters without breaking Vanilla compatibility.
</pre>
</div>
</content>
</entry>
<entry>
<title>demo fixes (#1095)</title>
<updated>2025-04-21T21:54:20+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-04-21T21:54:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=2977ed86202e158ffe9effb66ff74965b4586f95'/>
<id>2977ed86202e158ffe9effb66ff74965b4586f95</id>
<content type='text'>
- fix RD being recorded twice
- fix demos recording themselves</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- fix RD being recorded twice
- fix demos recording themselves</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'master' into cleanup</title>
<updated>2025-01-13T23:29:54+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-01-13T23:29:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=91e15ef48404a7bb03fec7873e977ac451be184b'/>
<id>91e15ef48404a7bb03fec7873e977ac451be184b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add the ability to "favorite" songs and pin them to the the top of the songlist (#1066)</title>
<updated>2025-01-13T23:28:56+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-01-13T23:28:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=047742a729f8f4f8f4e9c85bf475f75b16f4f7b7'/>
<id>047742a729f8f4f8f4e9c85bf475f75b16f4f7b7</id>
<content type='text'>
* add song favoriting

* remove incorrectly placed sort()

* store as qstringlist instead of using keys</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* add song favoriting

* remove incorrectly placed sort()

* store as qstringlist instead of using keys</pre>
</div>
</content>
</entry>
<entry>
<title>clazy cleanup</title>
<updated>2025-01-11T08:02:16+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-01-11T08:02:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=9d88356c0f53873bc740fc05a1af5c49577f039a'/>
<id>9d88356c0f53873bc740fc05a1af5c49577f039a</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
