Quests: /myquests parsing and the 30-second quest stream

The backend's quest panel shows the stipend, blank aug gem and insatiable
jaw timers from the `quest` frame, so the port reads /myquests the way the
original did (a three-second window of chat lines matched by its regex)
and streams the three priority stamps every 30 s with the same five-field
frame and the same countdown strings. The name table is copied as it was,
so the duplicate insatiableeaterjaw entry still resolves to the later name.
Timers run on the tick scheduler instead of thread-pool timers.

The session tests clear the login-time /myquests before counting the
commands the backend ran.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-25 12:14:25 +02:00
parent 5dbb294a96
commit 0b5da797e0
6 changed files with 857 additions and 2 deletions

View file

@ -9,6 +9,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Receive("{\"player_name\":\"mossy\",\"command\":\"/a hello\"}");
Assert.Empty(harness.Host.Automation.Chat.Submitted);
@ -23,6 +25,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Receive("{\"player_name\":\"Horan\",\"command\":\"/a hello\"}");
harness.Tick(0.01);
@ -35,6 +39,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Receive("{\"player_name\":\"Mossy\",\"command\":\"/one\"}");
harness.Receive("{\"player_name\":\"Mossy\",\"command\":\"/two\"}");
@ -49,6 +55,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
var toggles = new List<bool>();
harness.Session.RadarToggle = on => toggles.Add(on);
@ -68,6 +76,8 @@ public sealed class BackendSessionTests
var seen = new List<string>();
harness.Session.AddShareHandler(new RecordingShareHandler(seen));
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Receive("{\"type\":\"share_vital_update\",\"character_name\":\"Horan\"}");
@ -81,6 +91,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Receive("not json");
harness.Receive("[1,2,3]");
@ -94,6 +106,8 @@ public sealed class BackendSessionTests
{
using var harness = new PluginHarness("Mossy");
harness.Login();
// Login itself submits /myquests; these tests count only what the backend ran.
harness.Host.Automation.Chat.Submitted.Clear();
harness.Session.OnConnected(new DateTime(2026, 9, 25, 8, 5, 9, DateTimeKind.Utc));