@Punishment

Мой код не работает, но не выводит ошибку discord py. Как это исправить?

Мой бот должен выдавать роль по реакции на емоджи, но он этого не делает, но при этом в консоли не выводится ошибка. Я понятия не имею , в чем проблема. Помогите пожалуйста.
import discord
from discord.ext import commands
from discord.utils import get

client = commands.Bot(command_prefix = ".",intents = discord.Intents.all())

@client.event
async def on_ready():
  print(discord.__version__)
  
  Channel = client.get_channel(815951876708892672)
  Text= "Выбери свою роль"
  Moji = await Channel.send(Text)
  await Moji.add_reaction('')
@client.event
async def on_reaction_add(reaction, user):
  opa = "не работает"
  Channel = client.get_channel(815951876708892672)
  if reaction.message.channel.id != Channel:
    return opa
  if reaction.emoji == "":
    
    Role = discord.utils.get(user.server.roles, name="PUBG")
    await user.add_roles(Role)

client.run("My token")
  • Вопрос задан
  • 257 просмотров
Решения вопроса 1
  1. Переменные, возвращаемые в функции "слушателя" (listener) уходят, по большей части, в никуда
  2. Вы сравниваете ID канала с его объектом

Так же, вы сравниваете эмодзи в реакции с пустой строкой, но я, так полагаю, это хабр порезал эмодзи. Впрочем, если там используется не стандартное эмодзи, и вы вырезали его сами для "приватности", то пользовательские эмодзи так работать не будут. В случае пользовательских эмодзи, необходимо сравнивать эмодзи в реакции с объектом эмодзи.

import logging
...

log = logging.get_logger("mybot")

@client.event
async def on_reaction_add(reaction, user):
  if reaction.message.channel.id != 815951876708892672:
    log.debug("Игнорируем реакцию в канале %s", reaction.message.channel.name)
    return
  if reaction.emoji == "\N{PISTOL}":  # Указываем символ юникода по его имени, в данном случае - https://www.fileformat.info/info/unicode/char/1f52b/index.htm
    role = discord.utils.get(user.server.roles, name="PUBG")  # CamelCase/CapWords названия переменных, по хорошему, должны использоваться только для названий классов: https://www.python.org/dev/peps/pep-0008/#class-names
    await user.add_roles(role)
    log.info("Выдал роль %s пользователю %s", role.name, user.name)


Также, помните, что сообщение, на которое добавляется реакция, должно быть в кэше бота (кратко говоря - создано когда бот был запущен и готов, и не было вымещенно другими сообщениями). В противном случае, вам действительно нужен on_raw_reaction_add
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Потому что нужен on_raw_reaction_add
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы