Path: blob/master/bot/modules/users_settings.py
1619 views
from aiofiles.os import remove, path as aiopath, makedirs1from asyncio import sleep2from functools import partial3from html import escape4from io import BytesIO5from os import getcwd6from pyrogram.filters import create7from pyrogram.handlers import MessageHandler8from time import time9from re import findall1011from .. import (12user_data,13excluded_extensions,14auth_chats,15sudo_users,16included_extensions,17)18from ..core.config_manager import Config19from ..core.telegram_manager import TgClient20from ..helper.ext_utils.db_handler import database21from ..helper.ext_utils.media_utils import create_thumb22from ..helper.telegram_helper.button_build import ButtonMaker23from ..helper.ext_utils.help_messages import user_settings_text24from ..helper.ext_utils.bot_utils import (25update_user_ldata,26new_task,27get_size_bytes,28)29from ..helper.telegram_helper.message_utils import (30send_message,31edit_message,32send_file,33delete_message,34)3536handler_dict = {}3738leech_options = [39"THUMBNAIL",40"LEECH_SPLIT_SIZE",41"LEECH_DUMP_CHAT",42"LEECH_FILENAME_PREFIX",43"THUMBNAIL_LAYOUT",44]45rclone_options = ["RCLONE_CONFIG", "RCLONE_PATH", "RCLONE_FLAGS"]46gdrive_options = ["TOKEN_PICKLE", "GDRIVE_ID", "INDEX_URL"]474849async def get_user_settings(from_user, stype="main"):50user_id = from_user.id51name = from_user.mention52buttons = ButtonMaker()53rclone_conf = f"rclone/{user_id}.conf"54token_pickle = f"tokens/{user_id}.pickle"55user_dict = user_data.get(user_id, {})5657if stype == "leech":58thumbpath = f"thumbnails/{user_id}.jpg"59buttons.data_button("Thumbnail", f"userset {user_id} menu THUMBNAIL")60thumbmsg = "Exists" if await aiopath.exists(thumbpath) else "Not Exists"61buttons.data_button(62"Leech Split Size", f"userset {user_id} menu LEECH_SPLIT_SIZE"63)64if user_dict.get("LEECH_SPLIT_SIZE", False):65split_size = user_dict["LEECH_SPLIT_SIZE"]66else:67split_size = Config.LEECH_SPLIT_SIZE68buttons.data_button(69"Leech Destination", f"userset {user_id} menu LEECH_DUMP_CHAT"70)71if user_dict.get("LEECH_DUMP_CHAT", False):72leech_dest = user_dict["LEECH_DUMP_CHAT"]73elif "LEECH_DUMP_CHAT" not in user_dict and Config.LEECH_DUMP_CHAT:74leech_dest = Config.LEECH_DUMP_CHAT75else:76leech_dest = "None"77buttons.data_button(78"Leech Prefix", f"userset {user_id} menu LEECH_FILENAME_PREFIX"79)80if user_dict.get("LEECH_FILENAME_PREFIX", False):81lprefix = user_dict["LEECH_FILENAME_PREFIX"]82elif "LEECH_FILENAME_PREFIX" not in user_dict and Config.LEECH_FILENAME_PREFIX:83lprefix = Config.LEECH_FILENAME_PREFIX84else:85lprefix = "None"86if (87user_dict.get("AS_DOCUMENT", False)88or "AS_DOCUMENT" not in user_dict89and Config.AS_DOCUMENT90):91ltype = "DOCUMENT"92buttons.data_button("Send As Media", f"userset {user_id} tog AS_DOCUMENT f")93else:94ltype = "MEDIA"95buttons.data_button(96"Send As Document", f"userset {user_id} tog AS_DOCUMENT t"97)98if (99user_dict.get("EQUAL_SPLITS", False)100or "EQUAL_SPLITS" not in user_dict101and Config.EQUAL_SPLITS102):103buttons.data_button(104"Disable Equal Splits", f"userset {user_id} tog EQUAL_SPLITS f"105)106equal_splits = "Enabled"107else:108buttons.data_button(109"Enable Equal Splits", f"userset {user_id} tog EQUAL_SPLITS t"110)111equal_splits = "Disabled"112if (113user_dict.get("MEDIA_GROUP", False)114or "MEDIA_GROUP" not in user_dict115and Config.MEDIA_GROUP116):117buttons.data_button(118"Disable Media Group", f"userset {user_id} tog MEDIA_GROUP f"119)120media_group = "Enabled"121else:122buttons.data_button(123"Enable Media Group", f"userset {user_id} tog MEDIA_GROUP t"124)125media_group = "Disabled"126if (127TgClient.IS_PREMIUM_USER128and user_dict.get("USER_TRANSMISSION", False)129or "USER_TRANSMISSION" not in user_dict130and Config.USER_TRANSMISSION131):132buttons.data_button(133"Leech by Bot", f"userset {user_id} tog USER_TRANSMISSION f"134)135leech_method = "user"136elif TgClient.IS_PREMIUM_USER:137leech_method = "bot"138buttons.data_button(139"Leech by User", f"userset {user_id} tog USER_TRANSMISSION t"140)141else:142leech_method = "bot"143144if (145TgClient.IS_PREMIUM_USER146and user_dict.get("HYBRID_LEECH", False)147or "HYBRID_LEECH" not in user_dict148and Config.HYBRID_LEECH149):150hybrid_leech = "Enabled"151buttons.data_button(152"Disable Hybride Leech", f"userset {user_id} tog HYBRID_LEECH f"153)154elif TgClient.IS_PREMIUM_USER:155hybrid_leech = "Disabled"156buttons.data_button(157"Enable HYBRID Leech", f"userset {user_id} tog HYBRID_LEECH t"158)159else:160hybrid_leech = "Disabled"161162buttons.data_button(163"Thumbnail Layout", f"userset {user_id} menu THUMBNAIL_LAYOUT"164)165if user_dict.get("THUMBNAIL_LAYOUT", False):166thumb_layout = user_dict["THUMBNAIL_LAYOUT"]167elif "THUMBNAIL_LAYOUT" not in user_dict and Config.THUMBNAIL_LAYOUT:168thumb_layout = Config.THUMBNAIL_LAYOUT169else:170thumb_layout = "None"171172buttons.data_button("Back", f"userset {user_id} back")173buttons.data_button("Close", f"userset {user_id} close")174175text = f"""<u>Leech Settings for {name}</u>176Leech Type is <b>{ltype}</b>177Custom Thumbnail <b>{thumbmsg}</b>178Leech Split Size is <b>{split_size}</b>179Equal Splits is <b>{equal_splits}</b>180Media Group is <b>{media_group}</b>181Leech Prefix is <code>{escape(lprefix)}</code>182Leech Destination is <code>{leech_dest}</code>183Leech by <b>{leech_method}</b> session184HYBRID Leech is <b>{hybrid_leech}</b>185Thumbnail Layout is <b>{thumb_layout}</b>186"""187elif stype == "rclone":188buttons.data_button("Rclone Config", f"userset {user_id} menu RCLONE_CONFIG")189buttons.data_button(190"Default Rclone Path", f"userset {user_id} menu RCLONE_PATH"191)192buttons.data_button("Rclone Flags", f"userset {user_id} menu RCLONE_FLAGS")193buttons.data_button("Back", f"userset {user_id} back")194buttons.data_button("Close", f"userset {user_id} close")195rccmsg = "Exists" if await aiopath.exists(rclone_conf) else "Not Exists"196if user_dict.get("RCLONE_PATH", False):197rccpath = user_dict["RCLONE_PATH"]198elif Config.RCLONE_PATH:199rccpath = Config.RCLONE_PATH200else:201rccpath = "None"202if user_dict.get("RCLONE_FLAGS", False):203rcflags = user_dict["RCLONE_FLAGS"]204elif "RCLONE_FLAGS" not in user_dict and Config.RCLONE_FLAGS:205rcflags = Config.RCLONE_FLAGS206else:207rcflags = "None"208text = f"""<u>Rclone Settings for {name}</u>209Rclone Config <b>{rccmsg}</b>210Rclone Path is <code>{rccpath}</code>211Rclone Flags is <code>{rcflags}</code>"""212elif stype == "gdrive":213buttons.data_button("token.pickle", f"userset {user_id} menu TOKEN_PICKLE")214buttons.data_button("Default Gdrive ID", f"userset {user_id} menu GDRIVE_ID")215buttons.data_button("Index URL", f"userset {user_id} menu INDEX_URL")216if (217user_dict.get("STOP_DUPLICATE", False)218or "STOP_DUPLICATE" not in user_dict219and Config.STOP_DUPLICATE220):221buttons.data_button(222"Disable Stop Duplicate", f"userset {user_id} tog STOP_DUPLICATE f"223)224sd_msg = "Enabled"225else:226buttons.data_button(227"Enable Stop Duplicate", f"userset {user_id} tog STOP_DUPLICATE t"228)229sd_msg = "Disabled"230buttons.data_button("Back", f"userset {user_id} back")231buttons.data_button("Close", f"userset {user_id} close")232tokenmsg = "Exists" if await aiopath.exists(token_pickle) else "Not Exists"233if user_dict.get("GDRIVE_ID", False):234gdrive_id = user_dict["GDRIVE_ID"]235elif GDID := Config.GDRIVE_ID:236gdrive_id = GDID237else:238gdrive_id = "None"239index = user_dict["INDEX_URL"] if user_dict.get("INDEX_URL", False) else "None"240text = f"""<u>Gdrive API Settings for {name}</u>241Gdrive Token <b>{tokenmsg}</b>242Gdrive ID is <code>{gdrive_id}</code>243Index URL is <code>{index}</code>244Stop Duplicate is <b>{sd_msg}</b>"""245else:246buttons.data_button("Leech", f"userset {user_id} leech")247buttons.data_button("Rclone", f"userset {user_id} rclone")248buttons.data_button("Gdrive API", f"userset {user_id} gdrive")249250upload_paths = user_dict.get("UPLOAD_PATHS", {})251if not upload_paths and "UPLOAD_PATHS" not in user_dict and Config.UPLOAD_PATHS:252upload_paths = Config.UPLOAD_PATHS253if not upload_paths:254upload_paths = "None"255256buttons.data_button("Upload Paths", f"userset {user_id} menu UPLOAD_PATHS")257258if user_dict.get("DEFAULT_UPLOAD", ""):259default_upload = user_dict["DEFAULT_UPLOAD"]260elif "DEFAULT_UPLOAD" not in user_dict:261default_upload = Config.DEFAULT_UPLOAD262du = "Gdrive API" if default_upload == "gd" else "Rclone"263dur = "Gdrive API" if default_upload != "gd" else "Rclone"264buttons.data_button(265f"Upload using {dur}", f"userset {user_id} {default_upload}"266)267268user_tokens = user_dict.get("USER_TOKENS", False)269tr = "MY" if user_tokens else "OWNER"270trr = "OWNER" if user_tokens else "MY"271buttons.data_button(272f"Use {trr} token/config",273f"userset {user_id} tog USER_TOKENS {'f' if user_tokens else 't'}",274)275276buttons.data_button(277"Excluded Extensions", f"userset {user_id} menu EXCLUDED_EXTENSIONS"278)279if user_dict.get("EXCLUDED_EXTENSIONS", False):280ex_ex = user_dict["EXCLUDED_EXTENSIONS"]281elif "EXCLUDED_EXTENSIONS" not in user_dict:282ex_ex = excluded_extensions283else:284ex_ex = "None"285286buttons.data_button(287"Included Extensions", f"userset {user_id} menu INCLUDED_EXTENSIONS"288)289if user_dict.get("INCLUDED_EXTENSIONS", False):290inc_ex = user_dict["INCLUDED_EXTENSIONS"]291elif "INCLUDED_EXTENSIONS" not in user_dict:292inc_ex = included_extensions293else:294inc_ex = "None"295296if user_dict.get("NAME_SUBSTITUTE", False):297ns_msg = "Added"298elif "NAME_SUBSTITUTE" not in user_dict and Config.NAME_SUBSTITUTE:299ns_msg = "Added"300else:301ns_msg = "None"302buttons.data_button(303"Name Substitute", f"userset {user_id} menu NAME_SUBSTITUTE"304)305306buttons.data_button("YT-DLP Options", f"userset {user_id} menu YT_DLP_OPTIONS")307if user_dict.get("YT_DLP_OPTIONS", False):308ytopt = user_dict["YT_DLP_OPTIONS"]309elif "YT_DLP_OPTIONS" not in user_dict and Config.YT_DLP_OPTIONS:310ytopt = Config.YT_DLP_OPTIONS311else:312ytopt = "None"313314buttons.data_button("FFmpeg Cmds", f"userset {user_id} menu FFMPEG_CMDS")315if user_dict.get("FFMPEG_CMDS", False):316ffc = "Exists"317elif "FFMPEG_CMDS" not in user_dict and Config.FFMPEG_CMDS:318ffc = "Exists"319else:320ffc = "None"321322if user_dict:323buttons.data_button("Reset All", f"userset {user_id} reset all")324325buttons.data_button("Close", f"userset {user_id} close")326327text = f"""<u>Settings for {name}</u>328Default Package is <b>{du}</b>329Use <b>{tr}</b> token/config330Upload Paths is <code>{upload_paths}</code>331332Name substitution is <code>{ns_msg}</code>333334Excluded Extensions is <code>{ex_ex}</code>335336Included Extensions is <code>{inc_ex}</code>337338YT-DLP Options is <code>{ytopt}</code>339340FFMPEG Commands is <b>{ffc}</b>"""341342return text, buttons.build_menu(1)343344345async def update_user_settings(query, stype="main"):346handler_dict[query.from_user.id] = False347msg, button = await get_user_settings(query.from_user, stype)348await edit_message(query.message, msg, button)349350351@new_task352async def send_user_settings(_, message):353from_user = message.from_user354handler_dict[from_user.id] = False355msg, button = await get_user_settings(from_user)356await send_message(message, msg, button)357358359@new_task360async def add_file(_, message, ftype):361user_id = message.from_user.id362handler_dict[user_id] = False363if ftype == "THUMBNAIL":364des_dir = await create_thumb(message, user_id)365elif ftype == "RCLONE_CONFIG":366rpath = f"{getcwd()}/rclone/"367await makedirs(rpath, exist_ok=True)368des_dir = f"{rpath}{user_id}.conf"369await message.download(file_name=des_dir)370elif ftype == "TOKEN_PICKLE":371tpath = f"{getcwd()}/tokens/"372await makedirs(tpath, exist_ok=True)373des_dir = f"{tpath}{user_id}.pickle"374await message.download(file_name=des_dir)375update_user_ldata(user_id, ftype, des_dir)376await delete_message(message)377await database.update_user_doc(user_id, ftype, des_dir)378379380@new_task381async def add_one(_, message, option):382user_id = message.from_user.id383handler_dict[user_id] = False384user_dict = user_data.get(user_id, {})385value = message.text386if value.startswith("{") and value.endswith("}"):387try:388value = eval(value)389if user_dict[option]:390user_dict[option].update(value)391else:392update_user_ldata(user_id, option, value)393except Exception as e:394await send_message(message, str(e))395return396else:397await send_message(message, "It must be dict!")398return399await delete_message(message)400await database.update_user_data(user_id)401402403@new_task404async def remove_one(_, message, option):405user_id = message.from_user.id406handler_dict[user_id] = False407user_dict = user_data.get(user_id, {})408names = message.text.split("/")409for name in names:410if name in user_dict[option]:411del user_dict[option][name]412await delete_message(message)413await database.update_user_data(user_id)414415416@new_task417async def set_option(_, message, option):418user_id = message.from_user.id419handler_dict[user_id] = False420value = message.text421if option == "LEECH_SPLIT_SIZE":422if not value.isdigit():423value = get_size_bytes(value)424value = min(int(value), TgClient.MAX_SPLIT_SIZE)425elif option == "EXCLUDED_EXTENSIONS":426fx = value.split()427value = ["aria2", "!qB"]428for x in fx:429x = x.lstrip(".")430value.append(x.strip().lower())431elif option == "INCLUDED_EXTENSIONS":432fx = value.split()433value = []434for x in fx:435x = x.lstrip(".")436value.append(x.strip().lower())437elif option == "INDEX_URL":438value = value439elif option in ["UPLOAD_PATHS", "FFMPEG_CMDS", "YT_DLP_OPTIONS"]:440if value.startswith("{") and value.endswith("}"):441try:442value = eval(value)443except Exception as e:444await send_message(message, str(e))445return446else:447await send_message(message, "It must be dict!")448return449update_user_ldata(user_id, option, value)450await delete_message(message)451await database.update_user_data(user_id)452453454async def get_menu(option, message, user_id):455handler_dict[user_id] = False456user_dict = user_data.get(user_id, {})457buttons = ButtonMaker()458if option in ["THUMBNAIL", "RCLONE_CONFIG", "TOKEN_PICKLE"]:459key = "file"460else:461key = "set"462buttons.data_button("Set", f"userset {user_id} {key} {option}")463if option in user_dict and key != "file":464buttons.data_button("Reset", f"userset {user_id} reset {option}")465buttons.data_button("Remove", f"userset {user_id} remove {option}")466if option == "FFMPEG_CMDS":467ffc = None468if user_dict.get("FFMPEG_CMDS", False):469ffc = user_dict["FFMPEG_CMDS"]470buttons.data_button("Add one", f"userset {user_id} addone {option}")471buttons.data_button("Remove one", f"userset {user_id} rmone {option}")472elif "FFMPEG_CMDS" not in user_dict and Config.FFMPEG_CMDS:473ffc = Config.FFMPEG_CMDS474if ffc:475buttons.data_button("FFMPEG VARIABLES", f"userset {user_id} ffvar")476buttons.data_button("View", f"userset {user_id} view {option}")477elif option in user_dict and user_dict[option]:478if option == "THUMBNAIL":479buttons.data_button("View", f"userset {user_id} view {option}")480elif option in ["YT_DLP_OPTIONS", "UPLOAD_PATHS"]:481buttons.data_button("Add one", f"userset {user_id} addone {option}")482buttons.data_button("Remove one", f"userset {user_id} rmone {option}")483if option in leech_options:484back_to = "leech"485elif option in rclone_options:486back_to = "rclone"487elif option in gdrive_options:488back_to = "gdrive"489else:490back_to = "back"491buttons.data_button("Back", f"userset {user_id} {back_to}")492buttons.data_button("Close", f"userset {user_id} close")493text = f"Edit menu for: {option}"494await edit_message(message, text, buttons.build_menu(2))495496497async def set_ffmpeg_variable(_, message, key, value, index):498user_id = message.from_user.id499handler_dict[user_id] = False500txt = message.text501user_dict = user_data.setdefault(user_id, {})502ffvar_data = user_dict.setdefault("FFMPEG_VARIABLES", {})503ffvar_data = ffvar_data.setdefault(key, {})504ffvar_data = ffvar_data.setdefault(index, {})505ffvar_data[value] = txt506await delete_message(message)507await database.update_user_data(user_id)508509510async def ffmpeg_variables(511client, query, message, user_id, key=None, value=None, index=None512):513user_dict = user_data.get(user_id, {})514ffc = None515if user_dict.get("FFMPEG_CMDS", False):516ffc = user_dict["FFMPEG_CMDS"]517elif "FFMPEG_CMDS" not in user_dict and Config.FFMPEG_CMDS:518ffc = Config.FFMPEG_CMDS519if ffc:520buttons = ButtonMaker()521if key is None:522msg = "Choose which key you want to fill/edit variables in it:"523for k, v in list(ffc.items()):524add = False525for l in v:526if variables := findall(r"\{(.*?)\}", l):527add = True528if add:529buttons.data_button(k, f"userset {user_id} ffvar {k}")530buttons.data_button("Back", f"userset {user_id} menu FFMPEG_CMDS")531buttons.data_button("Close", f"userset {user_id} close")532elif key in ffc and value is None:533msg = f"Choose which variable you want to fill/edit: <u>{key}</u>\n\nCMDS:\n{ffc[key]}"534for ind, vl in enumerate(ffc[key]):535if variables := set(findall(r"\{(.*?)\}", vl)):536for var in variables:537buttons.data_button(538var, f"userset {user_id} ffvar {key} {var} {ind}"539)540buttons.data_button(541"Reset", f"userset {user_id} ffvar {key} ffmpegvarreset"542)543buttons.data_button("Back", f"userset {user_id} ffvar")544buttons.data_button("Close", f"userset {user_id} close")545elif key in ffc and value:546old_value = (547user_dict.get("FFMPEG_VARIABLES", {})548.get(key, {})549.get(index, {})550.get(value, "")551)552msg = f"Edit/Fill this FFmpeg Variable: <u>{key}</u>\n\nItem: {ffc[key][int(index)]}\n\nVariable: {value}"553if old_value:554msg += f"\n\nCurrent Value: {old_value}"555buttons.data_button("Back", f"userset {user_id} setevent")556buttons.data_button("Close", f"userset {user_id} close")557else:558return559await edit_message(message, msg, buttons.build_menu(2))560if key in ffc and value:561pfunc = partial(set_ffmpeg_variable, key=key, value=value, index=index)562await event_handler(client, query, pfunc)563await ffmpeg_variables(client, query, message, user_id, key)564565566async def event_handler(client, query, pfunc, photo=False, document=False):567user_id = query.from_user.id568handler_dict[user_id] = True569start_time = time()570571async def event_filter(_, __, event):572if photo:573mtype = event.photo574elif document:575mtype = event.document576else:577mtype = event.text578user = event.from_user or event.sender_chat579return bool(580user.id == user_id and event.chat.id == query.message.chat.id and mtype581)582583handler = client.add_handler(584MessageHandler(pfunc, filters=create(event_filter)), group=-1585)586587while handler_dict[user_id]:588await sleep(0.5)589if time() - start_time > 60:590handler_dict[user_id] = False591client.remove_handler(*handler)592593594@new_task595async def edit_user_settings(client, query):596from_user = query.from_user597user_id = from_user.id598name = from_user.mention599message = query.message600data = query.data.split()601handler_dict[user_id] = False602thumb_path = f"thumbnails/{user_id}.jpg"603rclone_conf = f"rclone/{user_id}.conf"604token_pickle = f"tokens/{user_id}.pickle"605user_dict = user_data.get(user_id, {})606if user_id != int(data[1]):607await query.answer("Not Yours!", show_alert=True)608elif data[2] == "setevent":609await query.answer()610elif data[2] in ["leech", "gdrive", "rclone"]:611await query.answer()612await update_user_settings(query, data[2])613elif data[2] == "menu":614await query.answer()615await get_menu(data[3], message, user_id)616elif data[2] == "tog":617await query.answer()618update_user_ldata(user_id, data[3], data[4] == "t")619if data[3] == "STOP_DUPLICATE":620back_to = "gdrive"621elif data[3] == "USER_TOKENS":622back_to = "main"623else:624back_to = "leech"625await update_user_settings(query, stype=back_to)626await database.update_user_data(user_id)627elif data[2] == "file":628await query.answer()629buttons = ButtonMaker()630if data[3] == "THUMBNAIL":631text = "Send a photo to save it as custom thumbnail. Timeout: 60 sec"632elif data[3] == "RCLONE_CONFIG":633text = "Send rclone.conf. Timeout: 60 sec"634else:635text = "Send token.pickle. Timeout: 60 sec"636buttons.data_button("Back", f"userset {user_id} setevent")637buttons.data_button("Close", f"userset {user_id} close")638await edit_message(message, text, buttons.build_menu(1))639pfunc = partial(add_file, ftype=data[3])640await event_handler(641client,642query,643pfunc,644photo=data[3] == "THUMBNAIL",645document=data[3] != "THUMBNAIL",646)647await get_menu(data[3], message, user_id)648elif data[2] == "ffvar":649await query.answer()650key = data[3] if len(data) > 3 else None651value = data[4] if len(data) > 4 else None652if value == "ffmpegvarreset":653user_dict = user_data.get(user_id, {})654ff_data = user_dict.get("FFMPEG_VARIABLES", {})655if key in ff_data:656del ff_data[key]657await database.update_user_data(user_id)658return659index = data[5] if len(data) > 5 else None660await ffmpeg_variables(client, query, message, user_id, key, value, index)661elif data[2] in ["set", "addone", "rmone"]:662await query.answer()663buttons = ButtonMaker()664if data[2] == "set":665text = user_settings_text[data[3]]666func = set_option667elif data[2] == "addone":668text = f"Add one or more string key and value to {data[3]}. Example: {{'key 1': 62625261, 'key 2': 'value 2'}}. Timeout: 60 sec"669func = add_one670elif data[2] == "rmone":671text = f"Remove one or more key from {data[3]}. Example: key 1/key2/key 3. Timeout: 60 sec"672func = remove_one673buttons.data_button("Back", f"userset {user_id} setevent")674buttons.data_button("Close", f"userset {user_id} close")675await edit_message(message, text, buttons.build_menu(1))676pfunc = partial(func, option=data[3])677await event_handler(client, query, pfunc)678await get_menu(data[3], message, user_id)679elif data[2] == "remove":680await query.answer("Removed!", show_alert=True)681if data[3] in ["THUMBNAIL", "RCLONE_CONFIG", "TOKEN_PICKLE"]:682if data[3] == "THUMBNAIL":683fpath = thumb_path684elif data[3] == "RCLONE_CONFIG":685fpath = rclone_conf686else:687fpath = token_pickle688if await aiopath.exists(fpath):689await remove(fpath)690del user_dict[data[3]]691await database.update_user_doc(user_id, data[3])692else:693update_user_ldata(user_id, data[3], "")694await database.update_user_data(user_id)695elif data[2] == "reset":696await query.answer("Reseted!", show_alert=True)697if data[3] in user_dict:698del user_dict[data[3]]699else:700for k in list(user_dict.keys()):701if k not in [702"SUDO",703"AUTH",704"THUMBNAIL",705"RCLONE_CONFIG",706"TOKEN_PICKLE",707]:708del user_dict[k]709await update_user_settings(query)710await database.update_user_data(user_id)711elif data[2] == "view":712await query.answer()713if data[3] == "THUMBNAIL":714await send_file(message, thumb_path, name)715elif data[3] == "FFMPEG_CMDS":716ffc = None717if user_dict.get("FFMPEG_CMDS", False):718ffc = user_dict["FFMPEG_CMDS"]719elif "FFMPEG_CMDS" not in user_dict and Config.FFMPEG_CMDS:720ffc = Config.FFMPEG_CMDS721msg_ecd = str(ffc).encode()722with BytesIO(msg_ecd) as ofile:723ofile.name = "users_settings.txt"724await send_file(message, ofile)725elif data[2] in ["gd", "rc"]:726await query.answer()727du = "rc" if data[2] == "gd" else "gd"728update_user_ldata(user_id, "DEFAULT_UPLOAD", du)729await update_user_settings(query)730await database.update_user_data(user_id)731elif data[2] == "back":732await query.answer()733await update_user_settings(query)734else:735await query.answer()736await delete_message(message.reply_to_message)737await delete_message(message)738739740@new_task741async def get_users_settings(_, message):742msg = ""743if auth_chats:744msg += f"AUTHORIZED_CHATS: {auth_chats}\n"745if sudo_users:746msg += f"SUDO_USERS: {sudo_users}\n\n"747if user_data:748for u, d in user_data.items():749kmsg = f"\n<b>{u}:</b>\n"750if vmsg := "".join(751f"{k}: <code>{v or None}</code>\n" for k, v in d.items()752):753msg += kmsg + vmsg754if not msg:755await send_message(message, "No users data!")756return757msg_ecd = msg.encode()758if len(msg_ecd) > 4000:759with BytesIO(msg_ecd) as ofile:760ofile.name = "users_settings.txt"761await send_file(message, ofile)762else:763await send_message(message, msg)764else:765await send_message(message, "No users data!")766767768