Documentation menu

Docs/Plugins/Tags

Tags

Save and recall snippets of text, plain or as embeds.

Tags are named snippets anyone (with the level you choose) can recall - FAQ answers, rule quotes, copy-pasta your server insists on keeping. A tag can carry a description (what staff see in lists instead of the content) and can render as an embed with a title, color, image, and footer.

plugins:
  tags:
    max_tag_length: 1900
    min_level_remove_others: 50   # who may delete other people's tags
    access:                       # optional, per-function minimum levels
      create: 10
      edit: 50
      remove: 10
      owner: 50

The three commands

  • tag {name} sends a tag. The slash form autocompletes the name as you type and has proper channel and user options; the prefix form takes the same -c / -u / -e flags it always has. The everyday invoker is still just !{name}.
  • tag create {name} {content} makes a tag the fast way. Add a description or embed afterwards in tag manage or the dashboard.
  • tag manage [name] is the toolbox. With a name it shows everything about that tag - content, description, author, usage - with buttons to edit, add or edit its embed, transfer ownership, and remove it. Without a name it opens the same paginated list as tags.
  • tags lists every tag, 15 per page with descriptions, with a picker that jumps straight into managing any of them.

The old tags edit, tags remove, tags info, tags list, and tags owner commands moved into tag manage. Typing the old forms still lands you in the right place, and !tags {name} still sends a tag like it did in classic HepBoat.

Buttons only show for members whose level can use them, and every click is re-checked. Editing is level based: anyone at access.edit can edit any tag (matching classic HepBoat). Removing someone else's tag needs min_level_remove_others on top of access.remove. The access block can raise any function's bar; leaving it out keeps the classic levels.

Setup checklist

  1. Add plugins.tags in Config. Set max_tag_length below Discord's message limit if staff tend to add surrounding text.
  2. Set min_level_remove_others to the lowest command level that may remove another member's tag. Raise levels per function under access: if the defaults are too open.
  3. Create a disposable tag with tag create, then open tag manage {name} and give it a description from the Edit button.
  4. Invoke it with the bare !<name> form, then with /tag and pick it from the autocomplete. Run tags to see your description in the list.
  5. Add an embed from the manage view (title and color are enough) and invoke it again - it should arrive as an embed everywhere, including -c sends.
  6. Remove the disposable tag from the manage view. Confirm an ordinary member cannot remove someone else's tag below the configured level.

The dashboard's Tags page lists, edits, and deletes them with usage counts, descriptions, and the embed fields.

Content tokens

Tag content supports placeholders, filled in when the tag is used:

  • {user} / {mention} - mentions the person who used the tag (or the -u target, see below)
  • {channel} - the channel the tag was used in (or the -c target)
  • {server} - the server name
  • {u<id>} / {r<id>} / {c<id>} - mention a specific user, role, or channel by ID

User and role mentions in tag content ping for real (embeds are the exception - Discord never notifies from inside an embed). @everyone and @here are always suppressed in tags, no matter who wrote them.

Directing a tag

Both !tag {name} and the bare !<name> form take flags, in any position after the name:

  • -u @someone (or --user) directs the tag at them: {user} tokens become that person, and if the tag has no {user} token they get pinged above the content.
  • -c #channel (or --channel) posts the tag to another channel.
  • -e (or --embed, !tag only) renders a plain tag inside an embed once. A tag with saved embed settings always renders as its embed.

On the /tag slash command those are real options: pick the channel and member from the pickers instead of typing flags.

Troubleshooting

  • A bare tag name runs another command: built-in command names take precedence; use a different tag name or invoke it through !tag.
  • A mention renders but does not ping: mentions inside embeds never notify, and @everyone plus @here are always suppressed.
  • -c cannot post: HepBoat needs access and Send Messages in the destination.
  • A member cannot remove another person's tag: compare their command level with min_level_remove_others.
  • A member cannot edit at all: compare their level with access.edit (the classic default is moderator level 50).
  • The Edit form does not include the content box: that tag's content is longer than Discord's 4000 character form limit - edit the body in the dashboard.
  • Long output fails: lower max_tag_length and account for text added by the invocation flags.

Commands

Arguments in {curly braces} are required. Arguments in [square brackets] are optional.

Command What it does
/tag {name} [channel] [user] [embed] Send a tag, optionally to a channel or at a member. Slash form autocompletes and has channel/user options.
/tag create {name} {content} Create a tag - invokable in chat as .
/tag manage [name] One tag's whole toolbox: info, edit, embed, owner, remove as buttons. No name = browse all.
/tags Paginated list of every tag with its description.