Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
5e454bc971 | |||
70bfb0fcee | |||
13b95c2732 | |||
ef5866343d | |||
d5ccd105a2 |
@ -5,4 +5,5 @@ nonebot:
|
||||
nickname: [ "liteyuki" ]
|
||||
default_language: zh
|
||||
driver: ~fastapi+~httpx+~websockets
|
||||
alconna_use_command_start: true
|
||||
alconna_use_command_start: true
|
||||
gotify_token: "empty token"
|
@ -75,11 +75,6 @@ class Channel(Generic[T]):
|
||||
if name in _channel:
|
||||
raise ValueError(f"Channel {name} already exists")
|
||||
_channel[name] = self
|
||||
logger.debug(f"Channel {name} initialized in main process")
|
||||
else:
|
||||
logger.debug(
|
||||
f"Channel {name} initialized in sub process, should manually set in main process"
|
||||
)
|
||||
|
||||
def _get_generic_type(self) -> Optional[type]:
|
||||
"""
|
||||
|
@ -118,6 +118,8 @@ def load_config_in_default(no_waring: bool = False) -> dict[str, Any]:
|
||||
从一个标准的轻雪项目加载配置文件
|
||||
项目目录下的config.*和config目录下的所有配置文件
|
||||
项目目录下的配置文件优先
|
||||
Args:
|
||||
no_waring: 是否关闭警告
|
||||
"""
|
||||
config = load_configs_from_dirs("config", no_waring=no_waring)
|
||||
config.update(
|
||||
|
@ -12,26 +12,34 @@ import sys
|
||||
|
||||
import loguru
|
||||
|
||||
logger = loguru.logger
|
||||
logger = loguru.logger.bind()
|
||||
|
||||
# DEBUG日志格式
|
||||
debug_format: str = (
|
||||
"<c>{time:YYYY-MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}]</lvl> "
|
||||
"<c><{name}.{module}.{function}:{line}></c> "
|
||||
"{message}"
|
||||
"<c>{time:YYYY-MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}{level}]</lvl> "
|
||||
"<c><{name}.{module}.{function}:{line}></c> "
|
||||
"{message}"
|
||||
)
|
||||
|
||||
# 默认日志格式
|
||||
default_format: str = (
|
||||
"<c>{time:MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}]</lvl> "
|
||||
"<c><{name}></c> "
|
||||
"{message}"
|
||||
"<c>{time:MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}{level}]</lvl> "
|
||||
"<c><{name}></c> "
|
||||
"{message}"
|
||||
)
|
||||
|
||||
|
||||
def get_format(level: str) -> str:
|
||||
"""
|
||||
获取日志格式
|
||||
Args:
|
||||
level: 日志等级
|
||||
|
||||
Returns: 日志格式
|
||||
|
||||
"""
|
||||
# DEBUG日志格式
|
||||
|
||||
if level == "DEBUG":
|
||||
return debug_format
|
||||
else:
|
||||
@ -41,23 +49,27 @@ def get_format(level: str) -> str:
|
||||
def init_log(config: dict):
|
||||
"""
|
||||
在语言加载完成后执行
|
||||
Returns:
|
||||
|
||||
Args:
|
||||
config: 配置
|
||||
"""
|
||||
|
||||
global logger
|
||||
level = config.get("log_level", "DEBUG")
|
||||
logger.remove()
|
||||
logger.add(
|
||||
sys.stdout,
|
||||
level=0,
|
||||
level=level,
|
||||
diagnose=False,
|
||||
format=get_format(config.get("log_level", "INFO")),
|
||||
format=get_format(level),
|
||||
)
|
||||
show_icon = config.get("log_icon", True)
|
||||
logger.level("DEBUG", color="<blue>", icon=f"{'🐛' if show_icon else ''}DEBUG")
|
||||
logger.level("INFO", color="<normal>", icon=f"{'ℹ️' if show_icon else ''}INFO")
|
||||
logger.level("SUCCESS", color="<green>", icon=f"{'✅' if show_icon else ''}SUCCESS")
|
||||
logger.level("WARNING", color="<yellow>", icon=f"{'⚠️' if show_icon else ''}WARNING")
|
||||
logger.level("ERROR", color="<red>", icon=f"{'⭕' if show_icon else ''}ERROR")
|
||||
logger.level("DEBUG", color="<blue>", icon=f"{'🐛' if show_icon else ''}")
|
||||
logger.level("INFO", color="<normal>", icon=f"{'ℹ️' if show_icon else ''}")
|
||||
logger.level("SUCCESS", color="<green>", icon=f"{'✅' if show_icon else ''}")
|
||||
logger.level("WARNING", color="<yellow>", icon=f"{'⚠️' if show_icon else ''}")
|
||||
logger.level("ERROR", color="<red>", icon=f"{'⭕' if show_icon else ''}")
|
||||
logger.level("CRITICAL", color="<red>", icon=f"{'❌' if show_icon else ''}")
|
||||
logger.level("TRACE", color="<cyan>", icon=f"{'🔍' if show_icon else ''}")
|
||||
|
||||
logger.bind()
|
||||
|
||||
init_log(config={})
|
||||
init_log(config={"log_level": "DEBUG", "log_icon": True})
|
@ -7,6 +7,8 @@ from typing import Iterable
|
||||
|
||||
from magicoca import Chan, select
|
||||
|
||||
from liteyuki.log import logger
|
||||
|
||||
|
||||
def message_handler_thread(i_chans: Iterable[Chan[Any]]):
|
||||
"""
|
||||
@ -15,4 +17,5 @@ def message_handler_thread(i_chans: Iterable[Chan[Any]]):
|
||||
Returns:
|
||||
"""
|
||||
for msg in select(*i_chans):
|
||||
print("Recv from anybot", msg)
|
||||
logger.debug(f"Recv from anybot {msg}")
|
||||
logger.info(f"Recv from anybot {msg}")
|
62
pdm.lock
generated
62
pdm.lock
generated
@ -5,7 +5,7 @@
|
||||
groups = ["default", "dev"]
|
||||
strategy = ["inherit_metadata"]
|
||||
lock_version = "4.5.0"
|
||||
content_hash = "sha256:0ae69881170a4850760711fe7edf87f03fb6f0349f9d3008276d6c9ac3fcf83b"
|
||||
content_hash = "sha256:b79773f31b417a430bc17fa770a0ff937c3ed0a3d1ac18950fdf4d5c405a28af"
|
||||
|
||||
[[metadata.targets]]
|
||||
requires_python = ">=3.10"
|
||||
@ -89,16 +89,16 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "croterline"
|
||||
version = "1.0.7"
|
||||
version = "1.0.9"
|
||||
requires_python = ">=3.10"
|
||||
summary = "Default template for PDM package"
|
||||
groups = ["default"]
|
||||
dependencies = [
|
||||
"magicoca>=1.0.1",
|
||||
"magicoca>=1.0.6",
|
||||
]
|
||||
files = [
|
||||
{file = "croterline-1.0.7-py3-none-any.whl", hash = "sha256:45d2c65b58edf9e723428f5e84a84f54c4b5dae49dbe60c2bb7988ce31243ea4"},
|
||||
{file = "croterline-1.0.7.tar.gz", hash = "sha256:9a72fb81786529ee23960cfe1c88edaf97a3270b5261b6675fad3413a09e7eb6"},
|
||||
{file = "croterline-1.0.9-py3-none-any.whl", hash = "sha256:d2d62bd8038ea0a845175b4a2ac127e4c4fcdb8dab5d4a04804c8af0a30986eb"},
|
||||
{file = "croterline-1.0.9.tar.gz", hash = "sha256:417a3aa2b18ee362f6b22939d918db378dceb1992b0231f3b80cbbdde4cb2f0a"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -142,18 +142,18 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "magicoca"
|
||||
version = "1.0.5"
|
||||
version = "1.0.6"
|
||||
requires_python = ">=3.10"
|
||||
summary = "A communication library for Python"
|
||||
groups = ["default"]
|
||||
files = [
|
||||
{file = "magicoca-1.0.5-py3-none-any.whl", hash = "sha256:e11a88dcd71fdb779ddf646d3071249f198623756ec8b4ddc3b92f65f68570d3"},
|
||||
{file = "magicoca-1.0.5.tar.gz", hash = "sha256:764a53be7cb170b1261d85f1db757cd98c584b8340d0bb3096dc7327266bb259"},
|
||||
{file = "magicoca-1.0.6-py3-none-any.whl", hash = "sha256:3c62d6c3e87b3b5a13e0fd5b5fb674374355326684ab4421f2ac8a4c5127455e"},
|
||||
{file = "magicoca-1.0.6.tar.gz", hash = "sha256:e32ec57d67e64232dc7681c5095166e6a0ee3d27048d7115aa2b09ce4e7d9ff6"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mypy"
|
||||
version = "1.12.0"
|
||||
version = "1.12.1"
|
||||
requires_python = ">=3.8"
|
||||
summary = "Optional static typing for Python"
|
||||
groups = ["dev"]
|
||||
@ -163,28 +163,28 @@ dependencies = [
|
||||
"typing-extensions>=4.6.0",
|
||||
]
|
||||
files = [
|
||||
{file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"},
|
||||
{file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"},
|
||||
{file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"},
|
||||
{file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"},
|
||||
{file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"},
|
||||
{file = "mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7"},
|
||||
{file = "mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57"},
|
||||
{file = "mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309"},
|
||||
{file = "mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f"},
|
||||
{file = "mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9"},
|
||||
{file = "mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164"},
|
||||
{file = "mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475"},
|
||||
{file = "mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9"},
|
||||
{file = "mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642"},
|
||||
{file = "mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601"},
|
||||
{file = "mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521"},
|
||||
{file = "mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893"},
|
||||
{file = "mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721"},
|
||||
{file = "mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3"},
|
||||
{file = "mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b"},
|
||||
{file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"},
|
||||
{file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"},
|
||||
{file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"},
|
||||
{file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"},
|
||||
{file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"},
|
||||
{file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"},
|
||||
{file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"},
|
||||
{file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"},
|
||||
{file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"},
|
||||
{file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"},
|
||||
{file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"},
|
||||
{file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"},
|
||||
{file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"},
|
||||
{file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"},
|
||||
{file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"},
|
||||
{file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"},
|
||||
{file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"},
|
||||
{file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"},
|
||||
{file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"},
|
||||
{file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"},
|
||||
{file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"},
|
||||
{file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"},
|
||||
{file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"},
|
||||
{file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -20,8 +20,8 @@ dependencies = [
|
||||
"toml>=0.10.2",
|
||||
"watchdog>=4.0.1",
|
||||
"pdm-backend>=2.3.3",
|
||||
"magicoca>=1.0.5",
|
||||
"croterline~=1.0.5",
|
||||
"magicoca>=1.0.6",
|
||||
"croterline>=1.0.9",
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
|
@ -7,9 +7,10 @@ httpx>=0.27.0
|
||||
nonebot-plugin-htmlrender>=0.1.0
|
||||
nonebot2[fastapi,httpx,websockets]>=2.3.3
|
||||
nonebot-adapter-onebot>=2.4.3
|
||||
nonebot-plugin-alconna>=0.46.3
|
||||
nonebot-plugin-alconna>=0.53.1
|
||||
nonebot_plugin_apscheduler>=0.4.0
|
||||
nonebot-adapter-satori>=0.11.5
|
||||
mysql-connector-python>=9.1.0
|
||||
pyppeteer>=2.0.0
|
||||
markdown>=3.3.6
|
||||
zhDateTime>=1.0.3
|
||||
|
@ -1,7 +1,7 @@
|
||||
import os.path
|
||||
from pathlib import Path
|
||||
|
||||
import nonebot
|
||||
|
||||
from croterline.utils import IsMainProcess
|
||||
|
||||
from liteyuki.core import sub_process_manager
|
||||
@ -14,9 +14,12 @@ __plugin_meta__ = PluginMetadata(
|
||||
|
||||
|
||||
def nb_run(*args, **kwargs):
|
||||
import nonebot
|
||||
|
||||
nonebot.init(**kwargs)
|
||||
|
||||
from .nb_utils import driver_manager, adapter_manager
|
||||
|
||||
driver_manager.init(config=kwargs)
|
||||
adapter_manager.init(kwargs)
|
||||
adapter_manager.register()
|
||||
@ -26,6 +29,7 @@ def nb_run(*args, **kwargs):
|
||||
|
||||
if IsMainProcess:
|
||||
from .dev_reloader import *
|
||||
|
||||
bot = get_bot()
|
||||
|
||||
sub_process_manager.add(
|
||||
|
@ -0,0 +1,109 @@
|
||||
import asyncio
|
||||
import aiohttp
|
||||
from nonebot import logger, on_message, Bot
|
||||
from nonebot.internal.adapter import Event
|
||||
from nonebot.plugin import PluginMetadata
|
||||
from nonebot import get_driver
|
||||
|
||||
from .adapter_ctx import Context
|
||||
from .config import plugin_config, Config, NOTICE, MESSAGE
|
||||
from .gotify import Message, msg_chan, fetch_msg
|
||||
|
||||
__plugin_meta__ = PluginMetadata(
|
||||
name="Gotify",
|
||||
description="使用Gotify API发送消息",
|
||||
usage="后台服务插件,无需用户交互",
|
||||
)
|
||||
|
||||
# on plugin load
|
||||
driver = get_driver()
|
||||
|
||||
async def push_thread():
|
||||
async with aiohttp.ClientSession() as session:
|
||||
while True:
|
||||
msg = await fetch_msg()
|
||||
try:
|
||||
logger.debug(f"Pushing message: {msg}")
|
||||
async with session.post(
|
||||
url=plugin_config.gotify_url + "/message",
|
||||
params={"token": plugin_config.gotify_token},
|
||||
data={
|
||||
"title": msg.title,
|
||||
"message": msg.message,
|
||||
"priority": msg.priority,
|
||||
},
|
||||
) as resp:
|
||||
if resp.status != 200:
|
||||
logger.error(
|
||||
f"Push message to server failed: {await resp.text()}"
|
||||
)
|
||||
else:
|
||||
logger.info(f"Push message to server success: {msg}")
|
||||
except Exception as e:
|
||||
logger.error(f"Push message to server failed: {e}")
|
||||
|
||||
@driver.on_startup
|
||||
async def start_push_thread():
|
||||
asyncio.create_task(push_thread())
|
||||
logger.info(
|
||||
f"Gotify plugin loaded, server: {plugin_config.gotify_url}, token: {plugin_config.gotify_token}"
|
||||
)
|
||||
|
||||
if MESSAGE in plugin_config.gotify_includes:
|
||||
@on_message(block=False, priority=100).handle()
|
||||
async def _(event: Event):
|
||||
ctx = Context(
|
||||
user_id=event.get_user_id(),
|
||||
nickname="",
|
||||
message=event.get_plaintext(),
|
||||
message_type=event.get_type(),
|
||||
)
|
||||
ctx.handle(event)
|
||||
|
||||
msg_chan << Message(
|
||||
title=plugin_config.gotify_title.format(**ctx.model_dump()),
|
||||
message=plugin_config.gotify_message.format(**ctx.model_dump()),
|
||||
)
|
||||
|
||||
if NOTICE in plugin_config.gotify_includes:
|
||||
@driver.on_startup
|
||||
async def startup():
|
||||
if NOTICE in plugin_config.gotify_includes:
|
||||
msg_chan << Message(
|
||||
title=plugin_config.gotify_nickname,
|
||||
message="Bot started",
|
||||
priority=plugin_config.gotify_priority,
|
||||
)
|
||||
|
||||
|
||||
@driver.on_shutdown
|
||||
async def shutdown():
|
||||
if NOTICE in plugin_config.gotify_includes:
|
||||
msg_chan << Message(
|
||||
title=plugin_config.gotify_nickname,
|
||||
message="Bot stopped",
|
||||
priority=plugin_config.gotify_priority,
|
||||
)
|
||||
|
||||
|
||||
@driver.on_bot_connect
|
||||
async def bot_connect(bot: Bot):
|
||||
if NOTICE in plugin_config.gotify_includes:
|
||||
msg_chan << Message(
|
||||
title=plugin_config.gotify_nickname,
|
||||
message=f"Bot connected: {bot.self_id}",
|
||||
priority=plugin_config.gotify_priority,
|
||||
)
|
||||
|
||||
|
||||
@driver.on_bot_disconnect
|
||||
async def bot_disconnect(bot: Bot):
|
||||
if NOTICE in plugin_config.gotify_includes:
|
||||
msg_chan << Message(
|
||||
title=plugin_config.gotify_nickname,
|
||||
message=f"Bot disconnected: {bot.self_id}",
|
||||
priority=plugin_config.gotify_priority,
|
||||
)
|
||||
|
||||
|
||||
|
@ -0,0 +1,12 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class Context(BaseModel):
|
||||
user_id: str
|
||||
nickname: str
|
||||
message: str
|
||||
message_type: str | None = None
|
||||
|
||||
def handle(self, event):
|
||||
pass
|
||||
|
@ -0,0 +1,22 @@
|
||||
from nonebot import get_plugin_config
|
||||
from pydantic import BaseModel
|
||||
|
||||
NOTICE = "notice"
|
||||
MESSAGE = "message"
|
||||
|
||||
class Config(BaseModel):
|
||||
# required fields
|
||||
gotify_token: str
|
||||
|
||||
# optional fields
|
||||
gotify_url: str = "http://127.0.0.1:40266"
|
||||
gotify_priority: int = 5
|
||||
gotify_nickname: str = "NoneBot"
|
||||
gotify_title: str = "{message_type}: {nickname}({user_id})"
|
||||
gotify_message: str = "{message}"
|
||||
gotify_includes: list[str, ...] = [NOTICE, MESSAGE]
|
||||
|
||||
|
||||
plugin_config = get_plugin_config(Config)
|
||||
if plugin_config.gotify_url.endswith("/"):
|
||||
plugin_config.gotify_url = plugin_config.gotify_url[:-1]
|
@ -0,0 +1,20 @@
|
||||
import asyncio
|
||||
from asyncio import Future
|
||||
from typing import Any
|
||||
|
||||
from magicoca import Chan
|
||||
from pydantic import BaseModel
|
||||
|
||||
from .config import plugin_config
|
||||
|
||||
msg_chan = Chan["Message"]()
|
||||
|
||||
|
||||
class Message(BaseModel):
|
||||
title: str
|
||||
message: str
|
||||
priority: int = plugin_config.gotify_priority
|
||||
|
||||
|
||||
def fetch_msg() -> Future[Any]:
|
||||
return asyncio.get_event_loop().run_in_executor(func=msg_chan.recv, executor=None)
|
@ -12,6 +12,7 @@ Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||
from croterline.process import get_ctx
|
||||
from nonebot.adapters.onebot.v11 import MessageEvent
|
||||
from nonebot.plugin import PluginMetadata
|
||||
from nonebot.log import logger
|
||||
from nonebot import on_message
|
||||
|
||||
__plugin_meta__ = PluginMetadata(
|
||||
@ -20,11 +21,13 @@ __plugin_meta__ = PluginMetadata(
|
||||
usage="用户无需使用",
|
||||
)
|
||||
|
||||
|
||||
|
||||
ctx = get_ctx()
|
||||
|
||||
@on_message().handle()
|
||||
@on_message(block=False, priority=100).handle()
|
||||
async def _(event: MessageEvent):
|
||||
print("Push message to Liteyuki")
|
||||
|
||||
logger.debug("Pushing message to Liteyuki")
|
||||
ctx.sub_chan << event.raw_message
|
||||
logger.debug("Pushed message to Liteyuki")
|
||||
|
||||
|
@ -1,9 +1,6 @@
|
||||
import time
|
||||
from typing import AnyStr
|
||||
|
||||
import time
|
||||
from typing import AnyStr
|
||||
|
||||
import nonebot
|
||||
import pip
|
||||
from nonebot import get_driver, require
|
||||
@ -14,15 +11,15 @@ from nonebot.permission import SUPERUSER
|
||||
|
||||
# from src.liteyuki.core import Reloader
|
||||
from src.utils import event as event_utils, satori_utils
|
||||
from src.utils.base import reload # type: ignore
|
||||
from src.utils.base.config import get_config
|
||||
from src.utils.base.data_manager import TempConfig, common_db
|
||||
from src.utils.base.language import get_user_lang
|
||||
from src.utils.base.ly_function import get_function # type: ignore
|
||||
from src.utils.base.ly_typing import T_Bot, T_MessageEvent
|
||||
from src.utils.message.html_tool import md_to_pic
|
||||
from src.utils.message.message import MarkdownMessage as md, broadcast_to_superusers
|
||||
from .api import update_liteyuki # type: ignore
|
||||
from src.utils.base import reload # type: ignore
|
||||
from src.utils.base.ly_function import get_function # type: ignore
|
||||
from src.utils.message.html_tool import md_to_pic
|
||||
|
||||
require("nonebot_plugin_alconna")
|
||||
require("nonebot_plugin_apscheduler")
|
||||
|
@ -4,14 +4,12 @@ from pathlib import Path
|
||||
|
||||
import nonebot.plugin
|
||||
from nonebot import get_driver
|
||||
from src.utils import init_log
|
||||
from src.utils.base.config import get_config
|
||||
from src.utils.base.data_manager import InstalledPlugin, plugin_db
|
||||
from src.utils.base.resource import load_resources
|
||||
from src.utils.message.tools import check_for_package
|
||||
|
||||
load_resources()
|
||||
init_log()
|
||||
|
||||
driver = get_driver()
|
||||
|
||||
|
@ -6,7 +6,6 @@ __NAME__ = "LiteyukiBot"
|
||||
__VERSION__ = "6.3.2" # 60201
|
||||
|
||||
from src.utils.base.config import load_from_yaml, config
|
||||
from src.utils.base.log import init_log
|
||||
from git import Repo
|
||||
|
||||
major, minor, patch = map(int, __VERSION__.split("."))
|
||||
@ -20,7 +19,6 @@ def init():
|
||||
|
||||
"""
|
||||
# 检测python版本是否高于3.10
|
||||
init_log()
|
||||
if sys.version_info < (3, 10):
|
||||
nonebot.logger.error("Requires Python3.10+ to run, please upgrade your Python Environment.")
|
||||
exit(1)
|
||||
|
@ -1,79 +1,79 @@
|
||||
import sys
|
||||
import loguru
|
||||
from typing import TYPE_CHECKING
|
||||
from .config import load_from_yaml
|
||||
from .language import Language, get_default_lang_code
|
||||
|
||||
logger = loguru.logger
|
||||
if TYPE_CHECKING:
|
||||
# avoid sphinx autodoc resolve annotation failed
|
||||
# because loguru module do not have `Logger` class actually
|
||||
from loguru import Record
|
||||
|
||||
|
||||
def default_filter(record: "Record"):
|
||||
"""默认的日志过滤器,根据 `config.log_level` 配置改变日志等级。"""
|
||||
log_level = record["extra"].get("nonebot_log_level", "INFO")
|
||||
levelno = logger.level(log_level).no if isinstance(log_level, str) else log_level
|
||||
return record["level"].no >= levelno
|
||||
|
||||
|
||||
# DEBUG日志格式
|
||||
debug_format: str = (
|
||||
"<c>{time:YYYY-MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}]</lvl> "
|
||||
"<c><{name}.{module}.{function}:{line}></c> "
|
||||
"{message}"
|
||||
)
|
||||
|
||||
# 默认日志格式
|
||||
default_format: str = (
|
||||
"<c>{time:MM-DD HH:mm:ss}</c> "
|
||||
"<lvl>[{level.icon}]</lvl> "
|
||||
"<c><{name}></c> "
|
||||
"{message}"
|
||||
)
|
||||
|
||||
|
||||
def get_format(level: str) -> str:
|
||||
if level == "DEBUG":
|
||||
return debug_format
|
||||
else:
|
||||
return default_format
|
||||
|
||||
|
||||
logger = loguru.logger.bind()
|
||||
|
||||
|
||||
def init_log():
|
||||
"""
|
||||
在语言加载完成后执行
|
||||
Returns:
|
||||
|
||||
"""
|
||||
global logger
|
||||
|
||||
config = load_from_yaml("config.yml")
|
||||
|
||||
logger.remove()
|
||||
logger.add(
|
||||
sys.stdout,
|
||||
level=0,
|
||||
diagnose=False,
|
||||
filter=default_filter,
|
||||
format=get_format(config.get("log_level", "INFO")),
|
||||
)
|
||||
show_icon = config.get("log_icon", True)
|
||||
lang = Language(get_default_lang_code())
|
||||
|
||||
debug = lang.get("log.debug", default="==DEBUG")
|
||||
info = lang.get("log.info", default="===INFO")
|
||||
success = lang.get("log.success", default="SUCCESS")
|
||||
warning = lang.get("log.warning", default="WARNING")
|
||||
error = lang.get("log.error", default="==ERROR")
|
||||
|
||||
logger.level("DEBUG", color="<blue>", icon=f"{'🐛' if show_icon else ''}{debug}")
|
||||
logger.level("INFO", color="<normal>", icon=f"{'ℹ️' if show_icon else ''}{info}")
|
||||
logger.level("SUCCESS", color="<green>", icon=f"{'✅' if show_icon else ''}{success}")
|
||||
logger.level("WARNING", color="<yellow>", icon=f"{'⚠️' if show_icon else ''}{warning}")
|
||||
logger.level("ERROR", color="<red>", icon=f"{'⭕' if show_icon else ''}{error}")
|
||||
# import sys
|
||||
# import loguru
|
||||
# from typing import TYPE_CHECKING
|
||||
# from .config import load_from_yaml
|
||||
# from .language import Language, get_default_lang_code
|
||||
#
|
||||
# logger = loguru.logger
|
||||
# if TYPE_CHECKING:
|
||||
# # avoid sphinx autodoc resolve annotation failed
|
||||
# # because loguru module do not have `Logger` class actually
|
||||
# from loguru import Record
|
||||
#
|
||||
#
|
||||
# def default_filter(record: "Record"):
|
||||
# """默认的日志过滤器,根据 `config.log_level` 配置改变日志等级。"""
|
||||
# log_level = record["extra"].get("nonebot_log_level", "INFO")
|
||||
# levelno = logger.level(log_level).no if isinstance(log_level, str) else log_level
|
||||
# return record["level"].no >= levelno
|
||||
#
|
||||
#
|
||||
# # DEBUG日志格式
|
||||
# debug_format: str = (
|
||||
# "<c>{time:YYYY-MM-DD HH:mm:ss}</c> "
|
||||
# "<lvl>[{level.icon}]</lvl> "
|
||||
# "<c><{name}.{module}.{function}:{line}></c> "
|
||||
# "{message}"
|
||||
# )
|
||||
#
|
||||
# # 默认日志格式
|
||||
# default_format: str = (
|
||||
# "<c>{time:MM-DD HH:mm:ss}</c> "
|
||||
# "<lvl>[{level.icon}]</lvl> "
|
||||
# "<c><{name}></c> "
|
||||
# "{message}"
|
||||
# )
|
||||
#
|
||||
#
|
||||
# def get_format(level: str) -> str:
|
||||
# if level == "DEBUG":
|
||||
# return debug_format
|
||||
# else:
|
||||
# return default_format
|
||||
#
|
||||
#
|
||||
# logger = loguru.logger.bind()
|
||||
#
|
||||
#
|
||||
# def init_log():
|
||||
# """
|
||||
# 在语言加载完成后执行
|
||||
# Returns:
|
||||
#
|
||||
# """
|
||||
# global logger
|
||||
#
|
||||
# config = load_from_yaml("config.yml")
|
||||
#
|
||||
# logger.remove()
|
||||
# logger.add(
|
||||
# sys.stdout,
|
||||
# level=0,
|
||||
# diagnose=False,
|
||||
# filter=default_filter,
|
||||
# format=get_format(config.get("log_level", "INFO")),
|
||||
# )
|
||||
# show_icon = config.get("log_icon", True)
|
||||
# lang = Language(get_default_lang_code())
|
||||
#
|
||||
# debug = lang.get("log.debug", default="==DEBUG")
|
||||
# info = lang.get("log.info", default="===INFO")
|
||||
# success = lang.get("log.success", default="SUCCESS")
|
||||
# warning = lang.get("log.warning", default="WARNING")
|
||||
# error = lang.get("log.error", default="==ERROR")
|
||||
#
|
||||
# logger.level("DEBUG", color="<blue>", icon=f"{'🐛' if show_icon else ''}{debug}")
|
||||
# logger.level("INFO", color="<normal>", icon=f"{'ℹ️' if show_icon else ''}{info}")
|
||||
# logger.level("SUCCESS", color="<green>", icon=f"{'✅' if show_icon else ''}{success}")
|
||||
# logger.level("WARNING", color="<yellow>", icon=f"{'⚠️' if show_icon else ''}{warning}")
|
||||
# logger.level("ERROR", color="<red>", icon=f"{'⭕' if show_icon else ''}{error}")
|
||||
|
9
tests/test_logger.py
Normal file
9
tests/test_logger.py
Normal file
@ -0,0 +1,9 @@
|
||||
from liteyuki import logger
|
||||
|
||||
def test_logger():
|
||||
logger.info('Hello, World!')
|
||||
logger.debug('Hello, World!')
|
||||
logger.warning('Hello, World!')
|
||||
logger.error('Hello, World!')
|
||||
logger.critical('Hello, World!')
|
||||
logger.success("Hello, World!")
|
Reference in New Issue
Block a user