diff --git a/main.py b/main.py index f6bac81..a19ca50 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ import json import sys import os import threading +import importlib # global variables STOP_REQUESTED = False @@ -41,7 +42,7 @@ class ModuleV1: try: exec(self.predefine) except Exception as e: - print("[ERROR] module: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e)) + print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e)) # running the module def process(self, msg): @@ -52,9 +53,27 @@ class ModuleV1: exec(self.code) return self.RESPONCE except Exception as e: - print("[ERROR] module: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e)) + print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e)) return "" +class ModuleV2: + def __init__(self, path, index_file, enabled, alias): + self.version = 2 + self.enabled = enabled + self.alias = alias + self.path = path + self.index_file = index_file[:-3] + self.obj = importlib.import_module((path + self.index_file).replace("/", ".")) + + # running the module + def process(self, msg): + try: + responce = self.obj.process(msg, self.path) + return responce + except Exception as e: + print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"") + return None + # module control unit class ModuleControlUnit: @@ -103,48 +122,33 @@ class ModuleControlUnit: self.modules.append( ModuleV1( "modules/{}/".format(folder), code, enabled, alias, predefine ) ) print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder, alias, enabled)) + + elif meta["version"] == 2: + if "index_file" in meta: + index_file = meta["index_file"] + else: + index_file = "index.py" + + if "start_on_boot" in meta: + enabled = meta["start_on_boot"] + else: + enabled = False + + if "alias" in meta: + alias = meta["alias"] + else: + alias = None + + self.modules.append(ModuleV2(f"modules/{folder}/", index_file, enabled, alias)) + + print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} (start_on_boot: {enabled})") + else: - print("[WARN] reload_modules: module {} requires unsupported version ({} > 1), skipping...".format(folder, meta["version"])) + print(f"[WARN] reload_modules: module {folder} requires unsupported version ({meta['version']} > 2), skipping...") + except Exception as e: print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder, e)) - def reload_module(self, folder_name): - try: - meta_raw = readfile("modules/{}/meta.json".format(folder)) - if not meta_raw: - print("[WARN] module_loader: no meta.json found in module folder \"{}\"".format(folder_name)) - return 1 - - meta = json.loads( readfile("modules/{}/meta.json".format(folder_name)) ) - if "version" in meta: - if meta["version"] == 1: - if "index_file" in meta: - index_file = meta["index_file"] - else: - index_file = "index.py" - - code = readfile( "modules/{}/{}".format(folder_name, index_file) ) - if not code: # False both when readfile() returns False and when the code string is empty - print("[WARN] reload_modules: module {} does not have any code, skipping...".format(folder_name)) - - if "start_on_boot" in meta: - enabled = meta["start_on_boot"] - else: - enabled = False - - if "alias" in meta: - alias = meta["alias"] - else: - alias = None - - self.modules.append( ModuleV1( code, enabled, alias ) ) - - print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder_name, alias, enabled)) - else: - print("[WARN] reload_modules: module {} requires unsupported version ({} > 1), skipping...".format(folder_name, meta["version"])) - except Exception as e: - print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder_name, e)) - # message queue object to go back to synchronous message processing #class MessageQueue: # def __init__(self): @@ -177,11 +181,11 @@ def queue_processor(): # modules are used in here for mod in mcu.modules: if mod.enabled: - if mod.version == 1: + if mod.version == 1 or mod.version == 2: responce = mod.process(msg) - if len(responce) > 0: + if responce: updater.bot.send_message(chat_id = msg.chat.id, text = responce, disable_web_page_preview = True) - print("Responded using module {} ({}) with text: {}".format(mod.path, mod.alias, responce)) + print(f"Responded using module {mod.path} ({mod.alias}) with text: {responce}") break del message_queue[0] diff --git a/module-testing.py b/module-testing.py index b18b490..d56fe94 100644 --- a/module-testing.py +++ b/module-testing.py @@ -5,6 +5,7 @@ import json import sys import os import threading +import importlib from telegram import Message, Chat @@ -42,7 +43,7 @@ class ModuleV1: try: exec(self.predefine) except Exception as e: - print("[ERROR] module: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e)) + print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\" during predefine stage, disabling it...".format(self.path, self.alias, e)) # running the module def process(self, msg): @@ -53,10 +54,29 @@ class ModuleV1: exec(self.code) return self.RESPONCE except Exception as e: - print("[ERROR] module: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e)) + print("[ERROR] module v1: module \"{}\" ({}) raised exception \"{}\"".format(self.path, self.alias, e)) return "" +class ModuleV2: + def __init__(self, path, index_file, enabled, alias): + self.version = 2 + self.enabled = enabled + self.alias = alias + self.path = path + self.index_file = index_file[:-3] + self.obj = importlib.import_module((path + self.index_file).replace("/", ".")) + + # running the module + def process(self, msg): + try: + responce = self.obj.process(msg, self.path) + return responce + except Exception as e: + print(f"[ERROR] module v2: module \"{self.path}\" ({self.alias}) raised exception \"{e}\"") + return None + + # module control unit class ModuleControlUnit: def __init__(self): @@ -104,47 +124,33 @@ class ModuleControlUnit: self.modules.append( ModuleV1( "modules/{}/".format(folder), code, enabled, alias, predefine ) ) print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder, alias, enabled)) + + elif meta["version"] == 2: + if "index_file" in meta: + index_file = meta["index_file"] + else: + index_file = "index.py" + + if "start_on_boot" in meta: + enabled = meta["start_on_boot"] + else: + enabled = False + + if "alias" in meta: + alias = meta["alias"] + else: + alias = None + + self.modules.append(ModuleV2(f"modules/{folder}/", index_file, enabled, alias)) + + print(f"[INFO] reload_modules: successfully loaded {folder} as {alias} (start_on_boot: {enabled})") + else: - print("[WARN] reload_modules: module {} requires unsupported version ({} > 1), skipping...".format(folder, meta["version"])) + print(f"[WARN] reload_modules: module {folder} requires unsupported version ({meta['version']} > 2), skipping...") + except Exception as e: print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder, e)) - def reload_module(self, folder_name): - try: - meta_raw = readfile("modules/{}/meta.json".format(folder)) - if not meta_raw: - print("[WARN] module_loader: no meta.json found in module folder \"{}\"".format(folder_name)) - return 1 - - meta = json.loads( readfile("modules/{}/meta.json".format(folder_name)) ) - if "version" in meta: - if meta["version"] == 1: - if "index_file" in meta: - index_file = meta["index_file"] - else: - index_file = "index.py" - - code = readfile( "modules/{}/{}".format(folder_name, index_file) ) - if not code: # False both when readfile() returns False and when the code string is empty - print("[WARN] reload_modules: module {} does not have any code, skipping...".format(folder_name)) - - if "start_on_boot" in meta: - enabled = meta["start_on_boot"] - else: - enabled = False - - if "alias" in meta: - alias = meta["alias"] - else: - alias = None - - self.modules.append( ModuleV1( code, enabled, alias ) ) - - print("[INFO] reload_modules: successfully loaded {} as {} (start_on_boot: {})".format(folder_name, alias, enabled)) - else: - print("[WARN] reload_modules: module {} requires unsupported version ({} > 1), skipping...".format(folder_name, meta["version"])) - except Exception as e: - print("[ERROR] module_loader: error while loading module \"{}\" ({})".format(folder_name, e)) # message queue object to go back to synchronous message processing #class MessageQueue: @@ -160,7 +166,7 @@ def queue_processor(): if len(message_queue) > 0: msg = message_queue[0] print("[DEBUG] queue_processor: {}".format(msg)) # debug - + # check for control commands if msg["chat"]["id"] == 575246355: if msg["text"][0] == "$": @@ -174,22 +180,23 @@ def queue_processor(): del message_queue[0] continue - + # modules are used in here for mod in mcu.modules: if mod.enabled: - if mod.version == 1: + if mod.version == 1 or mod.version == 2: responce = mod.process(msg) - if len(responce) > 0: - print("Responded using module {} ({}) with text: {}".format(mod.path, mod.alias, responce)) + if responce: + print(f"Responded using module {mod.path} ({mod.alias}) with text: {responce}") break - + del message_queue[0] else: if STOP_REQUESTED: break else: time.sleep(1) + except Exception as e: print("[ERROR] queue_processor: current message queue: {}".format(message_queue)) print("[ERROR] queue_processor: error while processing message, trying to delete it...")