## 序言:如果想要二開插件模塊,請好好閱讀。這樣你二開會節省好多多的時間
### 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();
}
}
```