2020-09-30 18:01:31 +08:00
|
|
|
import re
|
2020-08-10 13:06:02 +08:00
|
|
|
import json
|
2020-08-14 17:41:24 +08:00
|
|
|
import asyncio
|
2020-08-10 13:06:02 +08:00
|
|
|
import dataclasses
|
2020-08-14 17:41:24 +08:00
|
|
|
from functools import wraps, partial
|
2020-12-06 02:30:19 +08:00
|
|
|
from typing import Any, Optional, Callable, Awaitable
|
2020-08-10 13:06:02 +08:00
|
|
|
|
2020-12-02 19:52:45 +08:00
|
|
|
from nonebot.log import logger
|
2020-12-06 02:30:19 +08:00
|
|
|
from nonebot.typing import overrides
|
2020-08-14 17:41:24 +08:00
|
|
|
|
|
|
|
|
2020-09-30 18:01:31 +08:00
|
|
|
def escape_tag(s: str) -> str:
|
2020-10-01 00:39:44 +08:00
|
|
|
"""
|
|
|
|
:说明:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-10-01 00:55:03 +08:00
|
|
|
用于记录带颜色日志时转义 ``<tag>`` 类型特殊标签
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-10-01 00:39:44 +08:00
|
|
|
:参数:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-10-01 00:39:44 +08:00
|
|
|
* ``s: str``: 需要转义的字符串
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-10-01 00:39:44 +08:00
|
|
|
:返回:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-10-01 00:39:44 +08:00
|
|
|
- ``str``
|
|
|
|
"""
|
2020-09-30 18:01:31 +08:00
|
|
|
return re.sub(r"</?((?:[fb]g\s)?[^<>\s]*)>", r"\\\g<0>", s)
|
|
|
|
|
|
|
|
|
2020-08-14 17:41:24 +08:00
|
|
|
def run_sync(func: Callable[..., Any]) -> Callable[..., Awaitable[Any]]:
|
2020-09-13 00:43:31 +08:00
|
|
|
"""
|
|
|
|
:说明:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 00:43:31 +08:00
|
|
|
一个用于包装 sync function 为 async function 的装饰器
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 00:43:31 +08:00
|
|
|
:参数:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 00:43:31 +08:00
|
|
|
* ``func: Callable[..., Any]``: 被装饰的同步函数
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 00:43:31 +08:00
|
|
|
:返回:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 13:01:23 +08:00
|
|
|
- ``Callable[..., Awaitable[Any]]``
|
2020-09-13 00:43:31 +08:00
|
|
|
"""
|
2020-08-14 17:41:24 +08:00
|
|
|
|
|
|
|
@wraps(func)
|
|
|
|
async def _wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
|
|
loop = asyncio.get_running_loop()
|
|
|
|
pfunc = partial(func, *args, **kwargs)
|
|
|
|
result = await loop.run_in_executor(None, pfunc)
|
|
|
|
return result
|
|
|
|
|
|
|
|
return _wrapper
|
2020-08-10 13:06:02 +08:00
|
|
|
|
|
|
|
|
|
|
|
class DataclassEncoder(json.JSONEncoder):
|
2020-09-13 00:43:31 +08:00
|
|
|
"""
|
|
|
|
:说明:
|
2020-11-30 11:08:00 +08:00
|
|
|
|
2020-09-13 13:01:23 +08:00
|
|
|
在JSON序列化 ``Message`` (List[Dataclass]) 时使用的 ``JSONEncoder``
|
2020-09-13 00:43:31 +08:00
|
|
|
"""
|
2020-08-10 13:06:02 +08:00
|
|
|
|
|
|
|
@overrides(json.JSONEncoder)
|
|
|
|
def default(self, o):
|
|
|
|
if dataclasses.is_dataclass(o):
|
|
|
|
return dataclasses.asdict(o)
|
|
|
|
return super().default(o)
|
2020-12-02 19:52:45 +08:00
|
|
|
|
|
|
|
|
|
|
|
def logger_wrapper(logger_name: str):
|
2020-12-03 17:08:16 +08:00
|
|
|
"""
|
|
|
|
:说明:
|
2020-12-02 19:52:45 +08:00
|
|
|
|
2020-12-03 17:08:16 +08:00
|
|
|
用于打印 adapter 的日志。
|
2020-12-02 19:52:45 +08:00
|
|
|
|
2020-12-03 17:08:16 +08:00
|
|
|
:log 参数:
|
2020-12-02 19:52:45 +08:00
|
|
|
|
2020-12-03 17:08:16 +08:00
|
|
|
* ``level: Literal['WARNING', 'DEBUG', 'INFO']``: 日志等级
|
|
|
|
* ``message: str``: 日志信息
|
|
|
|
* ``exception: Optional[Exception]``: 异常信息
|
|
|
|
"""
|
2020-12-02 19:52:45 +08:00
|
|
|
|
2020-12-03 17:08:16 +08:00
|
|
|
def log(level: str, message: str, exception: Optional[Exception] = None):
|
|
|
|
return logger.opt(colors=True, exception=exception).log(
|
2021-08-12 16:45:22 +08:00
|
|
|
level, f"<m>{escape_tag(logger_name)}</m> | " + message)
|
2020-12-02 19:52:45 +08:00
|
|
|
|
|
|
|
return log
|