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.
| Trigger | Command | Sends 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 5The 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 wordreasonto 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.