discord.js - Discord.js 如何发布公告命令
问题描述
我正在尝试为运行 discord.js 的不和谐机器人发出公告命令。例如,如果我说它+ann (#CHANNEL) (ANNOUNCEMENT)
会在那里发布。我没有任何代码,并且一直在寻找年龄。你能帮忙吗?
解决方案
基本命令设置
在制作基本命令时,您首先要设置的是这样的:
<Discord.Client instance here>.on("message", message => {
if(message.author.bot) return;
let messageArray = message.content.split(" ");
let command = messageArray[0];
let args = messageArray.slice(1);
}
这是做什么的?
首先,只要机器人“接收”一条消息,就会调用这些花括号内的代码。这意味着只要消息在它所属的任何服务器的任何通道中发送,代码就会运行,包括 DM。此函数的第一行确保发送消息的用户不是机器人,因为您不希望其他机器人在您的机器人上触发命令。
然后,此代码对 进行一些简单的拆分message
,因此是消息中每个单词messageArray
的数组,由空格确定。例如,这意味着如果我发送,将包含以下内容:Hello there, Cloudy Sounds!
messageArray
['Hello', 'there,', 'Cloudy', 'Sounds!']
command
是这条消息的第一个词(在这种情况下'Hello'
)。这很重要,因为当向机器人发送命令时,例如+ann
上面您想要的命令,消息的标准格式是
<prefix><command> <arguments>
因此,稍后在您的代码中,您可以使用command
在一个字符串中同时获取前缀和命令,让您可以查看是否有人希望机器人做某事,或者他们是否只是与朋友聊天并且什么都不想做用机器人做。
最后, args 是其余单词的数组,在本例中为['there,', 'Cloudy', 'Sounds!']
。
通过结合使用这 3 个变量,您可以轻松地从消息中提取所有重要信息。
获取频道
由于用户的命令将包含一个提到的频道,我们要做的第一件事就是将该频道作为Discord.js 频道类,以便我们以后可以向它发送消息。
为此,我们可以将结果存储message.mentions.channels()
到中channel
。由于我们要在公会中提到一个chanel,我们首先要确保它不是 DM,并且在这种情况下实际上以我们的前缀开头。所以现在,我们的代码如下所示:command
'+'
<Discord.Client instance here>.on("message", message => {
if(message.author.bot) return;
let messageArray = message.content.split(" ");
let command = messageArray[0];
let args = messageArray.slice(1);
if(message.channel.type === "dm") return;
if(!message.content.startsWith('+')) return;
if(command === '+ann') {
let channel = message.mentions.channels();
}
}
提取公告
既然我们已经发布了channel
,我们将希望从message
. 我们将使用args
.
那么,我们该怎么做呢?
首先,我们知道这args[1]
将是频道 ( '#channel'
) 的提及,因此这不是命令的一部分。但是,其他所有内容都是我们公告的一部分,因此我们使用以下内容将所有内容组合成一个字符串:
let announcement = args.slice(1).join(" ");
把它们放在一起
现在我们有了announcement
and channel
,我们终于send
可以了。
最终代码将是:
<Discord.Client instance here>.on("message", message => {
if(message.author.bot) return;
let messageArray = message.content.split(" ");
let command = messageArray[0];
let args = messageArray.slice(1);
if(message.channel.type === "dm") return;
if(!message.content.startsWith('+')) return;
if(command === '+ann') {
let channel = message.mentions.channels();
let announcement = args.slice(1).join(" ");
channel.send(announcement);
}
}
欢迎来到 Stack Overflow,如果您对此答案有任何问题,或者需要进一步说明,请告诉我!
推荐阅读
- php - 悬停时没有显示 mysql 查询的 img 和没有 stocknr
- javascript - 如何将图像放在画布上,然后在上面绘制?
- c# - 删除列表视图中的文本文件行但不保存 c#
- python - 遍历 pandas df 行并执行操作
- java - 如何链接 c3p0 池 identityTokens 和 JDBC 池名称
- ios - UITableViewCell 中的 Swift WebKitView - Cell 每次出现在屏幕上时都会重新加载 webkit 视图
- javascript - 在 onclick 事件中传递变量
- c# - 使用 MahApps WPF 在 ListView 中更改悬停颜色
- vb.net - VB.Net Switch 语句,在每种情况下都包含代码段
- powerbi - PowerBI:使用未显示的值进行钻取