You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* chore(deps): bump RustPlusApi/RustPlusApi.Fcm to 2.0.0-beta.2 for 4a
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(switches): add SwitchPairedEvent and SwitchStateChangedEvent
* feat(switches): add SmartSwitch entity, config, and SmartSwitches migration
* feat(switches): add ISwitchStore/SwitchStore with CRUD over SmartSwitch
* feat(switches): add #switches channel spec, EN/FR name, and channel locator
* feat(switches): add smart-switch read/control/event to the connection seam
* feat(switches): supervisor smart-switch query, connect priming, and trigger relay
* feat(switches): add ServerService.GetByEndpointAsync lookup-only path
* feat(switches): route FCM entity pairings to SwitchPairedEvent via Facepunch ServerId
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(switches): scaffold Features.Switches project + EN/FR localizer and component ids
* feat(switches): add SwitchEmbedRenderer (embed, control row, pairing prompt)
* feat(switches): add DiscordSwitchChannelPoster (edit-by-id with self-heal)
* feat(switches): add SwitchPairingCoordinator (prompt, accept, dedupe)
* feat(switches): add SwitchStateRelay (state re-render + unreachable on disconnect)
* feat(switches): add SwitchComponentModule + rename modal (thin interaction surface)
* feat(switches): hosted service + AddSwitches DI + Host wiring (4a end-to-end)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(switches): address PR review — guard empty Facepunch GUID, idempotent AddAsync, delete real dismiss prompt
- PairingHandler: only backfill FacepunchServerId when non-empty, so servers paired
without a Facepunch GUID don't all collide on Guid.Empty (which would break entity
attribution / throw on resolution).
- ServerService.GetByFacepunchServerIdAsync: treat Guid.Empty as no-match and use
FirstOrDefault so resolution can never throw on duplicate legacy ids.
- SwitchStore.AddAsync: recover idempotently from the unique-index violation when two
users accept the same pending pairing concurrently (detach + return the winner row)
instead of surfacing a DbUpdateException as an interaction failure. + test.
- SwitchComponentModule.DismissAsync: delete the component's source prompt message
(IComponentInteraction.Message) rather than the ephemeral interaction response, which
left the prompt lingering.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gitignore): add .superpowers directory to ignore list
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: src/RustPlusBot.Domain/Servers/RustServer.cs
+3Lines changed: 3 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -20,4 +20,7 @@ public sealed class RustServer
20
20
21
21
/// <summary>The Discord user who added this server.</summary>
22
22
publiculongAddedByUserId{get;set;}
23
+
24
+
/// <summary>The Facepunch server GUID from FCM pairings, backfilled on server pairing; null until first seen. Used to attribute entity pairings.</summary>
0 commit comments