diff --git a/requirements.txt b/requirements.txt index 17cc2f7..5eee51e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,5 @@ uvicorn~=0.22.0 fastapi~=0.100.0 starlette~=0.27.0 pydantic~=2.0.2 -click~=8.1.4 \ No newline at end of file +click~=8.1.4 +lupa~=2.0 \ No newline at end of file diff --git a/src/modules/PluginsLoader/lua_plugins_loader.py b/src/modules/PluginsLoader/lua_plugins_loader.py index 60e46cc..7c03265 100644 --- a/src/modules/PluginsLoader/lua_plugins_loader.py +++ b/src/modules/PluginsLoader/lua_plugins_loader.py @@ -1,22 +1,33 @@ import asyncio import os +# noinspection PyUnresolvedReferences +import lupa.lua53 +from lupa.lua53 import LuaRuntime + from core import get_logger class MP: - def __init__(self): - pass + def __init__(self, name): + self.name = name + self.log = get_logger(f"LuaPlugin | {name}") + + def log_info(self, *args): + s = "" + for i in args: + s += i + self.log.info(s) class LuaPluginsLoader: def __init__(self, plugins_dir): self.loop = asyncio.get_event_loop() + self.plugins_dir = plugins_dir 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: " @@ -28,18 +39,29 @@ class LuaPluginsLoader: 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.lua_dirs.append([path, obj]) - self.log.debug(f"py_folders {py_folders}, folders {folders}") + self.log.debug(f"py_folders {py_folders}, lua_dirs {self.lua_dirs}") - # 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") + for path, obj in self.lua_dirs: + lua = LuaRuntime(encoding=config.enc, source_encoding=config.enc) + mp = MP(obj) + lua.globals().MP = mp + lua.globals().print = mp.log_info + code = f'package.path = package.path.."' \ + f';{self.plugins_dir}/{obj}/?.lua' \ + f';{self.plugins_dir}/{obj}/lua/?.lua' \ + f';modules/PluginsLoader/lua_libs/?.lua"' + with open(os.path.join(path, "main.lua"), 'r', encoding=config.enc) as f: + code += f.read() + lua.execute(code) - async def start(self, _): ... - async def unload(self, _): ... + async def start(self, _): + ... + + async def unload(self, _): + ...