【问题标题】:Want my bot to delete message when the user reacts with an emoji希望我的机器人在用户对表情符号做出反应时删除消息
【发布时间】:2021-07-24 03:42:02
【问题描述】:

所以我创建了一个书签机器人,它可以向使用书签表情符号对消息做出反应的用户发送 DM。机器人将 DM 中的消息 URL 发送给用户,并使用 X 表情符号做出反应。这个想法是,当用户在 DM 频道中也对 X 表情符号做出反应时,该消息将被删除。

但是,它并不完全正确。当导航到 DM 频道时,消息会自行删除。

这是我的代码;

import discord
import os
from datetime import datetime

intents = discord.Intents.default()
intents.members = True
embed = discord.Embed()
client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))
    

@client.event
async def on_raw_reaction_add(payload):
  message_id = payload.message_id
  channel_id = payload.channel_id
  channel = client.get_channel(channel_id)

  if isinstance(channel,discord.channel.DMChannel) == False:

    emoji = payload.emoji

    user = payload.member
    message = await channel.fetch_message(message_id)
  
    if emoji.name == "????":
      print(user.id)
      print(message.content)
      print("Channel ID = " + str(channel_id))
      #print(emoji.name)
  

      send = await user.send("**Bookmark Created:** " + str(datetime.now())[:-7] + "\n" + message.jump_url)
      await send.add_reaction("❌")

  elif isinstance(channel,discord.channel.DMChannel) == True:
    dm_message_id = payload.message_id
    dm_channel_id = payload.channel_id
    #guild_id = payload.guild_id
    #guild = client.get_guild(payload.guild_id)
    dm_channel = client.get_channel(dm_channel_id)
    dm_emoji = payload.emoji
    dm_user = payload.member

    dm_message = await dm_channel.fetch_message(dm_message_id)
    if dm_emoji.name == "❌":
      await dm_message.delete()

client.run(os.getenv('TOKEN'))

任何帮助将不胜感激:)

【问题讨论】:

    标签: python discord discord.py


    【解决方案1】:

    查看您的评论后,我明白了问题所在。当用户对消息做出反应时,用户反应的消息是被删除的消息,不是被“加入书签”的消息。根据我对代码的理解,您的目标是删除消息正文中链接的消息(即消息正文中的url,您可以通过message.contents提取)。

    要将消息 url 转换为实际值,您可以使用 discord.py 中可用的 MessageConverter 类。您将需要使用转换方法。按以下顺序查找(来自文档):

    查找策略如下(按顺序):

    1. 按“{channel ID}-{message ID}”查找(通过按住 shift 单击“复制 ID”进行检索)
    2. 按消息 ID 查找(消息必须在上下文通道中)
    3. 按消息 URL 查找

    【讨论】:

    • 对不起,但我很难看到它如何解决我的问题。我认为我的问题与语法有关。想详细说明您的解决方案吗?
    • @RaheelShaikh 更新了我的答案,请看一下。根据我对代码的理解,您删除的是用户反应的消息,而不是消息正文中链接的消息。
    【解决方案2】:

    您要确保机器人不会响应自己的反应。您可以围绕您不希望机器人响应的任何内容添加此检查。

    if payload.member == client.user:
    

    或者,如果您还想忽略其他机器人。

    if not(payload.member.bot):
    

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2023-03-04
      • 2021-04-04
      • 1970-01-01
      • 2020-10-11
      相关资源
      最近更新 更多