Skip to main content
Righteous

Server messages

Welcome, goodbye, boost, unboost, join-DM and custom punishment messages: one embed-code language, and an auto-delete flag that behaves differently on each surface.

Righteous can post a message when someone joins, leaves, boosts, stops boosting, or gets punished. It can also DM a message the moment they join, separately from all of those. Every one of these is written in the same embed-code language, so learning it once covers all five.

Not the same thing as the join/leave log

,config welcome and its leave counterpart toggle a plain log embed to a separate log channel: member tag, account age, join position. This page is about the custom message system: your own embed code, posted wherever you point it. The two run independently and can both be on at once.

Write the message

An embed code is a run of {tag: value} chunks, like {title: Welcome!}, {description: {user} just joined}, {button: link && Rules && https://discord.com}, with $p between them. {user} and its relatives are variables that resolve to whoever triggered the message. Embed codes is the full explanation of the language; this page is about the five places you can save one.

The variable list is generated straight from the bot's own parser rather than written out here: run ,customembed variables (alias ,ce variables, or /customembed variables) in Discord for the current one.

++delete <seconds> is different from the tags above: it is an instruction to the bot, not something that renders. Trailing it on an add command auto-deletes that message after the given number of seconds. On these surfaces the range is 1 to 60, which is narrower than the 600 ,customembed allows, and a value with a letter in it is not refused: it is quietly truncated to whatever digits it starts with. ++delete 1m saves as 1 second. Write the seconds as digits.

Start from a code that already works

A welcome message that greets the member by mention, counts them in, shows their avatar, and points at the rules:

Syntax

,welcomemessage add <channel> <code>

Example

,welcomemessage add #general {color: #fb4868}$p{title: Welcome to {guild.name}}$p{description: {user.mention} is member number {guild.membercount}.}$p{thumbnail: {user.avatar}}$p{button: link && Read the rules && https://discord.com}

A boost message that thanks the booster and shows what the server is up to:

Syntax

,boostmessage add <channel> <code>

Example

,boostmessage add #general {color: #f47fff}$p{description: {user.mention} just boosted {guild.name} — that's {guild.boostcount} boosts.}$p{thumbnail: {user.avatar}}

Both are ordinary embed codes; nothing on this page is special syntax. Three things are worth copying out of them:

  • {color:} first is a habit, not a rule. Order does not matter (the parser reads tags by name), but a code that opens with its colour is easier to re-read a month later.
  • {user.mention} pings, {user} does not. {user} renders their tag as plain text. Use the mention in a channel the member can see, and the tag in a log.
  • {guild.membercount} and {guild.boostcount} are read at send time, so they are right for the member who just triggered the message rather than for whenever you saved the code.

Tip

Try a code with ,customembed before you save it anywhere. It renders the same code immediately, in the channel you run it in, with your own account standing in for the member, so a typo costs you one message instead of showing up at the next real join.

Set a welcome, goodbye, boost or unboost message

These four commands share one shape: add a channel and a code, check what a channel has, list every channel configured, remove one, or reset all of them for the server. Each needs Manage Server.

TriggerCommandSends when
Member joins,welcomemessage (,wmsg)a member joins
Member leaves,goodbyemessage (,gbmsg)a member leaves
Member boosts,boostmessage (,bmsg)a member starts boosting
Member stops boosting,unboostmessage (,ubmsg)a member's boost ends

Syntax

,welcomemessage add <channel> <code> [++delete <seconds>]

Example

,welcomemessage add #general {description: {user} joined}$p{button: link && Rules && https://discord.com}$p ++delete 5

The other three take the identical shape: swap the command name. check, list, remove and reset need only a channel (or nothing, for list/reset):

Syntax

,welcomemessage check <channel>

Syntax

,welcomemessage remove <channel>

Syntax

,welcomemessage reset

A server can set one message per channel per trigger, and as many channels as you like: ,welcomemessage add a second channel and both fire.

Send a join DM

,joindm needs Manage Server and sends a code straight to a new member's DMs, the moment they join. No channel, no auto-delete. Deleting a DM the member may not have opened yet would destroy it with no trace, so ,joindm never honors ++delete: the flag is silently stripped out of the code if you type it, and nothing gets scheduled to disappear.

A welcome DM that says which server it came from and gives the member one thing to do next:

Syntax

,joindm add <code>

Example

,joindm add {color: #fb4868}$p{author: {guild.name} && {guild.icon}}$p{title: Welcome, {user.name}}$p{description: You're member number {guild.membercount}. Read the rules first, then say hello.}$p{thumbnail: {guild.icon}}$p{button: link && Read the rules && https://discord.com}

Two things are worth copying out of it:

  • Nothing about a channel resolves in a DM. A join DM is rendered outside any channel, so {channel.name} and {channel.id} have nothing to read, and they do not fail politely: one of them anywhere in the code drops the whole token pass, and the member receives the code with every token still showing as raw text, {guild.name} included. {user.*}, {guild.*} and {color.random} are all safe here.
  • Name the server, because the DM cannot. {guild.name} and {guild.icon} cost two tags and earn them back immediately: this message arrives in a list of DMs from everywhere, with nothing but your code to say who sent it.

Syntax

,joindm check

Syntax

,joindm remove

Join DMs also fail quietly for a reason outside the bot's control: a member with DMs closed to the server, or to the bot specifically, never receives one, and Righteous has no way to tell you that happened.

Customize a punishment message

,custommessage (,cm) replaces the built-in confirmation the bot posts for a ban, jail, kick, mute, warn, timeout, or any of their reversals, with your own embed code. It needs Manage Server and Server Premium: the free tier keeps the default confirmations.

A ban confirmation that reads like a log line (who, from where, and when):

Syntax

,cm <punishment> <code>

Example

,cm ban {color: #fb4868}$p{author: {user} && {user.avatar}}$p{description: **{user}** was banned from {guild.name}.}$p{footer: User ID {user.id}}$p{timestamp:}

Syntax

,cm <punishment> check

Syntax

,cm <punishment> reset

Syntax

,cm reset

<punishment> is one of ban, jail, kick, mute, unban, unjail, unmute, warn, timeout or untimeout. ,cm reset on its own clears every punishment message at once. Reach for ,cm <punishment> reset instead if you only meant to clear one.

Three things are worth copying out of that code:

  • Every {user.*} is the punished member, not the moderator. {user}, {user.avatar} and {user.id} all describe the person being banned. Get this backwards and your ban log quietly credits the wrong account.
  • There is no token for the reason, the duration, or the moderator. None of the three reaches the renderer, and an invented one does not come out blank: an unrecognised token posts as its own name, so {reason} publishes the literal word reason to the channel. Keep the confirmation to who and where; the reason is already in the ban's own audit-log entry.
  • {user.mention} is the wrong choice here. By the time the message posts, the member is gone, and a mention of someone no longer in the server renders as a dead grey pill. {user} gives you their tag as plain text, which still reads correctly a month later.

++delete is accepted in a ,cm code (it is stripped so it can never print), but nothing schedules it, so a punishment confirmation stays put whatever number you trail on it. Leave it off.

Where the slash command fits

Welcome, goodbye, boost, unboost and custom-punishment messages are one slash command, /messages, with a subcommand group per surface: /messages welcome add, /messages boost check, and so on. Join DMs are not part of that group: they keep their own slash command, /joindm, because the two systems were built and shipped separately. If you're looking for one and can't find it under /messages, that's why.

add on any of them opens a modal on slash rather than taking the code as an option: an embed code is multi-line by construction, and a normal text option silently eats newlines. Paste the whole code, ++delete included, into the box.

Common issues

A welcome/goodbye/boost/unboost message never posts. The target has to be a text channel the bot can see and send to. A code that renders to nothing (every tag typo'd, for example) also posts nothing, silently.

++delete does nothing on a join DM. That's by design. See Send a join DM above. It works on welcome, goodbye, boost and unboost messages, appended to the end of the code on add.

A permission problem in the welcome channel used to break more than the welcome message. Losing Send Messages or Embed Links in the configured welcome channel used to throw an error that stopped the entire join pipeline for that member partway through, so join DMs, autorole, and role restoration on rejoin all silently stopped firing too, and it looked like three unrelated features had broken at once. That's fixed: a failure sending the welcome message is now contained to that one channel, and everything after it in the join pipeline still runs. If a member reports only the welcome message missing, check that channel's permissions first.

,cm answers "Server Premium Only". That is the gate, not a bug: the whole command is refused without Server Premium, on both the prefix and the slash form, so nothing is saved and the built-in confirmations keep posting. Every other command on this page is free.