## 序言:如果想要二开插件模块,请好好阅读。这样你二开会节省好多多的时间
### 1:框架的生命周期(群消息)
```
0:机器人插件curl post到本系统。
1:Thinphp5.1框架启动
2:application/index/controller/Index 入口文件启动
3:入口文件加载 事件->群聊app\index\logic\GroupMsg
4:app\index\logic\GroupMsg 加载 处理核心 /application/app_group_所有/logic/所有
这里加载的核心文件是官方写好的不要随意的修改
5:app\app_group_menu_v1\logic\InjectOthersPlugUnit 依赖注入
所有/application/plug_group_所有/logic/所有 下的文件夹都会被注入
6:解析用户语句,如果匹配到 第三方插件 触发词,调用第三方插件
7:发送主动API到插件 进行动作。
```
### 2:第三方插件开发规范
1. 你的插件必须以 【plug_group_你的名字】 命名例如 ```/application/plug_group_pepper/```
2. 必须要有命名空间 例如 ``` namespace app\plug_group_peppe\logic```
3. 必须要有 class注释 必须要包含 @struct @description 格式规范
4. class 必须要有 默认的三个方法 __construct(参数) init() process_1(参数)
5. 消息模板必须要与逻辑程序分离,采用View::fetch()
6. 由于机器人需要被at才能激活,所有过滤at机器人后的消息用 `$msg=$this->conn>filterCqAt();
`
7. 【最重要】请细读TP5.1开发规范
### 3:群聊插件开发范例(聊天持久化)
聊天自然对话 持久化 由 鸽子大王 @Hstb 提出。
1:新建你的插件群,因为我是官方(admin)所有我就新建
/application/plug_group_admin/ 文件夹,请不要与其他开发者的文件夹冲突
2:新建逻辑处理程序(logic),比如我 写的一个 群管插件
/application/plug_group_admin/logic/ExmapleStructPlug.php
撰写代码
```
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2020/5/6
* Time: 21:13
*/
namespace app\plug_group_admin\logic;
use app\common\extend\GroupCommon;
use app\common\model\QqStruct;
use think\facade\View;
/**
* Class ExmapleStructPlug
* @package app\plug_group_admin\logic
* @struct 插件例子
* @author 官方测试插件
* @description 这里是 第三方 菜单插件的 描述文件。
*/
class ExmapleStructPlug
{
public $conn;
/**
* ExmapleStructPlug constructor.
* @param GroupCommon $groupCommon
* 无论是 init还是 proccess_x 都会执行这个函数
* 主要是传入 conn连接池,可以操作 jailbot框架所有的操作
*/
public function __construct(GroupCommon $groupCommon)
{
$this->conn = $groupCommon;
}
/**
* 【第一次】 触发此插件后 执行的函数,只会执行一次,
* 这里应该写导航语句的提示
*/
public function init(): void
{
//直接使用 文字发送消息
$this->conn->reply('恭喜 第三方 菜单 插件 已经 被接管到了,并且计入了数据库任务队列');
//使用模板 发送消息
//给模板变量赋值
View::assign('time', date("Y-m-d H:i:s"));
//回复模板消息 这里格式必须是 你的文件夹@分类文件夹/模板
//plug_group_admin@admin/page 实际为 ./plug_group_admin/view/admin/page.html
$this->conn->reply(View::fetch('plug_group_admin@admin/page'));
}
/**
* @param QqStruct $qqStruct
* 【持久化】接上一次的用户继续 调用此 插件
* 【默认】【第二次】激活机器人 会被调用
* 这里必须 为process_1(QqStruct $qqStruct)
*/
public function process_1(QqStruct $qqStruct): void
{
//获取到过滤 用户QT机器人的消息
$msg = $this->conn->filterCqAt;
//如果用户 回复2
if ($msg == '2') {
//把【持久化】过程调到下一步 finish ,这里是自定义函数 process_自定义
$qqStruct->addition_json->process = 'finish';
//保存 持久化指令数据库
$qqStruct->save();
//逻辑回复 提示用户
$this->conn->reply('您已经进入 第二个逻辑!请回复任意内容 结束');
return;
}
$this->conn->reply('这里是导航process_1,输入【2】即可即进入下一个逻辑');
}
/**
* @param QqStruct $qqStruct
* @throws \Exception
* 【持久化】接上一次的用户继续 调用此 插件
* 【用户自定义】 上一次变更 process流程的函数名
*/
public function process_finish(QqStruct $qqStruct): void
{
$this->conn->reply('这里是导航process_finish,逻辑完成!删除数据库任务');
//结束任务!下次用户在AT机器人,就不会再来 继续执行这个插件了,需要重新开始
$qqStruct->delete();
}
}
```