Удаление каналов и запуск кода только в том случае, если ПОЛЬЗОВАТЕЛЬ, а не БОТ, реагирует на сообщение

Я пытаюсь создать систему продажи билетов, в которой пользователь делает .ticket. У меня проблема, когда у 'бота' нет атрибута 'delete_channel', и я также хочу сделать так, чтобы бот игнорировал реакцию, если бот реагирует на сообщение, но признает, что обычный член гильдии отреагировал к нему. Вот мой код:

@bot.command()
async def ticket(ctx):
  global ticket_channel
  name = "tickets"
  category = discord.utils.get(ctx.guild.categories, name=name)
  guild = ctx.message.guild
  ticket_id = randint(0, 100)
  ticket_channel = await guild.create_text_channel(f"ticket-0{ticket_id}", category=category)
  embed = discord.Embed(title="Tickets", description="Support will be with you shortly.\nTo close this ticket, react with :lock:.")
  message = await ticket_channel.send(embed=embed)
  await message.add_reaction(emoji="\N{LOCK}")

@bot.event
async def on_reaction_add(reaction: discord.Reaction, user: discord.Member):
  if reaction.message.channel != ticket_channel:
    return
  if reaction.emoji == "\N{LOCK}":
    await bot.delete_channel(ticket_channel)

Некоторое время я пытался выяснить, в чем проблема, но я ничего не понимаю.


person Stress_    schedule 06.02.2020    source источник
comment
Вы захотите использовать wait_for, чтобы дождаться реакции. wait_for принимает check функцию, которую можно использовать для игнорирования определенных реакций. См. эту фабрику функций Я написал, что позволяет создавать такие функции динамически в вашем коде.   -  person Patrick Haugh    schedule 06.02.2020


Ответы (1)


Похоже, вы задаете здесь несколько вопросов:

У меня проблема из-за того, что у бота нет атрибута delete_channel

У бота нет delete_channel() функции. Однако класс Discord.TextChannel имеет функцию .delete() (, показанная в документации).

и я также хочу сделать так, чтобы бот игнорировал реакцию, если бот реагирует на сообщение

Альтернатива 1

Каждый пользователь, включая пользователей ботов, имеет атрибут .bot. Вы можете использовать это, чтобы проверить, является ли пользователь ботом, и если да, вернуть функцию раньше.

@bot.event
async def on_reaction_add(reaction, user):
    if user.bot: return
    # Code goes here

Обратите внимание, что это прослушивает все реакции, а не только это конкретное сообщение; так получается: ...

Альтернатива 2

Как упоминает Патрик Хо, вы можете использовать функцию discord.Client.wait_for() (doc link) и проанализируйте функцию как check аргумент функции.

reaction, user = bot.wait_for('reaction', check=lambda reac: reac.author == ctx.author)

* Обратите внимание, что этот подход не добавляет этот код ни к одному событию (как в первой альтернативе), кроме командного события. Он будет запускаться только один раз для каждой полученной команды, если не будет помещен в какой-либо цикл.

person Eric B    schedule 07.02.2020