这个系列会带着您通过Node.js中的Discord.js套件,从0到1开始製作属于自己的Discord机器人,希望可以帮助大家成为机器人的开发者哦!
前言
这篇文章会带着大家製作一个指令:bot-info,用途是查看机器人的相关资讯,指令注册的部分已经在Ep.5.0指导过,若还没看过的可以先行前往阅读唷!
指令构想
要製作一个新的指令之前,第一步便是构想指令的大致架构,在此分为以下五项:
指令名称指令说明指令用途回应内容其他功能前两项是在输入斜线 (/) 时使用者会看到的资讯,通常会让使用者对于指令的用途和用法一目了然。
而第三~五项是协助您设计指令的程式,让您有明确的方向製作并供使用者使用。
指令名称
指令名称已经提及,是bot-info,当然您也可以自行设计名称,但要注意指令的注册和回应侦测需使用同样的名称,否则会发生错误。
指令说明
指令是用来得知机器人的相关资讯的,因此我在此使用简短的文字:「查看机器人的相关资料及资讯」来带领使用者了解此指令。
指令用途
如上所述,指令是用来了解机器人的相关资讯,因此我们在製作或构想时须朝此方向,若偏离太多会导致使用者使用时感到困惑或混乱。
回应内容
回应的内容是一大重点,让我们来构思机器人会有哪些相关资讯:
静态资讯(不会随时间改变的资讯):
机器人名称机器人ID机器人製作者机器人的建立时间机器人邀请连结动态资讯(会随着时间或其他因素改变):
机器人的版本机器人所在的伺服器数量机器人上线的时间顺带一提,在製作指令时不知从何下手时,可以从官方指令翻阅相关内容
Discord.js Documentation
其他功能
目前的指令上不需要其他功能,因此此部分先省略!
指令製作
想好架构了,那就开始製作指令吧,一样会使用到机器人的主程式 index.js
:
......前段省略client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === 'ping') { const msg = await interaction.reply({ content: "正在计算延迟......", fetchReply: true }); const ping = msg.createdTimestamp - interaction.createdTimestamp; interaction.editReply(`机器人延迟:${ping} ms\nAPI延迟:${client.ws.ping} ms`) }});后段省略......
在侦测指令名称的区域中新增一个判断式,判断指令名称为bot-info的指令
......前段省略 if (interaction.commandName === 'ping') { const msg = await interaction.reply({ content: "正在计算延迟......", fetchReply: true }); const ping = msg.createdTimestamp - interaction.createdTimestamp; interaction.editReply(`机器人延迟:${ping} ms\nAPI延迟:${client.ws.ping} ms`) } if (interaction.commandName === 'bot-info') { }});后段省略......
接下来,我们要撰写的程式都会在此判断式中
......前段省略 if (interaction.commandName === 'bot-info') { }后段省略......
既然知道了要找的资讯,那就先来一个一个知道获取的方法吧!
资料获取
机器人名称
获得机器人使用者名称的方法如下
client.user.username
ClientUser是指目前登入的客户端,而username是用于获取其使用者名称
机器人ID
机器人ID的获取方法如下
client.user.id
同样是从ClientUser获得,id即是机器人的ID,和先前複製的ClientID相同
机器人製作者
机器人的製作者建议自行以字串方式填入,在此不多做说明
机器人的建立时间
获得机器人的建立时间方式如下
client.user.createdTimestamp
Timestamp
是指时间戳记,此处获得的时间戳记是「以毫秒表示从格林威治标準时间的西元1970年1月1日经过了多少时间」,将会是一串数字,那要如何转换成人话呢?
首先,虽然从Discord获得的为毫秒时间戳记,但用于表示的需使用秒的时间戳记,因此我们先将其除以1000转换为秒
client.user.createdTimestamp/1000
接下来,用Discord的时间表示格式进行处理
`<t:${client.user.createdTimestamp/1000}:R>`
但现在还是显示不出来唷!
因为我们现在得到的是一个小数,Discord要求的是一个整数,因此我们使用「~~」来将其四捨五入
`<t:${~~(client.user.createdTimestamp/1000)}:R>`
这样就得到了一个在Discord会显示为时间的字串啰!
机器人邀请连结
机器人的邀请连结请从邀请机器人的篇章获取,将其以字串方式表示,在此补充让其显示为文字(超连结)的方法
'[要显示的文字填写在中括号中](要连结到的网址填在小括号中)'
这是一种Markdown的语法,详细内容可以自行搜寻
机器人的版本
机器人的版本也可以自行以字串方式添加,顺便在此介绍版本号码的一种标準格式
major
.minor
.build
三个英语单字分别代表一个数字,中间以小数点分隔。
major:在有大型更动时进行变更
minor:在有较大更动但不至于major时变更
build:在有小型更动(像是修正错误)时变更
以下是一个维基百科撷取的例子:1.0
→1.0.1
→1.0.2
→1.1
→1.1.1
→2.0
→2.1
→2.1.1
→3.0
机器人所在的伺服器数量
机器人所在的伺服器数量获取方式如下
client.guilds.cache.size
会获得机器人所在伺服器数量的数字
机器人上线的时间
接下来,获得机器人上线时间的方式如下(此处指机器人此次上线持续运行的时间)
client.uptime
将会获取机器人上线后经过了「几毫秒」,让我们来将其再次转换为人话吧!
我们的目标为让其转换为HH:MM:SS,也就是时:分:秒的格式,因此我们来建立一个函式,用于执行此功能
function msToHMS(ms) { let seconds = ms / 1000; //将毫秒转换为秒 const hours = parseInt( seconds / 3600 ); //将可以转为小时的秒转换为小时 seconds = seconds % 3600; //去除已转换为小时的秒 const minutes = parseInt( seconds / 60 ); //将可以转为分钟的秒转换为分钟 seconds = seconds % 60; //去除已转换为分钟的秒 return(`${hours}:${minutes}:${~~(seconds)}`); //回传转换后的结果,秒数进行四捨五入}
建议将此函式放到所有程式的最后方(CLIENT.LOGIN后
),方便程式码的阅读与整理
这时,我们将刚刚的毫秒uptime丢到里面进行处理
msToHMS(client.uptime)
就可以得到我们想要的结果(字串型别)啰!
整理为程式码
接下来,我们将刚刚所获得的资讯整理到程式码中吧!
......前段省略 if (interaction.commandName === 'bot-info') { interaction.reply( `机器人名称:${client.user.username}\n`+ `机器人ID:${client.user.id}\n`+ `机器人製作者:自行填写\n`+ `机器人建立时间:<t:${~~(client.user.createdTimestamp/1000)}:R>\n`+ `机器人邀请连结:自行填写\n`+ `机器人版本:自行填写\n`+ `机器人所在伺服器数量:${client.guilds.cache.size}\n`+ `机器人上线时间:${msToHMS(client.uptime)}` ) }后段省略......
此时可以存档后执行程式码,并到Discord输入指令试看看
node index.js
此时可以看到刚刚的成果出现啰!关于将其美化为嵌入讯息,会在之后的文章进一步说明。
总结
此篇文章带着大家製作了bot-info指令,并加上了许多相关资料,希望对大家有帮助,尽情期待下一篇文章吧,掰掰!