Let members claim roles by reacting to a message or clicking a button. Configure panels from the dashboard only — there are no Discord commands. The dashboard editor has full embed/message customisation and a live preview of exactly what the panel will look like, the same way the Persist sticky-message editor and Welcomer editor work.
Replaces the old command-driven Reaction roles and Role buttons plugins, which are still supported for data created before this change but can no longer create new mappings.
#Configuration
plugins:
role_panels:
enabled: true
config:
panels:
- id: "a1b2c3d4-0000-4000-8000-000000000001"
name: "Colour Roles"
enabled: true
trigger_type: reaction
post_mode: bot
channel_id: "123456789012345678"
selection_mode: single
remove_on_unreact: true
content: "React to pick a colour."
embed:
enabled: true
title: "Colour roles"
description: "One colour at a time."
color: 5661430
roles:
- role_id: "111111111111111111"
emoji: "🔴"
- role_id: "222222222222222222"
emoji: "🔵"
- id: "a1b2c3d4-0000-4000-8000-000000000002"
name: "Pronoun Roles"
enabled: true
trigger_type: button
post_mode: existing
existing_message_link: "https://discord.com/channels/123456789012345678/234567890123456789/345678901234567890"
selection_mode: multiple
roles:
- role_id: "333333333333333333"
label: "he/him"
style: primary
- role_id: "444444444444444444"
label: "she/her"
style: primary
- role_id: "555555555555555555"
label: "they/them"
style: primary
#Panel fields
| Field | Description |
|---|---|
id | Stable panel ID. Generated by the dashboard — don't edit by hand |
name | Dashboard-only label |
enabled | Turn this panel on or off without deleting it |
trigger_type | reaction (members react) or button (members click) |
post_mode | bot (Dreamliner posts and owns the message) or existing (attach to a message you already posted) |
channel_id | Channel to post in. Required when post_mode is bot |
existing_message_link | Link to the message to attach to. Required when post_mode is existing |
content / embed | Message text and embed. Only used when post_mode is bot — existing mode never touches a message's content |
selection_mode | multiple (toggle roles independently) or single (picking one removes any other role from this panel the member already has) |
remove_on_unreact | Reaction trigger only: remove the role when the reaction is removed |
roles | The roles members can claim. Each entry: role_id, emoji (required for reaction triggers), label and style (button triggers only — primary/secondary/success/danger, label defaults to the role's name) |
embed reuses the same fields as Persist's embed (title, description,
color, author, thumbnail, image, footer, fields, timestamp).
Saving the dashboard config posts/edits/removes bot-mode messages automatically, and reconciles
existing-mode reactions/buttons on save — no separate "publish" step.
#Behaviour
post_mode: bot— Dreamliner posts and edits the message in place as the panel changes (never deletes and reposts to "bump" it, unlike Persist). Disabling or deleting the panel deletes the message.post_mode: existing— Dreamliner only ever touches its own contribution to that message: the reactions it added, or a button row it appended. Everything else about the message (content, embeds, other reactions, other components) is left alone, even when the panel changes or is disabled.selection_mode: single— when a member picks a new role on the panel, any other role from the same panel they already hold is removed. For reaction panels this also removes their other reaction(s) on that message.- A pre-existing legacy
/reactionrolemapping or/rolebuttonpanel on the same message as a new Role Panel will both fire independently and harmlessly (role add/remove is idempotent) — not recommended, but not broken either.
#Requirements
- The bot needs Manage Roles, and its highest role must be above every role in the panel.
- Reaction panels need Add Reactions; button panels need Send Messages (to edit the message).
selection_mode: singlereaction panels need Manage Messages in the target channel, to remove a member's other reaction when they pick a new role — the dashboard's Validate action warns if this is missing.post_mode: existingbutton panels need at least one free action row (max 5 per message) on the target message; the dashboard reports how much room is left.