diff --git a/.gitignore b/.gitignore index df891092d5..b2f5a9dc07 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,9 @@ temp/ *.swf *.air *.apk +*.webp +*.cpp + .vs env # temporary files diff --git a/callbacks.py b/callbacks.py new file mode 100644 index 0000000000..e73f3de1d0 --- /dev/null +++ b/callbacks.py @@ -0,0 +1,1277 @@ +# Ultroid - UserBot +# Copyright (C) 2021-2022 TeamUltroid +# +# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > +# PLease read the GNU Affero General Public License in +# . + +import ast +import asyncio +import re +import sys, os +import time +from asyncio.exceptions import TimeoutError as AsyncTimeOut +from os import execl, remove +from random import choice + +from bs4 import BeautifulSoup as bs +from core import HNDLR, udB, LOGS, Var +from database.helpers import get_random_color +# try: +# from pyUltroid.fns.gDrive import GDriveManager +# except ImportError: +# GDriveManager = None +from telegraph import upload_file as upl +from telethon import Button, events +from telethon.tl.types import MessageMediaWebPage +from telethon.utils import get_peer_id +from localization import get_string + +from utilities.helper import fast_download, progress +from utilities.tools import Carbon, async_searcher #, get_paste, telegraph_client +#from pyUltroid.startup.loader import Loader +from telethon.tl import types +from . import callback, get_back_button, asst + +# --------------------------------------------------------------------# +# telegraph = telegraph_client() +# GDrive = GDriveManager() if GDriveManager else None +# --------------------------------------------------------------------# + +async def setit(_, key, value): + udB.set_key(key, value) + +def text_to_url(event): + """function to get media url (with|without) Webpage""" + if isinstance(event.media, MessageMediaWebPage): + webpage = event.media.webpage + if not isinstance(webpage, types.WebPageEmpty) and webpage.type in ["photo"]: + return webpage.display_url + return event.text + + +# --------------------------------------------------------------------# + +_buttons = { + "otvars": { + "text": "Other Variables to set for @TeamUltroid:", + "buttons": [ + [ + Button.inline("Tᴀɢ Lᴏɢɢᴇʀ", data="taglog"), + Button.inline("SᴜᴘᴇʀFʙᴀɴ", data="cbs_sfban"), + ], + [ + Button.inline("Sᴜᴅᴏ Mᴏᴅᴇ", data="sudo"), + Button.inline("Hᴀɴᴅʟᴇʀ", data="hhndlr"), + ], + [ + Button.inline("Exᴛʀᴀ Pʟᴜɢɪɴs", data="plg"), + Button.inline("Aᴅᴅᴏɴs", data="eaddon"), + ], + [ + Button.inline("Eᴍᴏᴊɪ ɪɴ Hᴇʟᴘ", data="emoj"), + Button.inline("Sᴇᴛ ɢDʀɪᴠᴇ", data="gdrive"), + ], + [ + Button.inline("Iɴʟɪɴᴇ Pɪᴄ", data="inli_pic"), + Button.inline("Sᴜᴅᴏ HNDLR", data="shndlr"), + ], + [Button.inline("Dᴜᴀʟ Mᴏᴅᴇ", "cbs_oofdm")], + [Button.inline("« Bᴀᴄᴋ", data="setter")], + ], + }, + "sfban": { + "text": "SuperFban Settings:", + "buttons": [ + [Button.inline("FBᴀɴ Gʀᴏᴜᴘ", data="sfgrp")], + [Button.inline("Exᴄʟᴜᴅᴇ Fᴇᴅs", data="abs_sfexf")], + [Button.inline("« Bᴀᴄᴋ", data="cbs_otvars")], + ], + }, + "apauto": { + "text": "This'll auto approve on outgoing messages", + "buttons": [ + [Button.inline("Aᴜᴛᴏ Aᴘᴘʀᴏᴠᴇ ON", data="apon")], + [Button.inline("Aᴜᴛᴏ Aᴘᴘʀᴏᴠᴇ OFF", data="apof")], + [Button.inline("« Bᴀᴄᴋ", data="cbs_pmcstm")], + ], + }, + "alvcstm": { + "text": f"Customise your {HNDLR}alive. Choose from the below options -", + "buttons": [ + [Button.inline("Aʟɪᴠᴇ Tᴇxᴛ", data="abs_alvtx")], + [Button.inline("Aʟɪᴠᴇ ᴍᴇᴅɪᴀ", data="alvmed")], + [Button.inline("Dᴇʟᴇᴛᴇ Aʟɪᴠᴇ Mᴇᴅɪᴀ", data="delmed")], + [Button.inline("« Bᴀᴄᴋ", data="setter")], + ], + }, + "pmcstm": { + "text": "Customise your PMPERMIT Settings -", + "buttons": [ + [ + Button.inline("Pᴍ Tᴇxᴛ", data="pmtxt"), + Button.inline("Pᴍ Mᴇᴅɪᴀ", data="pmmed"), + ], + [ + Button.inline("Aᴜᴛᴏ Aᴘᴘʀᴏᴠᴇ", data="cbs_apauto"), + Button.inline("PMLOGGER", data="pml"), + ], + [ + Button.inline("Sᴇᴛ Wᴀʀɴs", data="swarn"), + Button.inline("Dᴇʟᴇᴛᴇ Pᴍ Mᴇᴅɪᴀ", data="delpmmed"), + ], + [Button.inline("PMPermit Type", data="cbs_pmtype")], + [Button.inline("« Bᴀᴄᴋ", data="cbs_ppmset")], + ], + }, + "pmtype": { + "text": "Select the type of PMPermit needed.", + "buttons": [ + [Button.inline("Inline", data="inpm_in")], + [Button.inline("Normal", data="inpm_no")], + [Button.inline("« Bᴀᴄᴋ", data="cbs_pmcstm")], + ], + }, + "ppmset": { + "text": "PMPermit Settings:", + "buttons": [ + [Button.inline("Tᴜʀɴ PMPᴇʀᴍɪᴛ Oɴ", data="pmon")], + [Button.inline("Tᴜʀɴ PMPᴇʀᴍɪᴛ Oғғ", data="pmoff")], + [Button.inline("Cᴜsᴛᴏᴍɪᴢᴇ PMPᴇʀᴍɪᴛ", data="cbs_pmcstm")], + [Button.inline("« Bᴀᴄᴋ", data="setter")], + ], + }, + "chatbot": { + "text": "From This Feature U can chat with ppls Via ur Assistant Bot.\n[More info](https://t.me/UltroidUpdates/2)", + "buttons": [ + [ + Button.inline("Cʜᴀᴛ Bᴏᴛ Oɴ", data="onchbot"), + Button.inline("Cʜᴀᴛ Bᴏᴛ Oғғ", data="ofchbot"), + ], + [ + Button.inline("Bᴏᴛ Wᴇʟᴄᴏᴍᴇ", data="bwel"), + Button.inline("Bᴏᴛ Wᴇʟᴄᴏᴍᴇ Mᴇᴅɪᴀ", data="botmew"), + ], + [Button.inline("Bᴏᴛ Iɴғᴏ Tᴇxᴛ", data="botinfe")], + [Button.inline("Fᴏʀᴄᴇ Sᴜʙsᴄʀɪʙᴇ", data="pmfs")], + [Button.inline("« Bᴀᴄᴋ", data="setter")], + ], + }, + "vcb": { + "text": "From This Feature U can play songs in group voice chat\n\n[moreinfo](https://t.me/UltroidUpdates/4)", + "buttons": [ + [Button.inline("VC Sᴇssɪᴏɴ", data="abs_vcs")], + [Button.inline("« Bᴀᴄᴋ", data="setter")], + ], + }, + "oofdm": { + "text": "About [Dual Mode](https://t.me/UltroidUpdates/18)", + "buttons": [ + [ + Button.inline("Dᴜᴀʟ Mᴏᴅᴇ Oɴ", "dmof"), + Button.inline("Dᴜᴀʟ Mᴏᴅᴇ Oғғ", "dmof"), + ], + [Button.inline("Dᴜᴀʟ Mᴏᴅᴇ Hɴᴅʟʀ", "dmhn")], + [Button.inline("« Back", data="cbs_otvars")], + ], + }, + "apiset": { + "text": get_string("ast_1"), + "buttons": [ + [Button.inline("Remove.bg API", data="abs_rmbg")], + [Button.inline("DEEP API", data="abs_dapi")], + [Button.inline("OCR API", data="abs_oapi")], + [Button.inline("« Back", data="setter")], + ], + }, +} + +_convo = { + "rmbg": { + "var": "RMBG_API", + "name": "Remove.bg API Key", + "text": get_string("ast_2"), + "back": "cbs_apiset", + }, + "dapi": { + "var": "DEEP_AI", + "name": "Deep AI Api Key", + "text": "Get Your Deep Api from deepai.org and send here.", + "back": "cbs_apiset", + }, + "oapi": { + "var": "OCR_API", + "name": "Ocr Api Key", + "text": "Get Your OCR api from ocr.space and send that Here.", + "back": "cbs_apiset", + }, + "pmlgg": { + "var": "PMLOGGROUP", + "name": "Pm Log Group", + "text": "Send chat id of chat which you want to save as Pm log Group.", + "back": "pml", + }, + "vcs": { + "var": "VC_SESSION", + "name": "Vc Session", + "text": "**Vc session**\nEnter the New session u generated for vc bot.\n\nUse /cancel to terminate the operation.", + "back": "cbs_vcb", + }, + "settag": { + "var": "TAG_LOG", + "name": "Tag Log Group", + "text": f"Make a group, add your assistant and make it admin.\nGet the `{HNDLR}id` of that group and send it here for tag logs.\n\nUse /cancel to cancel.", + "back": "taglog", + }, + "alvtx": { + "var": "ALIVE_TEXT", + "name": "Alive Text", + "text": "**Alive Text**\nEnter the new alive text.\n\nUse /cancel to terminate the operation.", + "back": "cbs_alvcstm", + }, + "sfexf": { + "var": "EXCLUDE_FED", + "name": "Excluded Fed", + "text": "Send the Fed IDs you want to exclude in the ban. Split by a space.\neg`id1 id2 id3`\nSet is as `None` if you dont want any.\nUse /cancel to go back.", + "back": "cbs_sfban", + }, +} + + +TOKEN_FILE = "resources/auths/auth_token.txt" + + +@callback( + re.compile( + "sndplug_(.*)", + ), + owner=True, +) +async def send(eve): + key, name = (eve.data_match.group(1)).decode("UTF-8").split("_") + thumb = "resources/extras/inline.jpg" + await eve.answer("■ Sending ■") + data = f"uh_{key}_" + index = None + if "|" in name: + name, index = name.split("|") + key = "plugins" if key == "Official" else key.lower() + plugin = f"{key}/{name}.py" + _ = f"pasta-{plugin}" + if index is not None: + data += f"|{index}" + _ += f"|{index}" + buttons = [ + [ + Button.inline( + "« Pᴀsᴛᴇ »", + data=_, + ) + ], + [ + Button.inline("« Bᴀᴄᴋ", data=data), + ], + ] + try: + await eve.edit(file=plugin, thumb=thumb, buttons=buttons) + except Exception as er: + await eve.answer(str(er), alert=True) + + +heroku_api, app_name = Var.HEROKU_API, Var.HEROKU_APP_NAME + + +@callback("updatenow", owner=True) +async def update(eve): + repo = Repo() + ac_br = repo.active_branch + ups_rem = repo.remote("upstream") + if heroku_api: + import heroku3 + + try: + heroku = heroku3.from_key(heroku_api) + heroku_app = None + heroku_applications = heroku.apps() + except BaseException as er: + LOGS.exception(er) + return await eve.edit("`Wrong HEROKU_API.`") + for app in heroku_applications: + if app.name == app_name: + heroku_app = app + if not heroku_app: + await eve.edit("`Wrong HEROKU_APP_NAME.`") + repo.__del__() + return + await eve.edit(get_string("clst_1")) + ups_rem.fetch(ac_br) + repo.git.reset("--hard", "FETCH_HEAD") + heroku_git_url = heroku_app.git_url.replace( + "https://", f"https://api:{heroku_api}@" + ) + + if "heroku" in repo.remotes: + remote = repo.remote("heroku") + remote.set_url(heroku_git_url) + else: + remote = repo.create_remote("heroku", heroku_git_url) + try: + remote.push(refspec=f"HEAD:refs/heads/{ac_br}", force=True) + except GitCommandError as error: + await eve.edit(f"`Here is the error log:\n{error}`") + repo.__del__() + return + await eve.edit("`Successfully Updated!\nRestarting, please wait...`") + else: + await eve.edit(get_string("clst_1")) + call_back() + await bash("git pull && pip3 install -r requirements.txt") + execl(sys.executable, sys.executable, "-m", "pyUltroid") + + + + +@callback( + re.compile( + "pasta-(.*)", + ), + owner=True, +) +async def _(e): + ok = (e.data_match.group(1)).decode("UTF-8") + index = None + if "|" in ok: + ok, index = ok.split("|") + with open(ok, "r") as hmm: + _, key = await get_paste(hmm.read()) + link = f"https://spaceb.in/{key}" + raw = f"https://spaceb.in/api/v1/documents/{key}/raw" + if not _: + return await e.answer(key[:30], alert=True) + if ok.startswith("addons"): + key = "Addons" + elif ok.startswith("vcbot"): + key = "VCBot" + else: + key = "Official" + data = f"uh_{key}_" + if index is not None: + data += f"|{index}" + await e.edit( + "", + buttons=[ + [Button.url("Lɪɴᴋ", link), Button.url("Rᴀᴡ", raw)], + [Button.inline("« Bᴀᴄᴋ", data=data)], + ], + ) + + +@callback(re.compile("cbs_(.*)"), owner=True) +async def _edit_to(event): + match = event.data_match.group(1).decode("utf-8") + data = _buttons.get(match) + if not data: + return + await event.edit(data["text"], buttons=data["buttons"], link_preview=False) + + +@callback(re.compile("abs_(.*)"), owner=True) +async def convo_handler(event: events.CallbackQuery): + match = event.data_match.group(1).decode("utf-8") + if not _convo.get(match): + return + await event.delete() + get_ = _convo[match] + back = get_["back"] + async with event.client.conversation(event.sender_id) as conv: + await conv.send_message(get_["text"]) + response = await conv.get_response() + themssg = response.message + try: + themssg = ast.literal_eval(themssg) + except Exception: + pass + if themssg == "/cancel": + return await conv.send_message( + "Cancelled!!", + buttons=get_back_button(back), + ) + await setit(event, get_["var"], themssg) + await conv.send_message( + f"{get_['name']} changed to `{themssg}`", + buttons=get_back_button(back), + ) + + +@callback("authorise", owner=True) +async def _(e): + if not e.is_private: + return + url = GDrive._create_token_file() + await e.edit("Go to the below link and send the code!") + async with asst.conversation(e.sender_id) as conv: + await conv.send_message(url) + code = await conv.get_response() + if GDrive._create_token_file(code=code.text): + await conv.send_message( + "`Success!\nYou are all set to use Google Drive with Ultroid Userbot.`", + buttons=Button.inline("Main Menu", data="setter"), + ) + else: + await conv.send_message("Wrong code! Click authorise again.") + + +@callback("folderid", owner=True, func=lambda x: x.is_private) +async def _(e): + if not e.is_private: + return + msg = ( + "Send your FOLDER ID\n\n" + + "For FOLDER ID:\n" + + "1. Open Google Drive App.\n" + + "2. Create Folder.\n" + + "3. Make that folder public.\n" + + "4. Send link of that folder." + ) + await e.delete() + async with asst.conversation(e.sender_id, timeout=150) as conv: + await conv.send_message(msg) + repl = await conv.get_response() + id = repl.text + if id.startswith("https"): + id = id.split("?id=")[-1] + udB.set_key("GDRIVE_FOLDER_ID", id) + await repl.reply( + "`Success.`", + buttons=get_back_button("gdrive"), + ) + + +@callback("gdrive", owner=True) +async def _(e): + if not e.is_private: + return + await e.edit( + "Click Authorise and send the code.\n\nYou can use your own CLIENT ID and SECRET by [this](https://t.me/UltroidUpdates/37)", + buttons=[ + [ + Button.inline("Folder ID", data="folderid"), + Button.inline("Authorise", data="authorise"), + ], + [Button.inline("« Back", data="cbs_otvars")], + ], + link_preview=False, + ) + + +@callback("dmof", owner=True) +async def rhwhe(e): + if udB.get_key("DUAL_MODE"): + udB.del_key("DUAL_MODE") + key = "Off" + else: + udB.set_key("DUAL_MODE", "True") + key = "On" + Msg = f"Dual Mode : {key}" + await e.edit(Msg, buttons=get_back_button("cbs_otvars")) + + +@callback("dmhn", owner=True) +async def hndlrr(event): + await event.delete() + pru = event.sender_id + var = "DUAL_HNDLR" + name = "Dual Handler" + CH = udB.get_key(var) or "/" + async with event.client.conversation(pru) as conv: + await conv.send_message( + f"Send The Symbol Which u want as Handler/Trigger to use your Assistant bot\nUr Current Handler is [ `{CH}` ]\n\n use /cancel to cancel.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_otvars"), + ) + elif len(themssg) > 1: + await conv.send_message( + "Incorrect Handler", + buttons=get_back_button("cbs_otvars"), + ) + else: + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}", + buttons=get_back_button("cbs_otvars"), + ) + + +@callback("emoj", owner=True) +async def emoji(event): + await event.delete() + pru = event.sender_id + var = "EMOJI_IN_HELP" + name = f"Emoji in `{HNDLR}help` menu" + async with event.client.conversation(pru) as conv: + await conv.send_message("Send emoji u want to set 🙃.\n\nUse /cancel to cancel.") + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_otvars"), + ) + elif themssg.startswith(("/", HNDLR)): + await conv.send_message( + "Incorrect Emoji", + buttons=get_back_button("cbs_otvars"), + ) + else: + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}\n", + buttons=get_back_button("cbs_otvars"), + ) + + +@callback("plg", owner=True) +async def pluginch(event): + await event.delete() + pru = event.sender_id + var = "PLUGIN_CHANNEL" + name = "Plugin Channel" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "Send id or username of a channel from where u want to install all plugins\n\nOur Channel~ @ultroidplugins\n\nUse /cancel to cancel.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_otvars"), + ) + elif themssg.startswith(("/", HNDLR)): + await conv.send_message( + "Incorrect channel", + buttons=get_back_button("cbs_otvars"), + ) + else: + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}\n After Setting All Things Do Restart", + buttons=get_back_button("cbs_otvars"), + ) + + +@callback("hhndlr", owner=True) +async def hndlrr(event): + await event.delete() + pru = event.sender_id + var = "HNDLR" + name = "Handler/ Trigger" + async with event.client.conversation(pru) as conv: + await conv.send_message( + f"Send The Symbol Which u want as Handler/Trigger to use bot\nUr Current Handler is [ `{HNDLR}` ]\n\n use /cancel to cancel.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_otvars"), + ) + elif len(themssg) > 1: + await conv.send_message( + "Incorrect Handler", + buttons=get_back_button("cbs_otvars"), + ) + elif themssg.startswith(("/", "#", "@")): + await conv.send_message( + "This cannot be used as handler", + buttons=get_back_button("cbs_otvars"), + ) + else: + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}", + buttons=get_back_button("cbs_otvars"), + ) + + +@callback("shndlr", owner=True) +async def hndlrr(event): + await event.delete() + pru = event.sender_id + var = "SUDO_HNDLR" + name = "Sudo Handler" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "Send The Symbol Which u want as Sudo Handler/Trigger to use bot\n\n use /cancel to cancel." + ) + + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_otvars"), + ) + elif len(themssg) > 1: + await conv.send_message( + "Incorrect Handler", + buttons=get_back_button("cbs_otvars"), + ) + elif themssg.startswith(("/", "#", "@")): + await conv.send_message( + "This cannot be used as handler", + buttons=get_back_button("cbs_otvars"), + ) + else: + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}", + buttons=get_back_button("cbs_otvars"), + ) + + +@callback("taglog", owner=True) +async def tagloggrr(e): + BUTTON = [ + [Button.inline("SET TAG LOG", data="abs_settag")], + [Button.inline("DELETE TAG LOG", data="deltag")], + get_back_button("cbs_otvars"), + ] + await e.edit( + "Choose Options", + buttons=BUTTON, + ) + + +@callback("deltag", owner=True) +async def _(e): + udB.del_key("TAG_LOG") + await e.answer("Done!!! Tag Logger has been turned Off") + + +@callback("eaddon", owner=True) +async def pmset(event): + BT = ( + [Button.inline("Aᴅᴅᴏɴs Oғғ", data="edof")] + if udB.get_key("ADDONS") + else [Button.inline("Aᴅᴅᴏɴs Oɴ", data="edon")] + ) + + await event.edit( + "ADDONS~ Extra Plugins:", + buttons=[ + BT, + [Button.inline("« Bᴀᴄᴋ", data="cbs_otvars")], + ], + ) + + +@callback("edon", owner=True) +async def eddon(event): + var = "ADDONS" + await setit(event, var, "True") + await event.edit( + "Done! ADDONS has been turned on!!\n\n After Setting All Things Do Restart", + buttons=get_back_button("eaddon"), + ) + + +@callback("edof", owner=True) +async def eddof(event): + udB.set_key("ADDONS", "False") + await event.edit( + "Done! ADDONS has been turned off!! After Setting All Things Do Restart", + buttons=get_back_button("eaddon"), + ) + + +@callback("sudo", owner=True) +async def pmset(event): + BT = ( + [Button.inline("Sᴜᴅᴏ Mᴏᴅᴇ Oғғ", data="ofsudo")] + if udB.get_key("SUDO") + else [Button.inline("Sᴜᴅᴏ Mᴏᴅᴇ Oɴ", data="onsudo")] + ) + + await event.edit( + f"SUDO MODE ~ Some peoples can use ur Bot which u selected. To know More use `{HNDLR}help sudo`", + buttons=[ + BT, + [Button.inline("« Bᴀᴄᴋ", data="cbs_otvars")], + ], + ) + + +@callback("onsudo", owner=True) +async def eddon(event): + var = "SUDO" + await setit(event, var, "True") + await event.edit( + "Done! SUDO MODE has been turned on!!\n\n After Setting All Things Do Restart", + buttons=get_back_button("sudo"), + ) + + +@callback("ofsudo", owner=True) +async def eddof(event): + var = "SUDO" + await setit(event, var, "False") + await event.edit( + "Done! SUDO MODE has been turned off!! After Setting All Things Do Restart", + buttons=get_back_button("sudo"), + ) + + +@callback("sfgrp", owner=True) +async def sfgrp(event): + await event.delete() + name = "FBan Group ID" + var = "FBAN_GROUP_ID" + pru = event.sender_id + async with asst.conversation(pru) as conv: + await conv.send_message( + f"Make a group, add @MissRose_Bot, send `{HNDLR}id`, copy that and send it here.\nUse /cancel to go back.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + return await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_sfban"), + ) + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}", + buttons=get_back_button("cbs_sfban"), + ) + + +@callback("alvmed", owner=True) +async def media(event): + await event.delete() + pru = event.sender_id + var = "ALIVE_PIC" + name = "Alive Media" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "**Alive Media**\nSend me a pic/gif/media to set as alive media.\n\nUse /cancel to terminate the operation.", + ) + response = await conv.get_response() + try: + themssg = response.message + if themssg == "/cancel": + return await conv.send_message( + "Operation cancelled!!", + buttons=get_back_button("cbs_alvcstm"), + ) + except BaseException as er: + LOGS.exception(er) + if ( + not (response.text).startswith("/") + and response.text != "" + and (not response.media or isinstance(response.media, MessageMediaWebPage)) + ): + url = text_to_url(response) + elif response.sticker: + url = response.file.id + else: + media = await event.client.download_media(response, "alvpc") + try: + x = upl(media) + url = f"https://graph.org/{x[0]}" + remove(media) + except BaseException as er: + LOGS.exception(er) + return await conv.send_message( + "Terminated.", + buttons=get_back_button("cbs_alvcstm"), + ) + await setit(event, var, url) + await conv.send_message( + f"{name} has been set.", + buttons=get_back_button("cbs_alvcstm"), + ) + + +@callback("delmed", owner=True) +async def dell(event): + try: + udB.del_key("ALIVE_PIC") + return await event.edit( + get_string("clst_5"), buttons=get_back_button("cbs_alabs_vcstm") + ) + except BaseException as er: + LOGS.exception(er) + return await event.edit( + get_string("clst_4"), + buttons=get_back_button("cbs_alabs_vcstm"), + ) + + +@callback("inpm_in", owner=True) +async def inl_on(event): + var = "INLINE_PM" + await setit(event, var, "True") + await event.edit( + "Done!! PMPermit type has been set to inline!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_pmtype")]], + ) + + +@callback("inpm_no", owner=True) +async def inl_on(event): + var = "INLINE_PM" + await setit(event, var, "False") + await event.edit( + "Done!! PMPermit type has been set to normal!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_pmtype")]], + ) + + +@callback("pmtxt", owner=True) +async def name(event): + await event.delete() + pru = event.sender_id + var = "PM_TEXT" + name = "PM Text" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "**PM Text**\nEnter the new Pmpermit text.\n\nu can use `{name}` `{fullname}` `{count}` `{mention}` `{username}` to get this from user Too\n\nUse /cancel to terminate the operation.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + return await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_pmcstm"), + ) + if len(themssg) > 4090: + return await conv.send_message( + "Message too long!\nGive a shorter message please!!", + buttons=get_back_button("cbs_pmcstm"), + ) + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}\n\nAfter Setting All Things Do restart", + buttons=get_back_button("cbs_pmcstm"), + ) + + +@callback("swarn", owner=True) +async def name(event): + m = range(1, 10) + tultd = [Button.inline(f"{x}", data=f"wrns_{x}") for x in m] + lst = list(zip(tultd[::3], tultd[1::3], tultd[2::3])) + lst.append([Button.inline("« Bᴀᴄᴋ", data="cbs_pmcstm")]) + await event.edit( + "Select the number of warnings for a user before getting blocked in PMs.", + buttons=lst, + ) + + +@callback(re.compile(b"wrns_(.*)"), owner=True) +async def set_wrns(event): + value = int(event.data_match.group(1).decode("UTF-8")) + if dn := udB.set_key("PMWARNS", value): + await event.edit( + f"PM Warns Set to {value}.\nNew users will have {value} chances in PMs before getting banned.", + buttons=get_back_button("cbs_pmcstm"), + ) + else: + await event.edit( + f"Something went wrong, please check your {HNDLR}logs!", + buttons=get_back_button("cbs_pmcstm"), + ) + + +@callback("pmmed", owner=True) +async def media(event): + await event.delete() + pru = event.sender_id + var = "PMPIC" + name = "PM Media" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "**PM Media**\nSend me a pic/gif/sticker/link to set as pmpermit media.\n\nUse /cancel to terminate the operation.", + ) + response = await conv.get_response() + try: + themssg = response.message + if themssg == "/cancel": + return await conv.send_message( + "Operation cancelled!!", + buttons=get_back_button("cbs_pmcstm"), + ) + except BaseException as er: + LOGS.exception(er) + media = await event.client.download_media(response, "pmpc") + if ( + not (response.text).startswith("/") + and response.text != "" + and (not response.media or isinstance(response.media, MessageMediaWebPage)) + ): + url = text_to_url(response) + elif response.sticker: + url = response.file.id + else: + try: + x = upl(media) + url = f"https://graph.org/{x[0]}" + remove(media) + except BaseException as er: + LOGS.exception(er) + return await conv.send_message( + "Terminated.", + buttons=get_back_button("cbs_pmcstm"), + ) + await setit(event, var, url) + await conv.send_message( + f"{name} has been set.", + buttons=get_back_button("cbs_pmcstm"), + ) + + +@callback("delpmmed", owner=True) +async def dell(event): + try: + udB.del_key("PMPIC") + return await event.edit( + get_string("clst_5"), buttons=get_back_button("cbs_pmcstm") + ) + except BaseException as er: + LOGS.exception(er) + return await event.edit( + get_string("clst_4"), + buttons=[[Button.inline("« Sᴇᴛᴛɪɴɢs", data="setter")]], + ) + + +@callback("apon", owner=True) +async def apon(event): + var = "AUTOAPPROVE" + await setit(event, var, "True") + await event.edit( + "Done!! AUTOAPPROVE Started!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_apauto")]], + ) + + +@callback("apof", owner=True) +async def apof(event): + try: + udB.set_key("AUTOAPPROVE", "False") + return await event.edit( + "Done! AUTOAPPROVE Stopped!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_apauto")]], + ) + except BaseException as er: + LOGS.exception(er) + return await event.edit( + get_string("clst_4"), + buttons=[[Button.inline("« Sᴇᴛᴛɪɴɢs", data="setter")]], + ) + + +@callback("pml", owner=True) +async def l_vcs(event): + BT = ( + [Button.inline("PMLOGGER OFF", data="pmlogof")] + if udB.get_key("PMLOG") + else [Button.inline("PMLOGGER ON", data="pmlog")] + ) + + await event.edit( + "PMLOGGER This Will Forward Ur Pm to Ur Private Group -", + buttons=[ + BT, + [Button.inline("PᴍLᴏɢɢᴇʀ Gʀᴏᴜᴘ", "abs_pmlgg")], + [Button.inline("« Bᴀᴄᴋ", data="cbs_pmcstm")], + ], + ) + + +@callback("pmlog", owner=True) +async def pmlog(event): + await setit(event, "PMLOG", "True") + await event.edit( + "Done!! PMLOGGER Started!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="pml")]], + ) + + +@callback("pmlogof", owner=True) +async def pmlogof(event): + try: + udB.del_key("PMLOG") + return await event.edit( + "Done! PMLOGGER Stopped!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="pml")]], + ) + except BaseException as er: + LOGS.exception(er) + return await event.edit( + get_string("clst_4"), + buttons=[[Button.inline("« Sᴇᴛᴛɪɴɢs", data="setter")]], + ) + + +@callback("pmon", owner=True) +async def pmonn(event): + var = "PMSETTING" + await setit(event, var, "True") + await event.edit( + "Done! PMPermit has been turned on!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_ppmset")]], + ) + + +@callback("pmoff", owner=True) +async def pmofff(event): + var = "PMSETTING" + await setit(event, var, "False") + await event.edit( + "Done! PMPermit has been turned off!!", + buttons=[[Button.inline("« Bᴀᴄᴋ", data="cbs_ppmset")]], + ) + + +@callback("botmew", owner=True) +async def hhh(e): + async with e.client.conversation(e.chat_id) as conv: + await conv.send_message("Send Any Media to keep at your Bot's welcome ") + msg = await conv.get_response() + if not msg.media or msg.text.startswith("/"): + return await conv.send_message( + "Terminated!", buttons=get_back_button("cbs_chatbot") + ) + udB.set_key("STARTMEDIA", msg.file.id) + await conv.send_message("Done!", buttons=get_back_button("cbs_chatbot")) + + +@callback("botinfe", owner=True) +async def hhh(e): + async with e.client.conversation(e.chat_id) as conv: + await conv.send_message( + "Send message to set to Display, when user Press Info button in Bot Welcome!\n\nsend `False` to completely remove that button.." + ) + msg = await conv.get_response() + if msg.media or msg.text.startswith("/"): + return await conv.send_message( + "Terminated!", buttons=get_back_button("cbs_chatbot") + ) + udB.set_key("BOT_INFO_START", msg.text) + await conv.send_message("Done!", buttons=get_back_button("cbs_chatbot")) + + +@callback("pmfs", owner=True) +async def heheh(event): + Ll = [] + err = "" + async with event.client.conversation(event.chat_id) as conv: + await conv.send_message( + "• Send The Chat Id(s), which you want user to Join Before using Chat/Pm Bot\n\n• Send /clear to disable PmBot Force sub..\n• • Send /cancel to stop this process.." + ) + await conv.send_message( + "Example : \n`-1001234567\n-100778888`\n\nFor Multiple Chat(s)." + ) + try: + msg = await conv.get_response() + except AsyncTimeOut: + return await conv.send_message("**• TimeUp!**\nStart from /start back.") + if not msg.text or msg.text.startswith("/"): + timyork = "Cancelled!" + if msg.text == "/clear": + udB.del_key("PMBOT_FSUB") + timyork = "Done! Force Subscribe Stopped\nRestart your Bot!" + return await conv.send_message( + "Cancelled!", buttons=get_back_button("cbs_chatbot") + ) + for chat in msg.message.split("\n"): + if chat.startswith("-") or chat.isdigit(): + chat = int(chat) + try: + CHSJSHS = await event.client.get_entity(chat) + Ll.append(get_peer_id(CHSJSHS)) + except Exception as er: + err += f"**{chat}** : {er}\n" + if err: + return await conv.send_message(err) + udB.set_key("PMBOT_FSUB", str(Ll)) + await conv.send_message( + "Done!\nRestart Your Bot.", buttons=get_back_button("cbs_chatbot") + ) + + +@callback("bwel", owner=True) +async def name(event): + await event.delete() + pru = event.sender_id + var = "STARTMSG" + name = "Bot Welcome Message:" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "**BOT WELCOME MSG**\nEnter the msg which u want to show when someone start your assistant Bot.\nYou Can use `{me}` , `{mention}` Parameters Too\nUse /cancel to terminate the operation.", + ) + response = conv.wait_event(events.NewMessage(chats=pru)) + response = await response + themssg = response.message.message + if themssg == "/cancel": + return await conv.send_message( + "Cancelled!!", + buttons=get_back_button("cbs_chatbot"), + ) + await setit(event, var, themssg) + await conv.send_message( + f"{name} changed to {themssg}", + buttons=get_back_button("cbs_chatbot"), + ) + + +@callback("onchbot", owner=True) +async def chon(event): + var = "PMBOT" + await setit(event, var, "True") + Loader(path="assistant/pmbot.py", key="PM Bot").load() + if AST_PLUGINS.get("pmbot"): + for i, e in AST_PLUGINS["pmbot"]: + event.client.remove_event_handler(i) + for i, e in AST_PLUGINS["pmbot"]: + event.client.add_event_handler(i, events.NewMessage(**e)) + await event.edit( + "Done! Now u Can Chat With People Via This Bot", + buttons=[Button.inline("« Bᴀᴄᴋ", data="cbs_chatbot")], + ) + + +@callback("ofchbot", owner=True) +async def chon(event): + var = "PMBOT" + await setit(event, var, "False") + if AST_PLUGINS.get("pmbot"): + for i, e in AST_PLUGINS["pmbot"]: + event.client.remove_event_handler(i) + await event.edit( + "Done! Chat People Via This Bot Stopped.", + buttons=[Button.inline("« Bᴀᴄᴋ", data="cbs_chatbot")], + ) + + +@callback("inli_pic", owner=True) +async def media(event): + await event.delete() + pru = event.sender_id + var = "INLINE_PIC" + name = "Inline Media" + async with event.client.conversation(pru) as conv: + await conv.send_message( + "**Inline Media**\nSend me a pic/gif/ or link to set as inline media.\n\nUse /cancel to terminate the operation.", + ) + response = await conv.get_response() + try: + themssg = response.message + if themssg == "/cancel": + return await conv.send_message( + "Operation cancelled!!", + buttons=get_back_button("setter"), + ) + except BaseException as er: + LOGS.exception(er) + media = await event.client.download_media(response, "inlpic") + if ( + not (response.text).startswith("/") + and response.text != "" + and (not response.media or isinstance(response.media, MessageMediaWebPage)) + ): + url = text_to_url(response) + else: + try: + x = upl(media) + url = f"https://graph.org/{x[0]}" + remove(media) + except BaseException as er: + LOGS.exception(er) + return await conv.send_message( + "Terminated.", + buttons=get_back_button("setter"), + ) + await setit(event, var, url) + await conv.send_message( + f"{name} has been set.", + buttons=get_back_button("setter"), + ) + + +FD_MEDIA = {} + + +@callback(re.compile("fd(.*)"), owner=True) +async def fdroid_dler(event): + uri = event.data_match.group(1).decode("utf-8") + if FD_MEDIA.get(uri): + return await event.edit(file=FD_MEDIA[uri]) + await event.answer("• Starting Download •", alert=True) + await event.edit("• Downloading.. •") + URL = f"https://f-droid.org/packages/{uri}" + conte = await async_searcher(URL, re_content=True) + BSC = bs(conte, "html.parser", from_encoding="utf-8") + dl_ = BSC.find("p", "package-version-download").find("a")["href"] + title = BSC.find("h3", "package-name").text.strip() + thumb = BSC.find("img", "package-icon")["src"] + if thumb.startswith("/"): + thumb = f"https://f-droid.org{thumb}" + thumb, _ = await fast_download(thumb, filename=f"{uri}.png") + s_time = time.time() + file, _ = await fast_download( + dl_, + filename=f"{title}.apk", + progress_callback=lambda d, t: asyncio.get_event_loop().create_task( + progress( + d, + t, + event, + s_time, + "Downloading...", + ) + ), + ) + + time.time() + n_file = await event.client.fast_uploader( + file, show_progress=True, event=event, message="Uploading...", to_delete=True + ) + buttons = Button.switch_inline("Search Back", query="fdroid", same_peer=True) + try: + msg = await event.edit( + f"**• [{title}]({URL}) •**", file=n_file, thumb=thumb, buttons=buttons + ) + except Exception as er: + LOGS.exception(er) + try: + msg = await event.client.edit_message( + await event.get_input_chat(), + event.message_id, + f"**• [{title}]({URL}) •**", + buttons=buttons, + thumb=thumb, + file=n_file, + ) + except Exception as er: + os.remove(thumb) + LOGS.exception(er) + return await event.edit(f"**ERROR**: `{er}`", buttons=buttons) + if msg and hasattr(msg, "media"): + FD_MEDIA.update({uri: msg.media}) + os.remove(thumb) diff --git a/core/__init__.py b/core/__init__.py index b60edc729d..9ba45b40e4 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -6,9 +6,7 @@ # . import sys -import telethonpatch # pylint: disable=unused-import - import time from .config import Var from .setup import * @@ -59,4 +57,4 @@ SUDO_HNDLR = udB.get_key("SUDO_HNDLR") or HNDLR for _ in ["HNDLR", "DUAL_HNDLR"]: - udB.on(_, "change", update_handlers) \ No newline at end of file + udB.on(_, "change", update_handlers) diff --git a/core/__main__.py b/core/__main__.py index 07f4570007..557067fcd9 100644 --- a/core/__main__.py +++ b/core/__main__.py @@ -14,7 +14,7 @@ from utilities.helper import bash, time_formatter, check_update from .utils.funcs import process_main, load_plugins - +from telethon.errors import SessionRevokedError # Option to Auto Update On Restarts.. # TODO: UPDATE_ON_RESTART @@ -50,5 +50,10 @@ ---------------------------------------------------------------------- """ ) +try: + asst.run() +except SessionRevokedError: + LOGS.info(f"Assistant [@{asst.me.username}]'s session was revoked!") -asst.run() + # shift loop to bot + ultroid_bot.run() diff --git a/core/client/BaseClient.py b/core/client/BaseClient.py index dccece56a8..a1d18e6ab8 100644 --- a/core/client/BaseClient.py +++ b/core/client/BaseClient.py @@ -188,7 +188,8 @@ async def fast_downloader(self, file, **kwargs): try: if isinstance(file.attributes[-1], DocumentAttributeFilename): filename = file.attributes[-1].file_name - except IndexError: + assert filename != None + except (IndexError, AssertionError): mimetype = file.mime_type filename = ( mimetype.split("/")[0] @@ -198,7 +199,7 @@ async def fast_downloader(self, file, **kwargs): ) message = kwargs.get("message", f"Downloading {filename}...") dirname = os.path.dirname(filename) - if not os.path.exists(dirname): + if dirname and not os.path.exists(dirname): os.mkdir(dirname) raw_file = None while not raw_file: diff --git a/core/decorators/__init__.py b/core/decorators/__init__.py index eb6d474db9..e41c19e34c 100644 --- a/core/decorators/__init__.py +++ b/core/decorators/__init__.py @@ -46,15 +46,4 @@ def fullsudos(): fullsudos.append(owner) return list(map(_parse, filter(lambda id: id, fullsudos))) - -# ------------------------------------------------ # - - -# TODO: What does this do?: -def append_or_update(load, func, name, arggs): - if isinstance(load, list): - return load.append(func) - if isinstance(load, dict): - if load.get(name): - return load[name].append((func, arggs)) - return load.update({name: [(func, arggs)]}) +# ------------------------------------------------ # \ No newline at end of file diff --git a/core/decorators/_decorators.py b/core/decorators/_decorators.py index 5fdf324bbe..752e01077b 100644 --- a/core/decorators/_decorators.py +++ b/core/decorators/_decorators.py @@ -76,7 +76,7 @@ def ultroid_cmd(pattern=None, manager=False, asst=asst, **kwargs): admins_only = kwargs.get("admins_only", False) fullsudo = kwargs.get("fullsudo", False) only_devs = kwargs.get("only_devs", False) -# cmd_key = kwargs.get("cmds_key") + # cmd_key = kwargs.get("cmds_key") func = kwargs.get("func", lambda e: not e.via_bot_id) def decor(dec): @@ -122,8 +122,7 @@ async def wrapp(ult: Message): udB.get_config("LOG_CHANNEL"), f"`FloodWaitError:\n{str(fwerr)}\n\nSleeping for {tf((fwerr.seconds + 10)*1000)}`", ) - await ultroid_bot.disconnect() - await asyncio.sleep(fwerr.seconds + 10) + time.sleep(fwerr.seconds + 10) await ultroid_bot.connect() await asst.send_message( udB.get_config("LOG_CHANNEL"), @@ -216,7 +215,8 @@ async def wrapp(ult: Message): parse_mode="html", ) await ultr.edit( - f"[An error occurred]", parse_mode="html" + f"[An error occurred]", + parse_mode="html", ) except Exception as er: LOGS.error(f"Error while pasting exception on graph: {er}") @@ -259,7 +259,11 @@ async def wrapp(ult: Message): if TAKE_EDITS: def func_(x): - return (x.out or x.sender_id == ultroid_bot.me.id) and not x.via_bot_id and not (x.is_channel and x.chat.broadcast) + return ( + (x.out or x.sender_id == ultroid_bot.me.id) + and not x.via_bot_id + and not (x.is_channel and x.chat.broadcast) + ) ultroid_bot.add_handler( wrapp, diff --git a/core/decorators/_supporter.py b/core/decorators/_supporter.py index 2b86d1238a..e296c30066 100644 --- a/core/decorators/_supporter.py +++ b/core/decorators/_supporter.py @@ -28,7 +28,7 @@ bot = borg = catub = friday = ultroid_bot -catub.cat_cmd = ultroid_cmd +catub.cat_cmd = ultroid_cmd # type: ignore black_list_chats = udB.get_key("BLACKLIST_CHATS") @@ -49,9 +49,7 @@ def admin_cmd(pattern=None, func=None, **args): friday_on_cmd = admin_cmd -command = ultroid_cmd -register = ultroid_cmd - +register = command = ultroid_cmd def sudo_cmd(allow_sudo=True, pattern=None, func=None, **args): args["func"] = lambda e: not e.via_bot_id and e.sender_id in get_sudos() and func diff --git a/core/loader.py b/core/loader.py index a62af12cba..da80faa8d5 100644 --- a/core/loader.py +++ b/core/loader.py @@ -22,8 +22,6 @@ def __load(func, plugin, key, single): try: modl = func(plugin) except ModuleNotFoundError as er: - import traceback - LOGS.info(traceback.format_exc()) LOGS.error(f"{plugin}: '{er.name}' not installed!") return except Exception as exc: diff --git a/core/remote.py b/core/remote.py index e1f81c5cb8..cc760868c0 100644 --- a/core/remote.py +++ b/core/remote.py @@ -15,6 +15,7 @@ class Remote: REMOTE_URL = Var.REMOTE_URI or "https://plugins.xditya.me" MAX_HR = 1 + DEF_CONFIG = {"plugins": {}, "helpers": {}, "manager": {}} def __init__(self) -> None: self._modules = {} @@ -23,9 +24,13 @@ def __init__(self) -> None: if os.path.exists(LOCK_PATH): with open(LOCK_PATH, "r") as file: - self.RemoteConfig: dict = json.load(file) + try: + self.RemoteConfig: dict = json.load(file) + except json.decoder.JSONDecodeError: + Logger.error("Failed to decode ultroid lock file, creating new...") + self.RemoteConfig = self.DEF_CONFIG else: - self.RemoteConfig = {"plugins": {}, "helpers": {}, "manager": {}} + self.RemoteConfig = self.DEF_CONFIG def _http_import(self, path: str, save_as=None, helper=False, manager=False): if not save_as: @@ -126,8 +131,8 @@ def __install_deps(self, deps: list): self._deps.append(dep) for prc in proc: prc.wait(timeout=10000) - if prc.stderr: - Logger.error(prc.stderr) + if err:= prc.stderr.read(): + Logger.error(err) async def get_all_plugins(self, end): return await fetch(f"{self.REMOTE_URL}/{end}", re_json=True) @@ -174,6 +179,9 @@ def evaluate(req): return fetch_sync( f"{self.REMOTE_URL}/getlanguage/{langCode}", evaluate=evaluate ) + + async def getLanguages(self): + return await fetch(f"{self.REMOTE_URL}/getlanguage", re_json=True) def save(self): with open(LOCK_PATH, "w") as file: diff --git a/core/utils/__init__.py b/core/utils/__init__.py index 7ee05d276d..5aacaecfc8 100644 --- a/core/utils/__init__.py +++ b/core/utils/__init__.py @@ -5,12 +5,14 @@ def isMultiClient(): if getArg := list(filter(re.compile("--run=(.*)").match, sys.argv)): runCode = getArg[0].split("=")[-1] else: - return + return startMultiClient() _session = getattr(Config, f"SESSION{runCode}") _db = _get_db(runCode) + _botToken = getattr(Config, f"BOT_TOKEN{runCode}") + if not (_db and _session): return - return runCode, _session + return runCode, _session, _botToken def _get_db(count): diff --git a/core/utils/funcs.py b/core/utils/funcs.py index 031a80a848..7c8ed5db12 100644 --- a/core/utils/funcs.py +++ b/core/utils/funcs.py @@ -1,5 +1,5 @@ import asyncio -import os +import os, sys import time from core import LOGS, asst, udB, ultroid_bot @@ -22,6 +22,10 @@ async def onNewPlugin(ult): PluginChannel[ult.chat_id][ult.id] = file LOGS.debug(f"Loaded new plugin {file} from {ult.chat_id}") + from modules.basic._help import _cache + if _cache.get("addons"): + del _cache["addons"] + async def onPluginDel(ult): chat = ult.chat_id @@ -99,6 +103,11 @@ def setup_addons(): async def load_plugins(): + # TODO: REMOVE + if "no-addons" in sys.argv: + load(path=["modules/basic"]) + return + # GET: Addons plugins plugins = None @@ -142,12 +151,12 @@ async def fetch_all(end="getallplugins", folder="addons", **kwargs): with rm.get("pmbot", helper=True, dispose=True): LOGS.info("Loaded PMBOT.") - if udB.get_config("VCBOT"): - try: - with rm.get("setup_vcbot", helper=True, dispose=True) as mod: - await mod.setup() - except Exception as er: - LOGS.exception(er) + # if udB.get_config("VCBOT"): + # try: + # with rm.get("setup_vcbot", helper=True, dispose=True) as mod: + # await mod.setup() + # except Exception as er: + # LOGS.exception(er) if not udB.get_key("INIT_DEPLOY"): udB.set_key("INIT_DEPLOY", True) diff --git a/database/helpers/botchat_db.py b/database/helpers/botchat_db.py deleted file mode 100644 index 71d6a6ec51..0000000000 --- a/database/helpers/botchat_db.py +++ /dev/null @@ -1,29 +0,0 @@ -# Ultroid - UserBot -# Copyright (C) 2020-2023 TeamUltroid -# -# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > -# PLease read the GNU Affero General Public License in -# . - - -from core import udB - - -def get_stuff(): - return udB.get_key("BOTCHAT") or {} - - -def tag_add(msg, chat, user): - ok = get_stuff() - if not ok.get("TAG"): - ok.update({"TAG": {msg: [chat, user]}}) - else: - ok["TAG"].update({msg: [chat, user]}) - return udB.set_key("BOTCHAT", ok) - - -def who_tag(msg): - ok = get_stuff() - if ok.get("TAG") and ok["TAG"].get(msg): - return ok["TAG"][msg] - return False, False diff --git a/database/initialize/base_db.py b/database/initialize/base_db.py index d99970a5c7..f73b2ff8a6 100644 --- a/database/initialize/base_db.py +++ b/database/initialize/base_db.py @@ -67,12 +67,14 @@ def on(self, key, method, handler, *args, **kwargs): self._handlers[key] = {} self._handlers[key][method] = (handler, args, kwargs) - def set_key(self, key, value): + def set_key(self, key, value, only_cache=False): value = self._get_data(data=value) self._cache[key] = value with suppress(KeyError): handler, arg, kwargs = self._handlers[key]["change"] handler(key, value, self.get_key(key), *arg, **kwargs) + if only_cache: + return return self.set(str(key), str(value)) def rename(self, key1, key2): diff --git a/heroku.yml b/heroku.yml index 06f0fb7467..5c4139b20e 100644 --- a/heroku.yml +++ b/heroku.yml @@ -1,3 +1,3 @@ build: docker: - ultroid: Dockerfile + ultroid: Dockerfile \ No newline at end of file diff --git a/modules/__init__.py b/modules/__init__.py index f3e03674d8..b0c4b6344e 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -5,6 +5,7 @@ # PLease read the GNU Affero General Public License in # . +import shutil from random import choice from telethon import Button, events @@ -30,9 +31,12 @@ def inline_pic(get=False): return INLINE_PIC # is False, return None +udB.on("LOAD_ALL", "delete", lambda: shutil.rmtree("modules/addons")) List = [] Dict = {} +# Credentials variable for saving login credentials(Like Gdrive,OneDrive,etc. login credentials) in local +creds = {} # Chats, which needs to be ignore for some cases # Considerably, there can be many diff --git a/modules/assistant/start.py b/modules/assistant/start.py index cffe0ad676..6aac608a55 100644 --- a/modules/assistant/start.py +++ b/modules/assistant/start.py @@ -1,18 +1,18 @@ # Ultroid - UserBot -# Copyright (C) 2021-2022 TeamUltroid +# Copyright (C) 2021-2023 TeamUltroid # # This file is a part of < https://github.com/TeamUltroid/Ultroid/ > # PLease read the GNU Affero General Public License in # . -import contextlib +import contextlib, re from datetime import datetime from telethon import Button, events from telethon.errors.rpcerrorlist import MessageDeleteForbiddenError from telethon.utils import get_display_name -from core import LOGS, ultroid_bot, HNDLR +from core import LOGS, ultroid_bot, HNDLR, rm from core.decorators import fullsudos, owner_and_sudos from core.version import version from database import udB @@ -56,26 +56,10 @@ def get_start_message(): return Owner_info_msg, _custom -_settings = [ - [ - Button.inline("API Kᴇʏs", data="cbs_apiset"), - Button.inline("Pᴍ Bᴏᴛ", data="cbs_chatbot"), - ], - [ - Button.inline("Aʟɪᴠᴇ", data="cbs_alvcstm"), - Button.inline("PᴍPᴇʀᴍɪᴛ", data="cbs_ppmset"), - ], - [ - Button.inline("Fᴇᴀᴛᴜʀᴇs", data="cbs_otvars"), - Button.inline("VC Sᴏɴɢ Bᴏᴛ", data="cbs_vcb"), - ], - [Button.inline("« Bᴀᴄᴋ", data="mainmenu")], -] - _start = [ [ Button.inline("Lᴀɴɢᴜᴀɢᴇ 🌐", data="lang"), - Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"), +# Button.inline("Sᴇᴛᴛɪɴɢs ⚙️", data="setter"), ], [ Button.inline("Sᴛᴀᴛs ✨", data="stat"), @@ -149,10 +133,12 @@ async def ultroid_handler(event): else: name = get_display_name(event.sender) if args == "set": + """ await event.reply( "Choose from the below options -", buttons=_settings, ) + """ return elif args == "_manager": with contextlib.suppress(ImportError): @@ -177,7 +163,7 @@ async def ekekdhdb(e): @callback("mainmenu", owner=True, func=lambda x: not x.is_group) async def ultroid(event): await event.edit( - get_string("ast_3").format(ultroid_bot.full_name), + get_string("ast_3").format(get_display_name(event.sender)), buttons=_start, ) @@ -225,18 +211,66 @@ async def bdcast(event): ) +""" + +_settings = [ + [ + Button.inline("API Kᴇʏs", data="cbs_apiset"), + Button.inline("Pᴍ Bᴏᴛ", data="cbs_chatbot"), + ], + [ + Button.inline("Aʟɪᴠᴇ", data="cbs_alvcstm"), + Button.inline("PᴍPᴇʀᴍɪᴛ", data="cbs_ppmset"), + ], + [ + Button.inline("Fᴇᴀᴛᴜʀᴇs", data="cbs_otvars"), + Button.inline("VC Sᴏɴɢ Bᴏᴛ", data="cbs_vcb"), + ], + [Button.inline("« Bᴀᴄᴋ", data="mainmenu")], +] + + @callback("setter", owner=True) async def setting(event): await event.edit( "Choose from the below options -", buttons=_settings, ) +""" + +@callback("lang", owner=True) +async def setlang(event): + languages = await rm.getLanguages() + tultd = [ + Button.inline( + f"{languages[ult]['name']} [{ult.lower()}]", + data=f"set_{ult}", + ) + for ult in languages + ] + buttons = list(zip(tultd[::2], tultd[1::2])) + if len(tultd) % 2 == 1: + buttons.append((tultd[-1],)) + buttons.append([Button.inline("« Back", data="mainmenu")]) + await event.edit(get_string("ast_4"), buttons=buttons) + + +@callback(re.compile(b"set_(.*)"), owner=True) +async def settt(event): + lang = event.data_match.group(1).decode("UTF-8") + languages = await rm.getLanguages() + udB.del_key("language") if lang == "en" else udB.set_key("language", lang) + await event.edit( + f"Your language has been set to {languages[lang]['name']} [{lang}].", + buttons=get_back_button("lang"), + ) @callback("tz", owner=True) async def timezone_(event): from pytz import timezone await event.delete() + pru = event.sender_id var = "TIMEZONE" name = "Timezone" diff --git a/modules/basic/_help.py b/modules/basic/_help.py index 2565fdfa82..496edc5117 100644 --- a/modules/basic/_help.py +++ b/modules/basic/_help.py @@ -24,7 +24,9 @@ def split_list(List, index): def get_help_buttons(): row_1 = [Button.inline(get_string("help_4"), data="uh_basic_")] - if udB.get_config("ADDONS") or udB.get_key("LOAD_ALL"): + if filter_modules( + "addons" + ): # (udB.get_config("ADDONS") or udB.get_key("LOAD_ALL")) row_1.append(Button.inline(get_string("help_5"), data="uh_addons_")) row_2 = [] if udB.get_config("VCBOT"): @@ -45,17 +47,16 @@ def get_help_buttons(): row_2.insert(0, button) else: Markup.append([button]) - Markup.extend( - [ - [ - Button.inline(get_string("help_8"), data="ownr"), - Button.url( - get_string("help_9"), - url=f"https://t.me/{asst.me.username}?start=set", - ), - ], - [Button.inline(get_string("help_10"), data="close")], - ] + settingButton = Button.url( + get_string("help_9"), + url=f"https://t.me/{asst.me.username}?start=set", + ) + if len(row_2) == 1: + row_2.append(settingButton) + else: + Markup.append([settingButton]) + Markup.append( + [Button.inline(get_string("help_10"), data="close")], ) if row_2 and row_2 not in Markup: Markup.insert(1, row_2) @@ -86,7 +87,7 @@ def get_doc_from_module(name, type=""): if mod := _get_module(name, type): if not mod.__doc__: return get_from_funcs(mod, name) - msg = f"Commands available in `{name}`-\n" + msg = f"Commands available in `{name}`-\n\n" msg += mod.__doc__.format(i=HNDLR) msg += "\n ©️ @TeamUltroid" return msg @@ -104,9 +105,9 @@ def get_from_funcs(mod, name): ) if not funcs: return False - msg = f"Command available in `{name}`-\n" + msg = f"Command available in `{name}` -" for cmd in funcs: - msg += f"\n• `{HNDLR}{cmd[0][:-5]}`\n - {cmd[1].__doc__}\n" + msg += f"\n\n• {cmd[1].__doc__.format(*list(HNDLR*len(funcs)))}" msg += "\n ©️ @TeamUltroid" return msg @@ -235,16 +236,24 @@ def _get_buttons(key, index): cols = udB.get_key("HELP_COLUMNS") or 2 emoji = udB.get_key("EMOJI_IN_HELP") or "✘" loaded = filter_modules(key) - List = [ - Button.inline(f"{emoji} {x} {emoji}", data=f"uplugin_{key}_{x}|{index}") - for x in loaded - ] - all_ = split_list(List, cols) - fl_ = split_list(all_, rows) + cindex = 0 + NList = [] + tl = rows * cols + for plugs in split_list(loaded, tl): + MList = [] + for ps in split_list(plugs, rows): + for p in ps: + MList.append( + Button.inline( + f"{emoji} {p} {emoji}", data=f"uplugin_{key}_{p}|{cindex}" + ) + ) + NList.append(split_list(MList, cols)) + cindex += 1 if _cache.get("help") is None: _cache["help"] = {} - _cache["help"][key] = fl_ - return fl_ + _cache["help"][key] = NList + return NList def page_num(index, key): @@ -259,9 +268,8 @@ def page_num(index, key): if index == 0 and len(fl_) == 1: new_.append([Button.inline("« Bᴀᴄᴋ »", data="open")]) else: - more = len(fl_) > 3 - - nrow = [ + new_.append( + [ Button.inline( "« Pʀᴇᴠɪᴏᴜs", data=f"uh_{key}_{index-1}", @@ -272,12 +280,8 @@ def page_num(index, key): data=f"uh_{key}_{index+1}", ), ] - - if more: + ) - nrow.insert(0, Button.inline("«", f"uh_{key}_{index-2}")) - nrow.append(Button.inline("»", f"uh_{key}_{index+2}")) - new_.append(nrow) return new_ diff --git a/modules/basic/admins.py b/modules/basic/admins.py index a10823ccff..efcaf6554d 100644 --- a/modules/basic/admins.py +++ b/modules/basic/admins.py @@ -1,41 +1,13 @@ # Ultroid - UserBot -# Copyright (C) 2021-2022 TeamUltroid +# Copyright (C) 2021-2023 TeamUltroid # # This file is a part of < https://github.com/TeamUltroid/Ultroid/ > # PLease read the GNU Affero General Public License in # . -""" -✘ Commands Available - - -• `.promote ` - -• `.demote` - Promote/Demote the user in the chat. - -• `.ban ` -• `.unban`\n Ban/Unban the user from the chat. - -• `.kick ` - Kick the user from the chat. - -• `.pin ` - Pin the message in the chat -• `.tpin