diff --git a/config/logging.php b/config/logging.php index aae5cf16..3f8b2a98 100644 --- a/config/logging.php +++ b/config/logging.php @@ -7,17 +7,17 @@ use Psr\Log\LogLevel; use ZM\Logger\ConsoleLogger; return [ - 'level' => LogLevel::DEBUG, - 'logger' => static function (string $title = null): LoggerInterface { - if ($title) { - $title = strtoupper($title); + 'level' => LogLevel::INFO, + 'logger' => static function (string $prefix = null): LoggerInterface { + if ($prefix) { + $prefix = strtoupper($prefix); } else { // 在 Master 中,worker_id 将不存在 - $title = app()->has('worker_id') ? '#' . app('worker_id') : 'MST'; + $prefix = app()->has('worker_id') ? '#' . app('worker_id') : 'MST'; } $logger = new ConsoleLogger(zm_config('logging.level')); - $logger::$format = "[%date%] [%level%] [{$title}] %body%"; + $logger::$format = "[%date%] [%level%] [{$prefix}] %body%"; $logger::$date_format = 'Y-m-d H:i:s'; // 如果你喜欢旧版的日志格式,请取消下行注释 // $logger::$date_format = 'm-d H:i:s'; diff --git a/src/Module/Example/Hello.php b/src/Module/Example/Hello.php index 2bcafa91..d4148d6b 100644 --- a/src/Module/Example/Hello.php +++ b/src/Module/Example/Hello.php @@ -13,7 +13,6 @@ use ZM\Annotation\Http\RequestMapping; use ZM\Annotation\Swoole\OnCloseEvent; use ZM\Annotation\Swoole\OnOpenEvent; use ZM\Annotation\Swoole\OnRequestEvent; -use ZM\Annotation\Swoole\OnStart; use ZM\API\CQ; use ZM\API\OneBotV11; use ZM\API\TuringAPI; @@ -252,7 +251,7 @@ class Hello bot()->all()->allGroups()->sendGroupMsg(0, ctx()->getMessage()); } - /* + /** * 欢迎来到容器时代 * * @param Context $context 通过依赖注入实现的 diff --git a/src/ZM/Adapters/AdapterInterface.php b/src/ZM/Adapters/AdapterInterface.php index b485c674..d6abd0a5 100644 --- a/src/ZM/Adapters/AdapterInterface.php +++ b/src/ZM/Adapters/AdapterInterface.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace ZM\Adapters; -use Swoole\WebSocket\Frame; use ZM\Context\ContextInterface; interface AdapterInterface @@ -22,8 +21,7 @@ interface AdapterInterface /** * 处理传入请求 * - * @param Frame $frame WebSocket消息帧 * @param ContextInterface $context 上下文 */ - public function handleIncomingRequest(Frame $frame, ContextInterface $context): void; + public function handleIncomingRequest(ContextInterface $context): void; } diff --git a/src/ZM/Adapters/OneBot11Adapter.php b/src/ZM/Adapters/OneBot11Adapter.php index 83baa14c..18a1d7b3 100644 --- a/src/ZM/Adapters/OneBot11Adapter.php +++ b/src/ZM/Adapters/OneBot11Adapter.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace ZM\Adapters; -use Swoole\WebSocket\Frame; use ZM\Annotation\CQ\CQAfter; use ZM\Annotation\CQ\CQAPIResponse; use ZM\Annotation\CQ\CQBefore; @@ -41,68 +40,74 @@ class OneBot11Adapter implements AdapterInterface /** * {@inheritDoc} */ - public function handleIncomingRequest(Frame $frame, ContextInterface $context): void + public function handleIncomingRequest(ContextInterface $context): void { - $data = json_decode($frame->data, true); + $data = json_decode($context->getFrame()->data, true); // 将数据存入协程参数中 set_coroutine_params(compact('data')); try { - // 事件类型不存在,代表为非法请求或 API 响应 - if (!isset($data['post_type'])) { - if (isset($data['echo']) && CoMessage::resumeByWS()) { - EventDispatcher::interrupt(); - } - $this->handleAPIResponse($data, $context); - return; - } + logger()->debug('start handle incoming request'); - if ($data['post_type'] !== 'meta_event') { - $before_result = $this->handleBeforeEvent($data, 'pre'); - if ($before_result->store === 'block') { + // 非元事件调用 pre-before 事件 + if (!$this->isMetaEvent($data)) { + logger()->debug('pre-before event'); + $pre_before_result = $this->handleBeforeEvent($data, 'pre'); + if ($pre_before_result->store === 'block') { EventDispatcher::interrupt(); } } + // 回调或事件处理 resume if (CoMessage::resumeByWS()) { EventDispatcher::interrupt(); } - if ($data['post_type'] !== 'meta_event') { - $before_result = $this->handleBeforeEvent($data, 'post'); - if ($before_result->store === 'block') { + // 非元事件调用 after-before 事件 + if (!$this->isMetaEvent($data)) { + logger()->debug('post-before event'); + $post_before_result = $this->handleBeforeEvent($data, 'post'); + if ($post_before_result->store === 'block') { EventDispatcher::interrupt(); } } - switch ($data['post_type']) { - case 'message': - $this->handleMessageEvent($data, $context); - break; - case 'meta_event': - $this->handleMetaEvent($data, $context); - break; - case 'notice': - $this->handleNoticeEvent($data, $context); - break; - case 'request': - $this->handleRequestEvent($data, $context); - break; - } - - if ($data['post_type'] !== 'meta_event') { - $before_result = $this->handleAfterEvent($data); - if ($before_result->store === 'block') { - EventDispatcher::interrupt(); + // 进入回调、事件分发流程 + if ($this->isEvent($data)) { + // 事件分发 + switch ($data['post_type']) { + case 'message': + logger()->debug('message event {data}', compact('data')); + $this->handleMessageEvent($data, $context); + break; + case 'meta_event': + logger()->debug('meta event {data}', compact('data')); + $this->handleMetaEvent($data, $context); + break; + case 'notice': + logger()->debug('notice event {data}', compact('data')); + $this->handleNoticeEvent($data, $context); + break; + case 'request': + logger()->debug('request event {data}', compact('data')); + $this->handleRequestEvent($data, $context); + break; } + } elseif ($this->isAPIResponse($data)) { + logger()->debug('api response {data}', compact('data')); + $this->handleAPIResponse($data, $context); } + logger()->debug('event end {data}', compact('data')); + // 回调、事件处理完成 } catch (WaitTimeoutException $e) { $e->module->finalReply($e->getMessage()); } finally { - if (isset($data['post_type']) && $data['post_type'] !== 'meta_event') { - $before_result = $this->handleAfterEvent($data); - if ($before_result->store === 'block') { + // 非元事件调用 after 事件 + if (!$this->isMetaEvent($data)) { + logger()->debug('after event'); + $after_result = $this->handleAfterEvent($data); + if ($after_result->store === 'block') { EventDispatcher::interrupt(); } } @@ -271,7 +276,7 @@ class OneBot11Adapter implements AdapterInterface } else { $level = $event->level < 200; } - return $level && ($event->cq_event === $data['post_type']); + return $level && ($event->cq_event === ($data['post_type'] ?? '')); }); // 设定返回值处理函数 $dispatcher->setReturnFunction(function ($result) { @@ -300,4 +305,30 @@ class OneBot11Adapter implements AdapterInterface $dispatcher->dispatchEvents($data); return $dispatcher; } + + /** + * 判断是否为 API 回调 + */ + private function isAPIResponse(array $data): bool + { + // API 响应应带有 echo 字段 + return !isset($data['post_type']) && isset($data['echo']); + } + + /** + * 判断是否为事件 + */ + private function isEvent(array $data): bool + { + // 所有事件都应带有 post_type 字段 + return isset($data['post_type']); + } + + /** + * 判断是否为元事件 + */ + private function isMetaEvent(array $data): bool + { + return $this->isEvent($data) && $data['post_type'] === 'meta_event'; + } } diff --git a/src/ZM/Container/ContainerServicesProvider.php b/src/ZM/Container/ContainerServicesProvider.php index 707e64a1..4fca8092 100644 --- a/src/ZM/Container/ContainerServicesProvider.php +++ b/src/ZM/Container/ContainerServicesProvider.php @@ -79,7 +79,7 @@ class ContainerServicesProvider $container->instance('worker_id', Framework::$server->worker_id); $container->singleton(AdapterInterface::class, OneBot11Adapter::class); - $container->singleton(LoggerInterface::class, ZMConfig::get('logging.logger')); + $container->instance(LoggerInterface::class, ZMConfig::get('logging.logger')()); } /** diff --git a/src/ZM/Module/ModuleUnpacker.php b/src/ZM/Module/ModuleUnpacker.php index 9f9728f4..f481fd67 100644 --- a/src/ZM/Module/ModuleUnpacker.php +++ b/src/ZM/Module/ModuleUnpacker.php @@ -197,7 +197,7 @@ class ModuleUnpacker $prompt = !is_string($this->module['unpack']['global-config-override']) ? '请根据模块提供者提供的要求进行修改 global.php 中对应的配置项' : $this->module['unpack']['global-config-override']; Console::warning('模块作者要求用户手动修改 global.php 配置文件中的项目:'); Console::warning('*' . $prompt); - if (STDIN === false) { + if (STDIN === false) { // @phpstan-ignore-line Console::warning('检测到终端无法输入,请手动修改 global.php 配置文件中的项目'); return; } diff --git a/src/ZM/global_functions.php b/src/ZM/global_functions.php index d41c5b5a..bf134725 100644 --- a/src/ZM/global_functions.php +++ b/src/ZM/global_functions.php @@ -788,10 +788,10 @@ function is_assoc_array(array $array): bool /** * 返回 Logger 实例 */ -function logger(...$args): LoggerInterface +function logger(string $prefix = null): LoggerInterface { - if (!app()->has(LoggerInterface::class)) { - return zm_config('logging.logger')(...$args); + if (!is_null($prefix) || !app()->has(LoggerInterface::class)) { + return zm_config('logging.logger')($prefix); } return resolve(LoggerInterface::class); }