/encounter SandStalker · group 5 · kills 0 · destructive no · skill 2
+
+
+
After you submit, you’ll get a private “Encounter recorded” message and the pirate list updates shortly after.
diff --git a/assets/docs/commands/PirateReportCog.encounter.details.html b/assets/docs/commands/PirateReportCog.encounter.details.html
new file mode 100644
index 0000000..a981410
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.encounter.details.html
@@ -0,0 +1,75 @@
+
What it does
+
+ /encounter adds a single encounter to the pirate’s history. These entries feed the
+ threat score so the pirate list reflects how dangerous someone actually is right now.
+
+
+
+
+
Form fields
+
+
Pirate (name or account)
+ Best: Name#12345. If you only know the character name, it must match exactly and not be ambiguous.
+
+
Group size
+ Integer ≥ 1. How many pirates were in their group, including the reported pirate.
+
+
Kills
+ Integer ≥ 0. Use 0 for none/unknown.
+
+
Destructive?
+ yes/no. “Yes” if a base/ornithopter was destroyed, etc.
+
+
Perceived Skill
+ 0–5. Use 0 if you’re unsure. 5 = cracked aim/sweaty movement, 1–2 = casual.
+
If the account format is wrong, you’ll be told what to fix (Name#12345 ending with five digits).
+
Character names must be an exact match. If multiple pirates share that name, you’ll be asked to use the account.
+
Rate limit: one report per user per pirate every 10 minutes.
+
You’ll see a private “Encounter recorded” confirmation on success.
+
+
+
+
+
How threat is calculated (short)
+
+ Each encounter contributes to a weighted score (0–100):
+
+
+
Kills: higher if the pirate gets kills.
+
Destructive: higher if they destroy stuff.
+
Group size: higher if they roll with group ≥ T (T comes from config).
+
Skill: your 0–5 rating normalized and averaged across encounters.
+
+
+ The weights are configurable (defaults: Kill 0.35, Destruction 0.30, Group 0.20, Skill 0.15). After you submit,
+ the bot recomputes the pirate’s threat level and encounter count, then refreshes the list.
+
+
+
+
+
Tips
+
+
Use the account (Name#12345) whenever possible — it guarantees the report hits the right person.
+
If you can’t tell skill, leave it at 0. That’s fine.
+
Group size includes the pirate you’re reporting.
+
+
+
+
+
Common errors
+
+
“No such pirate registered.” — Ask a mod to add them, or submit a /report first.
+
“Character name is ambiguous.” — Use the account tag (Name#12345).
+
“You can only report the same pirate once every 10 minutes.” — Wait a bit and try again.
+
diff --git a/assets/docs/commands/PirateReportCog.encounters_migrate_ids.brief.html b/assets/docs/commands/PirateReportCog.encounters_migrate_ids.brief.html
new file mode 100644
index 0000000..757355d
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.encounters_migrate_ids.brief.html
@@ -0,0 +1,12 @@
+
Quick usage — /encounters_migrate_ids [Moderator]
+
+
+ Converts old encounter records stored by character name to the
+ canonical account (Name#12345).
+
+
+
/encounters_migrate_ids
+
+
+ Useful after adding pirates where past encounters referenced only nicknames.
+
diff --git a/assets/docs/commands/PirateReportCog.encounters_migrate_ids.details.html b/assets/docs/commands/PirateReportCog.encounters_migrate_ids.details.html
new file mode 100644
index 0000000..8371efc
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.encounters_migrate_ids.details.html
@@ -0,0 +1,27 @@
+
What it does
+
+ Scans stored encounters and rewrites any identifier that is a character name to the correct
+ account for that pirate. Keeps data consistent for threat calculations.
+
+
+
+
+
How matching works
+
+
If the encounter already uses an account (# + five digits), it’s counted as “already accounts”.
+
If the character name maps to exactly one pirate, it’s updated to that pirate’s account.
+
If there’s no pirate with that name, it’s counted as “not found”.
+
If multiple pirates share the same nickname, it’s “ambiguous” and skipped.
+
+
+
+
+
Result
+
+
Replies with a compact summary (updated / already / ambiguous / not found).
+
Refreshes the public pirate list afterwards.
+
+
+
+ Moderator-only.
+
diff --git a/assets/docs/commands/PirateReportCog.remove_pirate.brief.html b/assets/docs/commands/PirateReportCog.remove_pirate.brief.html
new file mode 100644
index 0000000..1a7051c
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.remove_pirate.brief.html
@@ -0,0 +1,9 @@
+
Quick usage — /remove_pirate [Moderator]
+
+
Remove a pirate from the approved list by account.
+
+
/remove_pirate account_name: Name#12345
+
+
+ Account format must be Name#12345. If the account isn’t found, you’ll get “Pirate not found.”
+
diff --git a/assets/docs/commands/PirateReportCog.remove_pirate.details.html b/assets/docs/commands/PirateReportCog.remove_pirate.details.html
new file mode 100644
index 0000000..751212d
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.remove_pirate.details.html
@@ -0,0 +1,19 @@
+
What it does
+
Deletes the matching pirate record from the approved list.
+
+
+
+
Parameters
+
+
account_name — exact account tag (Name#12345).
+
+
+
+
+
Behavior & messages
+
+
Moderator-only.
+
If no match: “Pirate not found.”
+
On success: “Removed.” (ephemeral via slash).
+
Mod-log note is posted (“🗑️ Removed pirate …”) and the public list refreshes.
+
diff --git a/assets/docs/commands/PirateReportCog.report.brief.html b/assets/docs/commands/PirateReportCog.report.brief.html
new file mode 100644
index 0000000..9745d67
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.report.brief.html
@@ -0,0 +1,24 @@
+
What it does
+
+ Sends a player to the Pirate Review Queue. Mods get a card with ✅/❌.
+ If you include a Discord media link, it will preview for them.
+
+
+
Quick use — /report
+
+
In-game nickname – e.g. SandStalker
+
Account – must be Name#12345 (five digits)
+
Proof (optional, recommended) – direct Discord CDN link
+ (cdn.discordapp.com / media.discordapp.net)
+
+
+
Limits
+
+
1 submission per user every 60s
+
No duplicates (pending or already approved)
+
Non-Discord media links are blocked
+
+
+
+ Tip: Images show inside the card; videos stay as a link so the inline player works.
+
diff --git a/assets/docs/commands/PirateReportCog.report.details.html b/assets/docs/commands/PirateReportCog.report.details.html
new file mode 100644
index 0000000..6d64dd6
--- /dev/null
+++ b/assets/docs/commands/PirateReportCog.report.details.html
@@ -0,0 +1,48 @@
+
Submit a pirate report
+
+ Use /report to send a player to the Pirate Review Queue.
+ Mods see a compact card with your info and can approve or reject with one click.
+
+
+
Form fields
+
+
In-game nickname
+ The name they use in game. Example: SandStalker
+
Account (Name#12345)
+ Must end with # + five digits. Example: SomeUser#12345
+ If you only know the nickname, try to grab the account too – it prevents ambiguity.
+
Proof (Discord media URL) – optional but highly encouraged
+ Use a direct Discord CDN link so it previews: https://cdn.discordapp.com/… or
+ https://media.discordapp.net/…
+ Allowed: png, jpg, jpeg, gif, webp, mp4, webm, mov.
+ How to get it: open the media in Discord → “Open in browser” → copy the address.
+
+
+
What happens next
+
+
You get a short “thanks” message in the channel.
+
Mods receive an embed with ✅/❌. If you added an image, it shows inside the card.
+ If it’s a video, the URL is kept above the card so the inline player works.
+
A “Jump to message” button lets mods see your original context quickly.
+
When a mod decides, the card updates to show Approved/Rejected with who and when.
+ Your small ack message in the channel is edited to reflect the result.
+
If approved, the player is added to the pirate list (threat level starts at 0).
+
+
+
Rules & common errors
+
+
Account format must be Name#12345. Five digits – no spaces at the end.
+
Proof link must be a Discord media URL. Non-Discord links are blocked.
+
Duplicates are blocked (already pending or already approved).
+
Rate limit: one report per user every 60 seconds.
+
+
+ Typical messages: “Invalid account format”, “URL must be a Discord media link”, “A report for this player is already pending”.
+
+
+
Related actions
+
+
/encounter – log a new encounter with a known pirate (updates threat level over time).
+
/edit_pirate (mods) – update a pirate’s nickname/account.
+
remove_pirate (mods, hybrid) – remove an entry.
+
diff --git a/assets/docs/commands/PiratesListCog.pirates_list_refresh.brief.html b/assets/docs/commands/PiratesListCog.pirates_list_refresh.brief.html
new file mode 100644
index 0000000..397c41e
--- /dev/null
+++ b/assets/docs/commands/PiratesListCog.pirates_list_refresh.brief.html
@@ -0,0 +1,9 @@
+
Quick usage — /pirates_list_refresh [Moderator]
+
Rebuild the compact pirates list in the configured channel. Use this after adding/removing pirates or when encounter stats change.
+
+
/pirates_list_refresh
+
+
+
Replies: Pirates list refreshed. (ephemeral)
+
Runs per-guild cooldown: 10s
+
diff --git a/assets/docs/commands/PiratesListCog.pirates_list_refresh.details.html b/assets/docs/commands/PiratesListCog.pirates_list_refresh.details.html
new file mode 100644
index 0000000..6c191d6
--- /dev/null
+++ b/assets/docs/commands/PiratesListCog.pirates_list_refresh.details.html
@@ -0,0 +1,55 @@
+
What it does
+
+
Builds a compact, alphabetized list of verified pirates and posts it in the configured list channel.
+
Entries are chunked to stay under Discord’s 2000-character limit; old chunks are edited or deleted as needed.
+
No one gets pinged — all content is sanitized to avoid accidental mentions.
+
+
+
+
+
Entry format
+
+- Character (Account#12345) [Threat%]
+ - In group: bucket. Destructive: bucket. Encounters: N. Last: <t:UNIX:R>
+
/power restart reason:"Reloading cogs after changing threat weights and enabling nick loop; avoids inconsistent state."
+
+
+
❌ Bad
+
/power restart reason:"update"
+
+
+
+
+
+
What you’ll see
+
+
Ephemeral confirmation in chat.
+
Modlog post similar to:
+
🔁 Bot Restart Requested
+By: @YourName
+When: 2025-01-01 12:34 UTC
+Running version: vX.Y.Z
+Reason: Reloading cogs after threat weight change…
+
+
Bot goes offline briefly, then comes back once the host restarts it.
+
+
+
+
+
Config that affects it
+
+
modlog_channel_id — where the restart entry is posted. If not set, it falls back to server logs only.
+
home_guild_id — where the /power group is registered (home-guild only vs global).
+
+
+
+
+
Permissions
+
+
Moderator-only. Non-mods are blocked with an ephemeral message.
+
Bot just needs permission to send messages in the modlog channel.
+
diff --git a/assets/docs/commands/ReactionRoleCog.nick_same.brief.html b/assets/docs/commands/ReactionRoleCog.nick_same.brief.html
new file mode 100644
index 0000000..66f5c4a
--- /dev/null
+++ b/assets/docs/commands/ReactionRoleCog.nick_same.brief.html
@@ -0,0 +1,18 @@
+
/nick_same
+
Nick matches my in-game name. Tells mods your current server nickname (or global display name if you haven’t set one) already matches your in-game name, and opens a quick review.
+
+
Usage
+
/nick_same
+
+
+
You’ll get an ephemeral “thanks” message.
+
Moderators get a review with ✅ / ❌ in the mod channel.
+
Full Access is granted automatically when you have: Rules ✅ + Engagement ✅ + this nickname claim (pending or verified).
+
+
+
Tips
+
+
Run it in the server (not in DMs).
+
If you recently changed your nick, this will trigger a re-review.
+
Alternative: react ✅ on the “Nickname” rules message to claim the same thing.
+
diff --git a/assets/docs/commands/ReactionRoleCog.nick_same.details.html b/assets/docs/commands/ReactionRoleCog.nick_same.details.html
new file mode 100644
index 0000000..b00bc9a
--- /dev/null
+++ b/assets/docs/commands/ReactionRoleCog.nick_same.details.html
@@ -0,0 +1,38 @@
+
/nick_same — Nickname claim
+
Use this when your server nickname already matches your in-game character name. It opens a moderator review so you can get (or keep) access without typing anything else.
+
+
What it does
+
+
Marks your nickname as claimed and opens exactly one pending review for moderators.
+
You’ll see a short ephemeral confirmation in the channel.
+
Moderators get a message in the mod channel with ✅ Approve / ❌ Reject.
+
Full Access is granted automatically when you have: Rules ✅ + Engagement ✅ + Nickname claimed (pending or verified).
+
+
+
How to use
+
/nick_same
+
+
Run it in the server, any channel where you can use slash commands.
+
No extra arguments. If your display name already matches the game name, that’s enough.
+
+
+
Typical flow
+
+
You run /nick_same. The bot replies “Thanks — your nickname claim was sent for moderator review.”
+
Mods see a review card with your previous nick (if known) and the current one.
+
They press ✅ to verify or ❌ to reject. You keep (or lose) Full Access depending on Rules/Engagement and the result.
+
+
+
Good to know
+
+
If a verified user changes their nickname later, verification is automatically revoked. Just run /nick_same again (or react ✅ on the nickname message) to re-claim and re-review.
+
The command is idempotent: if a review is already pending, it won’t open duplicates.
+
Alternative path: reacting ✅ on the Nickname rules message triggers the same review and access checks.
+
+
+
Troubleshooting
+
+
No response? Make sure you used it inside the server (not DMs) and that slash commands are allowed in the channel.
+
Still no Full Access? You need all three: Rules ✅, Engagement ✅, and a nickname claim (pending or verified). Missing any one will remove the role.
+
Mods didn’t get a review? Ping a moderator; the mod channel might be misconfigured.
+
diff --git a/assets/docs/commands/SpicePayCog.spicepay.brief.html b/assets/docs/commands/SpicePayCog.spicepay.brief.html
new file mode 100644
index 0000000..1bddaec
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay.brief.html
@@ -0,0 +1,25 @@
+
/spicepay
+
Open the Spice Pay wizard. Step through participants, roles, payout type (Sand or Melange), and weighting. Shows a live preview and lets you post the result.
+
+
Usage
+
/spicepay [participants] [force_new]
+
+
participants (optional): total people, incl. owners (1–25).
+
force_new (optional): start fresh if you already have a session.
+
+
+
Quick flow
+
+
Enter the total yield and participant count.
+
Add/edit each participant (name, active %, owner roles).
+
Toggle payout: Sand ⟷ Melange (set refinery yield for Melange).
+
Adjust weighting factors or use a preset.
+
Finish → preview → Post to channel.
+
+
+
Notes
+
+
0% active = owner-only (gets owner perks but didn’t actively join).
+
Melange: exactly one Refiner owner is required.
+
Rounding leftovers go to Refiner (Melange) or top earner (Sand).
+
\ No newline at end of file
diff --git a/assets/docs/commands/SpicePayCog.spicepay.details.html b/assets/docs/commands/SpicePayCog.spicepay.details.html
new file mode 100644
index 0000000..44741f8
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay.details.html
@@ -0,0 +1,72 @@
+
/spicepay — Guided payout
+
Calculate a fair split for a spice run. The wizard keeps things simple and transparent for the team.
+
+
Start
+
/spicepay [participants] [force_new]
+
+
If participants is omitted, you set it in the first modal (1–25).
+
Use force_new: true to discard an existing session and start clean.
+
+
+
Setup modal
+
+
Total spice yield (sand) — integer ≥ 0.
+
Participants — include owners (Refiner/Carrier/Crawler). People only; vehicles/refinery are owned by people.
+
+
+
Editing participants
+
For each slot:
+
+
Name — free text (mention text is fine).
+
Active % — 0–100. 0% = owner-only (didn’t actively join).
+
Owner of (optional) — any of: refiner, carrier, crawler. Flexible input (e.g. “lsr”, “refinery”, “car”, “cr”).
+
+
Use Add / Edit participant, Previous/Next to navigate. The preview shows filled vs. empty slots and highlights “owner-only”.
+
+
Payout type
+
+
Sand — no refinery cut; 0 or 1 Refiner owner allowed.
+
Melange — requires exactly one Refiner owner. First a refinery cut % is taken and paid to the Refiner, then the rest is split.
+
+
When switching to Melange, set the refinery yield (integer) in the modal.
+
+
Weighting (the math, simplified)
+
+
Each person gets a weight: Base × Active% + bonuses for owning Carrier/Crawler.
+
We split the pot proportionally by weights (they’re normalized; only ratios matter).
+
Melange only: take Refinery cut % first → Refiner. Any rounding leftovers go to Refiner (Melange) or top earner (Sand).
+
+
+
Controls
+
+
Toggle payout: Sand/Melange — switches mode (prompts for refinery yield on Melange).
Save as my defaults — stores your weights for future runs (per user).
+
Finish — shows a neat preview (table) and lets you Post to channel.
+
+
+
Validation & limits
+
+
Participants: 1–25.
+
Active %: 0–100.
+
Melange: exactly one Refiner owner required; Sand: 0 or 1 allowed.
+
No duplicate names (duplicates are auto-disambiguated in preview).
+
+
+
Posting
+
The post includes:
+
+
Header (Sand or Melange) with the chosen emoji.
+
Weighting summary (Base, bonuses, and refinery cut if Melange).
+
A clean monospace table: Name · Active% · Owner of/Role · Amount.
+
+
Footnote: “0% = owner only”.
diff --git a/assets/docs/commands/SpicePayCog.spicepay_cancel.brief.html b/assets/docs/commands/SpicePayCog.spicepay_cancel.brief.html
new file mode 100644
index 0000000..a97a1d6
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_cancel.brief.html
@@ -0,0 +1,10 @@
+
/spicepay_cancel
+
Cancel your active Spice Pay session. Clears everything for you so you can start fresh.
+
+
Usage
+
/spicepay_cancel
+
+
+
Removes your in-memory session (does not post anything).
+
Run /spicepay again to start over.
+
diff --git a/assets/docs/commands/SpicePayCog.spicepay_cancel.details.html b/assets/docs/commands/SpicePayCog.spicepay_cancel.details.html
new file mode 100644
index 0000000..683a82a
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_cancel.details.html
@@ -0,0 +1,11 @@
+
/spicepay_cancel — Cancel session
+
Discards your current wizard state. Handy if you mis-entered totals or want to restructure the roster.
+
+
What it does
+
+
Deletes your session (you + this server).
+
Nothing is posted publicly.
+
+
+
Next steps
+
Run /spicepay to start again. You can optionally pass participants or just set them in the first modal.
diff --git a/assets/docs/commands/SpicePayCog.spicepay_config.brief.html b/assets/docs/commands/SpicePayCog.spicepay_config.brief.html
new file mode 100644
index 0000000..94afb1d
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_config.brief.html
@@ -0,0 +1,10 @@
+
/spicepay_config
+
Show server SpicePay weights. Read-only view of the defaults the wizard uses.
+
+
Usage
+
/spicepay_config
+
+
+
Displays: Refinery cut %, Base × active %, Carrier bonus, Crawler bonus.
+
Change via ENV/INI; restart the bot to apply.
+
diff --git a/assets/docs/commands/SpicePayCog.spicepay_config.details.html b/assets/docs/commands/SpicePayCog.spicepay_config.details.html
new file mode 100644
index 0000000..4f5bedd
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_config.details.html
@@ -0,0 +1,19 @@
+
/spicepay_config — Server weights
+
Shows the current default weighting used by the Spice Pay wizard.
+
+
Fields
+
+
Refinery cut % (Melange only) — percent taken first and paid to the Refiner owner.
+
Base × active % — the core share, scaled by each player’s active participation.
+
Carrier bonus — flat weight added if the person owns the carrier.
+
Crawler bonus — flat weight added if the person owns the crawler.
+
+
+
Where to change
+
Configure via environment variables or your INI, then restart the bot. The wizard’s Adjust weighting factors lets users override per-run; those don’t change the server defaults.
+
+
Tips
+
+
Use Presets in the wizard to quickly switch philosophy (owner-heavy, participation-heavy, etc.).
+
Users can Save as my defaults to keep their personal weights for future runs.
+
diff --git a/assets/docs/commands/SpicePayCog.spicepay_resume.brief.html b/assets/docs/commands/SpicePayCog.spicepay_resume.brief.html
new file mode 100644
index 0000000..88b8cc9
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_resume.brief.html
@@ -0,0 +1,10 @@
+
/spicepay_resume
+
Reopen your active Spice Pay session. Useful if you closed the wizard message by accident.
+
+
Usage
+
/spicepay_resume
+
+
+
If a session exists, the wizard view is shown again.
+
If not, you’ll be told to run /spicepay.
+
diff --git a/assets/docs/commands/SpicePayCog.spicepay_resume.details.html b/assets/docs/commands/SpicePayCog.spicepay_resume.details.html
new file mode 100644
index 0000000..55ebc80
--- /dev/null
+++ b/assets/docs/commands/SpicePayCog.spicepay_resume.details.html
@@ -0,0 +1,14 @@
+
/spicepay_resume — Resume wizard
+
Brings back the current session UI (if you already started one with /spicepay).
+
+
When to use
+
+
You dismissed the ephemeral wizard message and want it back.
+
You’re mid-entry and don’t want to start over.
+
+
+
Behavior
+
+
If a session exists (keyed to you + this server), it re-renders the progress view.
+
If none exists, you get a friendly nudge to start a new one.
+
diff --git a/assets/docs/commands/UserCardsCog.usercards_rescan.brief.html b/assets/docs/commands/UserCardsCog.usercards_rescan.brief.html
new file mode 100644
index 0000000..52cf031
--- /dev/null
+++ b/assets/docs/commands/UserCardsCog.usercards_rescan.brief.html
@@ -0,0 +1,18 @@
+
/usercards_rescan
+
Re-check everyone and refresh the user cards. Also repairs Roles/RoE/nickname claims from the live reaction messages, and re-opens any missing nickname reviews.
+
+
Usage
+
/usercards_rescan
+
+
+
Moderator-only (requires Manage Server).
+
Runs in the server; reply is ephemeral with a short summary.
+
+
+
What it does
+
+
Reconciles from the configured Rules / RoE / Nickname reaction messages.
+
Grants/removes the Rules & RoE roles to match reactions.
+
For Nickname: opens a pending review if someone claimed but no review exists.
+
Rebuilds/updates every user’s status card in the list channel.
+
diff --git a/assets/docs/commands/UserCardsCog.usercards_rescan.details.html b/assets/docs/commands/UserCardsCog.usercards_rescan.details.html
new file mode 100644
index 0000000..93c88f2
--- /dev/null
+++ b/assets/docs/commands/UserCardsCog.usercards_rescan.details.html
@@ -0,0 +1,47 @@
+
/usercards_rescan — Reconcile & refresh all cards
+
One-shot maintenance pass that makes the server’s user cards match reality.
+
+
Access
+
+
Moderator-only — requires the Discord permission Manage Server.
+
Must be used in a server channel (not DMs). The result is sent ephemerally.
+
+
+
What it fixes
+
+
Rules / RoE agreement
+
+
+
Adds/removes the corresponding roles so roles match the reactions.
+
+
+
Nickname claim & reviews
+
+
If a member has an “accept” reaction on the Nickname message but has no pending/verified record and no open review, it opens a pending nickname review for them.
+
If a member removed their Nickname reaction, it clears any pending/verified state.
+
+
+
User cards
+
+
Updates (or recreates) the embed for each member in the configured “users list” channel.
+
Card color reflects: Rules, RoE, and Nickname status (✅ verified / ✔️ pending / ❌ not done).
+
Uses a stable footer marker (UID:<id>) to find/edit the right card; cleans up duplicates.
+
+
+
+
+
Expected output
+
The command replies (ephemeral) with counts like:
+
Reconciled from messages. Changes — Rules: 3, RoE: 2, Nickname (added): 1, Nickname (removed): 0. Refreshed cards for 154 members.
+
+
Setup notes
+
+
Relies on your configured IDs (ENV/INI): Rules/RoE/Nickname message IDs and their role IDs, the Full Access role, the user-cards channel, and the mod/modlog channels.
+
Won’t ping anyone; all posts/edits are sent with no mentions.
+
+
+
Tips
+
+
Run after importing a server, restoring from backup, or after downtime.
+
Large servers: this may take a moment while it walks members and edits cards. It’s safe to run again.
+
diff --git a/assets/docs/commands/__commands__.json b/assets/docs/commands/__commands__.json
index 9e26dfe..2dc3c08 100644
--- a/assets/docs/commands/__commands__.json
+++ b/assets/docs/commands/__commands__.json
@@ -1 +1,91 @@
-{}
\ No newline at end of file
+{
+ "PirateReportCog.report": {
+ "details_md": "## What it does\nSubmit a player to the **Pirate Review Queue**. Mods get a compact card with the details and can approve ❇️ or reject ❌ with one click. If you include proof, it shows inline so they can decide faster.\n\n---\n\n## How to use — `/report`\nWhen you run **/report**, a small form opens:\n\n- **In-game nickname** \n The name they use in game. Example: `SandStalker`\n\n- **Account (Name#12345)** \n Must end with a `#` and **five digits**. Example: `SomeUser#12345` \n > If you only know the nickname, try to get the account tag too. It removes ambiguity later.\n\n- **Proof (Discord media URL — optional but strongly encouraged)** \n Paste a **direct Discord CDN** link so it previews nicely:\n - Accepts: `https://cdn.discordapp.com/...` or `https://media.discordapp.net/...`\n - Works with: **png, jpg, jpeg, gif, webp, mp4, webm, mov**\n - How to get the link: open the image/video in Discord ➜ “Open in browser” ➜ copy the address.\n\n> **Tip:** Images appear inside the mod card. Videos are kept as a plain link above the card so the inline video player works.\n\n---\n\n## What happens after you submit\n- You get a quick **thank-you** in the channel.\n- Mods receive an embed in their review channel with ✅ and ❌.\n- There’s a **“Jump to message”** button on the mod card so they can see the original context.\n- When a mod picks ✅/❌, the card is updated to show **Approved/Rejected** (with who decided and when). The small ack message in your channel is also edited to reflect the result.\n\nIf approved, the player is added to the pirate list (threat level starts at 0 and grows with encounters).\n\n---\n\n## Rules & limits (so you don’t run into errors)\n- **Account format:** must be `Name#12345`. Five digits. No spaces at the end.\n- **Proof link:** must be a Discord media link (see above). Non-Discord links are blocked.\n- **Duplicates:** already-approved players can’t be re-reported; exact pending duplicates are blocked too.\n- **Rate limit:** one report per user every **60 seconds**.\n\nCommon messages you might see:\n- `Invalid account format` → fix to `Name#12345`.\n- `URL must be a Discord media link` → use cdn.discordapp.com or media.discordapp.net.\n- `A report for this player is already pending` → a mod is already reviewing one.\n- `This player is already in the pirate list` → no need to report again.\n\n---\n\n## Good proof examples\n- Screenshot of **names** and actions in the **event log**.\n- Short clip (10–30s) that shows **what happened** and **who did it**.\n- If the situation is complex, add a quick text summary when you submit.\n\n---\n\n## Related actions\n- **/encounter** — log a new encounter with a known pirate. \n Fields:\n - *Pirate (name or account)* — `MuadDib` or `MuadDib#12345` (account preferred)\n - *Group size* — integer ≥ 1\n - *Kills* — integer ≥ 0 (0 = none/unknown)\n - *Destructive?* — `yes` / `no`\n - *Perceived Skill* — 0–5 (0 = unknown) \n Limits: one encounter per same pirate per reporter every **10 minutes**. These entries automatically update the pirate’s **threat level** and **encounter count**.\n\n- **/edit_pirate** *(moderators)* — update a pirate’s nickname/account.\n- **remove_pirate** *(moderators, hybrid)* — remove an approved entry.\n- **encounters_migrate_ids** *(moderators, hybrid)* — migrate old encounter identifiers.\n\n---\n\n## FAQ\n**Q: My proof link won’t accept.** \nA: It must be a direct Discord CDN URL (ends in a known image/video extension). Open the media in browser from Discord and copy that address.\n\n**Q: I only know their nickname and it says “ambiguous”.** \nA: Use the **account** form `Name#12345`. Nicknames can be shared.\n\n**Q: Do I have to add proof?** \nA: Optional, but it **really** helps mods decide quickly. Screenshots are usually enough.\n",
+ "brief_html": "
What it does
\n
\n Sends a player to the Pirate Review Queue. Mods get a card with ✅/❌.\n If you include a Discord media link, it will preview for them.\n
\n Tip: Images show inside the card; videos stay as a link so the inline player works.\n
\n",
+ "details_html": "
Submit a pirate report
\n
\n Use /report to send a player to the Pirate Review Queue.\n Mods see a compact card with your info and can approve or reject with one click.\n
\n\n
Form fields
\n
\n
In-game nickname \n The name they use in game. Example: SandStalker
\n
Account (Name#12345) \n Must end with # + five digits. Example: SomeUser#12345 \n If you only know the nickname, try to grab the account too – it prevents ambiguity.
\n
Proof (Discord media URL) – optional but highly encouraged \n Use a direct Discord CDN link so it previews: https://cdn.discordapp.com/… or\n https://media.discordapp.net/… \n Allowed: png, jpg, jpeg, gif, webp, mp4, webm, mov. \n How to get it: open the media in Discord → “Open in browser” → copy the address.
\n
\n\n
What happens next
\n\n
You get a short “thanks” message in the channel.
\n
Mods receive an embed with ✅/❌. If you added an image, it shows inside the card.\n If it’s a video, the URL is kept above the card so the inline player works.
\n
A “Jump to message” button lets mods see your original context quickly.
\n
When a mod decides, the card updates to show Approved/Rejected with who and when.\n Your small ack message in the channel is edited to reflect the result.
\n
If approved, the player is added to the pirate list (threat level starts at 0).
\n\n\n
Rules & common errors
\n
\n
Account format must be Name#12345. Five digits – no spaces at the end.
\n
Proof link must be a Discord media URL. Non-Discord links are blocked.
\n
Duplicates are blocked (already pending or already approved).
\n
Rate limit: one report per user every 60 seconds.
\n
\n
\n Typical messages: “Invalid account format”, “URL must be a Discord media link”, “A report for this player is already pending”.\n
\n\n
Related actions
\n
\n
/encounter – log a new encounter with a known pirate (updates threat level over time).
\n
/edit_pirate (mods) – update a pirate’s nickname/account.
/encounter SandStalker · group 5 · kills 0 · destructive no · skill 2
\n
\n\n
After you submit, you’ll get a private “Encounter recorded” message and the pirate list updates shortly after.
\n",
+ "details_html": "
What it does
\n
\n /encounter adds a single encounter to the pirate’s history. These entries feed the\n threat score so the pirate list reflects how dangerous someone actually is right now.\n
\n\n\n\n
Form fields
\n
\n
Pirate (name or account) \n Best: Name#12345. If you only know the character name, it must match exactly and not be ambiguous.\n
\n
Group size \n Integer ≥ 1. How many pirates were in their group, including the reported pirate.\n
\n
Kills \n Integer ≥ 0. Use 0 for none/unknown.\n
\n
Destructive? \n yes/no. “Yes” if a base/ornithopter was destroyed, etc.\n
\n
Perceived Skill \n 0–5. Use 0 if you’re unsure. 5 = cracked aim/sweaty movement, 1–2 = casual.\n
If the account format is wrong, you’ll be told what to fix (Name#12345 ending with five digits).
\n
Character names must be an exact match. If multiple pirates share that name, you’ll be asked to use the account.
\n
Rate limit: one report per user per pirate every 10 minutes.
\n
You’ll see a private “Encounter recorded” confirmation on success.
\n
\n\n\n\n
How threat is calculated (short)
\n
\n Each encounter contributes to a weighted score (0–100):\n
\n
\n
Kills: higher if the pirate gets kills.
\n
Destructive: higher if they destroy stuff.
\n
Group size: higher if they roll with group ≥ T (T comes from config).
\n
Skill: your 0–5 rating normalized and averaged across encounters.
\n
\n
\n The weights are configurable (defaults: Kill 0.35, Destruction 0.30, Group 0.20, Skill 0.15). After you submit,\n the bot recomputes the pirate’s threat level and encounter count, then refreshes the list.\n
\n\n\n\n
Tips
\n
\n
Use the account (Name#12345) whenever possible — it guarantees the report hits the right person.
\n
If you can’t tell skill, leave it at 0. That’s fine.
\n
Group size includes the pirate you’re reporting.
\n
\n\n\n\n
Common errors
\n
\n
“No such pirate registered.” — Ask a mod to add them, or submit a /report first.
\n
“Character name is ambiguous.” — Use the account tag (Name#12345).
\n
“You can only report the same pirate once every 10 minutes.” — Wait a bit and try again.
\n Converts old encounter records stored by character name to the\n canonical account (Name#12345).\n
\n\n
/encounters_migrate_ids
\n\n
\n Useful after adding pirates where past encounters referenced only nicknames.\n
\n",
+ "details_html": "
What it does
\n
\n Scans stored encounters and rewrites any identifier that is a character name to the correct\n account for that pirate. Keeps data consistent for threat calculations.\n
\n\n\n\n
How matching works
\n
\n
If the encounter already uses an account (# + five digits), it’s counted as “already accounts”.
\n
If the character name maps to exactly one pirate, it’s updated to that pirate’s account.
\n
If there’s no pirate with that name, it’s counted as “not found”.
\n
If multiple pirates share the same nickname, it’s “ambiguous” and skipped.
\n
\n\n\n\n
Result
\n
\n
Replies with a compact summary (updated / already / ambiguous / not found).
Nick matches my in-game name. Tells mods your current server nickname (or global display name if you haven’t set one) already matches your in-game name, and opens a quick review.
\n\n
Usage
\n
/nick_same
\n\n
\n
You’ll get an ephemeral “thanks” message.
\n
Moderators get a review with ✅ / ❌ in the mod channel.
\n
Full Access is granted automatically when you have: Rules ✅ + Engagement ✅ + this nickname claim (pending or verified).
\n
\n\n
Tips
\n
\n
Run it in the server (not in DMs).
\n
If you recently changed your nick, this will trigger a re-review.
\n
Alternative: react ✅ on the “Nickname” rules message to claim the same thing.
\n
\n",
+ "details_html": "
/nick_same — Nickname claim
\n
Use this when your server nickname already matches your in-game character name. It opens a moderator review so you can get (or keep) access without typing anything else.
\n\n
What it does
\n
\n
Marks your nickname as claimed and opens exactly one pending review for moderators.
\n
You’ll see a short ephemeral confirmation in the channel.
\n
Moderators get a message in the mod channel with ✅ Approve / ❌ Reject.
\n
Full Access is granted automatically when you have: Rules ✅ + Engagement ✅ + Nickname claimed (pending or verified).
\n
\n\n
How to use
\n
/nick_same
\n
\n
Run it in the server, any channel where you can use slash commands.
\n
No extra arguments. If your display name already matches the game name, that’s enough.
\n
\n\n
Typical flow
\n\n
You run /nick_same. The bot replies “Thanks — your nickname claim was sent for moderator review.”
\n
Mods see a review card with your previous nick (if known) and the current one.
\n
They press ✅ to verify or ❌ to reject. You keep (or lose) Full Access depending on Rules/Engagement and the result.
\n\n\n
Good to know
\n
\n
If a verified user changes their nickname later, verification is automatically revoked. Just run /nick_same again (or react ✅ on the nickname message) to re-claim and re-review.
\n
The command is idempotent: if a review is already pending, it won’t open duplicates.
\n
Alternative path: reacting ✅ on the Nickname rules message triggers the same review and access checks.
\n
\n\n
Troubleshooting
\n
\n
No response? Make sure you used it inside the server (not DMs) and that slash commands are allowed in the channel.
\n
Still no Full Access? You need all three: Rules ✅, Engagement ✅, and a nickname claim (pending or verified). Missing any one will remove the role.
\n
Mods didn’t get a review? Ping a moderator; the mod channel might be misconfigured.
Open the Spice Pay wizard. Step through participants, roles, payout type (Sand or Melange), and weighting. Shows a live preview and lets you post the result.
\n\n
Usage
\n
/spicepay [participants] [force_new]
\n
\n
participants (optional): total people, incl. owners (1–25).
\n
force_new (optional): start fresh if you already have a session.
\n
\n\n
Quick flow
\n\n
Enter the total yield and participant count.
\n
Add/edit each participant (name, active %, owner roles).
\n
Toggle payout: Sand ⟷ Melange (set refinery yield for Melange).
\n
Adjust weighting factors or use a preset.
\n
Finish → preview → Post to channel.
\n\n\n
Notes
\n
\n
0% active = owner-only (gets owner perks but didn’t actively join).
\n
Melange: exactly one Refiner owner is required.
\n
Rounding leftovers go to Refiner (Melange) or top earner (Sand).
\n
",
+ "details_html": "
/spicepay — Guided payout
\n
Calculate a fair split for a spice run. The wizard keeps things simple and transparent for the team.
\n\n
Start
\n
/spicepay [participants] [force_new]
\n
\n
If participants is omitted, you set it in the first modal (1–25).
\n
Use force_new: true to discard an existing session and start clean.
\n
\n\n
Setup modal
\n
\n
Total spice yield (sand) — integer ≥ 0.
\n
Participants — include owners (Refiner/Carrier/Crawler). People only; vehicles/refinery are owned by people.
\n
\n\n
Editing participants
\n
For each slot:
\n
\n
Name — free text (mention text is fine).
\n
Active % — 0–100. 0% = owner-only (didn’t actively join).
\n
Owner of (optional) — any of: refiner, carrier, crawler. Flexible input (e.g. “lsr”, “refinery”, “car”, “cr”).
\n
\n
Use Add / Edit participant, Previous/Next to navigate. The preview shows filled vs. empty slots and highlights “owner-only”.
\n\n
Payout type
\n
\n
Sand — no refinery cut; 0 or 1 Refiner owner allowed.
\n
Melange — requires exactly one Refiner owner. First a refinery cut % is taken and paid to the Refiner, then the rest is split.
\n
\n
When switching to Melange, set the refinery yield (integer) in the modal.
\n\n
Weighting (the math, simplified)
\n
\n
Each person gets a weight: Base × Active% + bonuses for owning Carrier/Crawler.
\n
We split the pot proportionally by weights (they’re normalized; only ratios matter).
\n
Melange only: take Refinery cut % first → Refiner. Any rounding leftovers go to Refiner (Melange) or top earner (Sand).
\n
\n\n
Controls
\n
\n
Toggle payout: Sand/Melange — switches mode (prompts for refinery yield on Melange).
Show server SpicePay weights. Read-only view of the defaults the wizard uses.
\n\n
Usage
\n
/spicepay_config
\n\n
\n
Displays: Refinery cut %, Base × active %, Carrier bonus, Crawler bonus.
\n
Change via ENV/INI; restart the bot to apply.
\n
\n",
+ "details_html": "
/spicepay_config — Server weights
\n
Shows the current default weighting used by the Spice Pay wizard.
\n\n
Fields
\n
\n
Refinery cut % (Melange only) — percent taken first and paid to the Refiner owner.
\n
Base × active % — the core share, scaled by each player’s active participation.
\n
Carrier bonus — flat weight added if the person owns the carrier.
\n
Crawler bonus — flat weight added if the person owns the crawler.
\n
\n\n
Where to change
\n
Configure via environment variables or your INI, then restart the bot. The wizard’s Adjust weighting factors lets users override per-run; those don’t change the server defaults.
\n\n
Tips
\n
\n
Use Presets in the wizard to quickly switch philosophy (owner-heavy, participation-heavy, etc.).
\n
Users can Save as my defaults to keep their personal weights for future runs.
Re-check everyone and refresh the user cards. Also repairs Roles/RoE/nickname claims from the live reaction messages, and re-opens any missing nickname reviews.
\n\n
Usage
\n
/usercards_rescan
\n\n
\n
Moderator-only (requires Manage Server).
\n
Runs in the server; reply is ephemeral with a short summary.
\n
\n\n
What it does
\n
\n
Reconciles from the configured Rules / RoE / Nickname reaction messages.
\n
Grants/removes the Rules & RoE roles to match reactions.
\n
For Nickname: opens a pending review if someone claimed but no review exists.
\n
Rebuilds/updates every user’s status card in the list channel.
\n
\n",
+ "details_html": "
/usercards_rescan — Reconcile & refresh all cards
\n
One-shot maintenance pass that makes the server’s user cards match reality.
\n\n
Access
\n
\n
Moderator-only — requires the Discord permission Manage Server.
\n
Must be used in a server channel (not DMs). The result is sent ephemerally.
\n
\n\n
What it fixes
\n\n
Rules / RoE agreement\n
\n \n
Adds/removes the corresponding roles so roles match the reactions.
\n
\n
\n
Nickname claim & reviews\n
\n
If a member has an “accept” reaction on the Nickname message but has no pending/verified record and no open review, it opens a pending nickname review for them.
\n
If a member removed their Nickname reaction, it clears any pending/verified state.
\n
\n
\n
User cards\n
\n
Updates (or recreates) the embed for each member in the configured “users list” channel.
\n
Card color reflects: Rules, RoE, and Nickname status (✅ verified / ✔️ pending / ❌ not done).
\n
Uses a stable footer marker (UID:<id>) to find/edit the right card; cleans up duplicates.
\n
\n
\n\n\n
Expected output
\n
The command replies (ephemeral) with counts like:
\n
Reconciled from messages. Changes — Rules: 3, RoE: 2, Nickname (added): 1, Nickname (removed): 0. Refreshed cards for 154 members.
\n\n
Setup notes
\n
\n
Relies on your configured IDs (ENV/INI): Rules/RoE/Nickname message IDs and their role IDs, the Full Access role, the user-cards channel, and the mod/modlog channels.
\n
Won’t ping anyone; all posts/edits are sent with no mentions.
\n
\n\n
Tips
\n
\n
Run after importing a server, restoring from backup, or after downtime.
\n
Large servers: this may take a moment while it walks members and edits cards. It’s safe to run again.
\n
\n"
+ }
+}
\ No newline at end of file
diff --git a/assets/docs/commands/help.brief.html b/assets/docs/commands/help.brief.html
new file mode 100644
index 0000000..29536ff
--- /dev/null
+++ b/assets/docs/commands/help.brief.html
@@ -0,0 +1,12 @@
+
!help
+
Show a quick overview of commands or details about a specific command.