Discord – это одна из самых популярных платформ для общения и создания сообществ онлайн. Для того чтобы ваш сервер был более удобным в использовании и имел больше возможностей для пользователей, приложение telegram bot вам нужно самостоятельно написать какую-то функциональность. В сегодняшней статье мы рассмотрим настроенную выдачу ролей за реакции при помощи discord.py.
Что такое Discord.py
Discord.py является библиотекой для Python, которая позволяет создавать ботов для Discord. Она предоставляет удобный и простой в использовании интерфейс, который позволяет разрабатывать ботов для ваших серверов. Discord.py является мощным инструментом для создания ботов со множеством функций, включая настраиваемую выдачу ролей за реакции.
Что такое реакции в Discord?
Как работает настраиваемая выдача ролей за реакции
Как и было сказано ранее, настраиваемая выдача ролей за реакции позволяет вашим пользователям получать роли на сервере в зависимости от того, какую реакцию они отправляют на сообщение. Это очень удобно для организации конкурсов, розыгрышей или просто для того, чтобы сделать ваш сервер более интересным и удобным для пользователей.
ДИСКОРД БОТ #11 | КНОПКИ / РОЛИ ПО КНОПКЕ / BUTTONS | DISNAKE/DISCORDPY | DISCORD BOT PYTHON
Для настройки выдачи ролей за реакции мы будем использовать следующие шаги:
1. Создание ролей
2. Создание сообщения
3. Привязка реакций к ролям
4. Создание кода для бота
Шаг 1: Создание ролей
Первым шагом для настройки выдачи ролей за реакции является создание ролей, которые вы собираетесь выдавать вашим пользователям в зависимости от реакции. Для создания роли пройдите по пути: «Server settings» -> «Roles» -> «Create Role».
Выберите имя роли и установите необходимые права на эту роль. После создания роли необходимо скопировать ее ID для использования его в последующих шагах.
Шаг 2: Создание сообщения
Создайте сообщение со всеми деталями для вашего конкурса, розыгрыша или мероприятия, которое вы хотите провести на своем сервере. В этом сообщении вы можете включить текст, изображения или любые другие элементы.
После создания сообщения скопируйте его ID.
Шаг 3: Привязка реакций к ролям
Теперь необходимо привязать реакции к ролям. Для настройки выдачи ролей за реакции нам необходимо использовать метод add_reaction().
if payload.emoji.name == »:
role = guild.get_role(ROLE_ID)
await member.add_roles(role)
elif payload.emoji.name == »:
role = guild.get_role(ANOTHER_ROLE_ID)
await member.add_roles(role)
Здесь мы используем событие on_raw_reaction_add(), чтобы отслеживать, когда пользователь добавляет реакцию на сообщение. Если сообщение содержит корректный ID (MESSAGE_ID), то мы получаем объект гильдии (guild), а затем объект участника (member). Мы получаем объект гильдии и участника, чтобы убедиться в том, что наш бот может добавлять роли там, где ему нужно.
Затем мы проверяем, какую реакцию пользователь добавил к сообщению. Если реакция является «», мы добавляем роль c ID ROLE_ID, если реакция является «», мы добавляем другую роль c ID ANOTHER_ROLE_ID.
How to write a Discord Role Reaction Bot in Python w/ Discord.py
Шаг 4: Создание кода для бота
Последним шагом является написание кода, который позволит вашему боту работать с вашим сервером Discord. Настройте соединение с вашим сервером Discord:
from discord.ext import commands
Здесь мы использовали библиотеку discord.py, чтобы создать клиента бота по имени client. После того, как мы настроили соединение с нашим сервером, мы передаем ему токен, чтобы бот мог авторизоваться на сервере.
В итоге, мы можем получить полностью настроенную выдачу ролей за реакции. Как только это сделано, вы можете использовать это в своих серверах discord для облегчения управления ролями и для организации различных мероприятий, розыгрышей и конкурсов.
Настраиваемая выдача ролей за реакции является полезной функциональностью в Discord, которая позволяет пользователям получать доступ к уже настроенным или новым ролям, используя реакции на сообщениях. В этой статье мы прошли четыре шага, которые помогут вам настроить выдачу ролей за реакции при помощи discord.py.Такой бот, подключенный к серверу, сможет сделать ваш сервер более интересным и разнообразным для пространства, а так же украсит конкурсы или розыгрыши на вашем сервере Discord.
Похожие записи:
- discord.py выдача ролей по реакции
- Как работает настраиваемая среда Horizon?
- Discord API – Событие нажатия на кнопку реакции
- Как использовать Passport-Discord для аутентификации через Discord в Node.js?
- Использование Discord API для создания приложений на C#, работающих с мессенджером Discord
Источник: qaa-engineer.ru
Блог
Главная — Вопросы по программированию — Discord.py — Проверьте, есть ли у пользователя определенные роли?
Discord.py — Проверьте, есть ли у пользователя определенные роли?
- Post author: admin
- Запись опубликована: 13 января, 2022
- Post category: Вопросы по программированию
#python #discord #discord.py
Вопрос:
Я пытаюсь создать команду, которая может запрещать людей на Сервере и тех, кто не находится на сервере. Но есть проблема: если я использую async def ban(ctx, member: discord.Member, *, reason): для использования атрибут «роли», то он не сможет запретить тех, кого нет на сервере. Если я использую async def ban(ctx, member: discord.User, *, reason): , я не смогу использовать атрибут «роли», потому что это не атрибут.
Зачем я это делаю? Я пытаюсь сделать так, чтобы модераторы сервера не могли запретить тем, у кого есть роли модераторов
async def ban(ctx, member: discord.User = None, *, reason=None): if get(ctx.author.roles, or get(ctx.author.roles, or get( ctx.author.roles, or ctx.author.guild_permissions.administrator: # Check if the author has the Role «Moderator», «Admin», etc. if get(member.roles, or get(member.roles, and not ctx.author.guild_permissions.administrator: # Check if the member has the Role «Moderator», «Admin», etc. await ctx.send(«You cannot ban this user.»)
Ответ №1:
Предполагая, что вы используете команды discord.ext., вы могли бы использовать ввод текста.Конвертер союзов, чтобы убедиться, что аргумент является либо пользователем, либо участником.
import typing [. ] async def ban(ctx, user: typing.Union[discord.Member, discord.User]):
Обратите внимание, что порядок имеет значение: discord.Member сначала он пытается применить этот конвертер , прежде чем пытаться discord.User , таким образом, отдавая приоритет преобразованию в участника, а не преобразованию в пользователя (что должно быть тем, что вы хотите).
Чтобы различить эти два случая, теперь вы можете проверить, соответствует ли user тип discord.Member , и выполнить проверку.
if type(user) is discord.Member: if YOUR_CHECKS: await ctx.send(‘You cannot ban this user’) return # Perform ban await ctx.send(‘Ban successful’)
При тестировании я обнаружил, что библиотека команд выдаст вам числовой идентификатор пользователя вместо реального пользователя и покажет
Failed fetching discord object! Passing ID instead. в качестве предупреждения. Если вам нужно больше, чем просто идентификатор пользователя, вы можете преобразовать его в пользовательский объект с помощью
if type(user) is int: user = await bot.fetch_user(user) if user is None: await ctx.send(‘User not found’) return
Обратите внимание, что fetch_user это вызов API, и вы, возможно, захотите избежать его. Смотрите документы для получения дополнительной информации.
Ответ №2:
Одним из способов сделать это было бы проверить, входит ли данный member игрок в текущую гильдию. Если это так True , вы можете создать новый member object с их идентификатором или другим предпочтительным методом, в противном случае вы можете предположить, что у них нет роли модератора. Для простоты я включил проверку только для одной роли, но вы можете настроить ее так, как хотите. Кроме этого, все остальное более подробно объясняется в приведенном ниже коде.
if member in ctx.guild.members: # checks if the provided member is in the current server member = ctx.guild.get_member(member.id) # Get the member object of the user if get(member.roles, # Check if this role is in the member’s roles await ctx.send(«This member has «) else: await ctx.send(«This member does not have «) return # returns, since member was in the server # This happens if the provided member is not in the current server await ctx.send(«This member, who is not in this server, does not have «)
Ответ №3:
Вы должны использовать это
Источник: programbox.ru
Добавить роль по ID discord.py
В течение 1-2 часов я упорно пытался заставить этот фрагмент кода работать. Мне нужно добавить роль пользователю, достаточно просто, не так ли?
Этот код ищет роль, но не может ее найти, потому что я отправляю ее из канала, к которому эта роль не имеет доступа? Мне нужна помощь, пожалуйста.
Изменить 1: удалены цитаты вокруг идентификатора
2021-03-06T21:12:51.811235+00:00 app[worker.1]: Your bot is ready. 2021-03-06T21:14:09.010057+00:00 app[worker.1]: Ignoring exception in command addrole: 2021-03-06T21:14:09.012477+00:00 app[worker.1]: Traceback (most recent call last): 2021-03-06T21:14:09.012553+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 85, in wrapped 2021-03-06T21:14:09.012554+00:00 app[worker.1]: ret = await coro(*args, **kwargs) 2021-03-06T21:14:09.012592+00:00 app[worker.1]: File «bot.py», line 92, in addrole 2021-03-06T21:14:09.012593+00:00 app[worker.1]: await user.add_roles(user, role) 2021-03-06T21:14:09.012621+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/member.py», line 673, in add_roles 2021-03-06T21:14:09.012621+00:00 app[worker.1]: await req(guild_id, user_id, role.id, reason=reason) 2021-03-06T21:14:09.012651+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/http.py», line 243, in request 2021-03-06T21:14:09.012652+00:00 app[worker.1]: raise NotFound(r, data) 2021-03-06T21:14:09.012699+00:00 app[worker.1]: discord.errors.NotFound: 404 Not Found (error code: 10011): Unknown Role 2021-03-06T21:14:09.012735+00:00 app[worker.1]: 2021-03-06T21:14:09.012735+00:00 app[worker.1]: The above exception was the direct cause of the following exception: 2021-03-06T21:14:09.012736+00:00 app[worker.1]: 2021-03-06T21:14:09.012772+00:00 app[worker.1]: Traceback (most recent call last): 2021-03-06T21:14:09.012832+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/bot.py», line 935, in invoke 2021-03-06T21:14:09.012833+00:00 app[worker.1]: await ctx.command.invoke(ctx) 2021-03-06T21:14:09.012863+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 863, in invoke 2021-03-06T21:14:09.012863+00:00 app[worker.1]: await injected(*ctx.args, **ctx.kwargs) 2021-03-06T21:14:09.012890+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 94, in wrapped 2021-03-06T21:14:09.012891+00:00 app[worker.1]: raise CommandInvokeError(exc) from exc 2021-03-06T21:14:09.012932+00:00 app[worker.1]: discord.ext.commands.errors.CommandInvokeError: Command raised an exception: NotFound: 404 Not Found (error code: 10011): Unknown Role
Изменить 2: удален пользователь из add_role
2021-03-06T22:22:45.062172+00:00 app[worker.1]: Your bot is ready. 2021-03-06T22:22:52.026199+00:00 app[worker.1]: Ignoring exception in command addrole: 2021-03-06T22:22:52.028082+00:00 app[worker.1]: Traceback (most recent call last): 2021-03-06T22:22:52.028089+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 85, in wrapped 2021-03-06T22:22:52.028089+00:00 app[worker.1]: ret = await coro(*args, **kwargs) 2021-03-06T22:22:52.028092+00:00 app[worker.1]: File «bot.py», line 94, in addrole 2021-03-06T22:22:52.028100+00:00 app[worker.1]: await user.add_roles(role) 2021-03-06T22:22:52.028104+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/member.py», line 673, in add_roles 2021-03-06T22:22:52.028108+00:00 app[worker.1]: await req(guild_id, user_id, role.id, reason=reason) 2021-03-06T22:22:52.028111+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/http.py», line 241, in request 2021-03-06T22:22:52.028111+00:00 app[worker.1]: raise Forbidden(r, data) 2021-03-06T22:22:52.028152+00:00 app[worker.1]: discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions 2021-03-06T22:22:52.028160+00:00 app[worker.1]: 2021-03-06T22:22:52.028161+00:00 app[worker.1]: The above exception was the direct cause of the following exception: 2021-03-06T22:22:52.028161+00:00 app[worker.1]: 2021-03-06T22:22:52.028164+00:00 app[worker.1]: Traceback (most recent call last): 2021-03-06T22:22:52.028223+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/bot.py», line 935, in invoke 2021-03-06T22:22:52.028224+00:00 app[worker.1]: await ctx.command.invoke(ctx) 2021-03-06T22:22:52.028225+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 863, in invoke 2021-03-06T22:22:52.028225+00:00 app[worker.1]: await injected(*ctx.args, **ctx.kwargs) 2021-03-06T22:22:52.028225+00:00 app[worker.1]: File «/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py», line 94, in wrapped 2021-03-06T22:22:52.028226+00:00 app[worker.1]: raise CommandInvokeError(exc) from exc 2021-03-06T22:22:52.028228+00:00 app[worker.1]: discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
Надеюсь, теперь это сработает 🙂
Источник: www.javaer101.com