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
**A self-hosted Discord bot for the Rust+ companion app** — live map, team & clan chat bridges, smart devices, and a full offline item database, all provisioned automatically in your Discord server.
4
8
5
-
A self-hosted Discord bot for the Rust+ companion app.
The bot is live: it pairs with Rust+ over FCM, holds a socket per server, and
10
-
auto-provisions its own Discord channels. Pairing/connection, the chat bridge,
11
-
in-game `!commands` and slash surfaces, live map events, map rendering, smart
12
-
devices (switches, alarms, storage monitors), and an offline item database with
13
-
recycle/craft/research/decay/upkeep calculators are all shipped. Cameras are next.
17
+
---
14
18
15
-
## Features
19
+
The bot is live: it pairs with Rust+ over FCM, holds a socket per server, and auto-provisions its own Discord channels. Pairing/connection, the team & clan chat bridges, in-game `!commands` and slash surfaces, live map events, map rendering, smart devices (switches, alarms, storage monitors), and an offline item database with nine calculators are all shipped. Cameras are next.
16
20
17
-
### Onboarding & connection
21
+
##Channel tour
18
22
19
-
-**Self-provisioning workspace** — `/setup` (Manage Server) creates a global
20
-
`RustPlusBot` category (`#information`, `#setup`, `#settings`) plus one category
21
-
per paired server. A declarative reconciler keeps channels/messages converged,
22
-
self-heals deleted channels, and is idempotent under a per-guild lock.
23
-
-**FCM pairing** — connect a Rust+ account from `#setup`; pairing a server in-game
24
-
auto-registers it (servers are never typed by hand) and the bot provisions that
25
-
server's channels.
26
-
-**Credential pool per server** — multiple accounts can pair with the same server;
27
-
the bot keeps one live socket per `(guild, server)` with **hot-swap** of the
28
-
active player (`/server player`) and **auto-failover** to a standby
29
-
credential when one goes invalid (owner is DM'd).
30
-
-**Lifecycle controls** — "Remove server" (on `#info`) and "Disconnect account"
31
-
(on `#setup`), both Manage-Server-gated with a confirmation step; cascade
32
-
cleanup of channels, credentials, and live state.
33
-
-**Live `#info` dashboard** — three auto-refreshing embeds below the map image:
34
-
**Server** (status, players/queue, in-game time, wipe age), **Events** (cargo /
35
-
heli / chinook / both oil rigs), and **Team** (per-member presence, grid, and
36
-
survival time). Refreshed on connection-state changes and on a configurable
-**Set MOTD** — a button on the overview embed opens a modal that writes the MOTD
60
-
back to the game; it is offered only when the paired player's in-game clan role
61
-
carries the permission.
62
-
-**API limits** — RustPlusApi 2.0.0-beta.4 exposes no clan audit log, no per-member
63
-
scores, and no kick/invite/promote actions, so none of those are implemented; the
64
-
feed is instead derived by diffing successive clan snapshots.
38
+
### Onboarding & connection
65
39
66
-
### In-game `!commands`
40
+
-**Self-provisioning workspace** — `/setup` (Manage Server) creates the global category plus one category per paired server. A declarative reconciler keeps channels/messages converged, self-heals deleted channels, and is idempotent under a per-guild lock.
41
+
-**FCM pairing** — connect a Rust+ account from `#setup`; pairing a server in-game auto-registers it (servers are never typed by hand) and the bot provisions that server's channels, after an Accept/Dismiss confirmation for new servers.
42
+
-**Credential pool per server** — multiple accounts can pair with the same server; the bot keeps one live socket per `(guild, server)` with **hot-swap** of the active player (`/server player`) and **auto-failover** to a standby credential when one goes invalid (owner is DM'd).
43
+
-**Lifecycle controls** — "Remove server" (on `#info`) and "Disconnect account" (on `#setup`), both Manage-Server-gated with a confirmation step; cascade cleanup of channels, credentials, and live state.
44
+
-**Live `#info` dashboard** — three auto-refreshing embeds below the map image: **Server** (status, players/queue, in-game time, wipe age), **Events** (cargo / heli / chinook / both oil rigs), and **Team** (per-member presence, grid, and survival time). Refreshed on connection-state changes and on a configurable interval (`Workspace:InfoRefreshInterval`, default 1 min).
45
+
-**Bilingual** — every provisioned surface renders in **English or French**, switchable from a select menu in `#settings`.
67
46
68
-
Run in team chat by any teammate; replies in the guild's language with a
69
-
configurable per-server prefix (default `!`) and per-command cooldowns:
-**Conditional channels** — `#clanchat` and `#claninfo` appear automatically when the paired player is in a clan, and are removed again when they leave; no command to run either way.
54
+
-**`#clanchat`** — two-way relay between in-game clan chat and the channel, sharing the same echo/loop suppression as the team bridge.
55
+
-**`#claninfo`** — three auto-refreshing embeds — **Overview** (score, member count, creation date, leader, creator, MOTD), **Roster** (members grouped by clan role, online first, with each role's permissions), and **Invites** — plus a live feed of clan changes (members joining/leaving, promotions/demotions, invites, rename, MOTD, logo, colour, score, dissolution).
56
+
-**Set MOTD** — a button on the overview embed opens a modal that writes the MOTD back to the game; it is offered only when the paired player's in-game clan role carries the permission.
57
+
-**API limits** — the Rust+ API exposes no clan audit log, no per-member scores, and no kick/invite/promote actions, so none of those are implemented; the feed is instead derived by diffing successive clan snapshots.
85
58
86
59
### Live map events
87
60
88
-
- Per-server `#events` feed (and an in-game team-chat mirror) for **Cargo Ship**,
89
-
**Patrol Helicopter**, and **Chinook (CH47)** entering/leaving, plus **small /
90
-
large oil rig** activation, "crate lootable", and respawn — derived from
91
-
polling the Rust+ map markers and monuments.
61
+
- Per-server `#events` feed (and an in-game team-chat mirror) for **Cargo Ship**, **Patrol Helicopter**, and **Chinook (CH47)** entering/leaving, plus **small / large oil rig** activation, "crate lootable", and respawn — derived from polling the Rust+ map markers and monuments.
92
62
93
63
### Map rendering
94
64
95
-
- Per-server `#map` channel renders the live game map as an image with toggleable
controlled from a Manage-Server-gated control message.
65
+
- Per-server `#map` channel renders the live game map as an image with seven toggleable layers — **Grid**, **Markers**, **Monuments**, **Vendor**, **Players**, **Rigs**, **Tunnels** — controlled from a Manage-Server-gated control message.
66
+
-**Readable at a glance** — monument icons, rotor-composited event markers with dashed movement trails, per-teammate coloured crosses with a matching legend embed, and train-tunnel entrances.
67
+
-**Grid conventions** — a per-server `MapGridStyle` setting aligns the grid (and every event grid reference) with either the in-game F1 map or the Rust+/RustMaps convention.
68
+
69
+
### Smart devices
70
+
71
+
-**Switches** — one embed per paired smart switch in `#switches`, with on/off toggle and rename.
72
+
-**Alarms** — paired smart alarms in `#alarms`, with trigger notifications.
73
+
-**Storage monitors** — live contents embeds in `#storagemonitors`, with refresh and rename.
74
+
-**Reachability** — every device embed shows an inline status when the device is **removed**, **out of building privilege**, or **not responding**, detected on pairing, on actuation, and by periodic polling.
98
75
99
76
### Item database & calculators
100
77
101
-
- An **offline, versioned item dataset** (bundled, ~1200 items) behind one
102
-
lookup seam, exposing six calculators both in-game and as ephemeral slash
103
-
commands: item info, recycler yields, craft recipes, research scrap cost,
104
-
decay time, and building-block upkeep cost.
105
-
-**Name-or-id lookup** — type a name (case-insensitive, partial), an exact name,
106
-
or a numeric id; multiple matches return a short "did you mean" list.
107
-
-**Provenance-aware** — each result footers the date its data was sourced, and a
108
-
maintainer [generator tool](tools/RustPlusBot.ItemData.Generator) regenerates the
109
-
bundle from upstream (with strict validation) so it never silently rots.
78
+
- An **offline, versioned item dataset** (bundled, ~1200 items plus raid targets, smelters, and CCTV codes) behind one lookup seam, exposing nine calculators both in-game and as ephemeral slash commands: item info, recycler yields, craft recipes, research scrap cost, decay time, building-block upkeep, raid cost (`durability`), smelting, and monument CCTV codes.
79
+
-**Name-or-id lookup** — type a name (case-insensitive, partial), an exact name, or a numeric id; multiple matches return a short "did you mean" list.
80
+
-**Provenance-aware** — each result footers the date its data was sourced, and a maintainer [generator tool](tools/RustPlusBot.ItemData.Generator) regenerates the bundle from upstream (with strict validation) so it never silently rots.
| Control |`!mute` / `!unmute` (gate all bot→game output) |
100
+
101
+
Live server data (population, in-game time, wipe, team, oil rigs) is no longer a set of ephemeral commands — it renders continuously in the `#info` dashboard, and stays available in-game via the `!commands`.
|`RustPlusBot.Features.ItemData`| Bundled item dataset, lookup seam, calculator data |
157
154
|`RustPlusBot.Host`| Generic Host entry point, DI wiring, startup validation |
158
155
159
-
The `tools/` folder holds maintainer utilities that are not part of the running
160
-
bot — currently
161
-
[`RustPlusBot.ItemData.Generator`](tools/RustPlusBot.ItemData.Generator), which
162
-
regenerates the embedded item dataset.
156
+
The `tools/` folder holds maintainer utilities that are not part of the running bot — currently [`RustPlusBot.ItemData.Generator`](tools/RustPlusBot.ItemData.Generator), which regenerates the embedded item dataset.
163
157
164
158
## Roadmap
165
159
166
160
Subsystems are built in order; each has its own spec → plan → build cycle.
0 commit comments