nopolabs / yabot
另一个机器人
Requires
- php: >=7.0
- coderstephen/slack-client: dev-master
- guzzlehttp/guzzle: ^6.2
- monolog/monolog: ~1.13
- nopolabs/react-aware-guzzle-client: dev-master
- react/http: ^0.6
- roave/security-advisories: dev-master
- symfony/config: ^3.2
- symfony/dependency-injection: ^3.2
- symfony/expression-language: ^3.2
- symfony/yaml: ^3.2
- vlucas/phpdotenv: ^2.4
Requires (Dev)
- codeclimate/php-test-reporter: dev-master
- nopolabs/mock-with-expectations: dev-master
- phpunit/phpunit: ^6.0
This package is auto-updated.
Last update: 2024-09-17 16:40:08 UTC
README
yabot 是一个用 php 编写的 slack 聊天机器人。
快速开始
查看 tabot-template 了解如何使用 yabot 构建自己的机器人功能。
架构
我在 2017-07-17 的 PHPdx 用户组中做了演示:[PDF](https://github.com/nopolabs/yabot/blob/HEAD/Yabot-PHPdx-2017-07-18.pdf)
配置
Yabot 使用 Symfony 依赖注入容器进行配置。
yabot.php 加载三个配置文件:vendor/nopolabs/yabot/config/yabot.xml、config/plugins.yml 和 config.php。
vendor/nopolabs/yabot/config/yabot.xml 定义了 Yabot 使用的核心服务和可用于插件从容器中获取的服务。您不需要修改此文件。
config/plugins.yml 为配置您的 Yabot 应用程序的插件和共享服务提供了一个位置。请参阅下文的插件讨论。
config.php 提供了一个设置或覆盖运行时设置的位置。
日志记录
日志记录在 config.php 中配置
'log.file' => 'logs/bot.log',
'log.name' => 'bot',
'log.level' => 'DEBUG',
将 'log.file' 设置为 'php://stdout' 在开发期间可以将日志信息定向到您启动 yabot 的终端。
插件
查看 [yabot-plugins](https://github.com/nopolabs/yabot-plugins) 以获取示例。
Yabot 使用插件来了解要监听什么以及如何响应。
在 src/Examples、src/Reservations 和 src/Queue 中有示例。
最小化,插件必须实现 Nopolabs\Yabot\Bot\PluginInterface。
在 plugins.yml 中标记为 yabot.plugin 的插件将自动加载
services:
plugin.help:
class: Nopolabs\Yabot\Bot\HelpPlugin
arguments:
- '@logger'
- '@yabot'
tags:
- { name: yabot.plugin }
工作原理
Yabot 使用 Slack 的 实时消息 API。
消息事件按照它们加载的顺序发送到每个插件。
插件有机会对它们接收到的消息做出反应,例如回复,并且可以选择标记消息为已处理以中断进一步的分发。
插件配置用于选择插件将响应哪些消息以及如何响应。
插件配置
使用 PluginTrait 构建的插件提供了一个默认配置,该配置可以在 config.php 中覆盖,例如。
'plugin.help' => [
'priority' => PluginManager::DEFAULT_PRIORITY, // optional, higher priority is dispatched sooner
'prefix' => PluginManager::AUTHED_USER_PREFIX, // optional, string
'isBot' => false, // optional, true, false, or null
'channels' => [], // optional, array of strings
'users' => [], // optional, array of strings
'matchers' => [
'yabotHelp' => [
'isBot' => null, // optional, true, false, or null
'channels' => [], // optional, array of strings
'users' => [], // optional, array of strings
'pattern' => "/^help (?'topic'\\w+)\\b/", // pattern applied by preg_match()
'method' => 'help', // method called to handle accepted messages
],
],
],
匹配器简写语法
// shorthand:
'help' => "/^help (?'topic'\\w+)\\b/",
// expands to:
'help' => [
'isBot' => null, // null matches bot or non-bot
'channels => [], // empty array matches any channel
'users' => [], // empty array matches any user
'pattern => "/^help (?'topic'\\w+)\\b/",
'method' => 'help',
],
如果模式匹配,则调用插件对象上的方法,该方法带有消息和由匹配器模式捕获的任何字段。
响应消息
在消息所在的同一频道中回复
// assuming: 'help' => "/^help (?'topic'\\w+)\\b/"
public function help(MessageInterface $msg, array $matches)
{
$topic = $matches[1];
$msg->reply("you want help with $topic");
}
在 Thread 中
$msg->thread("here are the details...");
在特定频道中
$msg->say("lunchtime!", 'general');
用户和频道
Slack 消息使用 id 来引用用户和频道,例如。
Slack\Client 管理 Slack\Users 和 Slack\Channels 对象,并提供帮助将用户和频道名称映射到 id 以及将 id 映射到名称的方法。
消息格式化和附件
Yabot 使用 Slack REST API 发布消息,因为 WebSocket API 不支持格式化和附件。请参阅:[Slack API Messages](https://api.slack.com/docs/messages)