The problem#
I run a Discord community for a local hobby-focused friends group. Since it's theoretically people I know in person, I don't want it to be an open invite; I want confirmation that everyone that joins has a real in-person connection to the group. I handle by gating access to most of the channels behind a role that I grant to new users once I've identified them. As the group has grown, I am often not directly connected to everyone joining, so I wanted an easy way to grant trusted users the ability to do the same. The straightforward way is to just use Discord permissions to let other people assign roles, but I wanted something smoother and easier for non-technical users.
The solution#
YAGPDB ("Yet Another General Purpose Discord Bot") is an extremely flexible and configurable Discord bot that can be set up to do pretty much anything. For this purpose, we're deep in its customization features which include a programming language for running custom scripts in response to various triggers. Since people in the community tend to 👋 react to the join message Discord generates when someone they know joins, I wanted to specifically make that the signal that a user is a real person. Here's a YAGPDB custom command that will do so when set up to be triggered by adding a reaction and configured with the desired allowed roles and filling in the configurable values at the top of the script:
{{/*
Grant role to user when trusted user
reacts to their join message.
By Daniel Perelman <https://github.com/dperelman/>
Loosely based on
<https://yagpdb-cc.github.io/utilities/reaction-logs>
by Satty9361 <https://github.com/Satty9361>
*/}}
{{/* Configurable values */}}
{{$logging_channel_id := }}
{{$roleName := }}
{{$adminUserId := }}
{{/* End of configurable values */}}
{{/* Actual CODE */}}
{{ if (and
(eq .ReactionMessage.Type 7)
(eq .Reaction.Emoji.APIName "👋")) }}
{{$newUser := .ReactionMessage.Author}}
{{$role := getRole $roleName}}
{{$adminUserLink := (print "[" (userArg $adminUserId) "]"
"(<https://discord.com/users/" $adminUserId ">)")}}
{{$userLink := (print "[" .User "]"
"(<https://discord.com/users/" .User.ID ">)")}}
{{$newUserLink := (print "[" $newUser "]"
"(<https://discord.com/users/" $newUser.ID ">)")}}
{{ if targetHasRoleID $newUser.ID $role.ID }}
{{/* sendMessage $logging_channel_id (print
"DEBUG: " $userLink " would have granted `"
$role.Name "` to " $newUserLink
" but they already have that role.") */}}
{{ else }}
{{ giveRoleID $newUser.ID $role.ID }}
{{ sendMessage $logging_channel_id (print
$userLink " granted `" $role.Name "` to
" $newUserLink " by reacting :wave: to their "
"join message.") }}
{{ sendDM (print
"You have granted " $newUserLink " the role `"
$role.Name "` by :wave: reacting to their "
"join message. If this was in error, "
"please contact " $adminUserLink ".") }}
{{ end }}
{{ end }}