node.js 自定义类库
本文由Dan Prince和Matthew Wilkin进行了同行评审。 感谢所有SitePoint的同行评审员使SitePoint内容达到最佳状态!
Slack在开发人员和非开发人员技术社区中都有一定的吸引力和忠实拥护者。 其光滑的用户界面,保持沟通独立和相关的团队和渠道的概念,用于生产力的大量集成(Dropbox,Box,Google Calendar,Hangouts等)以及giphy和提醒等使使用起来很有趣。 此外,他们的API可以帮助开发人员扩展功能并为他们的团队建立自定义体验。
如果您正在考虑“ Slack所没有的唯一方式,HipChat(或您喜欢的应用程序)也拥有所有这些!”,您可能想看看: http : //slackvshipchat.com/
教程目标
本教程旨在帮助您使用一个简单的节点应用程序启动并运行,该应用程序可将Slack频道变成自定义命令行终端。 我们将使用一个名为slack-terminalize的帮助程序模块( 免责声明 :我开发了它),该模块抽象了消息的初始处理。 它使用Slack的Real-Time API Node客户端,并准备了一个机器人来侦听并响应您的请求。
请注意,这里我们不会使用斜杠命令 ,而是将常规消息解释为命令。 因此,如果您想了解有关Slash Commands的信息,那么本教程可能不合适。
开始之前
我的假设是您具有JavaScript和NodeJS的使用知识,并且熟悉Slack术语:团队,渠道, 机器人和集成 。 您将需要安装node和npm ; 您可以按照SitePoint对npm的精彩介绍来设置开发环境。
发展松弛终端化的动机
尽管有很多花哨的hubot 脚本可以响应自然语言查询,但任何Linux爱好者都会同意,用短命令和最少的击键操作就可以实现很多。 简单的命令在移动设备中尤其有意义,它可以帮助您减少键入次数,执行更多操作。 如果您考虑使用命令行系统,那么大多数情况下,shell所做的就是艰巨的工作,即获取,解析,标记化和分派命令(我知道这简直是过分简化)。
考虑到这一点,我感到需要一个可以做到这一点的模块。 如果愿意,可以使用Slack通道的外壳。 借助过程和调度方法以及类似于插件的体系结构来添加自定义命令, 松弛终端化可以抽象化事物,因此您可以将更多精力放在定义应用程序的行为上。
聊够了,让我们开始吧
首先,让我们为您的团队创建一个新的机器人用户,它可以接受您的订单! 转到https://<your-team-name>.slack.com/services/new/bot
,为其选择一个用户名,然后点击添加Bot集成 。
复制显示给您的API令牌,因为这是您的漫游器能够与渠道进行交互所必需的。 配置该机器人的其他详细信息,其配置文件图像和真实姓名,然后点击保存集成 。
现在,让我们克隆示例应用程序并安装依赖项:
git clone https://github.com/ggauravr/slack-sample-cli.git
cd slack-sample-cli
npm install
项目结构演练
从package.json
的依赖项列表中,唯一需要的依赖项是slack-terminalize
,但是由于示例应用程序具有一个示例来演示如何处理异步命令,因此请求模块用于进行REST调用。
配置/
您的应用可能需要的所有JSON文件都可以放在此处。 我说“可以”是因为它非常灵活,您可以通过配置参数将其更改为与其他目录一起使用(稍后再介绍)。 这只是构建应用程序的多种方式之一,但是,如果您不熟悉Slack集成,建议您坚持使用此方法。
命令.json
这就是添加自定义命令的小菜一碟。 每个命令都由一个键-值对表示:键是命令名(我称其为“ 主名” ),值是一个对象,该对象具有要用于该命令的自定义键值对。
在这里,我为每个命令使用以下自定义字段:
alias
–这些是命令的别名(我们称其为次要名称 ),也可以在备用通道中使用它们来调用命令。 最好保留最小的名称作为主要名称,而保留更有意义,更长的名称作为别名。-
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95您的完全免费description
–命令功能的简短可读描述 help
–帮助消息,执行诸如man <command-name>
或help <command-name>
exclude
–一个标志,指示是否应在用户可用的命令列表中显示此命令。 一些命令可能只是出于开发目的和/或不需要暴露给用户的帮助者(例如,上面的错误命令)。endpoint
–命令应该与之交谈的REST端点,以防它依赖于任何外部服务来执行其任务
其中, alias
是唯一查找到的将用户键入的命令映射为其主要名称的键。 它们的其余部分是可选的,您可以随意使用命令对象内的任何字段。
命令/
这就是魔术发生的地方,是您定义命令行为的地方。 config / commands.json中指定的每个命令都应在此处具有其匹配的实现,其文件名应与该JSON中使用的键(主名称)匹配。 这就是调度程序调用正确的处理程序的方式。 是的,我有些自以为是,但仍然有用且可自定义。
{
"help": {
"alias": [ "halp" ],
"endpoint": "#",
"help": "help [command](optional)",
"description": "To get help on all supported commands, or a specified command"
},
"gem": {
"alias": [],
"endpoint": "https://rubygems.org/api/v1/gems/{gem}.json",
"help": "gem [gem-name]",
"description": "Fetches details of the specified Ruby gem"
},
"error": {
"exclude": true
}
}
再次注意,该文件中的键名与commands/
目录中的文件名相同。
代码演练
用您的漫游器替换index.js中 SLACK_TOKEN
的值。 CONFIG_DIR
和COMMAND_DIR
分别告诉slack-terminalize
在哪里寻找配置和命令实现。
var slackTerminal = require('slack-terminalize');
slackTerminal.init('xoxb-your-token-here', {
// slack client options here
}, {
CONFIG_DIR: __dirname + '/config',
COMMAND_DIR: __dirname + '/commands'
});
接下来,使用以下命令启动应用程序:
node .
在Web或应用程序上登录到您的Slack团队。 该漫游器默认情况下被添加到#general频道,但是您可以使用Slash命令: /invite @<your-bot-name>
邀请该漫游器进入任何频道,甚至是私有频道。 键入/invite @
,Slack应该会自动建议您使用用户名。 如果没有在此处列出您的机器人,请返回并检查是否已正确集成了该机器人。
在频道中输入help
或halp
(别名,还记得吗?),然后输入“ voila!”,机器人应响应您的请求。 继续并使用commands/help.js
来更改您在响应中看到的内容。 从实现中可以看到,该命令只是从config/commands.json
文件中加载命令详细信息以进行响应,因此它是同步的。 有时,您可能需要执行异步任务,例如查询数据库或调用REST端点,以获取响应。 让我们看看如何解决。
如前所述,我使用request
模块进行REST调用,以下代码段(gem命令)搜索用户在Slack中键入的gem名称。 看看commands/gem.js
,您会发现它记住了消息发布的渠道(使用闭包 ),并将响应发布回了同一渠道!
var request = require('request'),
util = require('../util');
module.exports = function (param) {
var channel = param.channel,
endpoint = param.commandConfig.endpoint.replace('{gem}', param.args[0]);
request(endpoint, function (err, response, body) {
var info = [];
if (!err && response.statusCode === 200) {
body = JSON.parse(body);
info.push('Gem: ' + body.name + ' - ' + body.info);
info.push('Authors: ' + body.authors);
info.push('Project URI: ' + body.project_uri);
}
else {
info = ['No such gem found!'];
}
util.postMessage(channel, info.join('\n\n'));
});
};
尝试在您的Slack频道中输入gem ab
,您应该看到类似以下内容:
再次尝试在commands/gem.js
尝试处理响应的格式,以解决问题。 现在,我们有一个机器人在受邀频道上监听并响应我们的请求。 让我们看看如何添加自定义命令。
添加自定义命令实现
在config/commands.json
添加新config/commands.json
。 如前所述,键将是主要命令名称。 该命令的别名作为alias中的值数组进入,如下所示。
{
"your-new-command": {
"alias": [ "command-alias", "another-alias", "yet-another-alias" ],
"help": "A short help message for the awesome new command",
"description": "Brief description of what the command does"
}
}
当前, 不支持带有空格的命令名称。 在commands/
目录中创建一个与上面命令的主要名称相同的文件(在本例中为your-command-name.js
)。 将module.exports
分配给命令实现功能,如下所示。
var util = require('../util');
module.exports = function (param) {
// param object contains the following keys:
// 1. command - the primary command name
// 2. args - an array of strings, which is user's message posted in the channel, separated by space
// 3. user - Slack client user id
// 4. channel - Slack client channel id
// 5. commandConfig - the json object for this command from config/commands.json
// implement your logic here..
// ..
// send back the response
// more on this method here: https://api.slack.com/methods/chat.postMessage
util.postMessage(param.channel, '<your-message-to-be-posted-back-in-the-channel>');
};
有关User
和Channel
对象的更多信息,请参考node-slack-client的文档 。
编写新命令,重新启动应用程序即可! 您应该使新命令起作用。 输入命令,看看是否能得到预期的响应。
使用配置自定义行为
slack-terminalize
模块采用两个参数,一个选项对象和一个配置对象。
var slackTerminal = require('slack-terminalize');
slackTerminal.init({
autoReconnect: true // or false, indicates if it should re-connect after error response from Slack
// other supported options can be seen here: https://github.com/slackhq/node-slack-client/blob/master/lib/clients/rtm/client.js
}, {
CONFIG_DIR: __dirname + '/config',
COMMAND_DIR: __dirname + '/commands',
ERROR_COMMAND: "error" // The filename it looks for in COMMAND_DIR, in case the user entered command is invalid
})
有关参数的更多信息,可以在此处查看文档。
接下来是什么?
- 去为您的团队定义一些很酷的命令:玩得开心,提高生产力。
- 分叉项目slack-terminalize及其示例应用程序 。 游玩,贡献并帮助改善它。 如果发现任何错误,请在存储库上创建一个问题!
- 下面评论您如何使用Slack来提高生产力,或者对如何改进它有任何建议。 我很想学习Slack API赋予开发人员的力量的创造性应用程序
链接与资源
node.js 自定义类库