使用Discord.js跨渠道发送消息,产生' undefined'错误

时间:2017-03-28 22:36:40

标签: javascript node.js discord discord.js

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

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

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

代码,这正是我作为基础做的事情,因为我可以将.get("name", "My server")替换为实际的通道ID,但通过类似说法的命令执行此操作会设置{{ 1}}作为我的代码中的Channel类,它不支持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)); 上出现undefined错误,我认为这会出错。我已经尝试了.sendMessage()以及其他所有可能的变体,甚至在message.chat.sendMessage()处进行了两行代码测试,但这仍然给了我同样的错误。我找到了找到ID后创建的on.ready()课程的方法,这导致我转到ChannelTextChannel扩展程序,但我非常确定考虑到所有代码(这里甚至是几个例子)都没有包含所有额外信息,因此可以更轻松地解决这个问题。我觉得我正在查看某些内容,或者可能使代码复杂化,但我还不确定。

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

编辑:看起来我是对的,我查看了几个关键点,特别是没有引号的channelID是一个字符串。独自试过命令,一切都很顺利;调整了主要代码并完成了所有工作。

1 个答案:

答案 0 :(得分:0)

首先,我只需要概述一些在 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() - 我们会删除“我”位!相反,我们只想args.join(" ")再次将单词连接成一个句子,然后用message.channel.send()将其发送出去 - 它只是将它发送到服务器中,它从中得到了消息。

如果您需要更多帮助,只需使用您的Discord名称进行评论,我将很乐意为您提供正确的方向。

信息来源:

在这些主题(Discord.JS)上寻求帮助的一些好地方是Official Discord.JS ServerAnIdiotsGuide。这两个都能解决你的问题。