使用 Discord.js 跨渠道发送消息会产生“未定义”错误

Posted

技术标签:

【中文标题】使用 Discord.js 跨渠道发送消息会产生“未定义”错误【英文标题】:Sending messages across channels with Discord.js, yields 'undefined' error 【发布时间】:2017-08-22 05:04:58 【问题描述】:

我希望创建一个“说”命令,允许我通过机器人直接向特定(或任何,也许)频道发送消息。对于初学者和一般测试目的,我的目标是能够使用标准 if(commandIs("command", message) 直接向我的测试服务器中的频道发送消息,最终演变为服务器上的所有频道。

通过我的研究,我偶然发现了:

var channel = client.servers.get("name", "My Server").defaultChannel; client.sendMessage(channel, "Hello");

代码,这正是我想要做的基础,因为我可以将 .get("name", "My server") 换成实际的频道 ID,但是通过类似 say 的命令执行此操作会将 var 设置为频道我的代码中的类,不支持.sendMessage()

我当前的命令代码如下:

if(commandIs("speak", message))
    var chat = client.channels.get(18numberID);
        if(args.length === 1)
                message.channel.sendMessage('You did not say anything. Usage: `a~speak [message]`')
             else 
                chat.sendMessage(args.join(" ").substring(8));

-但这会在.sendMessage() 上引发undefinederror,我认为会这样。我已经尝试了message.chat.sendMessage() 和所有其他可能的变化,甚至只用了两行代码在on.ready() 进行测试,但这仍然给我同样的错误。我一直在寻找一种方法来绕过找到 ID 后创建的 Channel 类,这导致我使用了 TextChannelGuildChannel 扩展,但考虑到所有代码,我很确定有一种更简单的方法(甚至这里有几个例子)不包含所有额外的信息。我觉得我正在查看某些内容,或者可能使代码复杂化了超出需要的程度,但我不确定。

任何想法或帮助将不胜感激。

编辑:看来我是对的,我查看了几个关键点,特别是 channelID 周围没有引号是一个字符串。单独尝试了这个命令,一切都很顺利;调整了主要代码,一切顺利。

【问题讨论】:

不知道为什么它不返回一个 TextChannel.. 你确定它是一个 TextChannel 吗?也许对客户端或其他东西有(安全性?)限制。也许你应该尝试在 discord.js 服务器上询问 Discord.js Official#222078108977594368 我自己也很好奇。作为初学者,我已经尝试了所有可以发现或发现的编码漏洞,但似乎没有任何效果。我会确保联系 Discord.js 官方服务器,看看他们是怎么想的。 你的 djs 版本是多少? 11.0.至于这个问题,我问了 discord.js 官方服务器,他们帮了我很大的忙。问题在于 .get 无法正常工作,因为我的 ID 不是字符串。我在频道 ID 周围使用了引号,但它似乎不起作用,所以我在测试机器人中从头开始重写了代码,一切顺利。在主机器人中做了同样的事情,一切都点击到位。 defaultChannel 已弃用。 【参考方案1】:

首先,我只需要概述一些在 Discord.JS 库中不再起作用的东西(感谢 Ty Q 的提醒!)

首先,.sendMessage() 已被弃用,并且很可能不再/很快不再工作。等效于 .send() - 它更简单,并且很容易进行更改。

第二:不幸的是,.defaultChannel 已不再存在。当我们想要发送消息时,我们必须更加具体。

我不擅长谈论这类问题,所以如果其他人想接听,请说。


好吧,让我们把你的命令设置成这样:a~speak [ChannelID] <Message>

假设我们使用这个命令:a~speak 12345689 I has a bucket

我们要做的是找出我们是否可以找到具有ID的频道,如果可以,将消息发送给它。

为此,我认为我们应该看看是否可以使用client.channels.find("id", ID) 函数。


让我们从设置命令开始

if(commandIs("speak", message))
    args = args.shift();
    /* ["a~speak", "CHANNELID", "I", "has", "a", "bucket"]
    BECOMES
    ["123456789", "I", "has", "a", "bucket"]
    args [0]      [1]   [2]   [3]     [4]*/


    let chan = client.channels.find("id", args[0]); // Find the channel ID "123456789"
    if(chan)  // Check if that channel exists
        chan.send(args.shift().join(" "));
     else 
        message.channel.send(args.join(" "));
    


让我们按照这个命令来

如果我们输入a~speak 12345689 I has a bucket,我们的机器人将寻找一个它可以访问的频道,ID 为“123456789”。


如果您的机器人找到了 ID 为“123456789”的频道:

chan.send(args.shift().join(" "));

我们之前定义了chan = args[0] - 这将是“123456789”,我们不想在消息中发送它,所以我们使用args.shift() - 这会从其余参数中删除第一个参数,留下我们["I", "has", "a", "bucket"].

之后,我们使用.join(" ") - 这将["I", "has", "a", "bucket"] 与空格连接起来形成I has a bucket

然后我们只需将该消息发送到我们定义的通道,chan.send()


如果您的机器人没有找到 ID 为“12456789”的频道

message.channel.send(args.join(" "));

这在某些方面有点不同,首先,我们忘记了chan 变量,因为我们找不到那个频道。如果我们知道这一点,我们可以推断出用户可能说了类似a~speak I has a bucket 之类的内容 - 完全没有 ID。

知道,我们(与以前不同),想要args.shift() - 我们会删除“I”位!相反,我们只想 args.join(" ") 再次将单词组合成一个句子,然后使用 message.channel.send() 将其发送出去 - 它只是将其发送到接收消息的服务器中。


如果您需要更多帮助,只需在评论中注明您的 Discord 名称,我很乐意为您提供一点帮助,朝着正确的方向发展。

信息来源:

在此类主题 (Discord.JS) 上寻求帮助的一些好地方是 Official Discord.JS Server 和 AnIdiotsGuide。两者都能解决你的问题。

【讨论】:

TL;DR:我认为您的问题是 var chat = client.channels.get(18numberID); - 我认为您可能必须使用 var chat = client.channels.find("id", 18numberID); 我认为你们忽略了这样一个事实,即 OP 正在尝试使用已弃用的代码,例如 .sendMessage().defaultChannel。如果他有最新的 Discord.js,这将产生错误。另外,我不确定 Discord API 是否仍然支持实际支持这些命令的 D.js 版本。 啊,是的。我出于习惯删除了.sendMessage()Message 部分,但我忘记解释它的重要性。我会编辑帖子。 我认为 OP 正在使用discordjs.readthedocs.io,因为他的所有代码都已弃用。我一开始也犯了同样的错误。现在我在制作机器人方面相当不错。但是,对于文档,您必须使用 discord.js.org。 用 Discord.JS 聊天的永久链接编辑了上述帖子。

以上是关于使用 Discord.js 跨渠道发送消息会产生“未定义”错误的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js:检测来自 Webhook 的消息

Discord.js guildMemberUpdate 事件

使用 discord.js 在第一个频道发送消息

discord.js 将消息作为代码块发送?

欢迎消息未通过 Discord.js 发送

可以发送嵌入消息的 Discord.js 机器人