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