skinnybot / skinny
一个用于在PHP中创建Discord机器人的框架。
Requires
- php: >=7.3
- cakephp/chronos: ^1.2
- charlottedunois/yasmin: ^0.6.2
- envms/fluentpdo: ^2.1.0
- skinnybot/plugin-installer: ~2.0
Requires (Dev)
- phpunit/phpunit: ~8.0
- squizlabs/php_codesniffer: ~3.0
README
使用 DiscordPHP 在PHP中创建Discord机器人的框架。
注意
这是机器人的核心。应用程序的骨架可以在 这里 找到。
安装
如果您只想使用和/或开发自己的机器人,您应该使用 Skinny Skeleton 作为项目的基准。安装步骤可以在那里找到。
要求
- 📦 Composer
文档
摘要
核心
创建新的模块
机器人附带模块系统和模块管理器,允许您为自定义命令创建模块。您的模块必须实现 Skinny\Module\ModuleInterface
。
以下是一个模块的默认模板,例如命名为 Basic
src/Module/Modules/Basic.php
<?php namespace Bot\Module\Modules; use Skinny\Module\ModuleInterface; use Skinny\Network\Wrapper; class Basic implements ModuleInterface { /** * {@inheritDoc} * * @param \Skinny\Network\Wrapper $wrapper The Wrapper instance. * @param array $message The message array. * * @return void */ public function onChannelMessage(Wrapper $wrapper, $message) { } /** * {@inheritDoc} * * @param \Skinny\Network\Wrapper $wrapper The Wrapper instance. * @param array $message The message array. * * @return void */ public function onPrivateMessage(Wrapper $wrapper, $message) { } /** * {@inheritDoc} * * @param \Skinny\Network\Wrapper $wrapper The Wrapper instance. * @param array $message The message array. * * @return void */ public function onCommandMessage(Wrapper $wrapper, $message) { } }
使用这三个函数,您可以处理 Discord 上的每条消息
- 命令消息:带有有效命令的频道中的普通消息。
- 私聊消息:私聊消息。
- 频道消息:不带有效命令的频道中的普通消息。
例如,如果我们想执行 !say [text]
命令,我们可以在 onCommandMessage
函数中执行
public function onCommandMessage(Wrapper $wrapper, $message) { switch ($message['command']) { case 'say': $wrapper->Channel->sendMessage($message['parts'][1]); break; } }
然后我们需要在 config/commands.php
文件中添加此命令
'say' => [ 'params' => 1, 'syntax' => 'Say [Message]' ]
这就完成了,您已经创建了一个 !say
命令。
变量 $message
此变量由 Skinny\Message\Message 类创建,是一个数组。例如,使用短语 !dev param1 param2 param3 etc
,我们将得到以下数组
[ 'raw' => '!dev param1 param2 param3 etc', 'parts' => [ (int) 0 => '!dev', (int) 1 => 'param1 param2 param3 etc' ], 'command' => 'dev', 'message' => 'param1 param2 param3 etc', 'commandCode' => '!', 'arguments' => [ (int) 0 => 'param1', (int) 1 => 'param2', (int) 2 => 'param3', (int) 3 => 'etc' ] ]
对象 $wrapper
此对象是 Skinny\Network\Wrapper 类的实例,用作包装器,以将 Discord 的所有类拆分,以便在开发模块时具有更好的可访问性和清晰度。
例如,对此对象执行 debug()
将生成以下输出
object(Skinny\Network\Wrapper) { ModuleManager => object(Skinny\Module\ModuleManager) { ... } Message => object(Discord\Parts\Channel\Message) { ... } Channel => object(Discord\Parts\Channel\Channel) { ... } Guild => object(Discord\Parts\Guild\Guild) { ... } Members => object(Discord\Repository\Guild\MemberRepository) { ... } }
模块系统
正如我之前所说的,此机器人实现了一个模块系统。模块系统仅在调试模式下工作 仅此而已:模块系统首先加载文件内容,然后使用 preg_replace()
将原始类名替换为随机名称。之后,它创建一个副本并包含它。
当消息被触发时,模块系统将对它进行一些测试以确保它是有效消息,然后将其分配给所有已加载的模块。
插件
是的,您可以为此机器人创建插件。虽然我建议使用 composer 创建插件,但您也可以不使用 composer 创建插件,这在开发插件时可能很有用。您可以在此找到名为 Basic
的示例插件 这里。
使用composer创建插件
使用 composer 创建插件很容易。首先,您必须创建一个如下的 composer.json
文件
{ "name": "skinnybot/basic", "description": "A simple plugin for Skinny.", "homepage": "https://github.com/SkinnyBot/Basic", "keywords": ["discord", "bot", "skinny", "plugin"], "type": "skinny-plugin", "license": "MIT", "require": { "php": ">=5.6", "skinnybot/skinny": "dev-master" }, "autoload": { "psr-4": { "Basic\\": "src" } }, "autoload-dev": { "psr-4": { "BasicTest\\": "tests" } }, "minimum-stability": "stable" }
注意:作曲器文件的类型必须为skinny-plugin
,否则您的插件将无法工作。文件层次结构如下
/config/
/bootstrap.php
/commands.php
/src/
/Module/
/Modules/
/Basic.php
composer.json
当您完成插件编码后,您当然必须在Packagist上发布它。
不使用composer创建插件
当您没有使用作曲器创建插件时,您的插件必须位于plugins
文件夹中。让我们创建一个不带作曲器的相同基本插件,文件层次结构如下
config/
plugins/
/Basic/
/config/
/bootstrap.php
/commands.php
/src/
/Module/
/Modules/
/Basic.php
src/
tmp/
创建插件后,您必须告诉作曲器执行dumpautoload
事件,这样插件就会注册到vendor/skinny-plugins.php
文件中,并更新您的自动加载器
composer dumpautoload
之后,您需要将插件加载到您的应用程序中的config/bootstrap.php
文件中
Plugin::load('Basic'); //Or if you're using a bootstrap file : Plugin::load('Basic', ['bootstrap' => true]);
其他
核心插件列表
贡献
特别感谢
- 感谢CakePHP团队及其用于创建插件系统的出色CakePHP核心类。