Удаление каналов и запуск только кода, если пользователь, а не BOT реагирует на сообщение - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь создать систему тикетов, в которой пользователь делает .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)

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

1 Ответ

0 голосов
/ 07 февраля 2020

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

У меня проблема, когда у 'bot' нет атрибута '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

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

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

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

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

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

...