def update_list() -> list: modules_list = [] for module, isRunning in LOAD_MODULES.items(): if not module == basename(__file__)[:-3]: # exclude this module if module in USER_MODULES: if module in MODULE_INFO.keys(): # Append [Name of module, filename of module, running] -> [] modules_list.append([ MODULE_INFO.get(module, {}).get("name", msgRep.UNKNOWN), module, isRunning ]) else: modules_list.append([module, module, isRunning]) else: if module in MODULE_INFO.keys(): modules_list.append([ MODULE_INFO.get(module, {}).get("name", msgRep.UNKNOWN), module, isRunning ]) else: modules_list.append([module, module, isRunning]) global MODULES_LISTED if MODULES_LISTED: MODULES_LISTED = {} # reset dict num = 0 for module in [modules[1] for modules in sorted(modules_list)]: num += 1 MODULES_LISTED[str(num)] = module return sorted(modules_list)
def module_info(name_of_module: str, module: str) -> str: if module in getLoadModules().keys(): package_name, moduletype, installation_date = (msgRep.UNKNOWN,)*3 size = 0 if module in getModuleInfo().keys(): authors = getModuleInfo().get(module, {}).get("authors", msgRep.UNKNOWN) version = getModuleInfo().get(module, {}).get("version", 0) elif module in MODULE_INFO.keys(): log.info(f"MODULE_INFO is obsolete, please use register_module_info() instead (in module '{module}')") authors = MODULE_INFO.get(module, {}).get("authors", msgRep.UNKNOWN) version = MODULE_INFO.get(module, {}).get("version", 0) if not authors: authors = msgRep.UNKNOWN if not version: version = 0 package_name = module module += ".py" syspath = join(".", "userbot", "modules") userpath = join(".", "userbot", "modules_user") if exists(join(syspath, module)): moduletype = msgRep.SYSTEM size = sizeStrMaker(getsize(join(syspath, module))) if OS and OS.lower().startswith("win"): installation_date = getctime(join(syspath, module)) elif OS and OS.lower().startswith("darwin"): installation_date = stat(join(syspath, module)).st_birthtime else: installation_date = stat(join(syspath, module)).st_ctime elif exists(join(userpath, module)): moduletype = msgRep.USER size = sizeStrMaker(getsize(join(userpath, module))) if OS and OS.lower().startswith("win"): installation_date = getctime(join(userpath, module)) elif OS and OS.lower().startswith("darwin"): installation_date = stat(join(userpath, module)).st_birthtime else: installation_date = stat(join(userpath, module)).st_ctime result = f"{msgRep.PKG_NAME}: {package_name}\n" result += f"{msgRep.MODULE_TYPE}: {moduletype}\n" result += f"{msgRep.AUTHORS}: {authors}\n" result += f"{msgRep.VERSION}: {version}\n" result += f"{msgRep.SIZE}: {size}\n" result += f"{msgRep.INSTALL_DATE}: {ctime(installation_date)}" return msgRep.NAME_MODULE.format(name_of_module) + "\n\n" + result else: raise IndexError
def module_info(name_of_module: str, module: str) -> str: if module in LOAD_MODULES: package_name, moduletype, installation_date = (msgRep.UNKNOWN, ) * 3 size = 0 version = MODULE_INFO.get(module, {}).get("version", 0) package_name = module module += ".py" if OS and OS.lower().startswith("win"): syspath = ".\\userbot\\modules\\" userpath = ".\\userbot\\modules_user\\" else: syspath = "./userbot/modules/" userpath = "./userbot/modules_user/" if exists(syspath + module): moduletype = msgRep.SYSTEM size = sizeStrMaker(getsize(syspath + module)) if OS and OS.lower().startswith("win"): installation_date = getctime(syspath + module) elif OS and OS.lower().startswith("darwin"): installation_date = stat(syspath + module).st_birthtime else: installation_date = stat(syspath + module).st_ctime elif exists(userpath + module): moduletype = msgRep.USER size = sizeStrMaker(getsize(userpath + module)) if OS and OS.lower().startswith("win"): installation_date = getctime(userpath + module) elif OS and OS.lower().startswith("darwin"): installation_date = stat(userpath + module).st_birthtime else: installation_date = stat(userpath + module).st_ctime result = f"{msgRep.PKG_NAME}: {package_name}\n" result += f"{msgRep.MODULE_TYPE}: {moduletype}\n" result += f"{msgRep.VERSION}: {version}\n" result += f"{msgRep.SIZE}: {size}\n" result += f"{msgRep.INSTALL_DATE}: {ctime(installation_date)}" return msgRep.NAME_MODULE.format(name_of_module) + "\n\n" + result else: raise IndexError
await event.edit(msgRep.SPD_FAIL_SEND_RESULT) else: # Convert speed to Mbit/s down_in_mbits = round(result["download"] / 10**6, 2) up_in_mbits = round(result["upload"] / 10**6, 2) # Convert speed to MB/s (real speed?) down_in_mb = round(result["download"] / ((10**6) * 8), 2) up_in_mb = round(result["upload"] / ((10**6) * 8), 2) time = parse(result["timestamp"]) ping = result["ping"] isp = result["client"]["isp"] host = result["server"]["sponsor"] host_cc = result["server"]["cc"] text = "<b>Speedtest by Ookla</b>\n\n" text += f"<b>{msgRep.SPD_TIME}</b>: <code>{time.strftime('%B %d, %Y')} - {time.strftime('%H:%M:%S')} {time.tzname()}</code>\n" text += f"<b>{msgRep.SPD_DOWNLOAD}</b>: <code>{down_in_mbits}</code> {msgRep.SPD_MEGABITS} (<code>{down_in_mb}</code> {msgRep.SPD_MEGABYTES})\n" text += f"<b>{msgRep.SPD_UPLOAD}</b>: <code>{up_in_mbits}</code> {msgRep.SPD_MEGABITS} (<code>{up_in_mb}</code> {msgRep.SPD_MEGABYTES})\n" text += f"<b>{msgRep.SPD_PING}</b>: <code>{ping}</code> ms\n" text += f"<b>{msgRep.SPD_ISP}</b>: {isp}\n" text += f"<b>{msgRep.SPD_HOSTED_BY}</b>: {host} ({host_cc})\n" await event.edit(text, parse_mode="html") return MODULE_DESC.update({basename(__file__)[:-3]: descRep.WEBTOOLS_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.WEBTOOLS_USAGE}) MODULE_INFO.update( {basename(__file__)[:-3]: module_info(name="Web Tools", version=VERSION)})
await msg.edit(msgRep.UNINSTALLING.format(modNames)) for modName in mods_uninstall: if modName not in USER_MODULES: await msg.edit(msgRep.NOT_IN_USERSPACE.format(modName)) return os.remove(USER_MODULES_DIR + modName + ".py") log.info(f"Modules '{modNames}' has been uninstalled from userspace") log.info("Rebooting userbot...") await msg.edit(msgRep.DONE_RBT) time.sleep(1) # just so we can actually see a message if LOGGING: await event_log(msg, "MODULE UNINSTALL", custom_text=msgRep.UNINSTALL_LOG.format(modNames)) await msg.edit(msgRep.REBOOT_DONE_UNINS.format(modNames)) args = [EXECUTABLE, "-m", "userbot"] os.execle(sys.executable, *args, os.environ) await msg.client.disconnect() return else: await msg.edit(msgRep.INVALID_ARG) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.PACKAGE_MANAGER_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.PACKAGE_MANAGER_USAGE}) MODULE_INFO.update({ basename(__file__)[:-3]: module_info(name="Package Manager", version=VERSION) })
reason = message gbantext = '/gkick ' + user + ' ' + reason for i in GBAN_BOT_IDS: async with tgclient.conversation(i) as conv: await conv.send_message(gbantext) x = None try: x = await conv.get_response() except Timeout: log.warning("@" + i + " took too much to respond, likely it is offline!\n") if x: response += i + ': ' + x.text.replace("**", "").replace("`", "").replace("tg://user?id=", "") + '\n\n' else: response += i + " took too much time to respond, likely it is offline!\n" await request.edit("`" + response + "`") return DESC = "nunos-private-repo modules are not for human consumption! This is the global bans module, which will redirect the gban command to group management bots (based on Marie), gbanning people on multiple bots at the same time." USAGE = "`.gban` <optional: user identifier> \ \nUsage: Globally bans a user in the specified Marie based bots. \ \n\n`.ungban` <optional: user identifier> \ \nUsage: Globally unbans a user in the specified Marie based bots. \ \n\n`.gkick` <optional: user identifier> \ \nUsage: Globally kicks a user in the specified Marie based bots. \ **ALERT**: This module is not suitable for human consumption! Please refrain from using it unless you know what you are doing!" MODULE_DESC.update({basename(__file__)[:-3]: DESC}) MODULE_DICT.update({basename(__file__)[:-3]: USAGE}) MODULE_INFO.update({basename(__file__)[:-3]: module_info(name="Global Bans Utility", version=VERSION)})
scale = 512 / size2 size1new = size1 * scale size2new = 512 size1new = math.floor(size1new) size2new = math.floor(size2new) sizenew = (size1new, size2new) image = image.resize(sizenew) else: image.thumbnail(maxsize) return image DESC = "Sticker Management Module - Allows you to clone or add existing stickers" USG = "`.clone`\ \nUsage: Reply .kang to a sticker or an image to add it to your userbot pack.\ \n\n`.clone [emoji('s)]`\ \nUsage: Works just like .clone but uses the emoji you picked.\ \n\n`.clone [number]`\ \nUsage: Add's the sticker/image to the specified pack but uses 🤔 as emoji.\ \n\n`.clone [emoji('s)] [number]`\ \nUsage: Add's the sticker/image to the specified pack and uses the emoji('s) you picked." MODULE_DESC.update({basename(__file__)[:-3]: DESC}) MODULE_DICT.update({basename(__file__)[:-3]: USG}) MODULE_INFO.update({ basename(__file__)[:-3]: module_info(name='Sticker Manager', version='1.0.0-debug') })
text += f"{msgRep.RESULT}: {is_banned}\n" if offenses: text += f"{msgRep.OFFENSES}: `{offenses}`\n" if time_banned: text += f"{msgRep.BANNED_SINCE}: `{time_banned.strftime('%b %d, %Y')} - {time_banned.time()} {time_banned.tzname()}`" except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) return except Exception as e: log.warning(e) await event.edit(msgRep.CAS_CHECK_FAIL) return try: if cas_count > 35: # limit list up to 35 users await casSendAsFile(event, text) else: await event.edit(text) except MessageTooLongError: await casSendAsFile(event, text) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.CAS_INTERFACE_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.CAS_INTERFACE_USAGE}) MODULE_INFO.update({ basename(__file__)[:-3]: module_info(name="CAS Interface", version=VERSION) })
@ehandler.on(pattern=r"^\.rand(?: |$)(.*)", outgoing=True) async def randomizer(msg): limit1 = 0 limit2 = 0 arguments = msg.text.split(" ") if len(arguments) != 3: await msg.edit(msgRep.RAND_INVLD_ARGS) return try: limit1 = int(arguments[1]) except ValueError: await msg.edit(msgRep.FRST_LIMIT_INVALID) return try: limit2 = int(arguments[2]) except ValueError: await msg.edit(msgRep.SCND_LIMIT_INVALID) return if limit1 > limit2: temp = limit1 limit1 = limit2 limit2 = temp rand_num = random.randint(limit1, limit2) await msg.edit(msgRep.RAND_NUM_GEN.format(limit1, limit2, rand_num)) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.MISC_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.MISC_USAGE}) MODULE_INFO.update({basename(__file__)[:-3]: module_info(name="Miscellaneous", version=VERSION)})
caption += f"- {msgRep.ROOT_RIGHTS} {root_rights}\n\n" else: caption += f"- {msgRep.SEND_MESSAGES} {send_messages}\n" caption += f"- {msgRep.SEND_MEDIA} {send_media}\n" caption += f"- {msgRep.SEND_GIFS_STICKERS} {send_stickers_gifs}\n" caption += f"- {msgRep.SEND_POLLS} {send_polls}\n" caption += f"- {msgRep.EMBED_LINKS} {embed_links}\n" caption += f"- {msgRep.INVITE_USERS} {invite_users}\n" caption += f"- {msgRep.PIN_MESSAGES} {pin_messages}\n" caption += f"- {msgRep.CHANGE_GROUP_INFO} {change_info}\n\n" if not am_i_admeme and not member_is_self: caption += f"{warning} <i>{msgRep.WARN_ADMIN_PRIV}</i>\n\n" if is_admin and promoted_by is not None: caption += f"{msgRep.PROMOTED_BY}: {promoted_by}\n" if added_by is not None: caption += f"{msgRep.ADDED_BY}: {added_by}\n" if (not banned and not not_member) and join_date is not None: caption += f"{msgRep.JOIN_DATE}: <code>{join_date.strftime('%b %d, %Y')} - {join_date.time()} {join_date.tzinfo}</code>\n" await event.edit(caption, parse_mode="html") return MODULE_DESC.update({basename(__file__)[:-3]: descRep.MEMBERINFO_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.MEMBERINFO_USAGE}) MODULE_INFO.update({ basename(__file__)[:-3]: module_info(name="Member Info", version=VERSION) })
except Exception as e: log.error(e, exc_info=True) await event.edit(f"`{msgRep.BASH_SEND_FILE_FAILED}`") remove(temp_file) return @ehandler.on(pattern=r"^\.shell(?: |$)(.*)", outgoing=True) async def bash(command): full_cmd_str = command.pattern_match.group(1) commandArray = command.text.split(" ") del (commandArray[0]) cmd_output = shell_runner(commandArray) if cmd_output is None: cmd_output = msgRep.BASH_ERROR output = "$ " + full_cmd_str + "\n\n" + cmd_output try: await command.edit("`" + output + "`") except MessageTooLongError: log.info( "Shell output is too large. Trying to upload output as a file...") await outputAsFile(command, output) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.TERMINAL_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.TERMINAL_USAGE}) MODULE_INFO.update( {basename(__file__)[:-3]: module_info(name="Terminal", version=VERSION)})
msg = await event.get_reply_message() file = msg.file if not file.name.endswith(".py"): await event.edit(msgRep.NOT_PY_FILE) return dest_path = USER_MODULES_DIR + file.name await event.edit(msgRep.DLOADING) if os.path.isfile(dest_path) and OVR_WRT_CAUT: log.info(f"Module '{file.name[:-3]}' installed already") await event.edit(msgRep.MODULE_EXISTS.format(file.name)) return await event.client.download_media(message=msg, file=dest_path) log.info(f"Module '{file.name[:-3]}' has been installed to userpace") await event.edit(msgRep.SUCCESS.format(file.name)) if getConfig("LOGGING"): await event_log(event, "SIDELOAD", custom_text=msgRep.LOG.format(file.name)) log.info("Rebooting userbot...") time.sleep(1) args = [EXECUTABLE, "-m", "userbot"] await event.edit(msgRep.RBT_CPLT) os.execle(sys.executable, *args, os.environ) await event.client.disconnect() return else: await event.edit(msgRep.INVALID_FILE) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.SIDELOADER_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.SIDELOADER_USAGE}) MODULE_INFO.update({basename(__file__)[:-3]: module_info(name="Sideloader", version=VERSION)})
deleted_accounts, rem_del_accounts = (0,)*2 await event.edit(msgRep.TRY_DEL_ACCOUNTS) async for member in event.client.iter_participants(chat.id): if member.deleted: deleted_accounts += 1 if chat.creator or (chat.admin_rights and chat.admin_rights.ban_users): try: await event.client.kick_participant(chat.id, member.id) await sleep(0.2) rem_del_accounts += 1 except: pass if deleted_accounts > 0 and not rem_del_accounts: await event.edit(msgRep.DEL_ACCS_COUNT.format(deleted_accounts)) elif rem_del_accounts > 0 and rem_del_accounts <= deleted_accounts: await event.edit(msgRep.REM_DEL_ACCS_COUNT.format(rem_del_accounts, deleted_accounts)) if LOGGING: await event_log(event, "DELACCS", chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=chat.id) else: await event.edit(msgRep.NO_DEL_ACCOUNTS) return MODULE_DESC.update({basename(__file__)[:-3]: descRep.ADMIN_DESC}) MODULE_DICT.update({basename(__file__)[:-3]: usageRep.ADMIN_USAGE}) MODULE_INFO.update({basename(__file__)[:-3]: module_info(name="Admininstration", version=VERSION)})