我希望创造一个“说”的话。允许我直接通过机器人向特定(或任何可能)通道发送消息的命令。对于初学者和一般测试目的,我的目标是能够使用标准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()
课程的方法,这导致我转到Channel
和TextChannel
扩展程序,但我非常确定考虑到所有代码(这里甚至是几个例子)都没有包含所有额外信息,因此可以更轻松地解决这个问题。我觉得我正在查看某些内容,或者可能使代码复杂化,但我还不确定。
任何想法或帮助都将不胜感激。
编辑:看起来我是对的,我查看了几个关键点,特别是没有引号的channelID是一个字符串。独自试过命令,一切都很顺利;调整了主要代码并完成了所有工作。
答案 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”的频道。
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()
将该消息发送到我们定义的频道。
message.channel.send(args.join(" "));
这一点在某些方面略有不同,首先,我们忘记了chan
变量,因为我们无法找到该频道。如果我们知道这一点,我们可以推断用户可能会说a~speak I has a bucket
之类的东西 - 而不是完全没有ID。
知道,我们(不像以前),不想要args.shift()
- 我们会删除“我”位!相反,我们只想args.join(" ")
再次将单词连接成一个句子,然后用message.channel.send()
将其发送出去 - 它只是将它发送到服务器中,它从中得到了消息。
在这些主题(Discord.JS)上寻求帮助的一些好地方是Official Discord.JS Server和AnIdiotsGuide。这两个都能解决你的问题。