@@ -4,9 +4,73 @@ A self-hosted Discord bot for the Rust+ companion app.
44
55## Status
66
7- ** Foundation** — the bot boots, registers slash commands, and persists data.
8- Available now: guild configuration, ` /server add|list|remove ` , ` /bind ` .
9- Live Rust+ features (pairing, chat bridge, map events, smart devices, cameras) are planned in upcoming subsystems.
7+ The bot is live: it pairs with Rust+ over FCM, holds a socket per server, and
8+ auto-provisions its own Discord channels. Pairing/connection, the chat bridge,
9+ in-game ` !commands ` and slash surfaces, live map events, and map rendering are all
10+ shipped. Smart devices and cameras are next.
11+
12+ ## Features
13+
14+ ### Onboarding & connection
15+
16+ - ** Self-provisioning workspace** — ` /setup ` (Manage Server) creates a global
17+ ` RustPlusBot ` category (` #information ` , ` #setup ` , ` #settings ` ) plus one category
18+ per paired server. A declarative reconciler keeps channels/messages converged,
19+ self-heals deleted channels, and is idempotent under a per-guild lock.
20+ - ** FCM pairing** — connect a Rust+ account from ` #setup ` ; pairing a server in-game
21+ auto-registers it (servers are never typed by hand) and the bot provisions that
22+ server's channels.
23+ - ** Credential pool per server** — multiple accounts can pair with the same server;
24+ the bot keeps one live socket per ` (guild, server) ` with ** hot-swap** of the
25+ active player (select menu on ` #info ` ) and ** auto-failover** to a standby
26+ credential when one goes invalid (owner is DM'd).
27+ - ** Lifecycle controls** — "Remove server" (on ` #info ` ) and "Disconnect account"
28+ (on ` #setup ` ), both Manage-Server-gated with a confirmation step; cascade
29+ cleanup of channels, credentials, and live state.
30+ - ** Live status** — ` #info ` shows connection status, player count, and a team
31+ summary (online/total + leader), refreshed on connection-state changes.
32+ - ** Bilingual** — every provisioned surface renders in ** English or French** ,
33+ switchable from a select menu in ` #settings ` .
34+
35+ ### Team chat bridge
36+
37+ - Two-way relay between in-game team chat and a per-server ` #teamchat ` channel
38+ (via a managed webhook), with echo/loop suppression.
39+
40+ ### In-game ` !commands `
41+
42+ Run in team chat by any teammate; replies in the guild's language with a
43+ configurable per-server prefix (default ` ! ` ) and per-command cooldowns:
44+
45+ - ** Server** — ` !pop ` , ` !time ` , ` !wipe `
46+ - ** Team** — ` !online ` , ` !offline ` , ` !team ` , ` !alive ` , ` !steamid [name] ` , ` !prox [name] `
47+ - ** Live events** — ` !cargo ` , ` !heli ` , ` !chinook ` , ` !small ` , ` !large ` , ` !events `
48+ - ** Control** — ` !mute ` / ` !unmute ` (gate all bot→game output)
49+
50+ ### Slash commands
51+
52+ - ** Server data** (ephemeral, with a ` server ` selector when several are paired) —
53+ ` /pop ` , ` /time ` , ` /wipe ` , ` /online ` , ` /offline ` , ` /team ` , ` /alive ` , ` /small ` , ` /large `
54+ - ** Utility** — ` /help ` , ` /uptime ` , ` /leader ` (Manage Server — transfer in-game team leadership)
55+ - ** Admin** — ` /setup ` , ` /workspace reset ` , ` /workspace simulate-server `
56+
57+ ### Live map events
58+
59+ - Per-server ` #events ` feed (and an in-game team-chat mirror) for ** Cargo Ship** ,
60+ ** Patrol Helicopter** , and ** Chinook (CH47)** entering/leaving, plus ** small /
61+ large oil rig** activation, "crate lootable", and respawn — derived from
62+ polling the Rust+ map markers and monuments.
63+
64+ ### Map rendering
65+
66+ - Per-server ` #map ` channel renders the live game map as an image with toggleable
67+ layers — ** Grid** , ** Markers** , ** Monuments** , ** Vendor** , ** Players** , ** Rigs** —
68+ controlled from a Manage-Server-gated control message.
69+
70+ ### Foundation
71+
72+ - Multi-guild, self-hosted, per-guild isolation everywhere; SQLite persistence;
73+ credentials protected at rest; fail-fast token validation on startup.
1074
1175## Tech stack
1276
@@ -36,10 +100,17 @@ See [docs/development/running-locally.md](docs/development/running-locally.md).
36100
37101| Project | Responsibility |
38102| --- | --- |
39- | ` RustPlusBot.Abstractions ` | Shared seams: ` IClock ` , ` IEventBus ` , ` ICredentialProtector ` , ` ICredentialStore ` |
103+ | ` RustPlusBot.Abstractions ` | Shared seams: ` IClock ` , ` IEventBus ` , credential/connection contracts, events |
40104| ` RustPlusBot.Domain ` | Entities and enums |
41105| ` RustPlusBot.Persistence ` | ` BotDbContext ` , EF Core services, SQLite migrations |
42- | ` RustPlusBot.Discord ` | Discord.Net gateway, hosted service, slash-command interaction modules |
106+ | ` RustPlusBot.Discord ` | Discord.Net gateway, hosted service, interaction modules |
107+ | ` RustPlusBot.Features.Workspace ` | Channel/message provisioning, reconciler, ` #info ` /` #setup ` /` #settings ` surfaces |
108+ | ` RustPlusBot.Features.Pairing ` | FCM pairing listener, credential intake, account disconnect |
109+ | ` RustPlusBot.Features.Connections ` | Live socket supervisor, hot-swap/failover, Rust+ query seam |
110+ | ` RustPlusBot.Features.Chat ` | Two-way ` #teamchat ` ↔ in-game chat bridge |
111+ | ` RustPlusBot.Features.Commands ` | In-game ` !commands ` , slash surfaces, ` /help ` /` /leader ` |
112+ | ` RustPlusBot.Features.Events ` | Live map-event classification + ` #events ` feed |
113+ | ` RustPlusBot.Features.Map ` | Map image rendering with toggleable layers |
43114| ` RustPlusBot.Host ` | Generic Host entry point, DI wiring, startup validation |
44115
45116## Roadmap
@@ -48,10 +119,10 @@ Subsystems are built in order; each has its own spec → plan → build cycle.
48119
49120| # | Subsystem | Status |
50121| --- | --- | --- |
51- | 0 | Foundation (bootable host, config/persistence, ` /server ` , ` /bind ` ) | Done |
52- | 1 | Pairing & connection (FCM, credential pool, hot-swap, auto-failover) | Planned |
53- | 2 | Chat bridge + ` !commands ` | Planned |
54- | 3 | Map + live events | Planned |
122+ | 0 | Foundation (bootable host, config/persistence, workspace provisioning ) | Done |
123+ | 1 | Pairing & connection (FCM, credential pool, hot-swap, auto-failover) | Done |
124+ | 2 | Map + live events (events feed, oil-rig detection, map render + layers) | Done |
125+ | 3 | Chat bridge + ` !commands ` + slash surfaces | Done |
55126| 4 | Smart devices | Planned |
56127| 5 | Cameras | Planned |
57128
0 commit comments