Skip to Content
Haven Documentation is the shared home for product guides, plugin setup, and release docs.

Panel Types

Reaction Roles supports multiple panel formats. The dashboard editor normalizes older formats into MIXED because MIXED supports every interaction style in one panel.

MIXED

MIXED is the recommended format for new panels.

It can include:

  • Select menu options
  • Buttons
  • Emoji reactions
  • Sub-panels
  • Links from buttons/select options to sub-panels
  • A check-current-roles helper button

Use MIXED when you want one polished panel with multiple interaction styles or future flexibility.

SELECT

SELECT panels show a Discord dropdown menu. Users can select one or more options, and the plugin adds/removes roles to match the current selection.

Good for:

  • Many notification roles
  • Cleaner panels with fewer visible buttons
  • Users managing several roles at once

Limit: Discord select menus support up to 25 options.

BUTTON

BUTTON panels show clickable buttons. Each button toggles one role.

Good for:

  • Small sets of important roles
  • Simple visual calls to action
  • Mobile-friendly role toggles

Limit: Discord allows 5 buttons per row and 5 rows per message.

REACT

REACT panels use emoji reactions directly on the panel message.

Good for:

  • Classic reaction role behavior
  • Very compact role menus
  • Servers that prefer reaction-based UX

If auto_remove_user_reactions is enabled, the bot removes the user’s reaction after toggling the role. This keeps the panel clean but requires Manage Messages.

CATEGORY

CATEGORY is a legacy structured format with main role options and category buttons. It is useful for older configs, but new dashboard-created panels should usually use MIXED plus sub-panels.

Sub-Panels

Sub-panels are private ephemeral menus opened from a MIXED panel. They are useful when a single public message should lead users into deeper choices without cluttering the channel.

Examples:

  • Main panel: “Choose your game”
  • Sub-panel: game-specific region/platform/rank roles
  • Main panel: “Notification settings”
  • Sub-panel: product-specific notification groups

Sub-panels can contain their own buttons and select menus. They can also link to other sub-panels, allowing chained flows.

Role Change Behavior

For buttons and reactions, each click/reaction toggles one role:

  • User does not have role -> add role
  • User already has role -> remove role

For select menus, the selected values become the desired state:

  • Selected option and user lacks role -> add role
  • Unselected option and user has role -> remove role

Current Roles Button

When enabled, the panel includes a “Check My Current Roles” button. It replies privately with the user’s current roles from that panel and a short tip.

This is especially useful for select-menu panels because Discord does not always display a user’s previous selections after page reloads or message refreshes.

Validation

Before assigning a role, the plugin checks:

  • The member exists.
  • The role exists.
  • The role is below the bot’s highest role if hierarchy checks are enabled.
  • The user has not exceeded max_roles_per_user.
  • The user has no bypass role unless bypass is intended.

Panel Records

Every sent panel is stored in MongoDB with:

  • panel name
  • guild ID
  • channel ID
  • message ID
  • embed title
  • panel type
  • updated timestamp

Those records let the plugin avoid duplicate panels on restart and recover when a panel message was deleted.