diff --git a/docs/component/bot/message-util.md b/docs/component/bot/message-util.md index 824e5523..5ba3dabe 100644 --- a/docs/component/bot/message-util.md +++ b/docs/component/bot/message-util.md @@ -128,3 +128,52 @@ public function onStart() { ( 其实还是很聪明的! +### strToArray() + +将 `string` 类型的消息文本转换为 `array` 格式。 + +定义:`strToArray($msg, bool $ignore_space = true, bool $trim_text = false)` + +参数 `$msg` 为带 OB/CQ 码的字符串消息,如 `你好啊,[CQ:at,qq=123]`。 + +参数 `$ignore_space` 在 `false` 时,转换的数组内会包含空 `text` 段。 + +参数 `$trim_text` 为 `true` 时,会自动去除 `text` 段消息头尾的换行符和空格。 + +这个命令转换的数组格式符合 OneBot 11/12 标准,但细节上可能会与不同 OneBot 实现有所差异。 + +```php +$str = "你好啊,[CQ:at,qq=123]"; +$arr = \ZM\Utils\MessageUtil::strToArray($str); +``` + +转换结果参考如下: + +```json +[ + { + "type": "text", + "data": { + "text": "你好啊," + } + }, + { + "type": "at", + "data": { + "qq": "123" + } + } +] +``` + +### arrayToStr() + +将 `array` 格式的消息内容转换为字符串 + CQ 码的形式。 + +定义:`arrayToStr(array $array)` + +```php +// 我们使用上边的 $arr 作为传入值。 +$new_str = \ZM\Utils\MessageUtil::arrayToStr($arr); +// 结果:"你好啊,[CQ:at,qq=123]" +``` \ No newline at end of file diff --git a/docs/guide/basic-config.md b/docs/guide/basic-config.md index b123eaa3..f3387956 100644 --- a/docs/guide/basic-config.md +++ b/docs/guide/basic-config.md @@ -56,6 +56,8 @@ | `swoole_coroutine_hook_flags` | Swoole 启动时一键协程化 Hook 的 Flag 值,详见 [一键协程化](http://wiki.swoole.com/#/runtime?id=%e5%87%bd%e6%95%b0%e5%8e%9f%e5%9e%8b) | `SWOOLE_HOOK_ALL & (~SWOOLE_HOOK_CURL)` | | `swoole_server_mode` | Swoole Server 启动的进程模式,有 `SWOOLE_PROCESS` 和 `SWOOLE_BASE` 两种,见 [启动方式](http://wiki.swoole.com/#/learn?id=swoole_process) | `SWOOLE_PROCESS` | | `middleware_error_policy` | 中间件错误处理策略,见 [中间件 - 错误处理策略](../../event/middleware/#_6) | 1 | +| `reload_delay_time` | 框架 reload 重载命令接收后延迟的时间(毫秒,0 为不等待) | 800 | +| `global_middleware_binding` | 给注解事件绑定全局中间件,见 [中间件 - 全局中间件](../../event/middleware/#_6) | `[]` | ### 子表 **light_cache** @@ -106,11 +108,12 @@ ### 子表 onebot -| 配置名称 | 说明 | 默认值 | -| ----------------- | ------------------------------------------------------------ | ------ | -| `status` | 是否开启 OneBot 标准机器人解析功能 | true | -| `single_bot_mode` | 是否开启单机器人模式 | false | -| `message_level` | 机器人的 WebSocket 事件在 Swoole 原生事件 `@OnMessageEvent` 中的等级(越高说明越被优先处理) | 99999 | +| 配置名称 | 说明 | 默认值 | +| ------------------------ | ------------------------------------------------------------ | ------ | +| `status` | 是否开启 OneBot 标准机器人解析功能 | true | +| `single_bot_mode` | 是否开启单机器人模式 | false | +| `message_level` | 机器人的 WebSocket 事件在 Swoole 原生事件 `@OnMessageEvent` 中的等级(越高说明越被优先处理) | 99 | +| `message_convert_string` | 是否将数组格式的消息转换为字符串以保证与旧版本的兼容性 | true | ### 子表 remote_terminal diff --git a/docs/update/build-update.md b/docs/update/build-update.md index 3e2805a4..14c2b7ae 100644 --- a/docs/update/build-update.md +++ b/docs/update/build-update.md @@ -4,6 +4,12 @@ 同时此处将只使用 build 版本号进行区分。 +## build 428 (2021-11-16) + +- 修复 `ctx()->waitMessage()` 在 array 消息模式下无法正确返回消息字符串的问题 +- 新增 `ctx()->getArrayMessage()` 和 `ctx()->getStringMessage()` 两个方法 +- 修复注解事件 `CQCommand` 和 `CQMessage` 在 array 消息模式下无法正确解析的 Bug + ## build 427 (2021-11-16) - 新增全局中间件,可在全局配置文件中设置 diff --git a/src/ZM/ConsoleApplication.php b/src/ZM/ConsoleApplication.php index fcb6081b..9e30719d 100644 --- a/src/ZM/ConsoleApplication.php +++ b/src/ZM/ConsoleApplication.php @@ -30,8 +30,8 @@ class ConsoleApplication extends Application { private static $obj = null; - const VERSION_ID = 427; - const VERSION = "2.6.0"; + const VERSION_ID = 428; + const VERSION = "2.6.1"; /** * @throws InitException @@ -75,7 +75,7 @@ class ConsoleApplication extends Application $composer["autoload"]["psr-4"]["Custom\\"] = "src/Custom"; $r = file_put_contents(WORKING_DIR . "/composer.json", json_encode($composer, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); if ($r !== false) { - echo "成功添加!请运行 composer dump-autoload !\n"; + echo "成功添加!请运行 'composer dump-autoload'\n"; exit(0); } else { echo zm_internal_errcode("E00006") . "添加失败!请按任意键继续!"; diff --git a/src/ZM/Context/Context.php b/src/ZM/Context/Context.php index 92912df5..b4a4b67b 100644 --- a/src/ZM/Context/Context.php +++ b/src/ZM/Context/Context.php @@ -181,7 +181,11 @@ class Context implements ContextInterface if ($r === false) { throw new WaitTimeoutException($this, $timeout_prompt); } - return $r["message"]; + if (is_array($r["message"]) && (ZMConfig::get("global", "onebot")["message_convert_string"] ?? true) === true) { + return MessageUtil::arrayToStr($r["message"]); + } else { + return $r["message"]; + } } /** @@ -254,4 +258,16 @@ class Context implements ContextInterface public function getOption() { return self::getCache("match"); } public function getOriginMessage() { return self::$context[$this->cid]["data"]["message"] ?? null; } + + public function getArrayMessage(): array { + $msg = $this->getOriginMessage(); + if (is_array($msg)) return $msg; + else return MessageUtil::strToArray($msg); + } + + public function getStringMessage(): string { + $msg = $this->getOriginMessage(); + if (is_string($msg)) return $msg; + else return MessageUtil::arrayToStr($msg); + } } diff --git a/src/ZM/Module/QQBot.php b/src/ZM/Module/QQBot.php index ee3fed76..2450ed05 100644 --- a/src/ZM/Module/QQBot.php +++ b/src/ZM/Module/QQBot.php @@ -73,11 +73,11 @@ class QQBot public function dispatchBeforeEvents($data, $time): EventDispatcher { $before = new EventDispatcher(CQBefore::class); if ($time === "pre") { - $before->setRuleFunction(function($v) use ($data){ + $before->setRuleFunction(function ($v) use ($data) { return $v->level >= 200 && $v->cq_event == $data["post_type"]; }); } else { - $before->setRuleFunction(function($v) use ($data){ + $before->setRuleFunction(function ($v) use ($data) { return $v->level < 200 && $v->cq_event == $data["post_type"]; }); } @@ -103,7 +103,7 @@ class QQBot if (is_string($result)) ctx()->reply($result); if (ctx()->getCache("has_reply") === true) EventDispatcher::interrupt(); }); - $s = MessageUtil::matchCommand(ctx()->getMessage(), ctx()->getData()); + $s = MessageUtil::matchCommand(ctx()->getStringMessage(), ctx()->getData()); if ($s->status !== false) { if (!empty($s->match)) ctx()->setCache("match", $s->match); $dispatcher->dispatchEvent($s->object, null); @@ -114,11 +114,11 @@ class QQBot //分发CQMessage事件 $msg_dispatcher = new EventDispatcher(CQMessage::class); $msg_dispatcher->setRuleFunction(function ($v) { - return ($v->message == '' || ($v->message != '' && $v->message == context()->getData()["message"])) && - ($v->user_id == 0 || ($v->user_id != 0 && $v->user_id == context()->getData()["user_id"])) && - ($v->group_id == 0 || ($v->group_id != 0 && $v->group_id == (context()->getData()["group_id"] ?? 0))) && - ($v->message_type == '' || ($v->message_type != '' && $v->message_type == context()->getData()["message_type"])) && - ($v->raw_message == '' || ($v->raw_message != '' && $v->raw_message == context()->getData()["raw_message"])); + return ($v->message == '' || ($v->message == ctx()->getStringMessage())) && + ($v->user_id == 0 || ($v->user_id == ctx()->getUserId())) && + ($v->group_id == 0 || ($v->group_id == (ctx()->getGroupId() ?? 0))) && + ($v->message_type == '' || ($v->message_type == ctx()->getMessageType())) && + ($v->raw_message == '' || ($v->raw_message == context()->getData()["raw_message"])); }); $msg_dispatcher->setReturnFunction(function ($result) { if (is_string($result)) ctx()->reply($result); diff --git a/src/ZM/Utils/MessageUtil.php b/src/ZM/Utils/MessageUtil.php index f3a7b10b..0abe0ae9 100644 --- a/src/ZM/Utils/MessageUtil.php +++ b/src/ZM/Utils/MessageUtil.php @@ -111,6 +111,9 @@ class MessageUtil */ public static function matchCommand($msg, $obj): MatchResult { $ls = EventManager::$events[CQCommand::class] ?? []; + if (is_array($msg)) { + $msg = self::arrayToStr($msg); + } $word = self::splitCommand($msg); $matched = new MatchResult(); foreach ($ls as $v) {