Diplomacy
Which factions are allied, at war, or neutral, and formal declarations between them. This is Genesius's faction relations system, wearing Chancery's UI.
Module: diplomacy, off unless switched on, and it's the one module a server's own admins can never self-enable even with a valid access key. Ask Ben.
The one rule
A relation is only an alliance if both sides say so. One side declaring friendship isn't an alliance.
Where the two sides disagree, the worse answer wins:
enemy beats neutral beats ally
unknown is a fourth state: nobody's set anything yet, for either side.
So if you call them an ally and they call you an enemy, you're enemies. That's the safe way round. The alternative would show a green light to somebody who's shooting at you.
Recording a relation
/affiliation set faction: TOM target: SCPF status: ally note: "Signed the Meridian pact"
faction is the one whose perspective you're recording, target is who they're talking about. note is optional and shows up in the history. Setting a relation needs the diplomat or leader role (affiliation_diplomat_role / affiliation_leader_role), or admin.
Every existing panel for this server redraws itself automatically the moment a relation changes. Nobody has to manually refresh anything.
Reading relations
/affiliation view faction: TOM
One faction's whole board: its resolved status with every other faction, and when it last changed.
/affiliation matrix
The whole network as an image, colour-coded (green ally, red enemy, yellow neutral, black unknown), with buttons to jump into View Faction or View Relationship without typing a command.
/affiliation history faction: TOM target: SCPF limit: 20
Every change between two specific factions, oldest rule first: old status, new status, who changed it, when, and their note if they left one. limit caps out at 50.
A worked example, start to finish
Setting up diplomacy for a network with three factions:
/affiliationadmin faction add faction_id: tom short: TOM name: "The ORANGE Movement"
/affiliationadmin faction add faction_id: scpf short: SCPF name: "SCP Foundation"
/affiliationadmin faction add faction_id: gru short: GRU name: "Grubs United"
faction_id is lowercase alphanumeric only, it's what every other command refers to this faction by. short and name are just display text.
Record the actual relations:
/affiliation set faction: TOM target: SCPF status: neutral
/affiliation set faction: SCPF target: TOM status: neutral
/affiliation set faction: TOM target: GRU status: enemy note: "Border skirmish, 2026-07"
Notice GRU never set anything back toward TOM. That's fine, the resolved status still comes out enemy, since only one side needs to say enemy for it to be true.
Optionally link each faction to the Discord role that pings its members:
/affiliationadmin faction role faction_id: tom role: @TOM
Then post a live panel somewhere everyone can see it:
/affiliationadmin panel post channel: #diplomacy
That panel keeps itself current from here on. Nobody needs to /affiliation matrix again unless they want their own private copy.
Managing factions
| Command | What it does |
|---|---|
/affiliationadmin faction add <id> <short> <name> | Register a new faction |
/affiliationadmin faction remove <id> | Soft-remove. History and past relations are kept, it just stops appearing as an option |
/affiliationadmin faction unremove <id> | Bring a soft-removed faction back |
/affiliationadmin faction delete <id> confirm: True | Hard delete. Every relation and every history entry involving it is gone, permanently. confirm: True is required on purpose |
/affiliationadmin faction role <id> <role> | Link a Discord role to a faction, for pings and identification |
All of these need admin.
Managing panels
A panel is a live-updating message. You can have more than one, in different channels.
| Command | What it does |
|---|---|
/affiliationadmin panel post <channel> | Post a new live panel |
/affiliationadmin panel remove <panel_id> | Take one down (deletes the message too, best effort) |
/affiliationadmin panel list | See every active panel and where it is |
Declarations
Formal, publicly posted statements between factions: a war declaration, a peace treaty, an announcement. Three templates:
| Type | For |
|---|---|
simple | A plain statement. faction is optional |
email | Styled as a formal letter from one faction. faction required |
communique | Styled as an official communique. faction required |
/declaration create type: email faction: TOM
Needs the diplomat or leader role, same as /affiliation set. Opens a modal to write the body; submitting shows a preview that nothing has posted yet, with buttons:
| Button | What it does |
|---|---|
| Post | Publishes it for real, to declarations_channel |
| Edit | Reopens the modal with what you wrote, still unposted |
| Cancel | Discards the draft |
Drafts expire if left too long. If declarations_channel is a forum, the declaration gets tag-mapped automatically from declaration_simple_tags / declaration_email_tags / declaration_communique_tags (see Settings), or override the tags for one specific post with tag: when you create it.
After it's posted
Two more buttons appear on the live message itself, for the original poster or an admin only:
- Edit reopens the same modal on the posted version and updates the message in place.
- Retract asks for confirmation, then strikes the message through, tags it retracted, and removes every button. Irreversible.
Where it lives
Not in the bot. Relations are stored in their own service (Genesius), which the Roblox game and the website both read. Change it here, and the game picks it up. The bot isn't keeping its own private copy that can drift.
Troubleshooting
| What you see | Usually means |
|---|---|
| "This module is not enabled" | diplomacy is off in this server, or your access key doesn't cover it. Ask Ben either way. |
| A relation looks wrong in the game | The game refreshes on a timer, not instantly. Give it a few minutes. |
| The matrix image won't generate | Usually one faction has a broken logo, or your network has more factions than the image renderer supports. /affiliation view still works and tells you the same thing in text. |
| "Only the poster or an admin can edit/retract this." | Exactly what it says. Ask an admin if you're not either. |
| A declaration's forum tags are wrong | Check declaration_*_tags in Settings, or pass tag: explicitly next time. |