Review fixes: logoff inventory, socket stop, connect order, relog leftovers

F2: the logoff inventory is skipped when the host already let go of the
items (it may reset the session before reporting the logoff): an empty list
would have emptied the backend's inventory and overwritten the saved copy.
F3/F4: each socket start owns its run; Stop no longer blocks the game thread
and gives the run up to ten seconds to send what was queued (a large logoff
inventory) before closing, flushing that run's own send loop; a relog never
hears the previous run's frames.
F7: on connect, share_subscribe goes out before the first telemetry frame, as
the original sent them.
F8: a rare announcement still waiting at logoff is dropped rather than sent
as the next character.
F9: each dungeon map is sent once per login, as the original (reloaded per
login) did.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-25 13:06:50 +02:00
parent 71f14473c6
commit aec0ddb8d7
8 changed files with 223 additions and 82 deletions

View file

@ -223,6 +223,29 @@ public sealed class InventoryFeatureTests
Assert.Single(harness.FramesOfTypeRaw("full_inventory"));
}
[Fact]
public void Logoff_after_the_host_let_go_of_the_items_sends_nothing_and_keeps_the_saved_copy()
{
// The host may reset the session before it reports the logoff; an
// empty list then would wipe the backend's inventory.
using var harness = new PluginHarness("Mossy", arrange: host => Own(host, Tapers()));
LoginAndSettle(harness);
harness.Tick(0.1);
harness.Tick(0.1);
harness.Plugin.OnLogoff();
string? saved = harness.Host.Storage.ReadText("inventory.json");
Assert.NotNull(saved);
harness.Plugin.OnLogin();
LoginAndSettle(harness);
harness.Frames.Clear();
harness.Host.Automation.Items.Owned.Clear();
harness.Plugin.OnLogoff();
Assert.Empty(harness.FramesOfTypeRaw("full_inventory"));
Assert.Equal(saved, harness.Host.Storage.ReadText("inventory.json"));
}
[Fact]
public void The_taper_count_follows_the_stacks_in_the_packs()
{