Skip to main content

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

CommandWhat 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: TrueHard 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.

CommandWhat 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 listSee every active panel and where it is

Declarations

Formal, publicly posted statements between factions: a war declaration, a peace treaty, an announcement. Three templates:

TypeFor
simpleA plain statement. faction is optional
emailStyled as a formal letter from one faction. faction required
communiqueStyled 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:

ButtonWhat it does
PostPublishes it for real, to declarations_channel
EditReopens the modal with what you wrote, still unposted
CancelDiscards 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 seeUsually 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 gameThe game refreshes on a timer, not instantly. Give it a few minutes.
The matrix image won't generateUsually 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 wrongCheck declaration_*_tags in Settings, or pass tag: explicitly next time.