使用 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()
上引发undefined
error,我认为会这样。我已经尝试了message.chat.sendMessage()
和所有其他可能的变化,甚至只用了两行代码在on.ready()
进行测试,但这仍然给我同样的错误。我一直在寻找一种方法来绕过找到 ID 后创建的 Channel
类,这导致我使用了 TextChannel
和 GuildChannel
扩展,但考虑到所有代码,我很确定有一种更简单的方法(甚至这里有几个例子)不包含所有额外的信息。我觉得我正在查看某些内容,或者可能使代码复杂化了超出需要的程度,但我不确定。
任何想法或帮助将不胜感激。
编辑:看来我是对的,我查看了几个关键点,特别是 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 跨渠道发送消息会产生“未定义”错误的主要内容,如果未能解决你的问题,请参考以下文章