diff --git a/.run/Reload Zhamao Server.run.xml b/.run/Reload Zhamao Server.run.xml deleted file mode 100644 index 06f86990..00000000 --- a/.run/Reload Zhamao Server.run.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/Run Zhamao Server.run.xml b/.run/Run Zhamao Server.run.xml deleted file mode 100644 index a78a357a..00000000 --- a/.run/Run Zhamao Server.run.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/Run watcher.run.xml b/.run/Run watcher.run.xml deleted file mode 100644 index eb9c1687..00000000 --- a/.run/Run watcher.run.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - \ No newline at end of file diff --git a/.run/Stop Zhamao Server.run.xml b/.run/Stop Zhamao Server.run.xml deleted file mode 100644 index 00a55197..00000000 --- a/.run/Stop Zhamao Server.run.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - \ No newline at end of file diff --git a/composer.json b/composer.json index 02a7c2a1..ebd1a3f1 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "require": { "php": "^8.0 || ^8.1", "ext-json": "*", + "ext-tokenizer": "*", "doctrine/dbal": "^2.13.1", "dragonmantank/cron-expression": "^3.3", "jelix/version": "^2.0", diff --git a/config/logging.php b/config/logging.php deleted file mode 100644 index de0602d3..00000000 --- a/config/logging.php +++ /dev/null @@ -1,28 +0,0 @@ - LogLevel::INFO, - // logger自定义回调 - 'logger' => static function (string $prefix = null): LoggerInterface { - if ($prefix) { - $prefix = strtoupper($prefix); - } else { - // 在 Master 中,worker_id 将不存在 - $prefix = app()->has('worker_id') ? '#' . app('worker_id') : 'MST'; - } - - $logger = new ConsoleLogger(config('logging.level')); - $logger::$format = "[%date%] [%level%] [{$prefix}] %body%"; - $logger::$date_format = 'Y-m-d H:i:s'; - // 如果你喜欢旧版的日志格式,请取消下行注释 -// $logger::$date_format = 'm-d H:i:s'; - return $logger; - }, -]; diff --git a/ext/go.sh b/ext/go.sh index ef449984..de5a947f 100755 --- a/ext/go.sh +++ b/ext/go.sh @@ -49,7 +49,7 @@ function download_file() { # 安装下载内建PHP function install_native_php() { - ZM_PHP_VERSION="8.0" + ZM_PHP_VERSION="8.1" if [ "$ZM_DOWN_PHP_VERSION" != "" ]; then ZM_PHP_VERSION="$ZM_DOWN_PHP_VERSION" fi diff --git a/instant-plugin-demo.php b/instant-plugin-demo.php index a0a0810d..64b59060 100644 --- a/instant-plugin-demo.php +++ b/instant-plugin-demo.php @@ -2,7 +2,7 @@ declare(strict_types=1); -$plugin = new InstantPlugin(__DIR__); +$plugin = new ZMPlugin(__DIR__); /* * 发送 "测试 123",回复 "你好,123" diff --git a/mybot.php b/mybot.php index c5fd2298..5320ba6b 100644 --- a/mybot.php +++ b/mybot.php @@ -7,7 +7,7 @@ use OneBot\Driver\Event\Http\HttpRequestEvent; require 'vendor/autoload.php'; // 创建框架 App -$app = new ZM\InstantApplication(); +$app = new ZM\ZMApplication(); // 传入自定义配置文件 $app->patchConfig([ 'driver' => 'workerman', @@ -32,7 +32,7 @@ $event = \ZM\Annotation\OneBot\BotEvent::make('message')->withMethod(function () $app->addBotEvent($event); $app->addBotCommand($cmd); -$app->registerEvent(HttpRequestEvent::getName(), function (HttpRequestEvent $event) { +$app->addEvent(HttpRequestEvent::getName(), function (HttpRequestEvent $event) { $event->withResponse(\OneBot\Http\HttpFactory::getInstance()->createResponse(503)); }); diff --git a/src/Globals/global_class_alias.php b/src/Globals/global_class_alias.php index ad21884a..9f4d1a1c 100644 --- a/src/Globals/global_class_alias.php +++ b/src/Globals/global_class_alias.php @@ -12,4 +12,4 @@ class_alias(\ZM\Annotation\OneBot\BotCommand::class, 'BotCommand'); class_alias(\ZM\Annotation\OneBot\BotEvent::class, 'BotEvent'); class_alias(\ZM\Annotation\OneBot\CommandArgument::class, 'CommandArgument'); class_alias(\ZM\Annotation\Closed::class, 'Closed'); -class_alias(\ZM\Plugin\InstantPlugin::class, 'InstantPlugin'); +class_alias(\ZM\Plugin\ZMPlugin::class, 'ZMPlugin'); diff --git a/src/ZM/Annotation/AnnotationHandler.php b/src/ZM/Annotation/AnnotationHandler.php index 0fc3101e..a324044f 100644 --- a/src/ZM/Annotation/AnnotationHandler.php +++ b/src/ZM/Annotation/AnnotationHandler.php @@ -21,8 +21,7 @@ class AnnotationHandler public const STATUS_RULE_FAILED = 4; // 判断事件执行的规则函数判定为false,所以不执行此方法 - /** @var AnnotationBase|string */ - private $annotation_class; + private string|AnnotationBase $annotation_class; /** @var callable */ private $rule_callback; @@ -30,11 +29,9 @@ class AnnotationHandler /** @var callable */ private $return_callback; - /** @var int */ - private $status = self::STATUS_NORMAL; + private int $status = self::STATUS_NORMAL; - /** @var mixed */ - private $return_val; + private mixed $return_val; /** * 注解调用器构造函数 @@ -50,10 +47,10 @@ class AnnotationHandler /** * 立刻中断注解调用器执行 * - * @param mixed $return_var 中断执行返回值,传入null则代表无返回值 + * @param null|mixed $return_var 中断执行返回值,传入null则代表无返回值 * @throws InterruptException */ - public static function interrupt($return_var = null) + public static function interrupt(mixed $return_var = null) { throw new InterruptException($return_var); } diff --git a/src/ZM/Annotation/AnnotationMap.php b/src/ZM/Annotation/AnnotationMap.php index 65412a42..313ed4db 100644 --- a/src/ZM/Annotation/AnnotationMap.php +++ b/src/ZM/Annotation/AnnotationMap.php @@ -15,7 +15,7 @@ class AnnotationMap * @var array> * @internal */ - public static $_list = []; + public static array $_list = []; /** * 存取注解对象的三维列表,key1是注解所在的类名,key2是注解所在的方法名,value是该方法标注的注解们(数组) @@ -23,14 +23,14 @@ class AnnotationMap * @var array>> * @internal */ - public static $_map = []; + public static array $_map = []; /** * 将Parser解析后的注解注册到全局的 AnnotationMap * * @param AnnotationParser $parser 注解解析器 */ - public static function loadAnnotationByParser(AnnotationParser $parser) + public static function loadAnnotationByParser(AnnotationParser $parser): void { // 生成后加入到全局list中 self::$_list = array_merge(self::$_list, $parser->generateAnnotationList()); diff --git a/src/ZM/Annotation/AnnotationParser.php b/src/ZM/Annotation/AnnotationParser.php index e417b902..ff052582 100644 --- a/src/ZM/Annotation/AnnotationParser.php +++ b/src/ZM/Annotation/AnnotationParser.php @@ -7,13 +7,11 @@ namespace ZM\Annotation; use Doctrine\Common\Annotations\AnnotationReader; use Koriym\Attributes\AttributeReader; use Koriym\Attributes\DualReader; -use ReflectionMethod; use ZM\Annotation\Http\Controller; use ZM\Annotation\Http\Route; use ZM\Annotation\Interfaces\ErgodicAnnotation; use ZM\Annotation\Interfaces\Level; use ZM\Annotation\Middleware\Middleware; -use ZM\Exception\ConfigException; use ZM\Store\FileSystem; use ZM\Utils\HttpUtil; @@ -25,27 +23,27 @@ class AnnotationParser /** * @var array 要解析的路径列表 */ - private $path_list = []; + private array $path_list = []; /** * @var float 用于计算解析时间用的 */ - private $start_time; + private float $start_time; /** * @var array 用于解析的注解解析树,格式见下方的注释 */ - private $annotation_tree = []; + private array $annotation_tree = []; /** * @var array 用于生成"类-方法"对应"注解列表"的数组 */ - private $annotation_map = []; + private array $annotation_map = []; /** * @var array 特殊的注解解析器回调列表 */ - private $special_parsers = []; + private array $special_parsers = []; /** * AnnotationParser constructor. @@ -54,6 +52,7 @@ class AnnotationParser { $this->start_time = microtime(true); + // 如果需要,添加内置的注解解析器 if ($with_internal_parsers) { $this->special_parsers = [ Middleware::class => [function (Middleware $middleware) { \middleware()->bindMiddleware([resolve($middleware->class), $middleware->method], $middleware->name, $middleware->params); }], @@ -73,103 +72,127 @@ class AnnotationParser $this->special_parsers[$class_name][] = $callback; } - /** - * 注册各个模块类的注解和模块level的排序 - * - * @throws \ReflectionException - * @throws ConfigException - */ - public function parseAll() + public function parse(array $path): void { - // 对每个设置的路径依次解析 - foreach ($this->path_list as $path) { - logger()->debug('parsing annotation in ' . $path[0] . ':' . $path[1]); + // 写日志 + logger()->debug('parsing annotation in ' . $path[0] . ':' . $path[1]); - // 首先获取路径下所有的类(通过 PSR-4 标准解析) - $all_class = FileSystem::getClassesPsr4($path[0], $path[1]); + // 首先获取路径下所有的类(通过 PSR-4 标准解析) + $all_class = FileSystem::getClassesPsr4($path[0], $path[1]); - // 读取配置文件中配置的忽略解析的注解名,防止误解析一些别的地方需要的注解,比如@mixin - $conf = config('global.runtime.annotation_reader_ignore'); - // 有两种方式,第一种是通过名称,第二种是通过命名空间 - if (isset($conf['name']) && is_array($conf['name'])) { - foreach ($conf['name'] as $v) { - AnnotationReader::addGlobalIgnoredName($v); - } + // 读取配置文件中配置的忽略解析的注解名,防止误解析一些别的地方需要的注解,比如@mixin + $conf = config('global.runtime.annotation_reader_ignore'); + // 有两种方式,第一种是通过名称,第二种是通过命名空间 + if (isset($conf['name']) && is_array($conf['name'])) { + foreach ($conf['name'] as $v) { + AnnotationReader::addGlobalIgnoredName($v); } - if (isset($conf['namespace']) && is_array($conf['namespace'])) { - foreach ($conf['namespace'] as $v) { - AnnotationReader::addGlobalIgnoredNamespace($v); - } + } + if (isset($conf['namespace']) && is_array($conf['namespace'])) { + foreach ($conf['namespace'] as $v) { + AnnotationReader::addGlobalIgnoredNamespace($v); } - // 因为mixin常用,且框架默认不需要解析,则全局忽略 - AnnotationReader::addGlobalIgnoredName('mixin'); + } + // 因为mixin常用,且框架默认不需要解析,则全局忽略 + AnnotationReader::addGlobalIgnoredName('mixin'); - // 声明一个既可以解析注解又可以解析Attribute的双reader来读取注解和Attribute - $reader = new DualReader(new AnnotationReader(), new AttributeReader()); - foreach ($all_class as $v) { - logger()->debug('正在检索 ' . $v); + // 声明一个既可以解析注解又可以解析Attribute的双reader来读取注解和Attribute + $reader = new DualReader(new AnnotationReader(), new AttributeReader()); + foreach ($all_class as $v) { + logger()->debug('正在检索 ' . $v); - // 通过反射实现注解读取 - $reflection_class = new \ReflectionClass($v); - $methods = $reflection_class->getMethods(\ReflectionMethod::IS_PUBLIC); - $class_annotations = $reader->getClassAnnotations($reflection_class); - // 这段为新加的:start - // 这里将每个类里面所有的类注解、方法注解通通加到一颗大树上,后期解析 - /* - $annotation_map: { - Module\Example\Hello: { - class_annotations: [ - 注解对象1, 注解对象2, ... - ], - methods: [ - ReflectionMethod, ReflectionMethod, ... - ], - methods_annotations: { - foo: [ 注解对象1, 注解对象2, ... ], - bar: [ 注解对象1, 注解对象2, ... ], - } + // 通过反射实现注解读取 + $reflection_class = new \ReflectionClass($v); + $methods = $reflection_class->getMethods(\ReflectionMethod::IS_PUBLIC); + $class_annotations = $reader->getClassAnnotations($reflection_class); + // 这段为新加的:start + // 这里将每个类里面所有的类注解、方法注解通通加到一颗大树上,后期解析 + /* + $annotation_map: { + Module\Example\Hello: { + class_annotations: [ + 注解对象1, 注解对象2, ... + ], + methods: [ + ReflectionMethod, ReflectionMethod, ... + ], + methods_annotations: { + foo: [ 注解对象1, 注解对象2, ... ], + bar: [ 注解对象1, 注解对象2, ... ], } } - */ + } + */ - // 保存对class的注解 - $this->annotation_tree[$v]['class_annotations'] = $class_annotations; - // 保存类成员的方法的对应反射对象们 - $this->annotation_tree[$v]['methods'] = $methods; - // 保存对每个方法获取到的注解们 - foreach ($methods as $method) { - $this->annotation_tree[$v]['methods_annotations'][$method->getName()] = $reader->getMethodAnnotations($method); + // 保存对class的注解 + $this->annotation_tree[$v]['class_annotations'] = $class_annotations; + // 保存类成员的方法的对应反射对象们 + $this->annotation_tree[$v]['methods'] = $methods; + // 保存对每个方法获取到的注解们 + foreach ($methods as $method) { + $this->annotation_tree[$v]['methods_annotations'][$method->getName()] = $reader->getMethodAnnotations($method); + } + + // 因为适用于类的注解有一些比较特殊,比如有向下注入的,有控制行为的,所以需要遍历一下下放到方法里 + foreach ($this->annotation_tree[$v]['class_annotations'] as $vs) { + $vs->class = $v; + + // 预处理0:排除所有非继承于 AnnotationBase 的注解 + if (!$vs instanceof AnnotationBase) { + logger()->notice(get_class($vs) . ' is not extended from ' . AnnotationBase::class); + continue; } - // 因为适用于类的注解有一些比较特殊,比如有向下注入的,有控制行为的,所以需要遍历一下下放到方法里 - foreach ($this->annotation_tree[$v]['class_annotations'] as $vs) { - $vs->class = $v; + // 预处理1:如果类包含了@Closed注解,则跳过这个类 + if ($vs instanceof Closed) { + unset($this->annotation_tree[$v]); + continue 2; + } - // 预处理0:排除所有非继承于 AnnotationBase 的注解 - if (!$vs instanceof AnnotationBase) { - logger()->notice(get_class($vs) . ' is not extended from ' . AnnotationBase::class); + // 预处理2:将适用于每一个函数的注解到类注解重新注解到每个函数下面 + if ($vs instanceof ErgodicAnnotation) { + foreach (($this->annotation_tree[$v]['methods'] ?? []) as $method) { + // 用 clone 的目的是生成个独立的对象,避免和 class 以及方法之间互相冲突 + $copy = clone $vs; + $copy->method = $method->getName(); + $this->annotation_tree[$v]['methods_annotations'][$method->getName()][] = $copy; + } + } + + // 预处理3:调用自定义解析器 + foreach (($this->special_parsers[get_class($vs)] ?? []) as $parser) { + $result = $parser($vs); + if ($result === true) { + continue 2; + } + if ($result === false) { + continue 3; + } + } + } + + // 预处理3:处理每个函数上面的特殊注解,就是需要操作一些东西的 + foreach (($this->annotation_tree[$v]['methods_annotations'] ?? []) as $method_name => $methods_annotations) { + foreach ($methods_annotations as $method_anno) { + // 预处理3.0:排除所有非继承于 AnnotationBase 的注解 + if (!$method_anno instanceof AnnotationBase) { + logger()->notice('Binding annotation ' . get_class($method_anno) . ' to ' . $v . '::' . $method_name . ' is not extended from ' . AnnotationBase::class); continue; } - // 预处理1:如果类包含了@Closed注解,则跳过这个类 - if ($vs instanceof Closed) { - unset($this->annotation_tree[$v]); + // 预处理3.1:给所有注解对象绑定当前的类名和方法名 + $method_anno->class = $v; + $method_anno->method = $method_name; + + // 预处理3.2:如果包含了@Closed注解,则跳过这个方法的注解解析 + if ($method_anno instanceof Closed) { + unset($this->annotation_tree[$v]['methods_annotations'][$method_name]); continue 2; } - // 预处理2:将适用于每一个函数的注解到类注解重新注解到每个函数下面 - if ($vs instanceof ErgodicAnnotation) { - foreach (($this->annotation_tree[$v]['methods'] ?? []) as $method) { - // 用 clone 的目的是生成个独立的对象,避免和 class 以及方法之间互相冲突 - $copy = clone $vs; - $copy->method = $method->getName(); - $this->annotation_tree[$v]['methods_annotations'][$method->getName()][] = $copy; - } - } - - // 预处理3:调用自定义解析器 - foreach (($this->special_parsers[get_class($vs)] ?? []) as $parser) { - $result = $parser($vs); + // 预处理3.3:调用自定义解析器 + foreach (($this->special_parsers[get_class($method_anno)] ?? []) as $parser) { + $result = $parser($method_anno); if ($result === true) { continue 2; } @@ -177,44 +200,23 @@ class AnnotationParser continue 3; } } - } - // 预处理3:处理每个函数上面的特殊注解,就是需要操作一些东西的 - foreach (($this->annotation_tree[$v]['methods_annotations'] ?? []) as $method_name => $methods_annotations) { - foreach ($methods_annotations as $method_anno) { - // 预处理3.0:排除所有非继承于 AnnotationBase 的注解 - if (!$method_anno instanceof AnnotationBase) { - logger()->notice('Binding annotation ' . get_class($method_anno) . ' to ' . $v . '::' . $method_name . ' is not extended from ' . AnnotationBase::class); - continue; - } - - // 预处理3.1:给所有注解对象绑定当前的类名和方法名 - $method_anno->class = $v; - $method_anno->method = $method_name; - - // 预处理3.2:如果包含了@Closed注解,则跳过这个方法的注解解析 - if ($method_anno instanceof Closed) { - unset($this->annotation_tree[$v]['methods_annotations'][$method_name]); - continue 2; - } - - // 预处理3.3:调用自定义解析器 - foreach (($this->special_parsers[get_class($method_anno)] ?? []) as $parser) { - $result = $parser($method_anno); - if ($result === true) { - continue 2; - } - if ($result === false) { - continue 3; - } - } - - // 如果上方没有解析或返回了 true,则添加到注解解析列表中 - $this->annotation_map[$v][$method_name][] = $method_anno; - } + // 如果上方没有解析或返回了 true,则添加到注解解析列表中 + $this->annotation_map[$v][$method_name][] = $method_anno; } } } + } + + /** + * 注册各个模块类的注解和模块level的排序 + */ + public function parseAll(): void + { + // 对每个设置的路径依次解析 + foreach ($this->path_list as $path) { + $this->parse($path); + } logger()->debug('解析注解完毕!'); } @@ -295,7 +297,7 @@ class AnnotationParser /** * 添加注解路由 */ - private function addRouteAnnotation(Route $vss) + private function addRouteAnnotation(Route $vss): void { // 拿到所属方法的类上面有没有控制器的注解 $prefix = ''; diff --git a/src/ZM/Annotation/Framework/BindEvent.php b/src/ZM/Annotation/Framework/BindEvent.php index 4e836b0b..cf59db49 100644 --- a/src/ZM/Annotation/Framework/BindEvent.php +++ b/src/ZM/Annotation/Framework/BindEvent.php @@ -24,13 +24,11 @@ use ZM\Annotation\Interfaces\Level; class BindEvent extends AnnotationBase implements Level { /** - * @var string * @Required() */ - public $event_class; + public string $event_class; - /** @var int */ - public $level = 800; + public int $level = 800; /** * @param string $event_class 绑定事件的类型 diff --git a/src/ZM/Annotation/Framework/Init.php b/src/ZM/Annotation/Framework/Init.php index c465289b..7cdb830b 100644 --- a/src/ZM/Annotation/Framework/Init.php +++ b/src/ZM/Annotation/Framework/Init.php @@ -19,8 +19,7 @@ use ZM\Annotation\AnnotationBase; #[\Attribute(\Attribute::IS_REPEATABLE | \Attribute::TARGET_METHOD)] class Init extends AnnotationBase { - /** @var int */ - public $worker = 0; + public int $worker = 0; public function __construct(int $worker = 0) { diff --git a/src/ZM/Annotation/Http/Controller.php b/src/ZM/Annotation/Http/Controller.php index 9ccd4f74..8a786abb 100644 --- a/src/ZM/Annotation/Http/Controller.php +++ b/src/ZM/Annotation/Http/Controller.php @@ -21,10 +21,9 @@ use ZM\Annotation\Interfaces\ErgodicAnnotation; class Controller extends AnnotationBase implements ErgodicAnnotation { /** - * @var string * @Required() */ - public $prefix = ''; + public string $prefix = ''; public function __construct(string $prefix) { diff --git a/src/ZM/Annotation/Http/Route.php b/src/ZM/Annotation/Http/Route.php index 42b46896..20a1372c 100644 --- a/src/ZM/Annotation/Http/Route.php +++ b/src/ZM/Annotation/Http/Route.php @@ -20,26 +20,18 @@ use ZM\Annotation\AnnotationBase; class Route extends AnnotationBase { /** - * @var string * @Required() */ - public $route = ''; + public string $route = ''; - /** - * @var string - */ - public $name = ''; + public string $name = ''; - /** - * @var array - */ - public $request_method = ['GET', 'POST']; + public array $request_method = ['GET', 'POST']; /** * Routing path params binding. eg. {"id"="\d+"} - * @var array */ - public $params = []; + public array $params = []; public function __construct($route, $name = '', $request_method = ['GET', 'POST'], $params = []) { @@ -49,7 +41,7 @@ class Route extends AnnotationBase $this->params = $params; } - public static function make($route, $name = '', $request_method = ['GET', 'POST'], $params = []) + public static function make($route, $name = '', $request_method = ['GET', 'POST'], $params = []): static { return new static($route, $name, $request_method, $params); } diff --git a/src/ZM/Annotation/Middleware/Middleware.php b/src/ZM/Annotation/Middleware/Middleware.php index d228d573..f47c3fe1 100644 --- a/src/ZM/Annotation/Middleware/Middleware.php +++ b/src/ZM/Annotation/Middleware/Middleware.php @@ -21,15 +21,14 @@ use ZM\Annotation\Interfaces\ErgodicAnnotation; class Middleware extends AnnotationBase implements ErgodicAnnotation { /** - * @var string * @Required() */ - public $name; + public string $name; /** * @var string[] */ - public $params = []; + public array $params = []; public function __construct($name, $params = []) { diff --git a/src/ZM/Annotation/OneBot/BotCommand.php b/src/ZM/Annotation/OneBot/BotCommand.php index 8193d06a..a614bf73 100644 --- a/src/ZM/Annotation/OneBot/BotCommand.php +++ b/src/ZM/Annotation/OneBot/BotCommand.php @@ -23,41 +23,30 @@ use ZM\Exception\ZMKnownException; #[\Attribute(\Attribute::IS_REPEATABLE | \Attribute::TARGET_METHOD)] class BotCommand extends AnnotationBase implements Level { - /** @var string */ - public $name = ''; + public string $name = ''; - /** @var string */ - public $match = ''; + public string $match = ''; - /** @var string */ - public $pattern = ''; + public string $pattern = ''; - /** @var string */ - public $regex = ''; + public string $regex = ''; - /** @var string */ - public $start_with = ''; + public string $start_with = ''; - /** @var string */ - public $end_with = ''; + public string $end_with = ''; - /** @var string */ - public $keyword = ''; + public string $keyword = ''; /** @var string[] */ - public $alias = []; + public array $alias = []; - /** @var string */ - public $message_type = ''; + public string $message_type = ''; - /** @var string */ - public $user_id = ''; + public string $user_id = ''; - /** @var string */ - public $group_id = ''; + public string $group_id = ''; - /** @var int */ - public $level = 20; + public int $level = 20; private array $arguments = []; diff --git a/src/ZM/Event/Listener/HttpEventListener.php b/src/ZM/Event/Listener/HttpEventListener.php index 21dd3cc9..1b2447ad 100644 --- a/src/ZM/Event/Listener/HttpEventListener.php +++ b/src/ZM/Event/Listener/HttpEventListener.php @@ -39,6 +39,7 @@ class HttpEventListener $handler->handleAll($event); // dump($event->getResponse()); $node = null; + /** @var null|array $params */ $params = null; // 如果状态是 Normal,那么说明跑了一遍没有阻塞或者其他的情况,我就直接跑一遍内部的路由分发和静态文件分发 if ($handler->getStatus() === AnnotationHandler::STATUS_NORMAL && $event->getResponse() === null) { diff --git a/src/ZM/Framework.php b/src/ZM/Framework.php index d214ca35..b4431039 100644 --- a/src/ZM/Framework.php +++ b/src/ZM/Framework.php @@ -31,6 +31,7 @@ use ZM\Exception\SingletonViolationException; use ZM\Exception\ZMKnownException; use ZM\Logger\TablePrinter; use ZM\Process\ProcessStateManager; +use ZM\Utils\EasterEgg; /** * 框架入口类 @@ -55,14 +56,14 @@ class Framework /** @var array> 启动注解列表 */ protected array $setup_annotations = []; + /** @var array|string[] 框架启动前置的内容,由上到下执行 */ protected array $bootstrappers = [ - // 驱动前置 - Bootstrap\LoadConfiguration::class, - Bootstrap\LoadGlobalDefines::class, - Bootstrap\RegisterLogger::class, - Bootstrap\HandleExceptions::class, - Bootstrap\RegisterEventProvider::class, - Bootstrap\SetInternalTimezone::class, + Bootstrap\LoadConfiguration::class, // 加载配置文件 + Bootstrap\LoadGlobalDefines::class, // 加载框架级别的全局常量声明 + Bootstrap\RegisterLogger::class, // 加载 Logger + Bootstrap\HandleExceptions::class, // 注册异常处理器 + Bootstrap\RegisterEventProvider::class, // 绑定框架的 EventProvider 到 libob 的 Driver 上 + Bootstrap\SetInternalTimezone::class, // 设置时区 ]; /** @@ -84,6 +85,8 @@ class Framework } /** + * 初始化框架 + * * @throws \Exception */ public function init(): Framework @@ -121,9 +124,10 @@ class Framework * 停止框架运行 * * 未测试 + * @param int $retcode 退出码 * @throws ZMKnownException */ - public function stop(int $retcode = 0) + public function stop(int $retcode = 0): void { switch ($this->driver->getName()) { case 'swoole': @@ -368,14 +372,8 @@ class Framework { // 先获取终端宽度,防止超过边界换行 $tty_width = (new TablePrinter([]))->fetchTerminalSize(); - // caidan - $str = substr(sprintf('%o', fileperms(__FILE__)), -4); - if ($str == '0777') { - $table = ['@' => '9fX1', '!' => 'ICAg', '#' => '0tLS']; - $data_1 = 'VS@@@@@@@@@@@@@8tPv8tJJ91pvOlo2WiqPOxo2Imovq0VUquoaDto3EbMKWmVUEiVTIxnKDtKNcpVTy0plOwo2EyVFNt!!!!!!!!!VP8XVP#############0tPvNt'; - $data_2 = $data_1 . '!!KPNtVS5sK14X!!!KPNtXT9iXIksK1@9sPvNt!!!VPusKlyp!!VPypY1jX!!!!!VUk8YF0gYKptsNbt!!!!!sUjt!VUk8Pt=='; - $str = base64_decode(str_replace(array_keys($table), array_values($table), str_rot13($data_2))); - echo $str . PHP_EOL; + if ($s = EasterEgg::checkFrameworkPermissionCall()) { + echo $s; return; } // 从源码目录、框架本身的初始目录寻找 MOTD 文件 diff --git a/src/ZM/Middleware/Pipeline.php b/src/ZM/Middleware/Pipeline.php index 9054e0ce..2c3cef37 100644 --- a/src/ZM/Middleware/Pipeline.php +++ b/src/ZM/Middleware/Pipeline.php @@ -11,11 +11,9 @@ use ZM\Exception\InvalidArgumentException; */ class Pipeline { - /** @var mixed */ - private $value; + private mixed $value; - /** @var array */ - private $middlewares; + private array $middlewares; /** * 向管道发送数据 @@ -23,7 +21,7 @@ class Pipeline * @param mixed $value 数据 * @return $this */ - public function send($value): Pipeline + public function send(mixed $value): Pipeline { $this->value = $value; return $this; diff --git a/src/ZM/Plugin/InstantPlugin.php b/src/ZM/Plugin/ZMPlugin.php similarity index 80% rename from src/ZM/Plugin/InstantPlugin.php rename to src/ZM/Plugin/ZMPlugin.php index 9421e2b6..d8a6052b 100644 --- a/src/ZM/Plugin/InstantPlugin.php +++ b/src/ZM/Plugin/ZMPlugin.php @@ -8,22 +8,25 @@ use ZM\Annotation\Http\Route; use ZM\Annotation\OneBot\BotCommand; use ZM\Annotation\OneBot\BotEvent; -class InstantPlugin +/** + * 单文件插件声明类 + */ +class ZMPlugin { /** @var string 插件目录 */ - protected $dir; + protected string $dir; /** @var array 机器人事件列表 */ - protected $bot_events = []; + protected array $bot_events = []; /** @var array 机器人指令列表 */ - protected $bot_commands = []; + protected array $bot_commands = []; /** @var array 全局的事件列表 */ - protected $events = []; + protected array $events = []; /** @var array 注册的路由列表 */ - protected $routes = []; + protected array $routes = []; public function __construct(string $dir) { @@ -45,7 +48,7 @@ class InstantPlugin $this->bot_commands[] = $command; } - public function registerEvent(string $event_name, callable $callback, int $level = 20) + public function addEvent(string $event_name, callable $callback, int $level = 20) { $this->events[] = [$event_name, $callback, $level]; } diff --git a/src/ZM/Utils/EasterEgg.php b/src/ZM/Utils/EasterEgg.php new file mode 100644 index 00000000..fd30b3a4 --- /dev/null +++ b/src/ZM/Utils/EasterEgg.php @@ -0,0 +1,25 @@ + '9fX1', '!' => 'ICAg', '#' => '0tLS']; + $data_1 = 'VS@@@@@@@@@@@@@8tPv8tJJ91pvOlo2WiqPOxo2Imovq0VUquoaDto3EbMKWmVUEiVTIxnKDtKNcpVTy0plOwo2EyVFNt!!!!!!!!!VP8XVP#############0tPvNt'; + $data_2 = $data_1 . '!!KPNtVS5sK14X!!!KPNtXT9iXIksK1@9sPvNt!!!VPusKlyp!!VPypY1jX!!!!!VUk8YF0gYKptsNbt!!!!!sUjt!VUk8Pt=='; + $str = base64_decode(str_replace(array_keys($table), array_values($table), str_rot13($data_2))); + return $str . PHP_EOL; + } + return null; + } +} diff --git a/src/ZM/InstantApplication.php b/src/ZM/ZMApplication.php similarity index 73% rename from src/ZM/InstantApplication.php rename to src/ZM/ZMApplication.php index c6380078..8f805f0a 100644 --- a/src/ZM/InstantApplication.php +++ b/src/ZM/ZMApplication.php @@ -6,12 +6,12 @@ namespace ZM; use ZM\Command\Server\ServerStartCommand; use ZM\Exception\SingletonViolationException; -use ZM\Plugin\InstantPlugin; +use ZM\Plugin\ZMPlugin; -class InstantApplication extends InstantPlugin +class ZMApplication extends ZMPlugin { - /** @var null|InstantApplication 存储单例类的变量 */ - private static ?InstantApplication $obj; + /** @var null|ZMApplication 存储单例类的变量 */ + private static ?ZMApplication $obj; /** @var array 存储要传入的args */ private array $args = []; @@ -26,13 +26,13 @@ class InstantApplication extends InstantPlugin $this->args = ServerStartCommand::exportOptionArray(); } - public function withConfig(array $config): InstantApplication + public function withConfig(array $config): ZMApplication { // TODO: 完成patch config return $this; } - public function withArgs(array $args): InstantApplication + public function withArgs(array $args): ZMApplication { $this->args = array_replace_recursive($this->args, $args); return $this;