Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
            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: