Files
zhamao-framework/src/Globals/global_functions.php

259 lines
5.6 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
2022-08-14 18:24:59 +08:00
use OneBot\Driver\Coroutine\Adaptive;
use OneBot\Driver\Coroutine\CoroutineInterface;
use OneBot\Driver\Process\ExecutionResult;
2022-08-13 17:00:29 +08:00
use OneBot\V12\Object\MessageSegment;
use Psr\Log\LoggerInterface;
2022-08-23 17:51:20 +08:00
use ZM\Config\ZMConfig;
2022-12-25 17:42:32 +08:00
use ZM\Container\ContainerHolder;
use ZM\Logger\ConsoleLogger;
2022-08-13 17:00:29 +08:00
use ZM\Middleware\MiddlewareHandler;
use ZM\Store\Database\DBException;
2022-12-30 16:15:22 +08:00
use ZM\Store\Database\DBQueryBuilder;
use ZM\Store\Database\DBWrapper;
2022-12-31 15:27:09 +08:00
use ZM\Store\KV\KVInterface;
2022-08-13 17:00:29 +08:00
// 防止重复引用引发报错
if (function_exists('zm_internal_errcode')) {
return;
}
/**
* 根据具体操作系统替换目录分隔符
*
* @param string $dir 目录
*/
function zm_dir(string $dir): string
{
if (str_starts_with($dir, 'phar://')) {
return $dir;
}
return str_replace('/', DIRECTORY_SEPARATOR, $dir);
}
2022-08-14 18:24:59 +08:00
/**
* 执行shell指令
*
* @param string $cmd 命令行
*/
function zm_exec(string $cmd): ExecutionResult
{
return Adaptive::exec($cmd);
}
/**
* sleep 指定时间单位为秒最小单位为1毫秒即0.001
*/
function zm_sleep(float|int $time)
2022-08-14 18:24:59 +08:00
{
Adaptive::sleep($time);
}
/**
* 获取协程接口
*/
function coroutine(): ?CoroutineInterface
{
return Adaptive::getCoroutine();
}
/**
* 获取内部错误码
*/
function zm_internal_errcode(int|string $code): string
{
return "[ErrCode:{$code}] ";
}
2022-12-20 20:10:40 +08:00
/**
* 返回当前炸毛实例的 ID
*/
function zm_instance_id(): string
{
if (defined('ZM_INSTANCE_ID')) {
return ZM_INSTANCE_ID;
}
if (!defined('ZM_START_TIME')) {
define('ZM_START_TIME', microtime(true));
}
$instance_id = dechex(crc32(strval(ZM_START_TIME)));
define('ZM_INSTANCE_ID', $instance_id);
return ZM_INSTANCE_ID;
}
/**
* 助手方法,返回一个 Logger 实例
*/
function logger(): LoggerInterface
{
global $ob_logger;
if ($ob_logger === null) {
return new ConsoleLogger();
}
return $ob_logger;
}
/**
* 判断传入的数组是否为关联数组
*/
function is_assoc_array(array $array): bool
{
return !empty($array) && array_keys($array) !== range(0, count($array) - 1);
}
/**
* 格式匹配
*/
function match_pattern(string $pattern, string $subject): bool
{
$pattern = str_replace(['\*', '\\\\.*'], ['.*', '\*'], preg_quote($pattern, '/'));
$pattern = '/^' . $pattern . '$/i';
return preg_match($pattern, $subject) === 1;
}
/**
* 匹配参数
*
* @return array|false 成功时返回匹配到的参数数组失败时返回false
*/
function match_args(string $pattern, string $subject)
{
$result = [];
if (match_pattern($pattern, $subject)) {
if (mb_strpos($pattern, '*') === false) {
return [];
}
$exp = explode('*', $pattern);
$i = 0;
foreach ($exp as $k => $v) {
if (empty($v) && $k === 0) {
continue;
}
if (empty($v) && $k === count($exp) - 1) {
$subject .= '^EOL';
$v = '^EOL';
}
$cur_var = '';
$ori = $i;
while (($a = mb_substr($subject, $i, mb_strlen($v))) !== $v && !empty($a)) {
$cur_var .= mb_substr($subject, $i, 1);
++$i;
}
if ($i !== $ori || $k === 1 || $k === count($exp) - 1) {
$result[] = $cur_var;
}
$i += mb_strlen($v);
}
return $result;
}
return false;
}
2022-08-13 17:00:29 +08:00
/**
* 构建消息段的助手函数
*
* @param string $type 类型
* @param array $data 字段
*/
function segment(string $type, array $data = []): MessageSegment
{
return new MessageSegment($type, $data);
}
/**
* 中间件操作类的助手函数
*/
function middleware(): MiddlewareHandler
{
return MiddlewareHandler::getInstance();
}
// ////////////////// 容器部分 //////////////////////
/**
2022-12-25 17:42:32 +08:00
* 获取容器实例
2022-08-13 17:00:29 +08:00
*/
2022-12-25 17:42:32 +08:00
function container(): DI\Container
2022-08-13 17:00:29 +08:00
{
2022-12-25 17:42:32 +08:00
return ContainerHolder::getEventContainer();
2022-08-13 17:00:29 +08:00
}
/**
* 解析类实例(使用容器)
*
2022-12-25 17:42:32 +08:00
* 这是 {@see container()}->make($abstract, $parameters) 的别名
*
2022-08-23 17:51:20 +08:00
* @template T
2022-11-08 17:33:25 +08:00
* @param class-string<T> $abstract
2022-08-13 17:00:29 +08:00
* @return Closure|mixed|T
*/
function resolve(string $abstract, array $parameters = [])
{
/* @noinspection PhpUnhandledExceptionInspection */
2022-12-25 17:42:32 +08:00
return container()->make($abstract, $parameters);
}
2022-08-21 16:08:20 +08:00
/**
* 获取 MySQL 调用的类
*
* @throws DBException
2022-08-21 16:08:20 +08:00
*/
function db(string $name = '')
2022-08-21 16:08:20 +08:00
{
return new DBWrapper($name);
2022-08-21 16:08:20 +08:00
}
/**
* 获取构建 MySQL 的类
*
* @throws DBException
2022-08-21 16:08:20 +08:00
*/
2022-12-30 16:15:22 +08:00
function sql_builder(string $name = ''): DBQueryBuilder
2022-08-21 16:08:20 +08:00
{
return (new DBWrapper($name))->createQueryBuilder();
2022-08-21 16:08:20 +08:00
}
2022-08-23 17:51:20 +08:00
/**
* 获取 / 设置配置项
*
* 传入键名和(或)默认值,获取配置项
* 传入数组,设置配置项
* 不传参数,返回配置容器
*
2022-11-08 17:33:25 +08:00
* @param null|array|string $key 键名
* @param null|mixed $default 默认值
2022-08-23 18:18:20 +08:00
* @return mixed|void|ZMConfig
2022-08-23 17:51:20 +08:00
*/
2022-11-08 17:28:07 +08:00
function config(array|string $key = null, mixed $default = null)
2022-08-23 17:51:20 +08:00
{
2022-08-23 18:18:20 +08:00
$config = ZMConfig::getInstance();
2022-08-23 17:51:20 +08:00
if (is_null($key)) {
2022-08-23 18:18:20 +08:00
return $config;
2022-08-23 17:51:20 +08:00
}
if (is_array($key)) {
2022-08-23 18:18:20 +08:00
$config->set($key);
return;
2022-08-23 17:51:20 +08:00
}
2022-08-23 18:18:20 +08:00
return $config->get($key, $default);
2022-08-23 17:51:20 +08:00
}
2022-12-20 20:10:40 +08:00
function bot(): ZM\Context\BotContext
{
2022-12-29 14:58:18 +08:00
if (container()->has(ZM\Context\BotContext::class)) {
return container()->get(ZM\Context\BotContext::class);
2022-12-20 20:10:40 +08:00
}
return new \ZM\Context\BotContext('', '');
}
2022-12-31 15:27:09 +08:00
function kv(string $name = ''): KVInterface
{
global $kv_class;
if (!$kv_class) {
$kv_class = config('global.kv.use', \LightCache::class);
}
return $kv_class::open($name);
}