- chargeoptions is the real field gating 2000/5000/10000 yen display
- chargeid (not chargenum) carries the actual denomination on charge
- getrecentcharge/getlastlog: fixed num mismatch, added missing result
section, and added placeholder items for empty result sets
- GetConfigEaChargeHandler: was declared as Handler<EmptyRequest, T>,
which made HandlerService attempt to XML-deserialize an EmptyRequest
against the incoming <eacharge> root, crashing on every getconf call.
Switched to HandlerWithoutRequest<T>, matching every other
parameterless handler (e.g. SppassOpenHandler).
- ChargeMachinePlugin.DoesProfileExist: was a synchronous Func<bool>,
but PluginService.DoesProfileExistAsync casts the DynamicInvoke result
to Task<bool>, throwing InvalidCastException on every card inquire.
Now returns Task.FromResult(true) - a PASELI profile always exists
once a user is created, so this plugin never needs to report "no
profile" here.
- EaChargeConfigResponse: dropped the multibills/readagreement fields
entirely and fixed articlelist's XML shape. A real getconf response
(captured via spice2x's automap against the genuine Konami server)
has neither field at all, and wraps articlelist entries in <item>
children rather than repeating sibling <articlelist> elements. The
denomination-button limitation this was chasing turned out to be an
unrelated spice2x bill-validator emulation gap (see spice2x issue
#123), not anything server-side.
- GetConfigEaChargeHandler: DOCMT_* article types now send an empty
articledoc, matching the real server - the disclosure/agreement text
is rendered client-side from a bundled asset, not delivered over the
wire. Sending real text there produced a solid black screen on a
real cabinet instead of the disclosure text.
Claude-Session: https://claude.ai/code/session_012FiU5Qe8fbePFxraxWHSd5
Introduce ChargeMachineDbContext (SQLite) with ArticleContent and
ChargeHistory entities, plus migrations, and wire it up via
ConfigurePluginServices/OnAppInitialize with startup migration and
article-content seeding.
- ChargeEaChargeHandler now records each charge to ChargeHistory
- GetConfigEaChargeHandler serves article config from the DB instead
of hardcoded values, and adds multibills/readagreement fields
- GetLastLogEaChargeHandler returns real daily totals and recent
charge items from history, keyed by session card
- Add GetRecentChargeEaChargeHandler (paginated charge history) and
OpChPassEaChargeHandler (PIN change)
- Update handlers to the new HandleAsync/primary-constructor style,
file-scoped namespaces
- Bump EF Core/Identity packages and Abstractions reference to
net10.0/10.0.10