Пример #1
0
async def sideload(event):
    if not getConfig("ALLOW_SIDELOAD"):
        return
    OVR_WRT_CAUT = True
    cmd_args = event.pattern_match.group(1).split(" ", 1)
    if cmd_args[0].lower() == "force":
        OVR_WRT_CAUT = False
    if event.reply_to_msg_id:
        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 = os.path.join(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)
        await event.edit(msgRep.RBT_CPLT)
        setConfig("REBOOT", True)
        await event.client.disconnect()
    else:
        await event.edit(msgRep.INVALID_FILE)
    return
Пример #2
0
def check_reboot():
    perf_reboot = getConfig("REBOOT", False)
    start_recovery = getConfig("START_RECOVERY", False)
    try:
        if perf_reboot or start_recovery:
            py_exec = (executable
                       if " " not in executable else '"' + executable + '"')
            if perf_reboot:  # preferred if True
                if getConfig("REBOOT_SAFEMODE"):
                    log.info("Rebooting into safe mode...")
                    tcmd = [py_exec, "-m", "userbot", "-safemode"]
                else:
                    log.info("Performing normal reboot...")
                    tcmd = [py_exec, "-m", "userbot"]
            elif start_recovery:
                commit_id = getConfig("UPDATE_COMMIT_ID")
                if commit_id:
                    log.info("Starting auto update in recovery...")
                    tcmd = [py_exec, "recovery.py", "-autoupdate", commit_id]
                else:
                    log.info("Rebooting into recovery...")
                    tcmd = [py_exec, "recovery.py"]
            shutdown_logging()
            execle(py_exec, *tcmd, environ)
    except KeyboardInterrupt:
        raise KeyboardInterrupt
    except (BaseException, Exception) as e:
        if start_recovery:
            log.critical(f"Failed to reboot HyperUBot into recovery: {e}",
                         exc_info=True)
        else:
            log.critical(f"Failed to reboot HyperUBot: {e}",
                         exc_info=True)
    return
Пример #3
0
async def kickme(leave):
    await leave.edit(msgRep.LEAVING)
    await leave.client.kick_participant(leave.chat_id, 'me')
    if getConfig("LOGGING"):
        await event_log(leave, "KICKME", chat_title=leave.chat.title,
                        chat_id=leave.chat.id)
    return
Пример #4
0
async def outputAsFile(event, output_text) -> bool:
    temp_file = path.join(getConfig("TEMP_DL_DIR"), "shell_output.txt")
    try:
        with open(temp_file, "w") as output_file:
            output_file.write(output_text)
        output_file.close()
    except IOError as io:
        log.warning(io, exc_info=True)
        await event.edit(f"`{msgRep.BASH_CRT_FILE_FAILED_RO}`")
        return
    except Exception as e:
        log.error(e, exc_info=True)
        await event.edit(f"`{msgRep.BASH_CRT_FILE_FAILED}`")
        return

    try:
        await event.client.send_file(event.chat_id, temp_file)
        await event.delete()  # delete message (not output file)
    except ChatSendMediaForbiddenError:
        log.warning(
            f"[Shell] Send media is not allowed in chat '{event.chat_id}'")
        await event.edit(f"`{msgRep.BASH_SEND_FILE_MTLO}`")
    except Exception as e:
        log.error(e, exc_info=True)
        await event.edit(f"`{msgRep.BASH_SEND_FILE_FAILED}`")

    remove(temp_file)
    return
Пример #5
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
Пример #6
0
async def req(event):
    reqs = event.pattern_match.group(1).split()
    message = f"Installing {len(reqs)} package(s):\n"
    success = 0
    for r in reqs:
        message = message + f"{EMOJI_INSTALLING} {r}\n"
        await event.edit(message)
        try:
            bout = subprocess.check_output(PIP_COMMAND.format(r).split())
            output = bout.decode('ascii')
            if f"Requirement already satisfied: {r}" in output:
                message = message.replace(f"{EMOJI_INSTALLING} {r}",f"{EMOJI_FAILURE} {r} "\
                                           "(package already installed)")
            else:
                message = message.replace(f"{EMOJI_INSTALLING} {r}",
                                          f"{EMOJI_SUCCESS} {r}")
                success = success + 1
        except subprocess.CalledProcessError:
            message = message.replace(f"{EMOJI_INSTALLING} {r}",
                                      f"{EMOJI_FAILURE} {r}")
        await event.edit(message.rstrip())
    message = message.replace("Installing ", f"Installed {success}/")
    if getConfig("LOGGING"):
        await event_log(event, "REQUIREMENT INSTALLER", custom_text="{} of {} python "\
                        "packages queued were installed successfully!".format(success, len(reqs)))
    await event.edit(message.rstrip())
    return
Пример #7
0
def list_updater():
    global MODULE_LIST
    MODULE_LIST = []
    assets = git.getAssets(git.getReleaseData(git.getData(UNIVERSE_URL), 0))
    for asset in assets:
        assetName = git.getReleaseFileName(asset)
        assetURL = git.getReleaseFileURL(asset)
        assetSize = git.getSize(asset)
        MODULE_LIST.append({
            "repo": UNIVERSE_NAME,
            "name": assetName,
            "url": assetURL,
            "size": assetSize
        })
    for repoURL in getConfig("COMMUNITY_REPOS", []):
        repoName = git.getReleaseTag(
            git.getReleaseData(git.getData(repoURL), 0))
        if repoName not in REPOS_NAMES:
            REPOS_NAMES.append(repoName)
        assets = git.getAssets(git.getReleaseData(git.getData(repoURL), 0))
        for asset in assets:
            assetName = git.getReleaseFileName(asset)
            assetURL = git.getReleaseFileURL(asset)
            assetSize = git.getSize(asset)
            if assetName in MODULE_LIST:
                MODULE_LIST.remove(MODULE_LIST["name"] == assetName)
            MODULE_LIST.append({
                "repo": repoName,
                "name": assetName,
                "url": assetURL,
                "size": assetSize
            })
    return MODULE_LIST
Пример #8
0
async def event_log(event,
                    event_name: str,
                    user_name=None,
                    user_id=None,
                    username=None,
                    chat_title=None,
                    chat_link=None,
                    chat_id=None,
                    custom_text=None):
    """
    Log any event by sending a message to the targeted chat

    Args:
        event (Event): any event e.g. NewMessage
        event_name (str): name of event (not Telethon event) e.g. ban
        user_name: name of user. Default to None
        user_id: ID from user. Default to None
        username: username from user. Default to None
        chat_title: Title of the specific chat. Default to None
        chat_link: link of the specific chat e.g. @example. Default to None
        chat_id: link of the specific chat e.g. -100123456789. Default to None
        custom_text: any custom text e.g. a note to the event. Default to None

    Example:
        @ehandler.on(command="example", outgoing=True)
        async def example_handler(event):
            user = fetch_user(event)
            await event_log(event, "BAN", user_name=user.first_name, chat_id=event.chat_id)
    """
    log_chat_id = getConfig("LOGGING_CHATID")

    if not log_chat_id:
        log.warning(
            f"EVENT_LOG logging event '{event_name}' failed: LOGGING_CHATID is not set"
        )
        return

    text = f"**{event_name}**\n"
    if user_name and user_id and not username:
        text += f"{msgsLang.LOG_USER}: [{user_name}](tg://user?id={user_id})\n"
    elif user_name:
        text += f"{msgsLang.LOG_USER}: {user_name}\n"
    if username:
        text += f"{msgsLang.LOG_USERNAME}: @{username}\n"
    if user_id:
        text += f"{msgsLang.LOG_USER_ID}: `{user_id}`\n"
    if chat_title:
        text += f"{msgsLang.LOG_CHAT_TITLE}: {chat_title}\n"
    if chat_link:
        text += f"{msgsLang.LOG_CHAT_LINK}: @{chat_link}\n"
    if chat_id:
        text += f"{msgsLang.LOG_CHAT_ID}: `{chat_id}`\n"
    if custom_text:
        text += f"{custom_text}"

    try:
        await event.client.send_message(log_chat_id, text)
    except Exception as e:
        log.warning(f"EVENT_LOG ({event_name}): {e}")
    return
Пример #9
0
async def storage(event):
    def list_dirs(source) -> list:
        listed_dirs = []
        for name in listdir(source):
            srcname = join(source, name)
            listed_dirs.append(srcname)
            if isdir(srcname):
                for elem in list_dirs(srcname):
                    listed_dirs.append(elem)
        return listed_dirs

    def getSizeFromPath(path) -> int:
        listed_paths = list_dirs(path)
        size = getsize(path)
        for name in listed_paths:
            size += getsize(name)
        return size

    ubot_size = getSizeFromPath(".")
    sys_size = getSizeFromPath(join(".", "userbot", "modules"))
    user_size = getSizeFromPath(join(".", "userbot", "modules_user"))
    userdata_size = getSizeFromPath(getConfig("USERDATA"))
    try:
        tmpdl_size = getSizeFromPath(getConfig("TEMP_DL_DIR"))
    except Exception:
        tmpdl_size = 0

    hdd = disk_usage("./")
    result = f"**{msgRep.STORAGE}**\n\n"
    result += f"__{msgRep.GENERAL}__\n"
    result += f"`{msgRep.STORAGE_TOTAL}: {sizeStrMaker(hdd.total)}`\n"
    result += f"`{msgRep.STORAGE_USED}: {sizeStrMaker(hdd.used)}`\n"
    result += f"`{msgRep.STORAGE_FREE}: {sizeStrMaker(hdd.free)}`\n\n"
    result += f"__{msgRep.USED_BY_HYPERUBOT}__\n"
    result += f"`{msgRep.STORAGE_TOTAL}: {sizeStrMaker(ubot_size)}`\n"
    result += f"`{msgRep.STORAGE_SYSTEM}: {sizeStrMaker(sys_size)}`\n"
    result += f"`{msgRep.STORAGE_USER}: {sizeStrMaker(user_size)}`\n"
    result += f"`{msgRep.STORAGE_USERDATA}: {sizeStrMaker(userdata_size)}`\n"
    result += f"`{msgRep.STORAGE_TEMP_DL}: {sizeStrMaker(tmpdl_size)}`\n\n"
    result += (f"`{msgRep.STORAGE_HDD} "
               f"{textProgressBar(22, hdd.total, hdd.used)}`")
    await event.edit(result)
    return
Пример #10
0
def update_currency_data():
    if exists(CC_CSV_PATH):
        file_date = datetime.fromtimestamp(getmtime(CC_CSV_PATH))
        duration = datetime.today() - file_date
        if not duration.days >= 1:  # don't update if file is not a day old
            return

    userdata_dir = getConfig("USERDATA")
    if not userdata_dir:
        log.warning("Userdata directory not available")
        return
    try:
        zipfile = join(userdata_dir, "currency.zip")
        # get latest data from the European Central Bank
        z = urlopen("https://www.ecb.int/stats/eurofxref/eurofxref-hist.zip",
                    cafile=ca_where(),
                    capath=dirname(ca_where()))
        with open(zipfile, "wb") as cur_zip:
            cur_zip.write(z.read())
        cur_zip.close()
    except Exception as e:
        log.warning(f"Unable to download updated data history: {e}")
        return

    try:
        csv_filename = None
        with ZipFile(zipfile, "r") as zipObject:
            contents = zipObject.namelist()
            for filename in contents:
                if filename.endswith(".csv"):
                    csv_filename = filename
                    zipObject.extract(filename, userdata_dir)
                    break
            zipObject.close()
        try:
            if exists(CC_CSV_PATH):
                remove(CC_CSV_PATH)
        except Exception as e:
            log.warning(f"Unable to delete old csv file: {e}")
            return
        try:
            rename(join(userdata_dir, csv_filename), CC_CSV_PATH)
            log.info("[CURRENCY] data history successfully updated")
        except Exception as e:
            log.warning(f"Unable to rename csv file: {e}")
    except BadZipFile as bze:
        log.warning(f"Bad zip archive: {bze}")
    except Exception as e:
        log.warning(f"Failed to extract data history: {e}")

    try:
        remove(zipfile)
    except Exception as e:
        log.warning(f"Couldn't remove zip file: {e}")
    return
Пример #11
0
async def restart(power_off):  # Totally not a shutdown kang *sips whiskey*
    cmd_args = power_off.pattern_match.group(1).split(" ", 1)
    if cmd_args[0] == "safemode":
        setConfig("REBOOT_SAFEMODE", True)
    setConfig("REBOOT", True)
    await power_off.edit(msgRep.RESTART)
    time.sleep(1)  # just so we can actually see a message
    if getConfig("LOGGING"):
        await event_log(power_off, "RESTART", custom_text=msgRep.RESTART_LOG)
    await power_off.edit(msgRep.RESTARTED)
    await power_off.client.disconnect()
Пример #12
0
async def kickme(leave):
    if not isinstance(leave.message.peer_id, (PeerChannel, PeerChat)):
        await leave.edit(msgRep.CANNOT_LEAVE)
        return
    await leave.edit(msgRep.LEAVING)
    await leave.client.kick_participant(leave.chat_id, 'me')
    if getConfig("LOGGING"):
        await event_log(leave,
                        "KICKME",
                        chat_title=leave.chat.title,
                        chat_id=leave.chat_id)
    return
Пример #13
0
async def restart(power_off):  # Totally not a shutdown kang *sips whiskey*
    if isWindows():
        await power_off.edit(msgRep.RESTART_UNSUPPORTED)
        return
    cmd_args = power_off.pattern_match.group(1).split(" ", 1)
    if cmd_args[0] == "safemode":
        setConfig("REBOOT_SAFEMODE", True)
    setConfig("REBOOT", True)
    await power_off.edit(msgRep.RESTART)
    if getConfig("LOGGING"):
        await event_log(power_off, "RESTART", custom_text=msgRep.RESTART_LOG)
    _setprop("reboot", True)
    _setprop("rebootchatid", power_off.chat_id)
    _setprop("rebootmsgid", power_off.message.id)
    _setprop("rebootmsg", msgRep.RESTARTED)
    await power_off.client.disconnect()
    return
Пример #14
0
async def casSendAsFile(event, input_text: str):
    await event.edit(msgRep.TOO_MANY_CAS)
    try:
        filename, success = createCASFile(
            input_text, path.join(getConfig("TEMP_DL_DIR"), "caslist.txt"))
        if success:
            await event.client.send_file(event.chat_id, filename)
        else:
            await event.edit(msgRep.FAIL_UPLOAD_LIST)
    except ChatSendMediaForbiddenError:
        await event.edit(msgRep.SEND_MEDIA_FORBIDDEN)
    except Exception as e:
        log.warning(e)
        await event.edit(msgRep.FAIL_UPLOAD_LIST)
    if success:
        remove(filename)
    return
Пример #15
0
from googletrans import Translator, LANGUAGES
from gtts import gTTS
from gtts.tts import gTTSError
from logging import getLogger
from pydub import AudioSegment
from os import remove, rename
from os.path import exists, getmtime, join, dirname
from speech_recognition import (AudioFile, Recognizer, UnknownValueError,
                                RequestError)
from urllib.request import urlopen
from zipfile import BadZipFile, ZipFile
from certifi import where as ca_where

log = getLogger(__name__)
ehandler = EventHandler(log)
TEMP_DL_DIR = getConfig("TEMP_DL_DIR")
CC_CSV_PATH = join(getConfig("USERDATA"), "currency.csv")
DEST_LANG = getBotLangCode()


def build_supported_langs():
    ret_val = ""
    for i in LANGUAGES:
        ret_val += "`{}`: {}\n".format(i, LANGUAGES[i])
    return ret_val


@ehandler.on(command="scrlang", outgoing=True)
async def lang_check(event):
    await event.edit(msgRep.SCRLANG.format(LANGUAGES[DEST_LANG]))
    return
Пример #16
0
 def __init__(self):
     self.__imported_module = None
     self.__load_modules_count = 0
     self.__not_load_modules = getConfig("NOT_LOAD_MODULES", [])
Пример #17
0
    len_before = len(environ.items())
    load_dotenv(path.join(".", "userbot", "config.env"))
    loaded_env = {
        key: value
        for key, value in list(environ.items())[len_before:]
    }
    if not SAFEMODE:
        for key, value in loaded_env.items():
            if not key in ("API_KEY", "API_HASH", "STRING_SESSION"):
                if value.startswith("[") and value.endswith("]"):
                    addConfig(key, strlist_to_list(value))
                elif value in ("True", "true", "False", "false"):
                    addConfig(key, str_to_bool(value))
                else:  # default case
                    addConfig(key, int(value) if value.isnumeric() else value)
    if getConfig("SAMPLE_CONFIG", None):
        log.error("Please remove SAMPLE_CONFIG from config.env!")
        quit(1)
    API_KEY = environ.get("API_KEY", None)
    API_HASH = environ.get("API_HASH", None)
    STRING_SESSION = environ.get("STRING_SESSION", None)
    if SAFEMODE:
        addConfig("UBOT_LANG", loaded_env.get("UBOT_LANG", "en"))
    environ["API_KEY"] = "0"
    environ["API_HASH"] = "None"
    environ["STRING_SESSION"] = "None"
    del loaded_env
elif path.exists(path.join(".", "userbot", "config.py")):
    try:
        import userbot.config
        if not SAFEMODE:
Пример #18
0
                                                ModuleUsages as usageRep)
from userbot.sysutils.configuration import getConfig
from userbot.sysutils.event_handler import EventHandler
from userbot.sysutils.registration import (register_cmd_usage,
                                           register_module_desc,
                                           register_module_info)
from userbot.version import VERSION
from telethon.errors import (ChatAdminRequiredError, InputUserDeactivatedError,
                             SearchQueryEmptyError)
from telethon.tl.functions.messages import SearchRequest
from telethon.tl.types import InputMessagesFilterEmpty, User
from logging import getLogger

log = getLogger(__name__)
ehandler = EventHandler(log)
LOGGING = getConfig("LOGGING")


@ehandler.on(command="msgs", hasArgs=True, outgoing=True)
async def countmessages(event):
    user, chat = await fetch_user(event, get_chat=True)

    if not user:
        return

    if not chat:
        await event.edit(msgRep.FAIL_CHAT)
        return

    remote = isRemoteCMD(event, chat.id)
Пример #19
0
            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:
        # reboot reasons
        perf_reboot = getConfig("REBOOT", False)
        start_recovery = getConfig("START_RECOVERY", False)
        if perf_reboot or start_recovery:
            PY_EXEC = executable if not " " in executable else '"' + executable + '"'
            if perf_reboot:  # preferred if True
                if getConfig("REBOOT_SAFEMODE"):
                    log.info("Rebooting into safe mode...")
                    tcmd = [PY_EXEC, "-m", "userbot", "-safemode"]
                else:
                    log.info("Performing normal reboot...")
                    tcmd = [PY_EXEC, "-m", "userbot"]
            elif start_recovery:
                commit_id = getConfig("UPDATE_COMMIT_ID")
                if commit_id:
                    log.info("Starting auto update in recovery...")
                    tcmd = [PY_EXEC, "recovery.py", "-autoupdate", commit_id]
Пример #20
0
async def shutdown(power_off):
    await power_off.edit(msgRep.SHUTDOWN)
    if getConfig("LOGGING"):
        await event_log(power_off, "SHUTDOWN", custom_text=msgRep.SHUTDOWN_LOG)
    await power_off.client.disconnect()
Пример #21
0
    _moduleloader._unimport_module(module)
    return


sys.modules[__name__] = _protectedAccess(
    sys.modules[__name__],
    attrs=[
        "_tgclient",
        "_moduleloader",
        "_ModuleLoader",
        "start_language_processor",
        "import_module",
        "unimport_module",
        "update_all_modules",
        "update_built_in_modules",
        "update_load_modules",
        "update_user_modules",
        "update_handlers",
        "unregister_module_desc",
        "unregister_module_info",
        "getHandlers",
        "unregister_cmd",
    ],
    allowed=((os.path.join("userbot", "modules", "_package_manager.py"),
              os.path.join("userbot", "modules", "sideloader.py"))
             if getConfig("SIDELOAD_NO_REBOOT", False) else os.path.join(
                 "userbot", "modules", "_package_manager.py")),
    warn_msg=("Unauthorized access to protected attribute blocked "
              "(requested by {1}:{2})"),
    mlogger=log)
Пример #22
0
from os.path import basename
from os.path import join as pathjoin
import os
from userbot.config import PlusConfig as pc
from userbot.sysutils.registration import register_cmd_usage, register_module_desc, register_module_info
from userbot.sysutils.event_handler import EventHandler
from userbot.sysutils.configuration import getConfig
from userbot import getConfig
from telethon.tl.functions.channels import EditBannedRequest
from telethon.tl.types import ChatBannedRights
from datetime import datetime, timedelta
from telethon.errors import UserAdminInvalidError

ehandler = EventHandler()
VERSION = "2022.1.2"
TEMP_DL_DIR = getConfig("TEMP_DL_DIR")

if getConfig("USERDATA") == None:
    raise Exception("disease requires a user data folder. Please set USERDATA in your config.")

FILES = pathjoin(getConfig("USERDATA"),"plus")

if not os.path.isdir(FILES):
    os.makedirs(FILES)

def progress(current, total):
    print("Downloaded {} of {}\nCompleted {}".format(current, total, (current / total) * 100))

@ehandler.on(command="infect", hasArgs=True, outgoing=True)
async def infect(event):
	if not event.text[0].isalpha() and event.text[0] in ("."):
Пример #23
0
    _len_before = len(environ.items())
    load_dotenv(path.join(".", "userbot", "config.env"))
    loaded_env = {
        key: value
        for key, value in list(environ.items())[_len_before:]
    }
    if not SAFEMODE:
        for key, value in loaded_env.items():
            if key not in ("API_KEY", "API_HASH", "STRING_SESSION"):
                if value.startswith("[") and value.endswith("]"):
                    addConfig(key, strlist_to_list(value))
                elif value in ("True", "true", "False", "false"):
                    addConfig(key, str_to_bool(value))
                else:  # default case
                    addConfig(key, int(value) if value.isnumeric() else value)
    if getConfig("SAMPLE_CONFIG", None):
        log.error("Please remove SAMPLE_CONFIG from config.env!")
        quit(1)
    if SAFEMODE:
        addConfig("UBOT_LANG", loaded_env.get("UBOT_LANG", "en"))
    environ["API_KEY"] = "0"
    environ["API_HASH"] = "None"
    environ["STRING_SESSION"] = "None"
    del loaded_env
elif path.exists(path.join(".", "userbot", "config.py")):
    _cfg_loadable = False
    try:
        import userbot.config as cfg
        _cfg_loadable = True
    except (IndentationError, NameError, TypeError, ValueError,
            SyntaxError):  # totally F
Пример #24
0
            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)
        await event.edit(msgRep.RBT_CPLT)
        setConfig("REBOOT", True)
        await event.client.disconnect()
    else:
        await event.edit(msgRep.INVALID_FILE)
    return


if getConfig("ALLOW_SIDELOAD"):
    register_cmd_usage(
        "sideload",
        usageRep.SIDELOADER_USAGE.get("sideload", {}).get("args"),
        usageRep.SIDELOADER_USAGE.get("sideload", {}).get("usage"))
else:
    register_cmd_usage("sideload", None, None)

register_module_desc(descRep.SIDELOADER_DESC)
register_module_info(name="Sideloader",
                     authors="nunopenim, prototype74",
                     version=VERSION)
Пример #25
0
 def __init__(self):
     """
     Initialize the module loader
     """
     self.__not_load_modules = getConfig("NOT_LOAD_MODULES", [])
Пример #26
0
async def speedtest(event):
    arg_from_event = event.pattern_match.group(1)
    chat = await event.get_chat()
    share_as_pic = True if arg_from_event.lower() == "pic" else False
    if share_as_pic:
        # if speedtest is send to a group and send media is not allowed then skip 'pic' argument
        if hasattr(chat, "default_banned_rights") and not chat.creator and not chat.admin_rights and \
           chat.default_banned_rights.send_media:
            share_as_pic = False  # disable
    process = None
    all_test_passed = False
    check_mark = u"\u2705"
    warning = u"\u26A0"
    try:
        process = f"**Speedtest by Ookla**\n\n- {msgRep.SPD_TEST_SELECT_SERVER}..."
        await event.edit(process)
        s = Speedtest()
        s.get_best_server()
        process = f"**Speedtest by Ookla**\n\n- {msgRep.SPD_TEST_SELECT_SERVER} {check_mark}\n" \
                  f"- {msgRep.SPD_TEST_DOWNLOAD}..."
        await event.edit(process)
        s.download()
        process = f"**Speedtest by Ookla**\n\n- {msgRep.SPD_TEST_SELECT_SERVER} {check_mark}\n" \
                  f"- {msgRep.SPD_TEST_DOWNLOAD} {check_mark}\n- {msgRep.SPD_TEST_UPLOAD}..."
        await event.edit(process)
        s.upload()
        process = f"**Speedtest by Ookla**\n\n- {msgRep.SPD_TEST_SELECT_SERVER} {check_mark}\n" \
                  f"- {msgRep.SPD_TEST_DOWNLOAD} {check_mark}\n- {msgRep.SPD_TEST_UPLOAD} {check_mark}"
        all_test_passed = True
        if share_as_pic:
            s.results.share()
        result = s.results.dict()
        if not result:
            await event.edit(process + "\n\n" +
                             f"`{msgRep.SPD_FAILED}: {msgRep.SPD_NO_RESULT}`")
            return
    except MemoryError as me:
        log.error(me)
        if not all_test_passed:
            process = process[:-3] + f" {warning}"
            await event.edit(process + "\n\n" +
                             f"`{msgRep.SPD_FAILED}: {msgRep.SPD_NO_MEMORY}`")
        else:
            await event.edit(process + "\n\n" +
                             f"`{msgRep.SPD_FAILED}: {msgRep.SPD_NO_MEMORY}`")
        return
    except Exception as e:
        log.error(e)
        if not all_test_passed:
            process = process[:-3] + f" {warning}"
            await event.edit(process + "\n\n" + msgRep.SPD_FAILED)
        else:
            await event.edit(process + "\n\n" + msgRep.SPD_FAILED)
        return

    if share_as_pic:
        try:
            await event.edit(process + "\n\n" + f"{msgRep.SPD_PROCESSING}...")
            png_file = getConfig("TEMP_DL_DIR") + "speedtest.png"
            urlretrieve(result["share"], png_file)
            await event.client.send_file(chat.id, png_file)
            await event.delete()
            remove(png_file)
        except Exception as e:
            log.error(e)
            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
Пример #27
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
Пример #28
0
async def updater(upd):
    global RAN
    global FOUND_UPD
    args = upd.pattern_match.group(1)
    if args.lower() == "upgrade":
        if not RAN:
            await upd.edit(msgRep.UPDATES_NOT_RAN)
            return
        if not FOUND_UPD:
            await upd.edit(msgRep.NO_UPDATES)
            return
        try:
            await upd.edit(msgRep.UPDATING)
            gitpull = check_output("git pull", shell=True).decode()
            log.info(gitpull)
            pip = check_output(EXECUTABLE +
                               " -m pip install -r requirements.txt",
                               shell=True).decode()
            log.info(pip)
        except CalledProcessError:
            await upd.edit(msgRep.UPD_ERROR)
            return
        await upd.edit(msgRep.UPD_SUCCESS)
        time.sleep(1)
        if getConfig("LOGGING"):
            await event_log(upd, "UPDATE", custom_text=msgRep.UPD_LOG)
        await upd.edit(msgRep.RBT_COMPLETE)
        args = [EXECUTABLE, "-m", "userbot"]
        os.execle(sys.executable, *args, os.environ)
        await upd.client.disconnect()
        return
    else:
        repo = Repo()
        branch = repo.active_branch.name
        if not (branch in ['master', 'staging']):
            await upd.edit(msgRep.UNKWN_BRANCH)
            return
        try:
            repo.create_remote('upstream', BOT_REPO_URL)
        except BaseException:
            pass
        repo.remote('upstream').fetch(branch)
        changelog = ''
        counter = 1
        for commit in repo.iter_commits("HEAD..upstream/" + branch):
            changelog += "{}. [{}] > `{}`\n".format(counter, commit.author,
                                                    commit.summary)
            counter += 1
        if not changelog:
            await upd.edit(msgRep.LATS_VERSION.format(PROJECT))
            RAN = True
            return
        if changelog:
            try:
                retText = msgRep.UPD_AVAIL
                retText += changelog
                retText += msgRep.RUN_UPD
                await upd.edit(retText)
            except MessageTooLongError:
                retText = msgRep.CHLG_TOO_LONG
                await upd.edit(retText)
            RAN = True
            FOUND_UPD = True
            return
Пример #29
0
from userbot.include.aux_funcs import module_info
from userbot.include.language_processor import CasIntText as msgRep, ModuleDescriptions as descRep, ModuleUsages as usageRep
from userbot.sysutils.configuration import getConfig
from userbot.sysutils.event_handler import EventHandler
from telethon.errors import ChatAdminRequiredError, MessageTooLongError, ChatSendMediaForbiddenError
from telethon.tl.types import User, Chat, Channel, PeerUser, PeerChannel
from datetime import datetime
from logging import getLogger
from os import remove
from os.path import basename, exists, getmtime
from requests import get, ConnectionError, Timeout
from time import sleep

log = getLogger(__name__)
ehandler = EventHandler(log)
CAS_CSV = getConfig("TEMP_DL_DIR") + "export.csv"
CAS_USER_IDS = []


def updateCASList() -> bool:
    global CAS_USER_IDS
    try:
        if CAS_USER_IDS:
            CAS_USER_IDS = []  # reset before appending again
        with open(CAS_CSV, "r") as data:
            for cas_id in data:
                try:
                    CAS_USER_IDS.append(int(cas_id))
                except:
                    pass
        data.close()
Пример #30
0
from currency_converter import CurrencyConverter
from googletrans import Translator, LANGUAGES
from gtts import gTTS
from gtts.tts import gTTSError
from logging import getLogger
from pydub import AudioSegment
from os import remove, rename
from os.path import exists, getmtime, join
from speech_recognition import (AudioFile, Recognizer, UnknownValueError,
                                RequestError)
from urllib.request import urlretrieve
from zipfile import BadZipFile, ZipFile

log = getLogger(__name__)
ehandler = EventHandler(log)
TEMP_DL_DIR = getConfig("TEMP_DL_DIR")
CC_CSV_PATH = join(TEMP_DL_DIR, "currency.csv")
DEST_LANG = getBotLangCode()


def build_supported_langs():
    ret_val = ""
    for i in LANGUAGES.keys():
        ret_val += "`{}`: {}\n".format(i, LANGUAGES[i])
    return ret_val


@ehandler.on(command="scrlang", outgoing=True)
async def lang_check(event):
    await event.edit(msgRep.SCRLANG.format(LANGUAGES[DEST_LANG]))
    return