我希望机器人检查新表情符号的频道是什么,然后做不同的事情,这取决于新表情符号是什么。它可以正常工作,直到表情符号出现在私人频道上,这使得 bot.get_channel(payload.channel_id)
返回 None。
我遇到了与用户或会员 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'
答案 0 :(得分: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
答案 1 :(得分:1)
如果您需要使用 operator[]
,您可以将 on_raw_reaction_add
(Documentation) 与 bot.private_channels
(Documentation) 结合使用(记得检查您的导入)获取 DM 频道。
discord.utils.get
答案 2 :(得分:0)
我添加了一个新函数 on_reaction_add
。它会在私人频道中做出反应并做不同的事情,而 on_raw_reaction_add
会在公会中出现反应。
on_reaction_add
仅适用于缓存中的消息的问题在我的情况下是可以解决的。带有机器人的服务器具有包含完全不可编辑的确切消息的频道,因此没有人可以添加新的反应,只能增加现有反应的数量。当有人点击反应时,他会得到不同的反应,这取决于他点击的表情符号是什么。反应之一是发送私人消息(在 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):
...