def modules_listing(error_text: str = None) -> str: modules_listed = f"**Modules**\n\n" if error_text: modules_listed += f"{error_text}\n\n" modules_listed += f"{msgRep.USAGE}:\n`.modules -d, --desc [{msgRep.NUMBER_OF_MODULE}]`\n"\ f"`.modules -i, --info [{msgRep.NUMBER_OF_MODULE}]`\n"\ f"`.modules -u, --usage [{msgRep.NUMBER_OF_MODULE}]`\n\n" sys_count, user_count = installed_modules() modules_listed += f"`{msgRep.SYSTEM_MODULES}: {sys_count}`\n" modules_listed += f"`{msgRep.USER_MODULES}: {user_count}`\n\n" if not SAFEMODE else "\n" modules_listed += f"{msgRep.AVAILABLE_MODULES}:\n" modules_list = update_list() all_running = all(ir == True for ir in [modules[-1] for modules in modules_list]) num = 0 warning = u"\u26A0" # warn emoji user_modules = getUserModules() for module_name, module, isRunning in modules_list: num += 1 if module in user_modules: if isRunning: modules_listed += f"`({str(num)}) {module_name}* ({module})`\n" else: modules_listed += f"`({str(num)}) {module_name}* ({module}) {warning}`\n" else: if isRunning: modules_listed += f"`({str(num)}) {module_name} ({module})`\n" else: modules_listed += f"`({str(num)}) {module_name} ({module}) {warning}`\n" not_load_modules = getConfig("NOT_LOAD_MODULES") if not_load_modules: all_modules = getAllModules() for module in not_load_modules: if module in module: modules_listed += "\n" modules_listed += f"{msgRep.DISABLED_MODULES}:\n" break for module in sorted(not_load_modules): if module in module: if module in user_modules: modules_listed += f"`- {module}*`\n" else: modules_listed += f"`- {module}`\n" num += 1 if (user_modules and not SAFEMODE) or not all_running: modules_listed += "--------------------------------\n" if user_modules and not SAFEMODE: modules_listed += f"__* = {msgRep.ASTERISK}__\n" if not all_running: modules_listed += f"__{warning} = {msgRep.NOT_RUNNING_INFO}__\n" return modules_listed
def installed_modules() -> tuple: syspath = join(".", "userbot", "modules") userpath = join(".", "userbot", "modules_user") sys_count, user_count = (0, ) * 2 for module in getAllModules(): if exists(join(syspath, (module + ".py"))): sys_count += 1 elif exists(join(userpath, (module + ".py"))): user_count += 1 return (sys_count, user_count)
def start_modules(): if SAFEMODE: log.info("Starting system modules only") else: log.info("Starting modules") modules = _Modules() try: modules.import_load_modules() except KeyboardInterrupt: raise KeyboardInterrupt except (BaseException, Exception) as e: log.critical(f"Failed to start modules: {e}", exc_info=True) load_modules_count = modules.loaded_modules() sum_modules = len(getAllModules()) if not load_modules_count: log.warning("No modules started!") elif load_modules_count > 0: log.info(f"Modules ({load_modules_count}/{sum_modules}) " "started and ready!") return
def installed_modules() -> tuple: syspath = join(".", "userbot", "modules") userpath = join(".", "userbot", "modules_user") sys_count, user_count = (0, ) * 2 core_mods = [ "_feature_manager", "_modules_utils", "_package_manager", "_systools", "_updater" ] for module in getAllModules(): if exists(join(syspath, (module + ".py"))): if SAFEMODE2: if module in core_mods: sys_count += 1 else: sys_count += 1 elif not SAFEMODE and exists(join(userpath, (module + ".py"))): user_count += 1 return (sys_count, user_count)
def modules_listing(error_text: str = None) -> str: modules_listed = f"**{msgRep.MOD_UTILS}**\n\n" if error_text: modules_listed += f"{error_text}\n" if _attempts >= 2: modules_listed += f"{msgRep.MOD_HELP.format('`.help mods`')}\n" modules_listed += "\n" sys_count, user_count = installed_modules() modules_listed += f"`{msgRep.SYSTEM_MODULES}: {sys_count}`\n" modules_listed += (f"`{msgRep.USER_MODULES}: {user_count}`\n\n" if not SAFEMODE else "\n") check_mark = u"\u2705" modules_listed += f"{check_mark} {msgRep.AVAILABLE_MODULES}:\n" modules_list = update_list() all_running = all(True if ir else False for ir in [modules[-1] for modules in modules_list]) num = 0 warning = u"\u26A0" # warn emoji recycle = u"\u267B" # recycling emoji user_modules = getUserModules() for module_name, module, isRunning in modules_list: num += 1 if module in user_modules: if isRunning: modules_listed += (f"`({str(num)}) {module_name}` {recycle}\n") else: modules_listed += (f"`({str(num)}) {module_name}` {recycle} " f"{warning}\n") else: if isRunning: modules_listed += (f"`({str(num)}) {module_name}`\n") else: modules_listed += (f"`({str(num)}) {module_name}` {warning}\n") not_load_modules = getConfig("NOT_LOAD_MODULES", []) if not_load_modules: all_modules = getAllModules() if any(module for module in not_load_modules if module in all_modules): modules_listed += "\n" no_entry = u"\u26D4" modules_listed += f"{no_entry} {msgRep.DISABLED_MODULES}:\n" for module in sorted(not_load_modules): if module in all_modules: if module in user_modules: modules_listed += f"`- {module}` {recycle}\n" else: modules_listed += f"`- {module}`\n" modules_listed += "\n" if user_modules and not SAFEMODE: modules_listed += f"{recycle} __{msgRep.ASTERISK}__\n" if not all_running: modules_listed += f"{warning} __{msgRep.NOT_RUNNING_INFO}__\n" return modules_listed
async def superuser(command): global WARNING_SHOWN cmd_args = command.pattern_match.group(1).split(" ", 1) if cmd_args[0].lower() == "disclaimer": await command.edit(DISCLAIMER) f = open(os.path.join(".", "userbot", "superuser.hbot"), "w+") f.write("\n") f.close() WARNING_SHOWN = True elif cmd_args[0].lower() == "remove": if not WARNING_SHOWN: await command.edit("For safety measures, the command will not run, please make "\ "sure you have read the disclaimer by typing `.sudo disclaimer`") return if len(cmd_args) == 1: await command.edit( "No name of module to be removed specified, command halted!") return if len(cmd_args) > 2: await command.edit( "For safety reasons you can only uninstall one module at a time!" ) return modName = cmd_args[1].lower() if modName not in getAllModules(): await command.edit( "Unknown module named `{}`. Uninstallation halted!") return if modName in getUserModules(): await command.edit("`Uninstalling user module...`") os.remove(os.path.join(USER_MODULES_DIR, modName + ".py")) time.sleep(1) if LOGGING: await event_log(command, "SUPERUSER", "The user module `{}` was removed "\ "successfully".format(modName)) await command.edit("The user module `{}` was uninstalled successfully! "\ "Reboot recommended!".format(modName)) else: await command.edit("`Uninstalling system module...`") os.remove(os.path.join(MODULES_DIR, modName + ".py")) time.sleep(1) if LOGGING: await event_log(command, "SUPERUSER", "The system module `{}` was removed "\ "successfully".format(modName)) await command.edit("The system module `{}` was uninstalled successfully! "\ "Reboot recommended!".format(modName)) elif cmd_args[0].lower() == "convert": if not WARNING_SHOWN: await command.edit("For safety measures, the command will not run, please make "\ "sure you have read the disclaimer by typing `.sudo disclaimer`") return if len(cmd_args) == 1: await command.edit( "No name of module to be converted specified, command halted!") return if len(cmd_args) > 2: await command.edit( "For safety reasons you can only convert one module at a time!" ) return modName = cmd_args[1].lower() if modName not in getAllModules(): await command.edit( "Unknown module named `{}`. Not found!".format(modName)) return if modName in getUserModules(): await command.edit("`Converting user module into system module...`" ) copyfile(os.path.join(USER_MODULES_DIR, modName + ".py"), os.path.join(MODULES_DIR, modName + ".py")) os.remove(os.path.join(USER_MODULES_DIR, modName + ".py")) time.sleep(1) if LOGGING: await event_log(command, "SUPERUSER", "The User module `{}` was successfully "\ "converted into a System module!".format(modName)) await command.edit("The User module `{}` was successfully converted into a "\ "System module! Reboot recommended!".format(modName)) else: await command.edit("`Converting system module into user module...`" ) copyfile(os.path.join(MODULES_DIR, modName + ".py"), os.path.join(USER_MODULES_DIR, modName + ".py")) os.remove(os.path.join(MODULES_DIR, modName + ".py")) time.sleep(1) if LOGGING: await event_log(command, "SUPERUSER", "The System module `{}` was successfully "\ "converted into a User module!".format(modName)) await command.edit("The System module `{}` was successfully converted into a "\ "user module! Reboot recommended!".format(modName)) else: await command.edit( "Invalid argument! Please make sure it is **disclaimer**, **remove** or **convert**" ) return
def _import_module(self, module: str, is_usermodule: bool, display_info: bool): """ Import a module and straight start it """ special_caller = [ os.path.join("userbot", "__main__.py"), os.path.join("userbot", "modules", "_package_manager.py"), os.path.join("userbot", "modules", "sideloader.py") ] sys_caller = getouterframes(currentframe(), 2)[2].filename valid_caller = False for caller in special_caller: if sys_caller.endswith(caller): valid_caller = True break if not valid_caller: caller = getouterframes(currentframe(), 2)[2] caller = f"{os.path.basename(caller.filename)}:{caller.lineno}" log.warning(f"Not a valid caller (requested by {caller})") return if NO_MODS: return if module.startswith("__"): log.warning(f"Illegal module name '{module}'") return path = (f"userbot.modules_user.{module}" if is_usermodule else f"userbot.modules.{module}") if is_usermodule: if module in getBuiltInModules(): log.warning(f"Module '{module}' present as " "built-in module already") return if path in sys.modules or module in getAllModules(): self._unimport_module(module) update_all_modules(module) if is_usermodule: update_user_modules(module) if SAFEMODE: return else: update_built_in_modules(module) if SAFEMODE2: core_mods = [ "_feature_manager", "_modules_utils", "_package_manager", "_systools", "_updater" ] if module not in core_mods: return if module in self.__not_load_modules: return try: importlib.import_module(path) update_load_modules(module, True) if display_info: log.info(f"Module '{module}' imported successfully") except KeyboardInterrupt: raise KeyboardInterrupt except (BaseException, Exception): log.error( f"Failed to start module '{module}' due " "to an unhandled exception", exc_info=True) update_load_modules(module, False) return
def _unimport_module(self, module: str): """ Tries to remove all data from the target module and finally to unimport it from runtime """ special_caller = [ os.path.join("userbot", "_core", os.path.basename(__file__)), os.path.join("userbot", "modules", "_package_manager.py") ] sys_caller = getouterframes(currentframe(), 2)[2].filename valid_caller = False for caller in special_caller: if sys_caller.endswith(caller): valid_caller = True break if not valid_caller: caller = getouterframes(currentframe(), 2)[2] caller = f"{os.path.basename(caller.filename)}:{caller.lineno}" log.warning(f"Not a valid caller (requested by {caller})") return if NO_MODS: return if module.startswith("__"): log.warning(f"Illegal module name '{module}'") return if module not in getAllModules(): return if module not in getUserModules(): log.error(f"Target module '{module}' is not an user module!") return handlers_from_module = getHandlers().get(module) if handlers_from_module: for handler in handlers_from_module: _tgclient.remove_event_handler(handler) log.info(f"Event handlers from '{module}' removed") else: log.info(f"Module '{module}' has no registered event handlers") update_handlers(module, None, True) unregister_module_desc(module) unregister_module_info(module) cmds_to_remove = [] for cmd, cmd_attrs in getRegisteredCMDs().items(): mod_name = cmd_attrs.get("module_name", "") if module == mod_name: cmds_to_remove.append(cmd) if cmds_to_remove: for cmd in cmds_to_remove: unregister_cmd(cmd) update_all_modules(module, True) update_load_modules(module, False, True) update_user_modules(module, True) try: path = f"userbot.modules_user.{module}" if path in sys.modules: sys.modules.pop(path) log.info(f"Module '{module}' unimported successfully") else: log.info(f"Removed module '{module}' from modules data " "successfully") except KeyError: log.error(f"Failed to unimport module '{module}'") return
quit(1) return def loaded_modules(self) -> int: return self.__load_modules_count if __name__ == "__main__": try: if SAFEMODE: log.info("Loading resources and system modules") else: log.info("Loading resources and modules") modules = _Modules() modules.import_load_modules() load_modules_count = modules.loaded_modules() sum_modules = len(getAllModules()) if not load_modules_count: log.warning("No module(s) loaded!") elif load_modules_count > 0: log.info(f"Modules ({load_modules_count}/{sum_modules}) loaded and ready") log.info("Starting Telegram client") with tgclient: me = tgclient.loop.run_until_complete(tgclient.get_me()) log.info("You're running %s v%s as %s (ID: %s)", PROJECT, VERSION, me.first_name, me.id) tgclient.run_until_disconnected() except KeyboardInterrupt: log.info("Keyboard interruption. Exiting...") except Exception as e: log.critical(f"Unable to start HyperUBot: {e}", exc_info=True) try: