【问题标题】:Discord.py can you make a say command that goes into a specific channel be usable with the #?Discord.py 你能不能用# 使进入特定频道的say 命令可用?
【发布时间】:2021-04-28 05:37:26
【问题描述】:

我正在为一个不和谐的机器人发出一个说命令,并且大部分情况下一切正常。我想做的是一个人可以在任何频道中使用的命令,它会在被告知发送它的频道中发送委托的消息。这一切都有效,这是我的代码:

async def say(self, ctx, channelname, *, message):
        """Make the bot say whatever you want it to say"""
        channel = discord.utils.get(ctx.guild.channels, name=channelname)
        await channel.send(message)

但是,我的问题是,预期的 discord 服务器中的每个频道在频道名称前都有一个表情符号,因此使用 discord 功能要容易得多,如果您键入 #,您可以单击名称渠道。但是,每当我这样做并发送它时,# 仍然存在,它会抛出这个错误代码:

AttributeError: NoneType object has no attribute “send”

有人知道我该如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 您是否启用了意图?
  • @Nurqm 对不起,那是什么?我不熟悉这个词
  • @SuperStormer 这似乎没有帮助,因为即使我删除了这些字符并只获得了 ID,我仍然会遇到同样的错误,因为 discord.utils.get(ctx.guild.channels)方法接受一串字符(通道的“名称”),而不是通道的特定 ID。有没有办法从该 ID 制作频道对象?因为如果是这样,那将解决我的问题。

标签: python python-3.x discord discord.py discord.py-rewrite


【解决方案1】:

最好使用 ids(正如您在之前的 cmets 中提到的)。您可以使用channel = bot.get_channel(channel_id) 来获取通道对象,然后在其上调用channel.send()。简单地获取频道不需要任何意图。您只需要确保机器人有权访问该频道并有权在该处发送。

【讨论】:

  • 谢谢!这正是我需要做的。该机器人也有管理员权限,所以这不是问题。我已经想通了——我找到了实际的方法——但是当我尝试执行 client.get_channel 甚至 self.client.get_channel 时,它不起作用,因为我将其定义为 bot。再次感谢!
  • 是的,没问题。区分 client、bot 和 util 命令可能会让人感到困惑。
  • 还有一件事,@dguis,我实际上已经有了 ID - 那是我唯一拥有的东西。在我发布我的问题后,我意识到我唯一真正需要的是如何从频道 ID 中获取频道对象。我找到了该命令,但不知道如何实际运行它,哈哈——我发现有人用 client.get_channel(channel_id) 运行它,但这不起作用,因为我的客户端对象被称为 bot。
  • 啊,有道理。这也让我困惑了一段时间。
【解决方案2】:

在 discord.py 1.5.x 版本中,有一些网关意图是获取成员、频道、公会、使用事件等所必需的。您必须在代码中定义它并从 @987654321 启用它@。

您可以检查API References 以定义您需要的意图并从Developer Portal 启用特权网关意图。

【讨论】:

  • 这似乎不是我的问题。我已经设法只获得了频道 ID,你知道我可以从那个频道 ID 中获取频道对象吗?我有普通的 id(只是数字)和带有 部分的 ID。如果我能够获得对象,那么我就完成了,这就是我需要获得的主要内容,该频道的对象版本。
  • 您没有获得频道的原因是因为意图。如果不启用和定义意图,您将无法获得频道或成员。
  • 我启用了这两个意图,但似乎都没有阻止获得公会/频道。但是它仍然无法正常工作,我认为是因为我将频道 ID 作为函数的输入,但是 discord.utils.get(ctx.guild.channels, name=“”) 函数创建了一个基于字符串的频道对象是频道的名称,而不是基于频道 ID。是否有另一种方法可以替换它,以便它与频道 ID 一起使用?
【解决方案3】:

警告:如果您在多个服务器上运行此机器人,我不建议您使用此代码,因为即使该命令是在包含机器人的不同服务器上运行的,它也会将消息发送到指定的通道!

根据您使用的是@client 还是@bot,您需要将下面代码中的每个“客户端”切换为“bot”

@client.command()
async def say(ctx, *, message):
    channel = client.get_channel(put the channel ID that you need the bot to send to)
    
    await channel.send(f"{message}")

在此之后您需要做的就是转到您的 discord 服务器并输入任何频道:

(前缀)说信息

机器人会将您的消息发送到您在代码中输入的频道。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2022-01-23
    • 2021-06-20
    • 1970-01-01
    • 2022-07-16
    • 2021-03-24
    相关资源
    最近更新 更多