Discord-бот выдает роли на основе имен пользователей
Я создаю бота для модерации Discord, одной из составляющих этого бота является следующая задача:
«Когда каждый новый пользователь заходит на сервер, его роль по умолчанию будет @NotMember, но когда он меняет свой серверный никнейм на «Никнейм | (Настоящее имя)", например, CoolPerson (Алекс), то его роль автоматически меняется на @Member".
Единственный способ сделать это, который я вижу, — проверить, содержит ли имя пользователя скобки, если нет, то его роль — старая @NotMember.
Есть ли другой способ определить, изменили ли участники сервера свое имя на псевдоним? И возможно ли это на самом деле?
Я делаю этого бота на JavaScript, но здесь также приветствуется Python.
Ответы (1 шт):
Чтобы проверять изменения никнеймов воспользуемся обработчиком
on_member_update(before, after)
before и after аргументы имеют тип discord.Member, так что мы можем сравнить никнейм пользователя до и после, обратившись к свойству nick.
Если никнейм изменился и при этом не был убран, то можем проверять соответствие никнейма форме
if before.nick != after.nick and after.nick != None:
Запишем в отдельную переменную никнейм, резделенный на 2 части по строке ' | '
splitted_nick = after.nick.split(' | ')
Если количество элементов в списке splitted_nick равно 2, значит никнейм имеет 2 части и можно работать со второй, для проверки скобок. Далее просто проверяем, чтобы вторая часть никнейма начиналась с '(' и заканчивалась на ')'
В противном случае забираем роль
if len(splitted_nick) == 2:
if splitted_nick[1].startswith('(') and splitted_nick[1].endswith(')'):
await after.add_roles(role)
else:
await after.remove_roles(role)
else:
await after.remove_roles(role)
Полный код:
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='!', intents=discord.Intents.all())
@bot.event
async def on_member_update(before, after):
if before.nick != after.nick and after.nick != None:
# роль, когда ник не по форме
not_member_role = after.guild.get_role(id)
# роль, когда ник оформлен правильно
member_role = after.guild.get_role(id)
splitted_nick = after.nick.split(' | ')
if len(splitted_nick) == 2:
if splitted_nick[1].startswith('(') and splitted_nick[1].endswith(')'):
await after.add_roles(member_role)
await after.remove_roles(not_member_role)
else:
await after.remove_roles(member_role)
await after.add_roles(not_member_role)
else:
await after.remove_roles(member_role)
await after.add_roles(not_member_role)
bot.run(TOKEN)