discord py как получать сообщения с атрибутами jump_url и реакций

#python #discord

Вопрос:

Я пытаюсь создать бота, который бы автоматически реагировал, проверял количество реакций на сообщения в канале, делал ссылку на сообщение и отправлял его на канал модерации, если он получил 2 или более реакций, а затем регистрировал URL-адрес перехода в каталоге бота. Я не могу найти способ получить все сообщения с атрибутами jump_url и реакций. я чувствую себя очень потерянным, поэтому я помещу код здесь

 async def on_message(message):
  if message.channel.id == 828579458167996420:
    channel = client.get_channel(828579458167996420)
    if message.attachments or "http" in message.content: 
      await message.add_reaction("<:MashaUpset:828589397074116709>")
      x = int
      messages = await channel.history(limit=21).flatten()
      f = open("message log.txt","r")
      readfile = f.read()
      f.close()
      if str(messages.jump_url) not in readfile:
        if messages.reactions[0].count >= 2:
          x = messages.reactions[0].count - 1
          link = messages.jump_url
          channel = client.get_channel(892065611876823100)
          await channel.send("this post was liked "  str(x)   " times! "  str(link))
          f = open("message log.txt", "a")
          f.write("n"   str(messages.jump_url))
          f.close()
 

я новичок, так что извините за беспорядок, который я устроил

Изменить: не удается выполнить выборку jump_url , поэтому вместо этого выполняется выборка для message.id

Комментарии:

1. Во время своих тестов я задавался вопросом, как это вообще должно работать. Вы не можете справиться со всем этим в on_message любом случае, так как счетчик будет время от времени подниматься. Просто чтобы понять логику: кто-то отправляет сообщение, бот добавляет реакцию, а затем напрямую проверяет, есть ли в сообщении две или более реакций. После того, как это событие закончится, бот больше никогда не будет проверять реакции. Ваша messages часть также очень запутана, так как вы пытаетесь пройти через list то, что работает не так, как вы хотите. Возможно, вы объясните свой код немного подробнее, используйте print инструкции и обрабатывайте его шаг за шагом.

2. Сначала я сделал так, чтобы он реагировал, а затем подождал 24 часа, прежде чем проверять количество реакций, полученных сообщением, а затем поделился ссылкой jump_link на сообщение на мод-канале. После использования бота в течение недели бот иногда выходил из строя и ничего не делал (проблема с обслуживанием хоста?). Что я пытаюсь сделать, так это заставить бота вместо этого проверить реакции на последние 20 сообщений, убедившись, что они еще не были опубликованы на канале мод, прочитав message log.txt

Ответ №1:

Хорошо, я нашел его. спасибо Доминику за помощь

Изменения, которые я сделал

  • Я разделил сценарий на 2 части, an on_message и a @tasks.loop
  • Добавил for x loop
  • Добавлено await channel.fetch_message(x.id) в цикл
  • Доставлено message.id скорее для, чем jump_url
  • Добавлена инструкция if для проверки наличия реакции на сообщение
 @client.event
async def on_message(message):
  if message.channel.id == 828579458167996420:
    
    if message.attachments or "http" in message.content: 
      await message.add_reaction("<:MashaUpset:828589397074116709>")

@tasks.loop(minutes=2)
async def check():
  channel = client.get_channel(828579458167996420)
  messages = await channel.history(limit=30).flatten()
  await asyncio.sleep(3)
  f = open("message log.txt","r")
  readfile = f.read()
  f.close()
  for message in messages:
    channel = client.get_channel(828579458167996420)
    message = await channel.fetch_message(message.id)
    if str(message.id) not in readfile:
      if message.reactions:
        if message.reactions[0].count >= 2:
         x = message.reactions[0].count - 1
         link = message.jump_url
         channel = client.get_channel(892065611876823100)
         await channel.send("this post was liked "  str(x)   " times! "  str(link))
         f = open("message log.txt", "a")
         f.write("n"   str(message.id))
         f.close()
@check.before_loop
async def before():
    await client.wait_until_ready()

check.start()
 

Комментарии:

1. Это выглядит намного лучше. Работает ли эта версия для вас?

2. да, это работает идеально! Это намного более последовательно, чем прежняя 1 полная защита, которая у меня была, даже если у них было несколько простоев ботов. еще раз спасибо, что указали мне правильное направление