Reaction roles let your server members self-assign Discord roles by clicking a button on a panel embed. Each button is tied to a specific role, labelled with a custom emoji and text, and styled with one of Discord’s four button colours. Panels are organised by category so you can have separate panels for notification preferences, regional roles, game interests, and more — all managed through a singleDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/devjhoan/absolet/llms.txt
Use this file to discover all available pages before exploring further.
/reaction-roles command.
Display Modes
Absolet renders reaction role panels as button rows. Each role in a category becomes one button, and up to five buttons can be placed per row (Discord’s limit). When a category has more than five roles the bot automatically wraps to a new action row. An optionaldisplay-label flag on the send subcommand controls whether each button shows the role’s text label alongside its emoji, or just the emoji alone — useful for compact panels.
Setup
Add role entries
Run
Each entry is saved to the guild’s
/reaction-roles add once for each role you want to include. Provide all required fields:| Field | Description |
|---|---|
category | Groups this entry with others in the same panel (e.g. notifications, countries) |
role | The Discord role to assign or remove when clicked |
emoji | The emoji displayed on the button |
label | The text label displayed on the button (shown only when display-label is true at send time) |
style | Button colour: Primary (blue), Secondary (grey), Success (green), or Danger (red) |
rolesConfig array in MongoDB.Review your entries (optional)
Run
/reaction-roles list at any time to see a paginated embed showing every configured role entry for the server, including its category, label, style, and emoji.Send the panel
Run The bot filters
/reaction-roles send to post the panel for a specific category in a channel:rolesConfig to only include entries matching the given category, builds the button rows, and posts the embed. The embed body is built from the SelectReactionRoleEmbed template in messages.yml with the {panels} placeholder replaced by a formatted list of all roles in the category. The channel and display-label options are both optional; if channel is omitted the panel is posted in the current channel.How It Works
Each reaction role button carries a custom ID in the formatrct-<roleId>. When a member clicks a button, Absolet’s reactionRoles event handler:
- Extracts the role ID from the custom ID.
- Looks up the role in the guild’s
rolesConfig. - Checks whether the member already has the role:
- Has the role → removes it and replies with
ReactionRoleRemovedEmbed - Does not have the role → adds it and replies with
ReactionRoleAddedEmbed
- Has the role → removes it and replies with
ephemeral: true, so only the clicking member sees the confirmation — keeping the panel channel clean.
RolesConfig Data Model
Each entry in therolesConfig array on the guild document conforms to the following interface:
Removing an Entry
To remove a single role from the reaction role system, run:rolesConfig in the database. Note that any already-posted panels that included this role will continue to show the button visually, but clicking it will no longer produce a result since the config entry no longer exists. Re-send the panel after deleting entries to refresh it.
Panel Embed Format
ThepanelsFormat field in messages.yml under SelectReactionRoleEmbed controls how each role line is rendered in the panel embed description. The default format is:
panelsFormat directly in messages.yml.