【问题标题】:How to get a DMChannel object? - discord.py如何获取 DMChannel 对象? - 不和谐.py
【发布时间】:2021-03-28 02:11:26
【问题描述】:

我希望机器人检查带有新表情符号的频道,然后根据新表情符号做不同的事情。它可以正常工作,直到表情符号在私人频道上,这使得 bot.get_channel(payload.channel_id) 返回无。

我在用户或会员 ID 上遇到了同样的问题。 payload.member 返回 None,但 bot.get_user(payload.user_id) 返回成员对象。那么,有没有这样的东西,但有渠道?用什么来获取 DMChannel 对象?

@bot.event
async def on_raw_reaction_add(payload):
print(bot.get_channel(payload.channel_id), payload.channel_id) # This line will be deleted, it is used for showing the problem.
if payload.user_id != None:
    channel = bot.get_channel(payload.channel_id)
    msg = await channel.fetch_message(payload.message_id)
    emoji = payload.emoji
    author = payload.member
    if emoji.is_custom_emoji():
        emoji_count = discord.utils.get(msg.reactions, emoji=emoji).count
    else:
        emoji_count = discord.utils.get(msg.reactions, emoji = emoji.name).count
    if payload.channel_id == channel_i:
        if emoji_count > 1:
           ...

反应在DM通道的输出,错误是因为通道是NoneType,是上一行造成的。

None 782664385889959976
Ignoring exception in on_raw_reaction_add
Traceback (most recent call last):
File "C:\Users\plays\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\client.py", 
line 312, in _run_event
await coro(*args, **kwargs)
File "C:\Users\plays\OneDrive\Рабочий стол\Python\bot2.py", line 122, in on_raw_reaction_add
msg = await channel.fetch_message(payload.message_id)
AttributeError: 'NoneType' object has no attribute 'fetch_message'

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    您是否有理由需要使用on_raw_reaction_add 而不是on_reaction_add?在 99% 的情况下,后者的作用与前者相同。话虽如此,它的参数是 reaction, user [documentation] 更容易解析,因为它们是 discord.py 对象。

    而不是通过bot.get_channel 检索频道,您可以直接调用

    channel = reaction.channel.message
    

    完整示例:

    @bot.event
    async def on_reaction_add(reaction, user):
        channel = reaction.message.channel
    

    【讨论】:

    • on_raw_reaction_add 适用于不在缓存中的消息,适用于超过 14 天的消息。所以是的,这似乎是他想要的东西
    • 好吧,看来我找不到答案了,所以我将尝试划分on_raw_reaction_add并添加一个on_reaction_add。在这种情况下,我需要检查频道是否为 dm 频道。有一个isinstance(),但是如果channel总是None,如果它是一个DMChannel,如何使用它?
    【解决方案2】:

    如果你需要使用on_raw_reaction_add,你可以使用bot.private_channels(Documentation)结合discord.utils.get(Documentation)(记得检查你的导入)来获取DM频道。

    @bot.event
    async def on_raw_reaction_add(payload):
    if payload.user_id != None:
        channel = bot.get_channel(payload.channel_id)
        if channel is None: # checking if we are in a DM channel
            channel = discord.utils.get(bot.private_channels, id=payload.channel_id)
    

    【讨论】:

    【解决方案3】:

    我添加了一个新功能on_reaction_add。它会在私人频道中做出回应并做不同的事情,而on_raw_reaction_add 会在公会中出现反应。 on_reaction_add 仅适用于缓存中的消息的问题在我的情况下是可以解决的。带有 bot 的服务器的频道包含完全不可编辑的确切消息,因此没有人可以添加新的反应,只能增加现有反应的数量。当有人点击反应时,他会得到不同的反应,这取决于他点击的是什么表情符号。其中一个反应是发送一条私人消息(在 DMChannel 中)并向其添加反应,并且由于机器人没有关闭,因此他在缓存中有这条消息(因为他发送了它)。现在,如果用户增加机器人添加的表情符号数量,机器人将以某种方式做出反应。为了检查频道是否为 DMChannel,我在第一个函数中写了if "None" in str(type(channel)),在其他函数中写了if isinstance((reaction.message.channel), discord.channel.DMChannel):

    @bot.event
    async def on_raw_reaction_add(payload):
    channel = bot.get_channel(payload.channel_id)
    if payload.user_id != 773501851396079618 and not "None" in str(type(channel)):
        msg = await channel.fetch_message(payload.message_id)
        emoji = payload.emoji
        author = payload.member
        if emoji.is_custom_emoji():
            emoji_count = discord.utils.get(msg.reactions, emoji=emoji).count
        else:
            emoji_count = discord.utils.get(msg.reactions, emoji = emoji.name).count
        ...
        ...
    
    @bot.event
    async def on_reaction_add(reaction, user):
        if isinstance((reaction.message.channel), discord.channel.DMChannel):
            ...
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2021-08-04
      • 1970-01-01
      • 2021-11-20
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2019-02-04
      相关资源
      最近更新 更多