ð不符号bot编程...在不和谐中!
#javascript #编程 #discord

满足我的机器人 kiryu 。他的专业是从Discord频道下载JavaScript代码并执行它。要让Kiryu自动为加入我的服务器的新成员添加角色,我将此消息在代码频道中写下:

Image description

kiryu看到了消息,提取JavaScript代码,然后eval()s。现在,每当新成员加入时,他都会给他们一个角色。

这是另一个。这使Kiryu自动禁止任何发送消息的人,包括禁止的单词:

Image description

kiryu启动时重新评估代码,在代码频道中创建新消息,更新代码消息以及删除代码消息时,他的代码始终与我拥有的代码保持同步写在代码频道中。

源代码

查看Kiryu的核心代码here。这只是一个源文件,小于200行。

运行自己的实例

如果您想尝试运行自己的实例,我将图像推向Docker Hub。您可以使用Docker轻松启动实例:

docker run \
  --name kiryu \
  --restart unless-stopped \
  -e PROGRAMMER_IDS='YOUR USER ID HERE' \
  -e BOT_TOKEN='YOUR BOT TOKEN HERE' \
  -e CODE_CHANNEL_IDS='YOUR CODE CHANNEL ID HERE' \
  -e LOG_CHANNEL_ID='YOUR LOG CHANNEL ID HERE' \
  -d \
  mistval/kiryu

如果您不知道如何创建机器人帐户,请查看start of this great article并按照说明进行操作,直到您获得bot令牌为止,然后您可以将其替换为上面的命令,以及用户ID,ID您要在中写代码的频道以及要报告错误的频道。

机器人在线后,尝试在您的代码频道中写下此版本,被js代码标签包围:

messageHandlers.push(
  (msg) => {
    if (msg.content === 'hello') {
      return msg.channel.createMessage('world');
    }
  },
);

Image description

机器人应与绿色检查标记进行反应。然后,如果您说hello(在其他频道中),机器人应以world响应。

处理事件

您可能已经注意到,Kiryu具有方便的内置messageHandlers阵列。添加到该数组的任何函数都将被调用不是代码消息而不是来自机器人的每个新消息。从消息处理程序功能的内部丢弃的错误将自动报告到日志通道。

对于其他类型的事件,您可以直接在bot对象上订阅它们,如我订阅guildMemberAdd事件时的第一张图像所示。

您可以在此处看到eris文档中的可用事件。 ERIS是Node.js的Discord Bot库。它不再维护良好,而且从来没有像discord.js库那样受欢迎,这正是我个人习惯的,因为我喜欢它出于表现原因。

一个陷阱是您必须小心对事件的双重订阅,因为代码消息中的代码可以多次评估。这就是为什么我在以前的示例中订阅事件之前运行bot.removeAllListeners('guildMemberAdd');

模块加载程序

Kiryu可以自动从NPM下载和安装模块。对于Kiryu的较高的功能之一,我使用@pagerduty/pdjs模块。这是一个与Pagerduty API接口的库。使用Kiryu,我的服务器中的主持人可以打开Pagerduty事件,该事件会打电话给我的手机,并将我从美容睡眠中唤醒。我之所以拥有此功能,是因为我在30,000多个服务器中有另一个机器人,如果有什么问题,我想尽快知道!

该功能的代码更长一些,所以我不会在这里显示它,但是这里是使用hello-world-npm模块重新实现上述Hello World命令的一个简短示例:

Image description

如果Kiryu还没有下载该模块,他将下载并退出。当他重新启动时(如果您使用上面的docker命令,他将自动进行操作),他将拥有可用的模块。 (我找不到将新模块加载到运行过程中的方法)

其他例子

如果您想查看我在kiryu上运行的所有代码,请随时查看my server,其中我拥有上述Pagerduty命令加上其他几个,加上SQLite Integration。

安全

,如果我没有提及从Discord服务器下载和eval()ing代码的

并不是一件固有的安全要做的事情。尽管Kiryu仅写入以评估由用户在PROGRAMMER_IDS环境变量中指定的用户发送的消息中的代码,但是Kiryu或Discord中的错误本身可能会导致在主机机器上执行恶意代码。

结论

那么为什么我要编码这样的机器人?好吧,只是因为它很有趣,而且在我的服务器中炫耀是一件很酷的事情。我真的不建议您为一个主要的生产机器人做这件事,但是它可以为我的服务器中的小家务完成工作,并且在这样做时看起来很酷!如果您有兴趣尝试Kiryu,或者更普遍地这项技术,我很想听听您在评论中的想法!