From 243177ee6fc0e2330db9e51e99d8d27841bf99b3 Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Mon, 29 Jul 2024 15:20:35 +0300 Subject: [PATCH] [~] console.del_command [!] FIX plugins load | reload --- src/core/__init__.py | 2 +- src/core/tcp_server.py | 4 +++- src/modules/ConsoleSystem/__init__.py | 22 +++++++++++++++++++++- src/modules/PluginsLoader/__init__.py | 15 ++++++++++----- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/core/__init__.py b/src/core/__init__.py index 86c8f99..276e77f 100644 --- a/src/core/__init__.py +++ b/src/core/__init__.py @@ -10,7 +10,7 @@ __title__ = 'KuiToi-Server' __description__ = 'BeamingDrive Multiplayer server compatible with BeamMP clients.' __url__ = 'https://github.com/kuitoi/kuitoi-Server' __version__ = '0.4.8 (pre)' -__build__ = 2511 # Я это считаю лог файлами +__build__ = 2542 # Я это считаю лог файлами __author__ = 'SantaSpeen' __author_email__ = 'admin@kuitoi.su' __license__ = "FPA" diff --git a/src/core/tcp_server.py b/src/core/tcp_server.py index 86423d5..2a160cc 100644 --- a/src/core/tcp_server.py +++ b/src/core/tcp_server.py @@ -177,8 +177,10 @@ class TCPServer: raise e except KeyboardInterrupt: pass + except ConnectionResetError as e: + self.log.debug(f"ConnectionResetError {e}") except Exception as e: - self.log.error(f"Error: {e}") + self.log.exception(e) raise e finally: self.run = False diff --git a/src/modules/ConsoleSystem/__init__.py b/src/modules/ConsoleSystem/__init__.py index 56b375a..c7f1f50 100644 --- a/src/modules/ConsoleSystem/__init__.py +++ b/src/modules/ConsoleSystem/__init__.py @@ -15,10 +15,12 @@ from prompt_toolkit import PromptSession, print_formatted_text, HTML from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.completion import NestedCompleter from prompt_toolkit.history import FileHistory + try: from prompt_toolkit.output.win32 import NoConsoleScreenBufferError except AssertionError: - class NoConsoleScreenBufferError(Exception): ... + class NoConsoleScreenBufferError(Exception): + ... from prompt_toolkit.patch_stdout import patch_stdout from core import get_logger @@ -123,6 +125,22 @@ class Console: def __update_completer(self): self.completer = NestedCompleter.from_nested_dict(self.__alias) + def del_command(self, func): + self.__debug(f"delete command: func={func};") + keys = [] + for k, v in self.__func.items(): + if v['f'] is func: + keys.append(k) + for key in keys: + self.__debug(f"Delete: key={key}") + self.__alias.pop(key) + self.__alias["man"].pop(key) + self.__func.pop(key) + self.__man.pop(key) + self.__desc.pop(key) + self.__debug("Deleted.") + self.__update_completer() + def add_command(self, key: str, func, man: str = None, desc: str = None, custom_completer: dict = None) -> dict: key = key.format(" ", "-") @@ -258,6 +276,8 @@ class Console: self.log(self.__not_found % cmd) except KeyboardInterrupt: raise KeyboardInterrupt + except ConnectionResetError as e: + self.__debug(f"ConnectionResetError {e}") except Exception as e: print(f"Error in console.py: {e}") self.__logger.exception(e) diff --git a/src/modules/PluginsLoader/__init__.py b/src/modules/PluginsLoader/__init__.py index df304cc..90709b0 100644 --- a/src/modules/PluginsLoader/__init__.py +++ b/src/modules/PluginsLoader/__init__.py @@ -31,7 +31,7 @@ class KuiToi: self.__name = name self.__dir = Path(self._plugins_dir) / self.__name os.makedirs(self.__dir, exist_ok=True) - self.__events_funcs = [] + self.__funcs = [] self.register_event = self.register @property @@ -67,11 +67,12 @@ class KuiToi: def register(self, event_name, event_func): self.log.debug(f"Registering event {event_name}") - self.__events_funcs.append(event_func) + self.__funcs.append(event_func) ev.register(event_name, event_func) def _unload(self): - for f in self.__events_funcs: + for f in self.__funcs: + console.del_command(f) ev.unregister(f) def call_event(self, event_name, *args, **kwargs): @@ -106,6 +107,7 @@ class KuiToi: def add_command(self, key, func, man, desc, custom_completer) -> dict: self.log.debug("Requests add_command") + self.__funcs.append(func) return console.add_command(key, func, man, desc, custom_completer) @@ -139,12 +141,15 @@ class PluginsLoader: ok, _, file, _ = await self._unload_by_name(x[1], True) if ok: if await self._load_by_file(file): + self.plugins[x[1]]['plugin'].start() return f"Plugin reloaded ({time.monotonic() - t1:.1f}sec)" return "Plugin not found" return usage case 'load': if len(x) == 2: - if await self._load_by_file(x[1]): + name = await self._load_by_file(x[1]) + if name: + self.plugins[name]['plugin'].start() return "Plugin loaded" return usage case 'unload': @@ -241,7 +246,7 @@ class PluginsLoader: th.join() self.loaded.append((pl_name, True)) self.log.debug(f"Plugin loaded: {file}. Settings: {self.plugins[pl_name]}") - return True + return pl_name except Exception as e: self.loaded.append((file, False)) self.log.error(i18n.plugins_error_loading.format(file, f"{e}"))