diff --git a/arclet/entari/builtins/auto_reload.py b/arclet/entari/builtins/auto_reload.py index ea6cc48..9cdb001 100644 --- a/arclet/entari/builtins/auto_reload.py +++ b/arclet/entari/builtins/auto_reload.py @@ -73,26 +73,28 @@ async def watch(self): for change in event: if plugin := find_plugin_by_file(change[1]): if plugin.is_static: - logger("INFO", f"Plugin {plugin.id!r} is static, ignored.") + logger.opt(colors=True).info(f"Plugin {plugin.id!r} is static, ignored.") continue - logger("INFO", f"Detected change in {plugin.id!r}, reloading...") + logger.opt(colors=True).info(f"Detected change in {plugin.id!r}, reloading...") pid = plugin.id del plugin unload_plugin(pid) if plugin := load_plugin(pid): - logger("INFO", f"Reloaded {plugin.id!r}") + logger.opt(colors=True).info(f"Reloaded {plugin.id!r}") del plugin else: - logger("ERROR", f"Failed to reload {pid!r}") + logger.opt(colors=True).error(f"Failed to reload {pid!r}") self.fail[change[1]] = pid elif change[1] in self.fail: - logger("INFO", f"Detected change in {change[1]!r} which failed to reload, retrying...") + logger.opt(colors=True).info( + f"Detected change in {change[1]!r} which failed to reload, retrying..." + ) if plugin := load_plugin(self.fail[change[1]]): - logger("INFO", f"Reloaded {plugin.id!r}") + logger.opt(colors=True).info(f"Reloaded {plugin.id!r}") del plugin del self.fail[change[1]] else: - logger("ERROR", f"Failed to reload {self.fail[change[1]]!r}") + logger.opt(colors=True).error(f"Failed to reload {self.fail[change[1]]!r}") async def watch_config(self): file = EntariConfig.instance.path.resolve() @@ -108,21 +110,20 @@ async def watch_config(self): ): print(change) continue - logger("INFO", f"Detected change in {change[1]!r}, reloading config...") + logger.opt(colors=True).info(f"Detected change in {change[1]!r}, reloading config...") old_basic = EntariConfig.instance.basic.copy() old_plugin = EntariConfig.instance.plugin.copy() EntariConfig.instance.reload() for key in old_basic: if key in EntariConfig.instance.basic and old_basic[key] != EntariConfig.instance.basic[key]: - logger( - "DEBUG", + logger.opt(colors=True).debug( f"Basic config {key!r} changed from {old_basic[key]!r} " f"to {EntariConfig.instance.basic[key]!r}", ) await es.publish(ConfigReload("basic", key, EntariConfig.instance.basic[key], old_basic[key])) for key in set(EntariConfig.instance.basic) - set(old_basic): - logger("DEBUG", f"Basic config {key!r} appended") + logger.opt(colors=True).debug(f"Basic config {key!r} appended") await es.publish(ConfigReload("basic", key, EntariConfig.instance.basic[key])) for plugin_name in old_plugin: if plugin_name.startswith("$") or plugin_name.startswith("~"): @@ -132,11 +133,10 @@ async def watch_config(self): if plugin := find_plugin(pid): del plugin unload_plugin(pid) - logger("INFO", f"Disposed plugin {pid!r}") + logger.opt(colors=True).info(f"Disposed plugin {pid!r}") continue if old_plugin[plugin_name] != EntariConfig.instance.plugin[plugin_name]: - logger( - "DEBUG", + logger.opt(colors=True).debug( f"Plugin {plugin_name!r} config changed from {old_plugin[plugin_name]!r} " f"to {EntariConfig.instance.plugin[plugin_name]!r}", ) @@ -146,25 +146,27 @@ async def watch_config(self): allow, deny, only_filter = detect_filter_change(old_conf, new_conf) plugin.update_filter(allow, deny) if only_filter: - logger("DEBUG", f"Plugin {pid!r} config only changed filter.") + logger.opt(colors=True).debug(f"Plugin {pid!r} config only changed filter.") continue res = await es.post( ConfigReload("plugin", plugin_name, new_conf, old_conf), ) if res and res.value: - logger("DEBUG", f"Plugin {pid!r} config change handled by itself.") + logger.opt(colors=True).debug(f"Plugin {pid!r} config change handled by itself.") continue - logger("INFO", f"Detected config of {pid!r} changed, reloading...") + logger.opt(colors=True).info( + f"Detected config of {pid!r} changed, reloading..." + ) plugin_file = str(plugin.module.__file__) unload_plugin(plugin_name) if plugin := load_plugin(plugin_name, new_conf): - logger("INFO", f"Reloaded {plugin.id!r}") + logger.opt(colors=True).info(f"Reloaded {plugin.id!r}") del plugin else: - logger("ERROR", f"Failed to reload {plugin_name!r}") + logger.opt(colors=True).error(f"Failed to reload {plugin_name!r}") self.fail[plugin_file] = pid else: - logger("INFO", f"Detected {pid!r} appended, loading...") + logger.opt(colors=True).info(f"Detected {pid!r} appended, loading...") load_plugin(plugin_name, new_conf) if new := (set(EntariConfig.instance.plugin) - set(old_plugin)): for plugin_name in new: diff --git a/arclet/entari/event/send.py b/arclet/entari/event/send.py index 393e14c..52571f0 100644 --- a/arclet/entari/event/send.py +++ b/arclet/entari/event/send.py @@ -8,7 +8,7 @@ from ..message import MessageChain if TYPE_CHECKING: - from ..session import SatoriEvent, Session + from ..session import Session @dataclass @@ -16,7 +16,7 @@ class SendRequest: account: Account channel: str message: MessageChain - session: Union["Session[SatoriEvent]", None] = None + session: Union["Session", None] = None async def gather(self, context: Contexts): context["account"] = self.account @@ -39,7 +39,7 @@ class SendResponse: channel: str message: MessageChain result: list[MessageReceipt] - session: Union["Session[SatoriEvent]", None] = None + session: Union["Session", None] = None async def gather(self, context: Contexts): context["account"] = self.account diff --git a/arclet/entari/logger.py b/arclet/entari/logger.py index 9a0599c..c5faa14 100644 --- a/arclet/entari/logger.py +++ b/arclet/entari/logger.py @@ -37,14 +37,12 @@ def message(self): return self.loggers["[message]"] def wrapper(self, name: str, color: str = "blue"): - patched = logger.patch(lambda r: r.update(name="entari")) + patched = logger.patch( + lambda r: r.update(name="entari", extra={"entari_plugin_name": name, "entari_plugin_color": color}) + ) patched = patched.bind(name=f"plugins.{name}") self.loggers[f"plugin.{name}"] = patched - - def _log(level: str, message: str, exception: Exception | None = None): - patched.opt(colors=True, exception=exception).log(level, f"| <{color}>{name} {message}") - - return _log + return patched @staticmethod def set_level(level: str | int): @@ -90,6 +88,21 @@ def default_filter(record): return record["level"].no >= levelno +def _custom_format(record: Record): + if "entari_plugin_name" in record["extra"]: + plugin = ( + f" <{record['extra']['entari_plugin_color']}>" + f"{record['extra']['entari_plugin_name']}" + f"" + ) + else: + plugin = "" + return ( + f"{{time:YYYY-MM-DD HH:mm:ss}} {{level}} | {{name}}" + f"{plugin} {{message}}\n" + ) + + logger.remove() logger_id = logger.add( sys.stdout, @@ -98,7 +111,7 @@ def default_filter(record): backtrace=True, colorize=True, filter=default_filter, - format="{time:YYYY-MM-DD HH:mm:ss} {level:8} | {name} {message}", + format=_custom_format, ) """默认日志处理器 id""" diff --git a/example_plugin.py b/example_plugin.py index 9bfc76b..1fa1c09 100644 --- a/example_plugin.py +++ b/example_plugin.py @@ -72,7 +72,7 @@ async def show(session: Session): await session.send_message(f"Execute `echo 123` Result: {res}") return f"Data: {kept_data}" -TEST = 5 +TEST = 6 print([*Plugin.current()._scope.subscribers]) print(Plugin.current().subplugins)