diff --git a/src/core/core.py b/src/core/core.py index b2dc3c9..2e574ac 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -16,7 +16,7 @@ from core import utils from core.Client import Client from core.tcp_server import TCPServer from core.udp_server import UDPServer -from modules import PluginsLoader +from modules import PluginsLoader, LuaPluginsLoader from modules.WebAPISystem import app as webapp @@ -217,11 +217,14 @@ class Core: lambda x: f"Players list: {self.get_clients_list(True)}" ) - self.log.debug("Initializing PluginsLoader...") - if not os.path.exists("plugins"): - os.mkdir("plugins") - pl = PluginsLoader("plugins") + pl_dir = "plugins" + self.log.debug("Initializing PluginsLoaders...") + if not os.path.exists(pl_dir): + os.mkdir(pl_dir) + pl = PluginsLoader(pl_dir) await pl.load() + lpl = LuaPluginsLoader(pl_dir) + await lpl.load() try: # WebApi Start @@ -263,6 +266,7 @@ class Core: t = asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION) await ev.call_async_event("_plugins_start") + await ev.call_async_event("_lua_plugins_start") self.run = True self.log.info(i18n.start) @@ -287,6 +291,7 @@ class Core: ev.call_event("onServerStopped") await ev.call_async_event("onServerStopped") await ev.call_async_event("_plugins_unload") + await ev.call_async_event("_lua_plugins_unload") self.run = False self.log.info(i18n.stop) if config.WebAPI["enabled"]: diff --git a/src/modules/PluginsLoader/__init__.py b/src/modules/PluginsLoader/__init__.py index f1cb068..55a0164 100644 --- a/src/modules/PluginsLoader/__init__.py +++ b/src/modules/PluginsLoader/__init__.py @@ -1 +1,2 @@ from .plugins_loader import PluginsLoader +from .lua_plugins_loader import LuaPluginsLoader diff --git a/src/modules/PluginsLoader/lua_plugins_loader.py b/src/modules/PluginsLoader/lua_plugins_loader.py new file mode 100644 index 0000000..60e46cc --- /dev/null +++ b/src/modules/PluginsLoader/lua_plugins_loader.py @@ -0,0 +1,45 @@ +import asyncio +import os + +from core import get_logger + + +class MP: + + def __init__(self): + pass + + +class LuaPluginsLoader: + + def __init__(self, plugins_dir): + self.loop = asyncio.get_event_loop() + self.lua_plugins = {} + self.lua_plugins_tasks = [] + self.plugins_dir = plugins_dir + self.lua_dirs = [] + self.log = get_logger("LuaPluginsLoader") + self.loaded_str = "Lua plugins: " + ev.register_event("_lua_plugins_start", self.start) + ev.register_event("_lua_plugins_unload", self.unload) + console.add_command("lua_plugins", lambda x: self.loaded_str[:-2]) + console.add_command("lua_pl", lambda x: self.loaded_str[:-2]) + + async def load(self): + self.log.debug("Loading Lua plugins...") + py_folders = ev.call_event("_plugins_get")[0] + folders = [] + for obj in os.listdir(self.plugins_dir): + path = os.path.join(self.plugins_dir, obj) + if os.path.isdir(path) and obj not in py_folders and obj not in "__pycache__": + if os.path.isfile(os.path.join(path, "main.lua")): + folders.append(path) + + self.log.debug(f"py_folders {py_folders}, folders {folders}") + + # for dirpath, dirnames, filenames in os.walk(f"/{self.plugins_dir}/{plugin_dir}"): + # if "main.lua" in filenames: + # return os.path.join(dirpath, "main.lua") + + async def start(self, _): ... + async def unload(self, _): ... diff --git a/src/modules/PluginsLoader/plugins_loader.py b/src/modules/PluginsLoader/plugins_loader.py index 2d46caf..f8cb73e 100644 --- a/src/modules/PluginsLoader/plugins_loader.py +++ b/src/modules/PluginsLoader/plugins_loader.py @@ -73,7 +73,7 @@ class PluginsLoader: self.loaded_str = "Plugins: " ev.register_event("_plugins_start", self.start) ev.register_event("_plugins_unload", self.unload) - ev.register_event("_plugins_get", lambda x: self.plugins) + ev.register_event("_plugins_get", lambda x: list(self.plugins.keys())) console.add_command("plugins", lambda x: self.loaded_str[:-2]) console.add_command("pl", lambda x: self.loaded_str[:-2]) @@ -81,14 +81,14 @@ class PluginsLoader: self.log.debug("Loading plugins...") files = os.listdir(self.plugins_dir) for file in files: - if os.path.isfile(file) and file.endswith(".py"): + file_path = os.path.join(self.plugins_dir, file) + if os.path.isfile(file_path) and file.endswith(".py"): try: self.log.debug(f"Loading plugin: {file[:-3]}") plugin = types.ModuleType(file[:-3]) plugin.KuiToi = KuiToi plugin.KuiToi._plugins_dir = self.plugins_dir plugin.print = print - file_path = os.path.join(self.plugins_dir, file) plugin.__file__ = file_path with open(f'{file_path}', 'r', encoding=config.enc) as f: code = f.read() diff --git a/src/modules/__init__.py b/src/modules/__init__.py index 6671fa1..914af1f 100644 --- a/src/modules/__init__.py +++ b/src/modules/__init__.py @@ -11,5 +11,6 @@ from .ConfigProvider import ConfigProvider, Config from .i18n import MultiLanguage from .EventsSystem import EventsSystem from .PluginsLoader import PluginsLoader +from .PluginsLoader import LuaPluginsLoader from .WebAPISystem import web_app from .WebAPISystem import _stop as stop_web