向在不和谐中扮演角色的每个人发送私人消息

Posted

技术标签:

【中文标题】向在不和谐中扮演角色的每个人发送私人消息【英文标题】:Send a private messege to everyone that has a role in discord 【发布时间】:2019-06-25 12:37:23 【问题描述】:

如果他们具有特定角色,我正在尝试向不和谐频道中的每个人发送私人消息。

我设法找到了这个:

from discord.ext import commands
import discord

TOKEN = 'xxx'

bot = commands.Bot(command_prefix='!')

@bot.command(pass_context=True)
async def message_role(ctx, role: discord.Role, *, message):
    for member in ctx.message.server.members:
        if role in member.roles:
            await bot.send_message(member, message)

bot.run(TOKEN)

我使用 Client.x,但我不明白 Bot.x 是什么。是,当我运行它时,我收到以下错误消息:

PS D:\discord bots> py .\DMeveryone.py
Ignoring exception in command message_role:
Traceback (most recent call last):
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\bot.py", line 898, in invoke
    await ctx.command.invoke(ctx)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 608, in invoke
    await self.prepare(ctx)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 573, in prepare
    await self._parse_arguments(ctx)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 491, in _parse_arguments
    transformed = await self.transform(ctx, param)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 353, in transform
    return await self.do_conversion(ctx, converter, argument, param)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 308, in do_conversion
    return await self._actual_conversion(ctx, converter, argument, param)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\core.py", line 254, in _actual_conversion
    ret = await instance.convert(ctx, argument)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\discord\ext\commands\converter.py", line 320, in convert
    raise NoPrivateMessage()
discord.ext.commands.errors.NoPrivateMessage

这是消息:!message_role member 大家好!

如果有人能向我解释这个问题会很棒,非常感谢。

【问题讨论】:

据我所见,您收到的 exception discord.ext.commands.NoPrivateMessage(message=None, *args) 本质上是在告诉您->当操作在私人消息上下文中不起作用时引发异常 所以这行不通? 如果您从机器人所在服务器中的文本通道调用命令而不是从私人消息中调用命令,则它可以工作 @Tristo 我已经试过了。我也得到一个错误:discord.ext.commands.errors.CommandInvokeError:命令引发异常:AttributeError:'Message'对象没有属性'server' @lucky_dandu 这是未在此处发布的代码错误,但这意味着您在某处执行message.server,而您需要执行message.channel.server 【参考方案1】:

discord.ext.commands.Bot 是 discord.py 和子类 discord.Client 的命令扩展的一部分。

根据discord.ext.commands.NoPrivateMessage 的文档,它是

当操作在私人消息上下文中不起作用时引发。

这是因为您正在尝试使用一个通过 DM 使用 RoleConverter 的命令,其中没有角色。

您收到AttributeError: 'Message' object has no attribute 'server' 异常的原因是您尝试使用Message.server 属性,但您使用的是discord.py 的rewrite 分支,其中Server is now Guild。 Message.server 在 discord.py (@Patrick Haugh) 的异步分支上作为 Message.channel 和 Channel.server 的快捷属性存在。相应地,Message.guild 作为属性存在于 rewrite 分支上。

您还使用了一种方法来发送仅存在于异步分支上的消息。 见Sending Messages subsection of the Migrating to v1.0 section of the documentation for the rewrite branch。

另外,pass_context=True no longer exists and is no longer necessary on the rewrite branch。

【讨论】:

你确定他们在使用重写吗?他们在上面的代码中有await bot.send_message @PatrickHaugh 是的,我指出了这一点。 raise NoPrivateMessage() 当前位于 line 320 of discord/ext/commands/converter.py on the rewrite branch 上,如异常的回溯中。而discord/ext/commands/converter.py on the async branch 甚至没有 320 行。 它在第 151 行而不是 github.com/Rapptz/discord.py/blob/async/discord/ext/commands/… 是的,它绝不是在异步分支的第 320 行,他们的异常回溯显示在。

以上是关于向在不和谐中扮演角色的每个人发送私人消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在不和谐上发送私人消息[关闭]

不和谐.js |在 quick.db 中扮演一个角色

关于新角色不和谐的消息[关闭]

如何获取@everyone 角色ID?

如何让一个不和谐的 js 机器人在某人获得某个角色后向他发送消息

使用机器人从私人消息中自动创建角色和频道的问题