diff --git a/plugins/__init__.py b/plugins/__init__.py deleted file mode 100644 index 45d1e4d76d93978bf394c0da906e3c286ea1bfe9..0000000000000000000000000000000000000000 --- a/plugins/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ -# Ultroid - UserBot -# 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 asyncio -import os -import time -from random import choice - -import requests -from telethon import Button, events -from telethon.tl import functions, types # pylint:ignore -from telethon.tl.custom.message import CustomMarkdown - -from pyUltroid import * -from pyUltroid._misc._assistant import asst_cmd, callback, in_pattern -from pyUltroid._misc._decorators import ultroid_cmd -from pyUltroid._misc._wrappers import eod, eor -from pyUltroid.dB import DEVLIST, ULTROID_IMAGES -from pyUltroid.fns.helper import * -from pyUltroid.fns.misc import * -from pyUltroid.fns.tools import * -from pyUltroid.startup._database import _BaseDatabase as Database -from pyUltroid.version import __version__, ultroid_version -from strings import get_help, get_string - -udB: Database - -Redis = udB.get_key -con = TgConverter -quotly = Quotly() -OWNER_NAME = ultroid_bot.full_name -OWNER_ID = ultroid_bot.uid - -ultroid_bot: UltroidClient -asst: UltroidClient - -LOG_CHANNEL = udB.get_key("LOG_CHANNEL") - -ultroid_bot.parse_mode = CustomMarkdown() - -def inline_pic(): - INLINE_PIC = udB.get_key("INLINE_PIC") - if INLINE_PIC is None: - INLINE_PIC = choice(ULTROID_IMAGES) - elif INLINE_PIC == False: - INLINE_PIC = None - return INLINE_PIC - - -Telegraph = telegraph_client() - -List = [] -Dict = {} -InlinePlugin = {} -N = 0 -cmd = ultroid_cmd -STUFF = {} - -# Chats, which needs to be ignore for some cases -# Considerably, there can be many -# Feel Free to Add Any other... - -NOSPAM_CHAT = [ - -1001361294038, # UltroidSupportChat - -1001387666944, # PyrogramChat - -1001109500936, # TelethonChat - -1001050982793, # Python - -1001256902287, # DurovsChat - -1001473548283, # SharingUserbot -] - -KANGING_STR = [ - "Using Witchery to kang this sticker...", - "Plagiarising hehe...", - "Inviting this sticker over to my pack...", - "Kanging this sticker...", - "Hey that's a nice sticker!\nMind if I kang?!..", - "Hehe me stel ur stiker...", - "Ay look over there (☉。☉)!→\nWhile I kang this...", - "Roses are red violets are blue, kanging this sticker so my pack looks cool", - "Imprisoning this sticker...", - "Mr.Steal-Your-Sticker is stealing this sticker... ", -] - -ATRA_COL = [ - "DarkCyan", - "DeepSkyBlue", - "DarkTurquoise", - "Cyan", - "LightSkyBlue", - "Turquoise", - "MediumVioletRed", - "Aquamarine", - "Lightcyan", - "Azure", - "Moccasin", - "PowderBlue", -] diff --git a/plugins/_chatactions.py b/plugins/_chatactions.py deleted file mode 100644 index be6379a6c2c673b4134f842a8935321ef95c5a9d..0000000000000000000000000000000000000000 --- a/plugins/_chatactions.py +++ /dev/null @@ -1,350 +0,0 @@ -# Ultroid - UserBot -# 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 asyncio - -from telethon import events -from telethon.errors.rpcerrorlist import UserNotParticipantError -from telethon.tl.functions.channels import GetParticipantRequest -from telethon.utils import get_display_name - -from pyUltroid.dB import stickers -from pyUltroid.dB.echo_db import check_echo -from pyUltroid.dB.forcesub_db import get_forcesetting -from pyUltroid.dB.gban_mute_db import is_gbanned -from pyUltroid.dB.greetings_db import get_goodbye, get_welcome, must_thank -from pyUltroid.dB.nsfw_db import is_profan -from pyUltroid.fns.helper import check_reply_to, inline_mention -from pyUltroid.fns.tools import ( - async_searcher, - create_tl_btn, - get_chatbot_reply, - get_oracle_reply, -) - -try: - from ProfanityDetector import detector -except ImportError: - detector = None -from . import LOG_CHANNEL, LOGS, asst, get_string, types, udB, ultroid_bot -from ._inline import something - -if not udB.get_key("ORACLE_USERS"): - udB.set_key("ORACLE_USERS", {}) -if not udB.get_key("CHATBOT_USERS"): - udB.set_key("CHATBOT_USERS", {}) - -@ultroid_bot.on(events.ChatAction()) -async def Function(event): - try: - await DummyHandler(event) - except Exception as er: - LOGS.exception(er) - - -async def DummyHandler(ult): - # clean chat actions - key = udB.get_key("CLEANCHAT") or [] - if ult.chat_id in key: - try: - await ult.delete() - except BaseException: - pass - - # thank members - if must_thank(ult.chat_id): - chat_count = (await ult.client.get_participants(ult.chat_id, limit=0)).total - if chat_count % 100 == 0: - stik_id = chat_count / 100 - 1 - sticker = stickers[stik_id] - await ult.respond(file=sticker) - # force subscribe - if ( - udB.get_key("FORCESUB") - and ((ult.user_joined or ult.user_added)) - and get_forcesetting(ult.chat_id) - ): - user = await ult.get_user() - if not user.bot: - joinchat = get_forcesetting(ult.chat_id) - try: - await ultroid_bot(GetParticipantRequest(int(joinchat), user.id)) - except UserNotParticipantError: - await ultroid_bot.edit_permissions( - ult.chat_id, user.id, send_messages=False - ) - res = await ultroid_bot.inline_query( - asst.me.username, f"fsub {user.id}_{joinchat}" - ) - await res[0].click(ult.chat_id, reply_to=ult.action_message.id) - - if ult.user_joined or ult.added_by: - user = await ult.get_user() - chat = await ult.get_chat() - # gbans and @UltroidBans checks - if udB.get_key("ULTROID_BANS"): - try: - is_banned = await async_searcher( - "https://bans.ultroid.tech/api/status", - json={"userId": user.id}, - post=True, - re_json=True, - ) - if is_banned["is_banned"]: - await ult.client.edit_permissions( - chat.id, - user.id, - view_messages=False, - ) - await ult.respond( - f'**@UltroidBans:** Banned user detected and banned!\n`{str(is_banned)}`.\nBan reason: {is_banned["reason"]}', - ) - - except BaseException: - pass - reason = is_gbanned(user.id) - if reason and chat.admin_rights: - try: - await ult.client.edit_permissions( - chat.id, - user.id, - view_messages=False, - ) - gban_watch = get_string("can_1").format(inline_mention(user), reason) - await ult.reply(gban_watch) - except Exception as er: - LOGS.exception(er) - - # greetings - elif get_welcome(ult.chat_id): - user = await ult.get_user() - chat = await ult.get_chat() - title = chat.title or "this chat" - count = ( - chat.participants_count - or (await ult.client.get_participants(chat, limit=0)).total - ) - mention = inline_mention(user) - name = user.first_name - fullname = get_display_name(user) - uu = user.username - username = f"@{uu}" if uu else mention - wel = get_welcome(ult.chat_id) - msgg = wel["welcome"] - med = wel["media"] or None - userid = user.id - msg = None - if msgg: - msg = msgg.format( - mention=mention, - group=title, - count=count, - name=name, - fullname=fullname, - username=username, - userid=userid, - ) - if wel.get("button"): - btn = create_tl_btn(wel["button"]) - await something(ult, msg, med, btn) - elif msg: - send = await ult.reply( - msg, - file=med, - ) - await asyncio.sleep(150) - await send.delete() - else: - await ult.reply(file=med) - elif (ult.user_left or ult.user_kicked) and get_goodbye(ult.chat_id): - user = await ult.get_user() - chat = await ult.get_chat() - title = chat.title or "this chat" - count = ( - chat.participants_count - or (await ult.client.get_participants(chat, limit=0)).total - ) - mention = inline_mention(user) - name = user.first_name - fullname = get_display_name(user) - uu = user.username - username = f"@{uu}" if uu else mention - wel = get_goodbye(ult.chat_id) - msgg = wel["goodbye"] - med = wel["media"] - userid = user.id - msg = None - if msgg: - msg = msgg.format( - mention=mention, - group=title, - count=count, - name=name, - fullname=fullname, - username=username, - userid=userid, - ) - if wel.get("button"): - btn = create_tl_btn(wel["button"]) - await something(ult, msg, med, btn) - elif msg: - send = await ult.reply( - msg, - file=med, - ) - await asyncio.sleep(150) - await send.delete() - else: - await ult.reply(file=med) - - -@ultroid_bot.on(events.NewMessage(incoming=True)) -async def chatBot_replies(e): - if e.sender_id in udB.get_key("CHATBOT_USERS"): - xxrep = await check_reply_to(e) - else: - return - - if xxrep: - sender = await e.get_sender() - if not isinstance(sender, types.User) or sender.bot: - return - if check_echo(e.chat_id, e.sender_id): - try: - await e.respond(e.message) - except Exception as er: - LOGS.exception(er) - key = udB.get_key("CHATBOT_USERS") or {} - if e.text and key.get(e.chat_id) and sender.id in key[e.chat_id]: - # Simulate typing indicator - async with e.client.action(e.chat_id, "typing"): - msg = await get_chatbot_reply(e.message.message) - if msg: - sleep = udB.get_key("CHATBOT_SLEEP") or 1.5 - await asyncio.sleep(sleep) - - # Check if the message length exceeds a certain threshold - if len(msg) > 4096: - # Create a temporary text file - with tempfile.NamedTemporaryFile( - mode="w+", delete=False - ) as temp_file: - temp_file.write(msg) - - # Send the text file with a caption - await e.client.send_file( - e.chat_id, - temp_file.name, - caption="Here is the response in a text file.", - ) - - # Delete the temporary text file - os.remove(temp_file.name) - else: - # Send the message directly - await e.reply(msg) - - chat = await e.get_chat() - if e.is_group and sender.username: - await uname_stuff(e.sender_id, sender.username, sender.first_name) - elif e.is_private and chat.username: - await uname_stuff(e.sender_id, chat.username, chat.first_name) - if detector and is_profan(e.chat_id) and e.text: - x, y = detector(e.text) - if y: - await e.delete() - - -@ultroid_bot.on(events.NewMessage(incoming=True)) -async def oracleBot_replies(e): - if e.sender_id in udB.get_key("ORACLE_USERS"): - xxxrep = await check_reply_to(e) - else: - return - - if xxxrep: - sender = await e.get_sender() - if not isinstance(sender, types.User) or sender.bot: - return - if check_echo(e.chat_id, e.sender_id): - try: - await e.respond(e.message) - except Exception as er: - LOGS.exception(er) - key = udB.get_key("ORACLE_USERS") or {} - if e.text and key.get(e.chat_id) and sender.id in key[e.chat_id]: - # Simulate typing indicator - async with e.client.action(e.chat_id, "typing"): - msg = await get_oracle_reply( - e.message.message, user_id=sender.id, mongo_url=MONGO_URI - ) - if msg: - sleep = udB.get_key("ORACLE_SLEEP") or 1.5 - await asyncio.sleep(sleep) - - # Check if the message length exceeds a certain threshold - if len(msg) > 4096: - # Create a temporary text file - with tempfile.NamedTemporaryFile( - mode="w+", delete=False - ) as temp_file: - temp_file.write(msg) - - # Send the text file with a caption - await e.client.send_file( - e.chat_id, - temp_file.name, - caption="Here is the response in a text file", - ) - - # Delete the temporary text file - os.remove(temp_file.name) - else: - # Send the message directly - await e.reply(msg) - - chat = await e.get_chat() - if e.is_group and sender.username: - await uname_stuff(e.sender_id, sender.username, sender.first_name) - elif e.is_private and chat.username: - await uname_stuff(e.sender_id, chat.username, chat.first_name) - if detector and is_profan(e.chat_id) and e.text: - x, y = detector(e.text) - if y: - await e.delete() - - -@ultroid_bot.on(events.Raw(types.UpdateUserName)) -async def uname_change(e): - await uname_stuff(e.user_id, e.usernames[0] if e.usernames else None, e.first_name) - - -async def uname_stuff(id, uname, name): - if udB.get_key("USERNAME_LOG"): - old_ = udB.get_key("USERNAME_DB") or {} - old = old_.get(id) - # Ignore Name Logs - if old and old == uname: - return - if old and uname: - await asst.send_message( - LOG_CHANNEL, - get_string("can_2").format(old, uname), - ) - elif old: - await asst.send_message( - LOG_CHANNEL, - get_string("can_3").format(f"[{name}](tg://user?id={id})", old), - ) - elif uname: - await asst.send_message( - LOG_CHANNEL, - get_string("can_4").format(f"[{name}](tg://user?id={id})", uname), - ) - - old_[id] = uname - udB.set_key("USERNAME_DB", old_) diff --git a/plugins/_help.py b/plugins/_help.py deleted file mode 100644 index b36101e7f5d5769f2c309797905e265bdc7e8f1a..0000000000000000000000000000000000000000 --- a/plugins/_help.py +++ /dev/null @@ -1,136 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from telethon.errors.rpcerrorlist import ( - BotInlineDisabledError, - BotMethodInvalidError, - BotResponseTimeoutError, -) -from telethon.tl.custom import Button - -from pyUltroid.dB._core import HELP, LIST -from pyUltroid.fns.tools import cmd_regex_replace - -from . import HNDLR, LOGS, OWNER_NAME, asst, get_string, inline_pic, udB, ultroid_cmd - -_main_help_menu = [ - [ - Button.inline(get_string("help_4"), data="uh_Official_"), - Button.inline(get_string("help_5"), data="uh_Addons_"), - ], - [ - Button.inline(get_string("help_6"), data="uh_VCBot_"), - Button.inline(get_string("help_7"), data="inlone"), - ], - [ - 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")], -] - - -@ultroid_cmd(pattern="help( (.*)|$)") -async def _help(ult): - plug = ult.pattern_match.group(1).strip() - chat = await ult.get_chat() - if plug: - try: - if plug in HELP["Official"]: - output = f"**Plugin** - `{plug}`\n" - for i in HELP["Official"][plug]: - output += i - output += "\n© @TeamUltroid" - await ult.eor(output) - elif HELP.get("Addons") and plug in HELP["Addons"]: - output = f"**Plugin** - `{plug}`\n" - for i in HELP["Addons"][plug]: - output += i - output += "\n© @TeamUltroid" - await ult.eor(output) - elif HELP.get("VCBot") and plug in HELP["VCBot"]: - output = f"**Plugin** - `{plug}`\n" - for i in HELP["VCBot"][plug]: - output += i - output += "\n© @TeamUltroid" - await ult.eor(output) - else: - try: - x = get_string("help_11").format(plug) - for d in LIST[plug]: - x += HNDLR + d - x += "\n" - x += "\n© @TeamUltroid" - await ult.eor(x) - except BaseException: - file = None - compare_strings = [] - for file_name in LIST: - compare_strings.append(file_name) - value = LIST[file_name] - for j in value: - j = cmd_regex_replace(j) - compare_strings.append(j) - if j.strip() == plug: - file = file_name - break - if not file: - # the enter command/plugin name is not found - text = f"`{plug}` is not a valid plugin!" - best_match = None - for _ in compare_strings: - if plug in _ and not _.startswith("_"): - best_match = _ - break - if best_match: - text += f"\nDid you mean `{best_match}`?" - return await ult.eor(text) - output = f"**Command** `{plug}` **found in plugin** - `{file}`\n" - if file in HELP["Official"]: - for i in HELP["Official"][file]: - output += i - elif HELP.get("Addons") and file in HELP["Addons"]: - for i in HELP["Addons"][file]: - output += i - elif HELP.get("VCBot") and file in HELP["VCBot"]: - for i in HELP["VCBot"][file]: - output += i - output += "\n© @TeamUltroid" - await ult.eor(output) - except BaseException as er: - LOGS.exception(er) - await ult.eor("Error 🤔 occured.") - else: - try: - results = await ult.client.inline_query(asst.me.username, "ultd") - except BotMethodInvalidError: - z = [] - for x in LIST.values(): - z.extend(x) - cmd = len(z) + 10 - if udB.get_key("MANAGER") and udB.get_key("DUAL_HNDLR") == "/": - _main_help_menu[2:3] = [[Button.inline("• Manager Help •", "mngbtn")]] - return await ult.reply( - get_string("inline_4").format( - OWNER_NAME, - len(HELP["Official"]), - len(HELP["Addons"] if "Addons" in HELP else []), - cmd, - ), - file=inline_pic(), - buttons=_main_help_menu, - ) - except BotResponseTimeoutError: - return await ult.eor( - get_string("help_2").format(HNDLR), - ) - except BotInlineDisabledError: - return await ult.eor(get_string("help_3")) - await results[0].click(chat.id, reply_to=ult.reply_to_msg_id, hide_via=True) - await ult.delete() diff --git a/plugins/_inline.py b/plugins/_inline.py deleted file mode 100644 index bcda7ee726539e975a10ad783b401be2f6677a49..0000000000000000000000000000000000000000 --- a/plugins/_inline.py +++ /dev/null @@ -1,451 +0,0 @@ -# Ultroid - UserBot -# 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 re -import time -from datetime import datetime -from os import remove - -from git import Repo -from telethon import Button -from telethon.tl.types import InputWebDocument, Message -from telethon.utils import resolve_bot_file_id - -from pyUltroid._misc._assistant import callback, in_pattern -from pyUltroid.dB._core import HELP, LIST -from pyUltroid.fns.helper import gen_chlog, time_formatter, updater -from pyUltroid.fns.misc import split_list - -from . import ( - HNDLR, - LOGS, - OWNER_NAME, - InlinePlugin, - asst, - get_string, - inline_pic, - split_list, - start_time, - udB, -) -from ._help import _main_help_menu - -# ================================================# - -helps = get_string("inline_1") - -add_ons = udB.get_key("ADDONS") - -zhelps = get_string("inline_3") if add_ons is False else get_string("inline_2") -PLUGINS = HELP.get("Official", []) -ADDONS = HELP.get("Addons", []) -upage = 0 -# ============================================# - -# --------------------BUTTONS--------------------# - -SUP_BUTTONS = [ - [ - Button.url("• Repo •", url="https://github.com/TeamUltroid/Ultroid"), - Button.url("• Support •", url="t.me/UltroidSupportChat"), - ], -] - -# --------------------BUTTONS--------------------# - - -@in_pattern(owner=True, func=lambda x: not x.text) -async def inline_alive(o): - TLINK = inline_pic() or "https://graph.org/file/74d6259983e0642923fdb.jpg" - MSG = "• **Ultroid Userbot •**" - WEB0 = InputWebDocument( - "https://graph.org/file/acd4f5d61369f74c5e7a7.jpg", 0, "image/jpg", [] - ) - RES = [ - await o.builder.article( - type="photo", - text=MSG, - include_media=True, - buttons=SUP_BUTTONS, - title="Ultroid Userbot", - description="Userbot | Telethon", - url=TLINK, - thumb=WEB0, - content=InputWebDocument(TLINK, 0, "image/jpg", []), - ) - ] - await o.answer( - RES, - private=True, - cache_time=300, - switch_pm="👥 ULTROID PORTAL", - switch_pm_param="start", - ) - - -@in_pattern("ultd", owner=True) -async def inline_handler(event): - z = [] - for x in LIST.values(): - z.extend(x) - text = get_string("inline_4").format( - OWNER_NAME, - len(HELP.get("Official", [])), - len(HELP.get("Addons", [])), - len(z), - ) - if inline_pic(): - result = await event.builder.photo( - file=inline_pic(), - link_preview=False, - text=text, - buttons=_main_help_menu, - ) - else: - result = await event.builder.article( - title="Ultroid Help Menu", text=text, buttons=_main_help_menu - ) - await event.answer([result], private=True, cache_time=300, gallery=True) - - -@in_pattern("pasta", owner=True) -async def _(event): - ok = event.text.split("-")[1] - link = f"https://spaceb.in/{ok}" - raw = f"https://spaceb.in/api/{ok}/raw" - result = await event.builder.article( - title="Paste", - text="Pasted to Spacebin 🌌", - buttons=[ - [ - Button.url("SpaceBin", url=link), - Button.url("Raw", url=raw), - ], - ], - ) - await event.answer([result]) - - -@callback("ownr", owner=True) -async def setting(event): - z = [] - for x in LIST.values(): - z.extend(x) - await event.edit( - get_string("inline_4").format( - OWNER_NAME, - len(HELP.get("Official", [])), - len(HELP.get("Addons", [])), - len(z), - ), - file=inline_pic(), - link_preview=False, - buttons=[ - [ - Button.inline("•Pɪɴɢ•", data="pkng"), - Button.inline("•Uᴘᴛɪᴍᴇ•", data="upp"), - ], - [ - Button.inline("•Stats•", data="alive"), - Button.inline("•Uᴘᴅᴀᴛᴇ•", data="doupdate"), - ], - [Button.inline("« Bᴀᴄᴋ", data="open")], - ], - ) - - -_strings = {"Official": helps, "Addons": zhelps, "VCBot": get_string("inline_6")} - - -@callback(re.compile("uh_(.*)"), owner=True) -async def help_func(ult): - key, count = ult.data_match.group(1).decode("utf-8").split("_") - if key == "VCBot" and HELP.get("VCBot") is None: - return await ult.answer(get_string("help_12"), alert=True) - elif key == "Addons" and HELP.get("Addons") is None: - return await ult.answer(get_string("help_13").format(HNDLR), alert=True) - if "|" in count: - _, count = count.split("|") - count = int(count) if count else 0 - text = _strings.get(key, "").format(OWNER_NAME, len(HELP.get(key))) - await ult.edit(text, buttons=page_num(count, key), link_preview=False) - - -@callback(re.compile("uplugin_(.*)"), owner=True) -async def uptd_plugin(event): - key, file = event.data_match.group(1).decode("utf-8").split("_") - index = None - if "|" in file: - file, index = file.split("|") - key_ = HELP.get(key, []) - hel_p = f"Plugin Name - `{file}`\n" - help_ = "" - try: - for i in key_[file]: - help_ += i - except BaseException: - if file in LIST: - help_ = get_string("help_11").format(file) - for d in LIST[file]: - help_ += HNDLR + d - help_ += "\n" - if not help_: - help_ = f"{file} has no Detailed Help!" - help_ += "\n© @TeamUltroid" - buttons = [] - if inline_pic(): - data = f"sndplug_{key}_{file}" - if index is not None: - data += f"|{index}" - buttons.append( - [ - Button.inline( - "« Sᴇɴᴅ Pʟᴜɢɪɴ »", - data=data, - ) - ] - ) - data = f"uh_{key}_" - if index is not None: - data += f"|{index}" - buttons.append( - [ - Button.inline("« Bᴀᴄᴋ", data=data), - ] - ) - try: - await event.edit(help_, buttons=buttons) - except Exception as er: - LOGS.exception(er) - help = f"Do `{HNDLR}help {key}` to get list of commands." - await event.edit(help, buttons=buttons) - - -@callback(data="doupdate", owner=True) -async def _(event): - if not await updater(): - return await event.answer(get_string("inline_9"), cache_time=0, alert=True) - if not inline_pic(): - return await event.answer(f"Do '{HNDLR}update' to update..") - repo = Repo.init() - changelog, tl_chnglog = await gen_chlog( - repo, f"HEAD..upstream/{repo.active_branch}" - ) - changelog_str = changelog + "\n\n" + get_string("inline_8") - if len(changelog_str) > 1024: - await event.edit(get_string("upd_4")) - with open("ultroid_updates.txt", "w+") as file: - file.write(tl_chnglog) - await event.edit( - get_string("upd_5"), - file="ultroid_updates.txt", - buttons=[ - [Button.inline("• Uᴘᴅᴀᴛᴇ Nᴏᴡ •", data="updatenow")], - [Button.inline("« Bᴀᴄᴋ", data="ownr")], - ], - ) - remove("ultroid_updates.txt") - else: - await event.edit( - changelog_str, - buttons=[ - [Button.inline("Update Now", data="updatenow")], - [Button.inline("« Bᴀᴄᴋ", data="ownr")], - ], - parse_mode="html", - ) - - -@callback(data="pkng", owner=True) -async def _(event): - start = datetime.now() - end = datetime.now() - ms = (end - start).microseconds - pin = f"🌋Pɪɴɢ = {ms} microseconds" - await event.answer(pin, cache_time=0, alert=True) - - -@callback(data="upp", owner=True) -async def _(event): - uptime = time_formatter((time.time() - start_time) * 1000) - pin = f"🙋Uᴘᴛɪᴍᴇ = {uptime}" - await event.answer(pin, cache_time=0, alert=True) - - -@callback(data="inlone", owner=True) -async def _(e): - _InButtons = [ - Button.switch_inline(_, query=InlinePlugin[_], same_peer=True) - for _ in list(InlinePlugin.keys()) - ] - InButtons = split_list(_InButtons, 2) - - button = InButtons.copy() - button.append( - [ - Button.inline("« Bᴀᴄᴋ", data="open"), - ], - ) - await e.edit(buttons=button, link_preview=False) - - -@callback(data="open", owner=True) -async def opner(event): - z = [] - for x in LIST.values(): - z.extend(x) - await event.edit( - get_string("inline_4").format( - OWNER_NAME, - len(HELP.get("Official", [])), - len(HELP.get("Addons", [])), - len(z), - ), - buttons=_main_help_menu, - link_preview=False, - ) - - -@callback(data="close", owner=True) -async def on_plug_in_callback_query_handler(event): - await event.edit( - get_string("inline_5"), - buttons=Button.inline("Oᴘᴇɴ Aɢᴀɪɴ", data="open"), - ) - - -def page_num(index, key): - rows = udB.get_key("HELP_ROWS") or 5 - cols = udB.get_key("HELP_COLUMNS") or 2 - loaded = HELP.get(key, []) - emoji = udB.get_key("EMOJI_IN_HELP") or "✘" - List = [ - Button.inline(f"{emoji} {x} {emoji}", data=f"uplugin_{key}_{x}|{index}") - for x in sorted(loaded) - ] - all_ = split_list(List, cols) - fl_ = split_list(all_, rows) - try: - new_ = fl_[index] - except IndexError: - new_ = fl_[0] if fl_ else [] - index = 0 - if index == 0 and len(fl_) == 1: - new_.append([Button.inline("« Bᴀᴄᴋ »", data="open")]) - else: - new_.append( - [ - Button.inline( - "« Pʀᴇᴠɪᴏᴜs", - data=f"uh_{key}_{index-1}", - ), - Button.inline("« Bᴀᴄᴋ »", data="open"), - Button.inline( - "Nᴇxᴛ »", - data=f"uh_{key}_{index+1}", - ), - ] - ) - return new_ - - -# --------------------------------------------------------------------------------- # - - -STUFF = {} - - -@in_pattern("stf(.*)", owner=True) -async def ibuild(e): - n = e.pattern_match.group(1).strip() - builder = e.builder - if not (n and n.isdigit()): - return - ok = STUFF.get(int(n)) - txt = ok.get("msg") - pic = ok.get("media") - btn = ok.get("button") - if not (pic or txt): - txt = "Hey!" - if pic: - try: - include_media = True - mime_type, _pic = None, None - cont, results = None, None - try: - ext = str(pic).split(".")[-1].lower() - except BaseException: - ext = None - if ext in ["img", "jpg", "png"]: - _type = "photo" - mime_type = "image/jpg" - elif ext in ["mp4", "mkv", "gif"]: - mime_type = "video/mp4" - _type = "gif" - else: - try: - if "telethon.tl.types" in str(type(pic)): - _pic = pic - else: - _pic = resolve_bot_file_id(pic) - except BaseException: - pass - if _pic: - results = [ - await builder.document( - _pic, - title="Ultroid Op", - text=txt, - description="@TeamUltroid", - buttons=btn, - link_preview=False, - ) - ] - else: - _type = "article" - include_media = False - if not results: - if include_media: - cont = InputWebDocument(pic, 0, mime_type, []) - results = [ - await builder.article( - title="Ultroid Op", - type=_type, - text=txt, - description="@TeamUltroid", - include_media=include_media, - buttons=btn, - thumb=cont, - content=cont, - link_preview=False, - ) - ] - return await e.answer(results) - except Exception as er: - LOGS.exception(er) - result = [ - await builder.article("Ultroid Op", text=txt, link_preview=False, buttons=btn) - ] - await e.answer(result) - - -async def something(e, msg, media, button, reply=True, chat=None): - if e.client._bot: - return await e.reply(msg, file=media, buttons=button) - num = len(STUFF) + 1 - STUFF.update({num: {"msg": msg, "media": media, "button": button}}) - try: - res = await e.client.inline_query(asst.me.username, f"stf{num}") - return await res[0].click( - chat or e.chat_id, - reply_to=bool(isinstance(e, Message) and reply), - hide_via=True, - silent=True, - ) - - except Exception as er: - LOGS.exception(er) diff --git a/plugins/_ultroid.py b/plugins/_ultroid.py deleted file mode 100644 index b2a3e2a6fb4bbf30e35f0fe5979307c2b3c145e2..0000000000000000000000000000000000000000 --- a/plugins/_ultroid.py +++ /dev/null @@ -1,66 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from telethon.errors import ( - BotMethodInvalidError, - ChatSendInlineForbiddenError, - ChatSendMediaForbiddenError, -) - -from . import LOG_CHANNEL, LOGS, Button, asst, eor, get_string, ultroid_cmd - -REPOMSG = """ -• **ULTROID USERBOT** •\n -• Repo - [Click Here](https://github.com/TeamUltroid/Ultroid) -• Addons - [Click Here](https://github.com/TeamUltroid/UltroidAddons) -• Support - @UltroidSupportChat -""" - -RP_BUTTONS = [ - [ - Button.url(get_string("bot_3"), "https://github.com/TeamUltroid/Ultroid"), - Button.url("Addons", "https://github.com/TeamUltroid/UltroidAddons"), - ], - [Button.url("Support Group", "t.me/UltroidSupportChat")], -] - -ULTSTRING = """🎇 **Thanks for Deploying Ultroid Userbot!** - -• Here, are the Some Basic stuff from, where you can Know, about its Usage.""" - - -@ultroid_cmd( - pattern="repo$", - manager=True, -) -async def repify(e): - try: - q = await e.client.inline_query(asst.me.username, "") - await q[0].click(e.chat_id) - return await e.delete() - except ( - ChatSendInlineForbiddenError, - ChatSendMediaForbiddenError, - BotMethodInvalidError, - ): - pass - except Exception as er: - LOGS.info(f"Error while repo command : {str(er)}") - await e.eor(REPOMSG) - - -@ultroid_cmd(pattern="ultroid$") -async def useUltroid(rs): - button = Button.inline("Start >>", "initft_2") - msg = await asst.send_message( - LOG_CHANNEL, - ULTSTRING, - file="https://graph.org/file/54a917cc9dbb94733ea5f.jpg", - buttons=button, - ) - if not (rs.chat_id == LOG_CHANNEL and rs.client._bot): - await eor(rs, f"**[Click Here]({msg.message_link})**") diff --git a/plugins/_userlogs.py b/plugins/_userlogs.py deleted file mode 100644 index 0696ce5b2edfe0b7dad6b98b6ea7e9f8ae499abb..0000000000000000000000000000000000000000 --- a/plugins/_userlogs.py +++ /dev/null @@ -1,297 +0,0 @@ -# Ultroid - UserBot -# 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 os -import re - -from telethon.errors.rpcerrorlist import ( - ChannelPrivateError, - ChatWriteForbiddenError, - MediaCaptionTooLongError, - MediaEmptyError, - MessageTooLongError, - PeerIdInvalidError, - UserNotParticipantError, -) -from telethon.tl.types import MessageEntityMention, MessageEntityMentionName, User -from telethon.utils import get_display_name - -from pyUltroid.dB.botchat_db import tag_add, who_tag - -from . import ( - LOG_CHANNEL, - LOGS, - Button, - asst, - callback, - events, - get_string, - inline_mention, - udB, - ultroid_bot, -) - -CACHE_SPAM = {} -TAG_EDITS = {} - - -@ultroid_bot.on( - events.NewMessage( - incoming=True, - func=lambda e: (e.mentioned), - ), -) -async def all_messages_catcher(e): - x = await e.get_sender() - if isinstance(x, User) and (x.bot or x.verified): - return - if not udB.get_key("TAG_LOG"): - return - NEEDTOLOG = udB.get_key("TAG_LOG") - buttons = await parse_buttons(e) - try: - sent = await asst.send_message(NEEDTOLOG, e.message, buttons=buttons) - if TAG_EDITS.get(e.chat_id): - TAG_EDITS[e.chat_id].update({e.id: {"id": sent.id, "msg": e}}) - else: - TAG_EDITS.update({e.chat_id: {e.id: {"id": sent.id, "msg": e}}}) - tag_add(sent.id, e.chat_id, e.id) - except MediaEmptyError as er: - LOGS.debug(f"handling {er}.") - try: - msg = await asst.get_messages(e.chat_id, ids=e.id) - sent = await asst.send_message(NEEDTOLOG, msg, buttons=buttons) - if TAG_EDITS.get(e.chat_id): - TAG_EDITS[e.chat_id].update({e.id: {"id": sent.id, "msg": e}}) - else: - TAG_EDITS.update({e.chat_id: {e.id: {"id": sent.id, "msg": e}}}) - tag_add(sent.id, e.chat_id, e.id) - except Exception as me: - if not isinstance(me, (PeerIdInvalidError, ValueError)): - LOGS.exception(me) - if e.photo or e.sticker or e.gif: - try: - media = await e.download_media() - sent = await asst.send_message( - NEEDTOLOG, e.message.text, file=media, buttons=buttons - ) - if TAG_EDITS.get(e.chat_id): - TAG_EDITS[e.chat_id].update({e.id: {"id": sent.id, "msg": e}}) - else: - TAG_EDITS.update({e.chat_id: {e.id: {"id": sent.id, "msg": e}}}) - return os.remove(media) - except Exception as er: - LOGS.exception(er) - await asst.send_message(NEEDTOLOG, get_string("com_4"), buttons=buttons) - except (PeerIdInvalidError, ValueError) as er: - LOGS.exception(er) - try: - CACHE_SPAM[NEEDTOLOG] - except KeyError: - await asst.send_message( - udB.get_key("LOG_CHANNEL"), get_string("userlogs_1") - ) - CACHE_SPAM.update({NEEDTOLOG: True}) - except ChatWriteForbiddenError: - try: - await asst.get_permissions(NEEDTOLOG, "me") - MSG = get_string("userlogs_4") - except UserNotParticipantError: - MSG = get_string("userlogs_2") - try: - CACHE_SPAM[NEEDTOLOG] - except KeyError: - await asst.send_message(LOG_CHANNEL, MSG) - CACHE_SPAM.update({NEEDTOLOG: True}) - except Exception as er: - LOGS.exception(er) - - -if udB.get_key("TAG_LOG"): - - @ultroid_bot.on(events.MessageEdited(func=lambda x: not x.out)) - async def upd_edits(event): - x = event.sender - if isinstance(x, User) and (x.bot or x.verified): - return - if event.chat_id not in TAG_EDITS: - if event.sender_id == udB.get_key("TAG_LOG"): - return - if event.is_private: - return - if entities := event.get_entities_text(): - is_self = False - username = event.client.me.username - if username: - username = username.lower() - for ent, text in entities: - if isinstance(ent, MessageEntityMention): - is_self = text[1:].lower() == username - elif isinstance(ent, MessageEntityMentionName): - is_self = ent.user_id == event.client.me.id - if is_self: - text = f"**#Edited & #Mentioned**\n\n{event.text}" - try: - sent = await asst.send_message( - udB.get_key("TAG_LOG"), - text, - buttons=await parse_buttons(event), - ) - except Exception as er: - return LOGS.exception(er) - if TAG_EDITS.get(event.chat_id): - TAG_EDITS[event.chat_id].update({event.id: {"id": sent.id}}) - else: - TAG_EDITS.update({event.chat_id: {event.id: {"id": sent.id}}}) - return - d_ = TAG_EDITS[event.chat_id] - if not d_.get(event.id): - return - d_ = d_[event.id] - if d_["msg"].text == event.text: - return - msg = None - if d_.get("count"): - d_["count"] += 1 - else: - msg = True - d_.update({"count": 1}) - if d_["count"] > 10: - return # some limit to take edits - try: - MSG = await asst.get_messages(udB.get_key("TAG_LOG"), ids=d_["id"]) - except Exception as er: - return LOGS.exception(er) - TEXT = MSG.text - if msg: - TEXT += "\n\n🖋 **Later Edited to !**" - strf = event.edit_date.strftime("%H:%M:%S") - if "\n" not in event.text: - TEXT += f"\n• `{strf}` : {event.text}" - else: - TEXT += f"\n• `{strf}` :\n-> {event.text}" - if d_["count"] == 10: - TEXT += "\n\n• __Only the first 10 Edits are shown.__" - try: - msg = await MSG.edit(TEXT, buttons=await parse_buttons(event)) - d_["msg"] = msg - except (MessageTooLongError, MediaCaptionTooLongError): - del TAG_EDITS[event.chat_id][event.id] - except Exception as er: - LOGS.exception(er) - - @ultroid_bot.on( - events.NewMessage( - outgoing=True, - chats=[udB.get_key("TAG_LOG")], - func=lambda e: e.reply_to, - ) - ) - async def idk(e): - id = e.reply_to_msg_id - chat, msg = who_tag(id) - if chat and msg: - try: - await ultroid_bot.send_message(chat, e.message, reply_to=msg) - except BaseException as er: - LOGS.exception(er) - - -# log for assistant/user joins/add - - -async def when_added_or_joined(event): - user = await event.get_user() - chat = await event.get_chat() - if not (user and user.is_self): - return - if getattr(chat, "username", None): - chat = f"[{chat.title}](https://t.me/{chat.username}/{event.action_message.id})" - else: - chat = f"[{chat.title}](https://t.me/c/{chat.id}/{event.action_message.id})" - key = "bot" if event.client._bot else "user" - buttons = Button.inline( - get_string("userlogs_3"), data=f"leave_ch_{event.chat_id}|{key}" - ) - if event.user_added: - tmp = event.added_by - text = f"#ADD_LOG\n\n{inline_mention(tmp)} just added {inline_mention(user)} to {chat}." - elif event.from_request: - text = f"#APPROVAL_LOG\n\n{inline_mention(user)} just got Chat Join Approval to {chat}." - else: - text = f"#JOIN_LOG\n\n{inline_mention(user)} just joined {chat}." - await asst.send_message(udB.get_key("LOG_CHANNEL"), text, buttons=buttons) - - -asst.add_event_handler( - when_added_or_joined, events.ChatAction(func=lambda x: x.user_added) -) -ultroid_bot.add_event_handler( - when_added_or_joined, - events.ChatAction(func=lambda x: x.user_added or x.user_joined), -) -_client = {"bot": asst, "user": ultroid_bot} - - -@callback( - re.compile( - "leave_ch_(.*)", - ), - from_users=[ultroid_bot.uid], -) -async def leave_ch_at(event): - cht = event.data_match.group(1).decode("UTF-8") - ch_id, client = cht.split("|") - try: - client = _client[client] - except KeyError: - return - try: - name = (await client.get_entity(int(ch_id))).title - await client.delete_dialog(int(ch_id)) - except UserNotParticipantError: - pass - except ChannelPrivateError: - return await event.edit( - "`[CANT_ACCESS_CHAT]` `Maybe already left or got banned.`" - ) - except Exception as er: - LOGS.exception(er) - return await event.answer(str(er)) - await event.edit(get_string("userlogs_5").format(name)) - - -@callback("do_nothing") -async def _(event): - await event.answer() - - -async def parse_buttons(event): - y, x = event.chat, event.sender - where_n, who_n = get_display_name(y), get_display_name(x) - where_l = event.message_link - buttons = [[Button.url(where_n, where_l)]] - if isinstance(x, User) and x.username: - try: - buttons.append( - [Button.mention(who_n, await asst.get_input_entity(x.username))] - ) - except Exception as er: - LOGS.exception(er) - buttons.append([Button.url(who_n, f"t.me/{x.username}")]) - elif getattr(x, "username"): - buttons.append([Button.url(who_n, f"t.me/{x.username}")]) - else: - buttons.append([Button.url(who_n, where_l)]) - replied = await event.get_reply_message() - if replied and replied.out: - button = Button.url("Replied to", replied.message_link) - if len(who_n) > 7: - buttons.append([button]) - else: - buttons[-1].append(button) - return buttons diff --git a/plugins/_wspr.py b/plugins/_wspr.py deleted file mode 100644 index f46def7dadebbc0e02e845fe53070f99224aac0a..0000000000000000000000000000000000000000 --- a/plugins/_wspr.py +++ /dev/null @@ -1,204 +0,0 @@ -# Ultroid - UserBot -# 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 re - -from telethon import Button -from telethon.errors.rpcerrorlist import ( - BotInlineDisabledError, - BotResponseTimeoutError, - MessageNotModifiedError, -) -from telethon.tl import types -from telethon.tl.functions.users import GetFullUserRequest as gu - -from . import ( - HNDLR, - LOGS, - asst, - callback, - get_string, - in_pattern, - inline_mention, - ultroid_bot, - ultroid_cmd, -) - -buddhhu = {} - - -@ultroid_cmd( - pattern="wspr( (.*)|$)", -) -async def _(e): - if e.reply_to_msg_id: - okk = await e.get_reply_message() - put = f"@{okk.sender.username}" if okk.sender.username else okk.sender_id - else: - put = e.pattern_match.group(1).strip() - if put: - try: - results = await e.client.inline_query(asst.me.username, f"msg {put}") - except BotResponseTimeoutError: - return await e.eor( - get_string("help_2").format(HNDLR), - ) - except BotInlineDisabledError: - return await e.eor(get_string("help_3")) - await results[0].click(e.chat_id, reply_to=e.reply_to_msg_id, hide_via=True) - return await e.delete() - await e.eor(get_string("wspr_3")) - - -@in_pattern("wspr", owner=True) -async def _(e): - iuser = e.query.user_id - zzz = e.text.split(maxsplit=2) - try: - query = zzz[1] - if query.isdigit(): - query = int(query) - logi = await ultroid_bot.get_entity(query) - if not isinstance(logi, types.User): - raise ValueError("Invalid Username.") - except IndexError: - sur = await e.builder.article( - title="Give Username", - description="You Didn't Type Username or id.", - text="You Didn't Type Username or id.", - ) - return await e.answer([sur]) - except ValueError as er: - LOGS.exception(er) - sur = await e.builder.article( - title="User Not Found", - description="Make sure username or id is correct.", - text="Make sure username or id is correct.", - ) - return await e.answer([sur]) - try: - desc = zzz[2] - except IndexError: - sur = await e.builder.article( - title="Type ur msg", text="You Didn't Type Your Msg" - ) - return await e.answer([sur]) - button = [ - [ - Button.inline("Secret Msg", data=f"dd_{e.id}"), - Button.inline("Delete Msg", data=f"del_{e.id}"), - ], - [ - Button.switch_inline( - "New", query=f"wspr {logi.username or logi.id}", same_peer=True - ) - ], - ] - us = logi.username or logi.first_name - sur = await e.builder.article( - title=logi.first_name, - description=desc, - text=get_string("wspr_1").format(us), - buttons=button, - ) - buddhhu.update({e.id: [logi.id, iuser, desc]}) - await e.answer([sur]) - - -@in_pattern("msg", owner=True) -async def _(e): - zzz = e.text.split(maxsplit=1) - desc = "Touch me" - try: - query = zzz[1] - if query.isdigit(): - query = int(query) - logi = await ultroid_bot(gu(id=query)) - user = logi.users[0] - mention = inline_mention(user) - x = user.status - if isinstance(x, types.UserStatusOnline): - status = "Online" - elif isinstance(x, types.UserStatusOffline): - status = "Offline" - elif isinstance(x, types.UserStatusRecently): - status = "Last Seen Recently" - elif isinstance(x, types.UserStatusLastMonth): - status = "Last seen months ago" - elif isinstance(x, types.UserStatusLastWeek): - status = "Last seen weeks ago" - else: - status = "Can't Tell" - text = f"**Name:** `{user.first_name}`\n" - text += f"**Id:** `{user.id}`\n" - if user.username: - text += f"**Username:** `{user.username}`\n" - url = f"https://t.me/{user.username}" - else: - text += f"**Mention:** `{mention}`\n" - url = f"tg://user?id={user.id}" - text += f"**Status:** `{status}`\n" - text += f"**About:** `{logi.full_user.about}`" - button = [ - Button.url("Private", url=url), - Button.switch_inline( - "Secret msg", - query=f"wspr {query} Hello 👋", - same_peer=True, - ), - ] - sur = e.builder.article( - title=user.first_name, - description=desc, - text=text, - buttons=button, - ) - except IndexError: - sur = e.builder.article( - title="Give Username", - description="You Didn't Type Username or id.", - text="You Didn't Type Username or id.", - ) - except BaseException as er: - LOGS.exception(er) - name = get_string("wspr_4").format(query) - sur = e.builder.article( - title=name, - text=name, - ) - - await e.answer([sur]) - - -@callback( - re.compile( - "dd_(.*)", - ), -) -async def _(e): - ids = int(e.pattern_match.group(1).strip().decode("UTF-8")) - if buddhhu.get(ids): - if e.sender_id in buddhhu[ids]: - await e.answer(buddhhu[ids][-1], alert=True) - else: - await e.answer("Not For You", alert=True) - else: - await e.answer(get_string("wspr_2"), alert=True) - - -@callback(re.compile("del_(.*)")) -async def _(e): - ids = int(e.pattern_match.group(1).strip().decode("UTF-8")) - if buddhhu.get(ids): - if e.sender_id in buddhhu[ids]: - buddhhu.pop(ids) - try: - await e.edit(get_string("wspr_2")) - except MessageNotModifiedError: - pass - else: - await e.answer(get_string("wspr_5"), alert=True) diff --git a/plugins/admintools.py b/plugins/admintools.py deleted file mode 100644 index 0d402ff2d6a220a1d884460ae595012a97d4e47a..0000000000000000000000000000000000000000 --- a/plugins/admintools.py +++ /dev/null @@ -1,472 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_admintools") - -import asyncio - -from telethon.errors import BadRequestError -from telethon.errors.rpcerrorlist import ChatNotModifiedError, UserIdInvalidError -from telethon.tl.functions.channels import EditAdminRequest, GetFullChannelRequest -from telethon.tl.functions.messages import GetFullChatRequest, SetHistoryTTLRequest -from telethon.tl.types import InputMessagesFilterPinned -from telethon.utils import get_display_name - -from pyUltroid.dB import DEVLIST -from pyUltroid.fns.admins import ban_time -from pyUltroid.fns.info import get_uinfo - -from . import HNDLR, LOGS, eod, eor, get_string, inline_mention, types, ultroid_cmd - - -@ultroid_cmd( - pattern="promote( (.*)|$)", - admins_only=True, - manager=True, - require="add_admins", - fullsudo=True, -) -async def prmte(ult): - xx = await ult.eor(get_string("com_1")) - user, rank = await get_uinfo(ult) - rank = rank or "Admin" - FullRight = False - if not user: - return await xx.edit(get_string("pro_1")) - if rank.split()[0] == "-f": - try: - rank = rank.split(maxsplit=1)[1] - except IndexError: - rank = "Admin" - FullRight = True - try: - if FullRight: - await ult.client( - EditAdminRequest(ult.chat_id, user.id, ult.chat.admin_rights, rank) - ) - else: - await ult.client.edit_admin( - ult.chat_id, - user.id, - invite_users=True, - ban_users=True, - delete_messages=True, - pin_messages=True, - manage_call=True, - title=rank, - ) - await eod( - xx, get_string("pro_2").format(inline_mention(user), ult.chat.title, rank) - ) - except Exception as ex: - return await xx.edit(f"`{ex}`") - - -@ultroid_cmd( - pattern="demote( (.*)|$)", - admins_only=True, - manager=True, - require="add_admins", - fullsudo=True, -) -async def dmote(ult): - xx = await ult.eor(get_string("com_1")) - user, rank = await get_uinfo(ult) - if not rank: - rank = "Not Admin" - if not user: - return await xx.edit(get_string("de_1")) - try: - await ult.client.edit_admin( - ult.chat_id, - user.id, - invite_users=None, - ban_users=None, - delete_messages=None, - pin_messages=None, - manage_call=None, - title=rank, - ) - await eod(xx, get_string("de_2").format(inline_mention(user), ult.chat.title)) - except Exception as ex: - return await xx.edit(f"`{ex}`") - - -@ultroid_cmd( - pattern="ban( (.*)|$)", - admins_only=True, - manager=True, - require="ban_users", - fullsudo=True, -) -async def bban(ult): - something = await get_uinfo(ult) - if not something: - return - user, reason = something - if not user: - return await eod(ult, get_string("ban_1")) - if user.id in DEVLIST: - return await eod(ult, get_string("ban_2")) - try: - await ult.client.edit_permissions(ult.chat_id, user.id, view_messages=False) - except UserIdInvalidError: - return await eod(ult, get_string("adm_1")) - except BadRequestError: - return await eod(ult, get_string("ban_3")) - senderme = inline_mention(await ult.get_sender()) - userme = inline_mention(user) - text = get_string("ban_4").format(userme, senderme, ult.chat.title) - if reason: - text += get_string("ban_5").format(reason) - await eod(ult, text) - - -@ultroid_cmd( - pattern="unban( (.*)|$)", - admins_only=True, - manager=True, - require="ban_users", - fullsudo=True, -) -async def uunban(ult): - xx = await ult.eor(get_string("com_1")) - if ult.text[1:].startswith("unbanall"): - return - something = await get_uinfo(ult) - if not something: - return - user, reason = something - if not user: - return await xx.edit(get_string("unban_1")) - try: - await ult.client.edit_permissions(ult.chat_id, user.id, view_messages=True) - except UserIdInvalidError: - return await eod(ult, get_string("adm_1")) - except BadRequestError: - return await xx.edit(get_string("adm_2")) - sender = inline_mention(await ult.get_sender()) - text = get_string("unban_3").format(inline_mention(user), sender, ult.chat.title) - if reason: - text += get_string("ban_5").format(reason) - await xx.edit(text) - - -@ultroid_cmd( - pattern="kick( (.*)|$)", - manager=True, - require="ban_users", - fullsudo=True, -) -async def kck(ult): - if "kickme" in ult.text: - return - if ult.is_private: - return await ult.eor("`Use this in Group/Channel.`", time=5) - ml = ult.text.split(" ", maxsplit=1)[0] - xx = await ult.eor(get_string("com_1")) - something = await get_uinfo(ult) - if not something: - return - user, reason = something - if not user: - return await xx.edit(get_string("adm_1")) - if user.id in DEVLIST: - return await xx.edit(get_string("kick_2")) - if getattr(user, "is_self", False): - return await xx.edit(get_string("kick_3")) - try: - await ult.client.kick_participant(ult.chat_id, user.id) - except BadRequestError as er: - LOGS.info(er) - return await xx.edit(get_string("kick_1")) - except Exception as e: - LOGS.exception(e) - return - text = get_string("kick_4").format( - inline_mention(user), inline_mention(await ult.get_sender()), ult.chat.title - ) - if reason: - text += get_string("ban_5").format(reason) - await xx.edit(text) - - -@ultroid_cmd( - pattern="tban( (.*)|$)", - admins_only=True, - manager=True, - require="ban_users", - fullsudo=True, -) -async def tkicki(e): - huh = e.text.split() - inputt = None - try: - tme = huh[1] - except IndexError: - return await e.eor(get_string("adm_3"), time=15) - try: - inputt = huh[2] - except IndexError: - if e.reply_to_msg_id: - inputt = (await e.get_reply_message()).sender_id - if not inputt: - return await e.eor(get_string("tban_1")) - userid = await e.client.parse_id(inputt) - try: - user = await e.client.get_entity(userid) - except Exception as ex: - return await eor(e, f"`{ex}`") - try: - bun = ban_time(tme) - await e.client.edit_permissions( - e.chat_id, user.id, until_date=bun, view_messages=False - ) - await eod( - e, - get_string("tban_2").format(inline_mention(user), e.chat.title, tme), - time=15, - ) - except Exception as m: - return await e.eor(str(m)) - - -@ultroid_cmd(pattern="pin$", manager=True, require="pin_messages", fullsudo=True) -async def pin(msg): - if not msg.is_reply: - return await eor(msg, get_string("pin_1")) - me = await msg.get_reply_message() - if me.is_private: - text = "`Pinned.`" - else: - text = f"Pinned [This Message]({me.message_link}) !" - try: - await msg.client.pin_message(msg.chat_id, me.id, notify=False) - except BadRequestError: - return await eor(msg, get_string("adm_2")) - except Exception as e: - return await eor(msg, f"**ERROR:**`{e}`") - await eor(msg, text) - - -@ultroid_cmd( - pattern="unpin($| (.*))", - manager=True, - require="pin_messages", - fullsudo=True, -) -async def unp(ult): - xx = await ult.eor(get_string("com_1")) - ch = (ult.pattern_match.group(1).strip()).strip() - msg = None - if ult.is_reply: - msg = ult.reply_to_msg_id - elif ch != "all": - return await xx.edit(get_string("unpin_1").format(HNDLR)) - try: - await ult.client.unpin_message(ult.chat_id, msg) - except BadRequestError: - return await xx.edit(get_string("adm_2")) - except Exception as e: - return await xx.edit(f"**ERROR:**`{e}`") - await xx.edit("`Unpinned!`") - - -@ultroid_cmd( - pattern="tpin( (.*)|$)", - admins_only=True, - manager=True, - require="pin_messages", - fullsudo=True, -) -async def pin_message(ult): - match = ult.pattern_match.group(1).strip() - if not ult.is_reply: - return await ult.eor("`Reply to message..`", time=6) - if not match: - return await ult.eor("`Please provide time..`", time=8) - msg = await ult.eor(get_string("com_1")) - msg_id = ult.reply_to_msg_id - try: - time = ban_time(match) - await ult.client.pin_message(ult.chat_id, msg_id) - await msg.eor(f"`pinned for time` `{time}`", time=8) - except Exception as er: - return await msg.edit(str(er)) - await asyncio.sleep(time) - try: - await ult.client.unpin_message(ult.chat_id, msg_id) - except Exception as er: - LOGS.exception(er) - - -@ultroid_cmd(pattern="purge( (.*)|$)", manager=True, require="delete_messages") -async def fastpurger(purg): - match = purg.pattern_match.group(1).strip() - try: - ABC = purg.text[6] - except IndexError: - ABC = None - if ABC and purg.text[6] in ["m", "a"]: - return - if not purg._client._bot and ( - (match) - or (purg.is_reply and (purg.is_private or isinstance(purg.chat, types.Chat))) - ): - p = 0 - async for msg in purg.client.iter_messages( - purg.chat_id, - limit=int(match) if match else None, - min_id=purg.reply_to_msg_id if purg.is_reply else None, - ): - await msg.delete() - p += 0 - return await eor(purg, f"Purged {p} Messages! ", time=5) - if not purg.reply_to_msg_id: - return await eor(purg, get_string("purge_1"), time=10) - try: - await purg.client.delete_messages( - purg.chat_id, list(range(purg.reply_to_msg_id, purg.id)) - ) - - except Exception as er: - LOGS.info(er) - await purg.eor("__Fast purge complete!__", time=5) - - -@ultroid_cmd( - pattern="purgeme( (.*)|$)", -) -async def fastpurgerme(purg): - if num := purg.pattern_match.group(1).strip(): - try: - nnt = int(num) - except BaseException: - await eor(purg, get_string("com_3"), time=5) - return - mp = 0 - async for mm in purg.client.iter_messages( - purg.chat_id, limit=nnt, from_user="me" - ): - await mm.delete() - mp += 1 - await eor(purg, f"Purged {mp} Messages!", time=5) - return - elif not purg.reply_to_msg_id: - return await eod( - purg, - "`Reply to a message to purge from or use it like ``purgeme `", - time=10, - ) - chat = await purg.get_input_chat() - msgs = [] - async for msg in purg.client.iter_messages( - chat, - from_user="me", - min_id=purg.reply_to_msg_id, - ): - msgs.append(msg) - if msgs: - await purg.client.delete_messages(chat, msgs) - await purg.eor( - "__Fast purge complete!__\n**Purged** `" + str(len(msgs)) + "` **messages.**", - time=5, - ) - - -@ultroid_cmd( - pattern="purgeall$", -) -async def _(e): - if not e.is_reply: - return await eod( - e, - get_string("purgeall_1"), - ) - - msg = await e.get_reply_message() - name = msg.sender - try: - await e.client.delete_messages(e.chat_id, from_user=msg.sender_id) - await e.eor(get_string("purgeall_2").format(name.first_name), time=5) - except Exception as er: - return await e.eor(str(er), time=5) - - -@ultroid_cmd(pattern="pinned", manager=True, groups_only=True) -async def djshsh(event): - chat = await event.get_chat() - if isinstance(chat, types.Chat): - FChat = await event.client(GetFullChatRequest(chat.id)) - elif isinstance(chat, types.Channel): - FChat = await event.client(GetFullChannelRequest(chat.id)) - else: - return - msg_id = FChat.full_chat.pinned_msg_id - if not msg_id: - return await event.eor(get_string("pinned_1")) - msg = await event.client.get_messages(chat.id, ids=msg_id) - if msg: - await event.eor(get_string("pinned_2").format(msg.message_link)) - - -@ultroid_cmd( - pattern="listpinned$", -) -async def get_all_pinned(event): - x = await event.eor(get_string("com_1")) - chat_id = (str(event.chat_id)).replace("-100", "") - chat_name = get_display_name(event.chat) - a = "" - c = 1 - async for i in event.client.iter_messages( - event.chat_id, filter=InputMessagesFilterPinned - ): - if i.message: - t = " ".join(i.message.split()[:4]) - txt = f"{t}...." - else: - txt = "Go to message." - a += f"{c}. {txt}\n" - c += 1 - - if c == 1: - m = f"The pinned message in {chat_name}:\n\n" - else: - m = f"List of pinned message(s) in {chat_name}:\n\n" - - if not a: - return await eor(x, get_string("listpin_1"), time=5) - - await x.edit(m + a, parse_mode="html") - - -@ultroid_cmd( - pattern="autodelete( (.*)|$)", - admins_only=True, -) -async def autodelte(ult): - match = ult.pattern_match.group(1).strip() - if not match or match not in ["24h", "7d", "1m", "off"]: - return await ult.eor("`Please Use in Proper Format..`", time=5) - if match == "24h": - tt = 3600 * 24 - elif match == "7d": - tt = 3600 * 24 * 7 - elif match == "1m": - tt = 3600 * 24 * 31 - else: - tt = 0 - try: - await ult.client(SetHistoryTTLRequest(ult.chat_id, period=tt)) - except ChatNotModifiedError: - return await ult.eor( - f"Auto Delete Setting is Already same to `{match}`", time=5 - ) - await ult.eor(f"Auto Delete Status Changed to `{match}` !") diff --git a/plugins/afk.py b/plugins/afk.py deleted file mode 100644 index 830136a449f960298a7a45fe2f4e6c717df31615..0000000000000000000000000000000000000000 --- a/plugins/afk.py +++ /dev/null @@ -1,166 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_afk") - - -import asyncio - -from telegraph import upload_file as uf -from telethon import events - -from pyUltroid.dB.afk_db import add_afk, del_afk, is_afk -from pyUltroid.dB.base import KeyManager - -from . import ( - LOG_CHANNEL, - NOSPAM_CHAT, - Redis, - asst, - get_string, - mediainfo, - udB, - ultroid_bot, - ultroid_cmd, -) - -old_afk_msg = [] - -is_approved = KeyManager("PMPERMIT", cast=list).contains - - -@ultroid_cmd(pattern="afk( (.*)|$)", owner_only=True) -async def set_afk(event): - if event.client._bot or is_afk(): - return - text, media, media_type = None, None, None - if event.pattern_match.group(1).strip(): - text = event.text.split(maxsplit=1)[1] - reply = await event.get_reply_message() - if reply: - if reply.text and not text: - text = reply.text - if reply.media: - media_type = mediainfo(reply.media) - if media_type.startswith(("pic", "gif")): - file = await event.client.download_media(reply.media) - iurl = uf(file) - media = f"https://graph.org{iurl[0]}" - else: - media = reply.file.id - await event.eor("`Done`", time=2) - add_afk(text, media_type, media) - ultroid_bot.add_handler(remove_afk, events.NewMessage(outgoing=True)) - ultroid_bot.add_handler( - on_afk, - events.NewMessage( - incoming=True, func=lambda e: bool(e.mentioned or e.is_private) - ), - ) - msg1, msg2 = None, None - if text and media: - if "sticker" in media_type: - msg1 = await ultroid_bot.send_file(event.chat_id, file=media) - msg2 = await ultroid_bot.send_message( - event.chat_id, get_string("afk_5").format(text) - ) - else: - msg1 = await ultroid_bot.send_message( - event.chat_id, get_string("afk_5").format(text), file=media - ) - elif media: - if "sticker" in media_type: - msg1 = await ultroid_bot.send_file(event.chat_id, file=media) - msg2 = await ultroid_bot.send_message(event.chat_id, get_string("afk_6")) - else: - msg1 = await ultroid_bot.send_message( - event.chat_id, get_string("afk_6"), file=media - ) - elif text: - msg1 = await event.respond(get_string("afk_5").format(text)) - else: - msg1 = await event.respond(get_string("afk_6")) - old_afk_msg.append(msg1) - if msg2: - old_afk_msg.append(msg2) - return await asst.send_message(LOG_CHANNEL, msg2.text) - await asst.send_message(LOG_CHANNEL, msg1.text) - - -async def remove_afk(event): - if event.is_private and udB.get_key("PMSETTING") and not is_approved(event.chat_id): - return - elif "afk" in event.text.lower(): - return - elif event.chat_id in NOSPAM_CHAT: - return - if is_afk(): - _, _, _, afk_time = is_afk() - del_afk() - off = await event.reply(get_string("afk_1").format(afk_time)) - await asst.send_message(LOG_CHANNEL, get_string("afk_2").format(afk_time)) - for x in old_afk_msg: - try: - await x.delete() - except BaseException: - pass - await asyncio.sleep(10) - await off.delete() - - -async def on_afk(event): - if event.is_private and Redis("PMSETTING") and not is_approved(event.chat_id): - return - elif "afk" in event.text.lower(): - return - elif not is_afk(): - return - if event.chat_id in NOSPAM_CHAT: - return - sender = await event.get_sender() - if sender.bot or sender.verified: - return - text, media_type, media, afk_time = is_afk() - msg1, msg2 = None, None - if text and media: - if "sticker" in media_type: - msg1 = await event.reply(file=media) - msg2 = await event.reply(get_string("afk_3").format(afk_time, text)) - else: - msg1 = await event.reply( - get_string("afk_3").format(afk_time, text), file=media - ) - elif media: - if "sticker" in media_type: - msg1 = await event.reply(file=media) - msg2 = await event.reply(get_string("afk_4").format(afk_time)) - else: - msg1 = await event.reply(get_string("afk_4").format(afk_time), file=media) - elif text: - msg1 = await event.reply(get_string("afk_3").format(afk_time, text)) - else: - msg1 = await event.reply(get_string("afk_4").format(afk_time)) - for x in old_afk_msg: - try: - await x.delete() - except BaseException: - pass - old_afk_msg.append(msg1) - if msg2: - old_afk_msg.append(msg2) - - -if udB.get_key("AFK_DB"): - ultroid_bot.add_handler(remove_afk, events.NewMessage(outgoing=True)) - ultroid_bot.add_handler( - on_afk, - events.NewMessage( - incoming=True, func=lambda e: bool(e.mentioned or e.is_private) - ), - ) diff --git a/plugins/afscrp.py b/plugins/afscrp.py deleted file mode 100644 index 56f02a5de24c38bbb0dd38879a80457f4eda6bc5..0000000000000000000000000000000000000000 --- a/plugins/afscrp.py +++ /dev/null @@ -1,95 +0,0 @@ -import logging -from bs4 import BeautifulSoup -from googleapiclient.discovery import build -from . import ultroid_cmd, async_searcher, run_async, LOGS -import asyncio -from io import BytesIO - -logging.getLogger("googleapiclient.discovery_cache").setLevel(logging.WARNING) - -async def fetch_full_content(url): - try: - api_url = f"https://scraper.api.airforce/scrape?url={url}" - response = await async_searcher(api_url) - - soup = BeautifulSoup(response, "html.parser") - main_content = soup.select_one("article") or soup.select_one("main") or soup - paragraphs = [ - para.get_text(separator=" ").strip() - for para in main_content.find_all("p") - if len(para.get_text(strip=True)) > 30 - and not any( - keyword in para.get_text().lower() - for keyword in [ - "privacy", - "cookie", - "subscribe", - "sign up", - "terms", - "all rights reserved", - "see all", - "see more", - ] - ) - ] - full_text = ( - " ".join(paragraphs[:5]) if paragraphs else "No main content available." - ) - return full_text - except Exception as e: - return f"Error fetching content: {e}" - -async def google_search(query): - api_key = " AIzaSyCDOnsWu0cF8W-6jnWceUSHeuSmpC7b2g0 " - cse_id = "a44275f02ca2946da" - service = build("customsearch", "v1", developerKey=api_key) - - results = service.cse().list(q=query, cx=cse_id, gl="AU").execute() - search_items = results.get("items", []) - - search_results = await asyncio.gather( - *(fetch_search_result(item) for item in search_items) - ) - - return search_results - -async def fetch_search_result(item): - title = item.get("title") - link = item.get("link") - snippet = item.get("snippet") - full_content = await fetch_full_content(link) - return (title, link, snippet, full_content) - -async def display_readable_results(results): - readable_res = "" - for idx, result in enumerate(results, start=1): - title, link, snippet, full_content = result - full_content = ( - full_content if full_content else "No additional content available." - ) - readable_res += f"Result {idx}:\n" - readable_res += f"Title: {title}\n" - readable_res += f"Link: {link}\n" - readable_res += f"Snippet: {snippet}\n" - readable_res += f"Full Content: {full_content.strip()}\n" - readable_res += "\n" + "=" * 80 + "\n" - return readable_res - -@ultroid_cmd(pattern="afscrp(?: (.*)|$)") -async def google_search_cmd(event): - query = event.pattern_match.group(1) - if not query: - return await event.eor("Please provide a query to search.") - moi = await event.eor("Searching Google...") - results = await google_search(query) - readable_results = await display_readable_results(results) - - if len(readable_results) < 4095: - await moi.edit(readable_results) - else: - with BytesIO(readable_results.encode()) as file: - file.name = "google_search_results.txt" - await event.client.send_file( - event.chat_id, file, caption=f"Search results for: {query}", reply_to=event.reply_to_msg_id - ) - await moi.delete() diff --git a/plugins/antiflood.py b/plugins/antiflood.py deleted file mode 100644 index 82225c16956e7096bb3e05457ef1892fa14541ef..0000000000000000000000000000000000000000 --- a/plugins/antiflood.py +++ /dev/null @@ -1,121 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_antiflood") - - -import re - -from telethon.events import NewMessage as NewMsg - -from pyUltroid.dB import DEVLIST -from pyUltroid.dB.antiflood_db import get_flood, get_flood_limit, rem_flood, set_flood -from pyUltroid.fns.admins import admin_check - -from . import Button, Redis, asst, callback, eod, get_string, ultroid_bot, ultroid_cmd - -_check_flood = {} - -if Redis("ANTIFLOOD"): - - @ultroid_bot.on( - NewMsg( - chats=list(get_flood().keys()), - ), - ) - async def flood_checm(event): - count = 1 - chat = (await event.get_chat()).title - if event.chat_id in _check_flood.keys(): - if event.sender_id == list(_check_flood[event.chat_id].keys())[0]: - count = _check_flood[event.chat_id][event.sender_id] - _check_flood[event.chat_id] = {event.sender_id: count + 1} - else: - _check_flood[event.chat_id] = {event.sender_id: count} - else: - _check_flood[event.chat_id] = {event.sender_id: count} - if await admin_check(event, silent=True) or getattr(event.sender, "bot", None): - return - if event.sender_id in DEVLIST: - return - if _check_flood[event.chat_id][event.sender_id] >= int( - get_flood_limit(event.chat_id) - ): - try: - name = event.sender.first_name - await event.client.edit_permissions( - event.chat_id, event.sender_id, send_messages=False - ) - del _check_flood[event.chat_id] - await event.reply(f"#AntiFlood\n\n{get_string('antiflood_3')}") - await asst.send_message( - int(Redis("LOG_CHANNEL")), - f"#Antiflood\n\n`Muted `[{name}](tg://user?id={event.sender_id})` in {chat}`", - buttons=Button.inline( - "Unmute", data=f"anti_{event.sender_id}_{event.chat_id}" - ), - ) - except BaseException: - pass - - -@callback( - re.compile( - "anti_(.*)", - ), -) -async def unmuting(e): - ino = (e.data_match.group(1)).decode("UTF-8").split("_") - user = int(ino[0]) - chat = int(ino[1]) - user_name = (await ultroid_bot.get_entity(user)).first_name - chat_title = (await ultroid_bot.get_entity(chat)).title - await ultroid_bot.edit_permissions(chat, user, send_messages=True) - await e.edit( - f"#Antiflood\n\n`Unmuted `[{user_name}](tg://user?id={user})` in {chat_title}`" - ) - - -@ultroid_cmd( - pattern="setflood ?(\\d+)", - admins_only=True, -) -async def setflood(e): - input_ = e.pattern_match.group(1).strip() - if not input_: - return await e.eor("`What?`", time=5) - if not input_.isdigit(): - return await e.eor(get_string("com_3"), time=5) - if m := set_flood(e.chat_id, input_): - return await eod(e, get_string("antiflood_4").format(input_)) - - -@ultroid_cmd( - pattern="remflood$", - admins_only=True, -) -async def remove_flood(e): - hmm = rem_flood(e.chat_id) - try: - del _check_flood[e.chat_id] - except BaseException: - pass - if hmm: - return await e.eor(get_string("antiflood_1"), time=5) - await e.eor(get_string("antiflood_2"), time=5) - - -@ultroid_cmd( - pattern="getflood$", - admins_only=True, -) -async def getflood(e): - if ok := get_flood_limit(e.chat_id): - return await e.eor(get_string("antiflood_5").format(ok), time=5) - await e.eor(get_string("antiflood_2"), time=5) diff --git a/plugins/asstcmd.py b/plugins/asstcmd.py deleted file mode 100644 index b88446ef7d5e50d4578c2f59e6742e90fd06f89e..0000000000000000000000000000000000000000 --- a/plugins/asstcmd.py +++ /dev/null @@ -1,107 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_asstcmd") - -import os - -from pyUltroid.dB.asstcmd_db import add_cmd, cmd_reply, list_cmds, rem_cmd -from pyUltroid.fns.tools import create_tl_btn, format_btn, get_msg_button - -try: - from telegraph import upload_file as uf -except ImportError: - uf = None -from telethon import events, utils - -from . import asst, get_string, mediainfo, udB, ultroid_cmd - - -@ultroid_cmd(pattern="addcmd( (.*)|$)") -async def ac(e): - wrd = (e.pattern_match.group(1).strip()).lower() - wt = await e.get_reply_message() - if not (wt and wrd): - return await e.eor(get_string("asstcmd_1"), time=5) - if "/" in wrd: - wrd = wrd.replace("/", "") - btn = format_btn(wt.buttons) if wt.buttons else None - if wt and wt.media: - wut = mediainfo(wt.media) - if wut.startswith(("pic", "gif")): - dl = await e.client.download_media(wt.media) - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "video": - if wt.media.document.size > 8 * 1000 * 1000: - return await e.eor(get_string("com_4"), time=5) - dl = await e.client.download_media(wt.media) - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - else: - m = utils.pack_bot_file_id(wt.media) - if wt.text: - txt = wt.text - if not btn: - txt, btn = get_msg_button(wt.text) - add_cmd(wrd, txt, m, btn) - else: - add_cmd(wrd, None, m, btn) - else: - txt = wt.text - if not btn: - txt, btn = get_msg_button(wt.text) - add_cmd(wrd, txt, None, btn) - asst.add_handler( - astcmds, - events.NewMessage( - func=lambda x: x.text.startswith("/") and x.text[1:] in list(list_cmds()) - ), - ) - await e.eor(get_string("asstcmd_4").format(wrd)) - - -@ultroid_cmd(pattern="remcmd( (.*)|$)") -async def rc(e): - wrd = (e.pattern_match.group(1).strip()).lower() - if not wrd: - return await e.eor(get_string("asstcmd_2"), time=5) - wrd = wrd.replace("/", "") - rem_cmd(wrd) - await e.eor(get_string("asstcmd_3").format(wrd)) - - -@ultroid_cmd(pattern="listcmd$") -async def lscmd(e): - if list_cmds(): - ok = get_string("asstcmd_6") - for x in list_cmds(): - ok += f"/{x}" + "\n" - return await e.eor(ok) - return await e.eor(get_string("asstcmd_5")) - - -async def astcmds(e): - xx = (e.text.replace("/", "")).lower().split()[0] - if cmd_reply(xx): - msg, media, bt = cmd_reply(xx) - if bt: - bt = create_tl_btn(bt) - await e.reply(msg, file=media, buttons=bt) - - -if udB.get_key("ASST_CMDS"): - asst.add_handler( - astcmds, - events.NewMessage( - func=lambda x: x.text.startswith("/") and x.text[1:] in list(list_cmds()) - ), - ) diff --git a/plugins/audiotools.py b/plugins/audiotools.py deleted file mode 100644 index f8c0b52558cc3642647a2145d8693182305a6c98..0000000000000000000000000000000000000000 --- a/plugins/audiotools.py +++ /dev/null @@ -1,160 +0,0 @@ -# Ultroid - UserBot -# 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 os -import time -from datetime import datetime as dt - -from pyUltroid.fns.tools import set_attributes - -from . import ( - LOGS, - ULTConfig, - bash, - downloader, - eod, - eor, - genss, - get_help, - get_string, - humanbytes, - mediainfo, - stdr, - time_formatter, - ultroid_cmd, - uploader, -) - -__doc__ = get_help("help_audiotools") - - -@ultroid_cmd(pattern="makevoice$") -async def vnc(e): - if not e.reply_to: - return await eod(e, get_string("audiotools_1")) - r = await e.get_reply_message() - if not mediainfo(r.media).startswith(("audio", "video")): - return await eod(e, get_string("spcltool_1")) - xxx = await e.eor(get_string("com_1")) - file, _ = await e.client.fast_downloader( - r.document, - ) - await xxx.edit(get_string("audiotools_2")) - await bash( - f"ffmpeg -i '{file.name}' -map 0:a -codec:a libopus -b:a 100k -vbr on out.opus" - ) - try: - await e.client.send_message( - e.chat_id, file="out.opus", force_document=False, reply_to=r - ) - except Exception as er: - LOGS.exception(er) - return await xxx.edit("`Failed to convert in Voice...`") - await xxx.delete() - os.remove(file.name) - os.remove("out.opus") - - -@ultroid_cmd(pattern="atrim( (.*)|$)") -async def trim_aud(e): - sec = e.pattern_match.group(1).strip() - if not sec or "-" not in sec: - return await eod(e, get_string("audiotools_3")) - a, b = sec.split("-") - if int(a) >= int(b): - return await eod(e, get_string("audiotools_4")) - vido = await e.get_reply_message() - if vido and vido.media and mediainfo(vido.media).startswith(("video", "audio")): - if hasattr(vido.media, "document"): - vfile = vido.media.document - name = vido.file.name - else: - vfile = vido.media - name = "" - if not name: - name = dt.now().isoformat("_", "seconds") + ".mp4" - xxx = await e.eor(get_string("audiotools_5")) - c_time = time.time() - file = await downloader( - f"resources/downloads/{name}", - vfile, - xxx, - c_time, - f"Downloading {name}...", - ) - - o_size = os.path.getsize(file.name) - d_time = time.time() - diff = time_formatter((d_time - c_time) * 1000) - file_name = (file.name).split("/")[-1] - out = file_name.replace(file_name.split(".")[-1], "_trimmed.aac") - if int(b) > int(await genss(file.name)): - os.remove(file.name) - return await eod(xxx, get_string("audiotools_6")) - ss, dd = stdr(int(a)), stdr(int(b)) - xxx = await xxx.edit( - f"Downloaded `{file.name}` of `{humanbytes(o_size)}` in `{diff}`.\n\nNow Trimming Audio from `{ss}` to `{dd}`..." - ) - cmd = f'ffmpeg -i "{file.name}" -preset ultrafast -ss {ss} -to {dd} -vn -acodec copy "{out}" -y' - await bash(cmd) - os.remove(file.name) - f_time = time.time() - mmmm = await uploader(out, out, f_time, xxx, f"Uploading {out}...") - attributes = await set_attributes(out) - - caption = get_string("audiotools_7").format(ss, dd) - await e.client.send_file( - e.chat_id, - mmmm, - thumb=ULTConfig.thumb, - caption=caption, - attributes=attributes, - force_document=False, - reply_to=e.reply_to_msg_id, - ) - await xxx.delete() - else: - await e.eor(get_string("audiotools_1"), time=5) - - -@ultroid_cmd(pattern="extractaudio$") -async def ex_aud(e): - reply = await e.get_reply_message() - if not (reply and reply.media and mediainfo(reply.media).startswith("video")): - return await e.eor(get_string("audiotools_8")) - name = reply.file.name or "video.mp4" - vfile = reply.media.document - msg = await e.eor(get_string("com_1")) - c_time = time.time() - file = await downloader( - f"resources/downloads/{name}", - vfile, - msg, - c_time, - f"Downloading {name}...", - ) - - out_file = f"{file.name}.aac" - cmd = f"ffmpeg -i {file.name} -vn -acodec copy {out_file}" - o, err = await bash(cmd) - os.remove(file.name) - attributes = await set_attributes(out_file) - - f_time = time.time() - try: - fo = await uploader(out_file, out_file, f_time, msg, f"Uploading {out_file}...") - - except FileNotFoundError: - return await eor(msg, get_string("audiotools_9")) - await e.reply( - get_string("audiotools_10"), - file=fo, - thumb=ULTConfig.thumb, - attributes=attributes, - ) - await msg.delete() diff --git a/plugins/autoban.py b/plugins/autoban.py deleted file mode 100644 index 597323213b309398b1f2a8f047f095aa904dc0df..0000000000000000000000000000000000000000 --- a/plugins/autoban.py +++ /dev/null @@ -1,59 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_autoban") - -from telethon import events - -from pyUltroid.dB.base import KeyManager - -from . import LOGS, asst, ultroid_bot, ultroid_cmd - -Keym = KeyManager("DND_CHATS", cast=list) - - -def join_func(e): - return e.user_joined and Keym.contains(e.chat_id) - - -async def dnd_func(event): - for user in event.users: - try: - await (await event.client.kick_participant(event.chat_id, user)).delete() - except Exception as ex: - LOGS.error("Error in DND:") - LOGS.exception(ex) - await event.delete() - - -@ultroid_cmd( - pattern="autokick (on|off)$", - admins_only=True, - manager=True, - require="ban_users", - fullsudo=True, -) -async def _(event): - match = event.pattern_match.group(1) - if match == "on": - if Keym.contains(event.chat_id): - return await event.eor("`Chat already in do not disturb mode.`", time=3) - Keym.add(event.chat_id) - event.client.add_handler(dnd_func, events.ChatAction(func=join_func)) - await event.eor("`Do not disturb mode activated for this chat.`", time=3) - elif match == "off": - if not Keym.contains(event.chat_id): - return await event.eor("`Chat is not in do not disturb mode.`", time=3) - Keym.remove(event.chat_id) - await event.eor("`Do not disturb mode deactivated for this chat.`", time=3) - - -if Keym.get(): - ultroid_bot.add_handler(dnd_func, events.ChatAction(func=join_func)) - asst.add_handler(dnd_func, events.ChatAction(func=join_func)) diff --git a/plugins/autopic.py b/plugins/autopic.py deleted file mode 100644 index f6e5127662bc1aaf78bf85ba4bcda347ffc841a3..0000000000000000000000000000000000000000 --- a/plugins/autopic.py +++ /dev/null @@ -1,84 +0,0 @@ -# Ultroid - UserBot -# 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 asyncio -import os -import random -from random import shuffle - -from telethon.tl.functions.photos import UploadProfilePhotoRequest - -from pyUltroid.fns.helper import download_file -from pyUltroid.fns.tools import get_google_images - -from . import LOGS, get_help, get_string, udB, ultroid_bot, ultroid_cmd - -__doc__ = get_help("help_autopic") - - -@ultroid_cmd(pattern="autopic( (.*)|$)") -async def autopic(e): - search = e.pattern_match.group(1).strip() - if udB.get_key("AUTOPIC") and not search: - udB.del_key("AUTOPIC") - return await e.eor(get_string("autopic_5")) - if not search: - return await e.eor(get_string("autopic_1"), time=5) - e = await e.eor(get_string("com_1")) - gi = googleimagesdownload() - args = { - "keywords": search, - "limit": 50, - "format": "jpg", - "output_directory": "./resources/downloads/", - } - try: - pth = await gi.download(args) - ok = pth[0][search] - except Exception as er: - LOGS.exception(er) - return await e.eor(str(er)) - if not ok: - return await e.eor(get_string("autopic_2").format(search), time=5) - await e.eor(get_string("autopic_3").format(search)) - udB.set_key("AUTOPIC", search) - SLEEP_TIME = udB.get_key("SLEEP_TIME") or 1221 - while True: - for lie in ok: - if udB.get_key("AUTOPIC") != search: - return - file = await e.client.upload_file(lie) - await e.client(UploadProfilePhotoRequest(file)) - await asyncio.sleep(SLEEP_TIME) - shuffle(ok) - - -if search := udB.get_key("AUTOPIC"): - images = {} - sleep = udB.get_key("SLEEP_TIME") or 1221 - - async def autopic_func(): - search = udB.get_key("AUTOPIC") - if images.get(search) is None: - images[search] = await get_google_images(search) - if not images.get(search): - return - img = random.choice(images[search]) - filee = await download_file(img["original"], "resources/downloads/autopic.jpg") - file = await ultroid_bot.upload_file(filee) - await ultroid_bot(UploadProfilePhotoRequest(file)) - os.remove(filee) - - try: - from apscheduler.schedulers.asyncio import AsyncIOScheduler - - schedule = AsyncIOScheduler() - schedule.add_job(autopic_func, "interval", seconds=sleep) - schedule.start() - except ModuleNotFoundError as er: - LOGS.error(f"autopic: '{er.name}' not installed.") diff --git a/plugins/beautify.py b/plugins/beautify.py deleted file mode 100644 index efe307d26d6557212168df78c8e333673d802e14..0000000000000000000000000000000000000000 --- a/plugins/beautify.py +++ /dev/null @@ -1,210 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_beautify") - - -import os -import random - -from telethon.utils import get_display_name -from urllib.parse import urlencode -from . import Carbon, ultroid_cmd, get_string, inline_mention, LOGS -from secrets import token_hex - -_colorspath = "resources/colorlist.txt" - -if os.path.exists(_colorspath): - with open(_colorspath, "r") as f: - all_col = f.read().split() -else: - all_col = [] - - -@ultroid_cmd( - pattern="(rc|c)arbon", -) -async def cr_bn(event): - xxxx = await event.eor(get_string("com_1")) - te = event.pattern_match.group(1) - col = random.choice(all_col) if te[0] == "r" else "White" - if event.reply_to_msg_id: - temp = await event.get_reply_message() - if temp.media: - b = await event.client.download_media(temp) - with open(b) as a: - code = a.read() - os.remove(b) - else: - code = temp.message - else: - try: - code = event.text.split(" ", maxsplit=1)[1] - except IndexError: - return await xxxx.eor(get_string("carbon_2")) - xx = await Carbon(code=code, file_name="ultroid_carbon", backgroundColor=col) - if isinstance(xx, dict): - await xxxx.edit(f"`{xx}`") - return - await xxxx.delete() - await event.reply( - f"Carbonised by {inline_mention(event.sender)}", - file=xx, - ) - - -@ultroid_cmd( - pattern="ccarbon( (.*)|$)", -) -async def crbn(event): - match = event.pattern_match.group(1).strip() - if not match: - return await event.eor(get_string("carbon_3")) - msg = await event.eor(get_string("com_1")) - if event.reply_to_msg_id: - temp = await event.get_reply_message() - if temp.media: - b = await event.client.download_media(temp) - with open(b) as a: - code = a.read() - os.remove(b) - else: - code = temp.message - else: - try: - match = match.split(" ", maxsplit=1) - code = match[1] - match = match[0] - except IndexError: - return await msg.eor(get_string("carbon_2")) - xx = await Carbon(code=code, backgroundColor=match) - await msg.delete() - await event.reply( - f"Carbonised by {inline_mention(event.sender)}", - file=xx, - ) - - -RaySoTheme = [ - "meadow", - "breeze", - "raindrop", - "candy", - "crimson", - "falcon", - "sunset", - "noir", - "midnight", - "bitmap", - "ice", - "sand", - "forest", - "mono" -] - - -@ultroid_cmd(pattern="rayso") -async def pass_on(ult): - try: - from playwright.async_api import async_playwright - except ImportError: - await ult.eor("`playwright` is not installed!\nPlease install it to use this command..") - return - - proc = await ult.eor(get_string("com_1")) - spli = ult.text.split() - theme, dark, title, text = None, True, get_display_name(ult.chat), None - - if len(spli) > 2: - if spli[1] in RaySoTheme: - theme = spli[1] - dark = spli[2].lower().strip() in ["true", "t"] - elif len(spli) > 1: - if spli[1] in RaySoTheme: - theme = spli[1] - elif spli[1] == "list": - text = "**List of Rayso Themes:**\n" + "\n".join([f"- `{th_}`" for th_ in RaySoTheme]) - await proc.eor(text) - return - else: - try: - text = ult.text.split(maxsplit=1)[1] - except IndexError: - pass - - if not theme or theme not in RaySoTheme: - theme = random.choice(RaySoTheme) - - if ult.is_reply: - try: - msg = await ult.get_reply_message() - text = msg.message - title = get_display_name(msg.sender) - except Exception as sam: - ErrInfo(sam) - - if not text: - await proc.eor("No text to beautify!") - return - - cleaned_text = "\n".join([line.strip() for line in text.splitlines()]) - - name = token_hex(8) + ".png" - data = {"darkMode": dark, "theme": theme, "title": title} - url = f"https://ray.so/#{urlencode(data)}" - - async with async_playwright() as play: - try: -# browser = await play.chromium.launch(headless=False) # Set to False for debugging - browser = await play.chromium.launch(headless=True, args=["--disable-crash-reporter"]) - page = await browser.new_page() - await page.goto(url, timeout=60000) # Increase timeout - await page.wait_for_load_state("networkidle") - - try: - await page.wait_for_selector("div[class*='Editor_editor__']", timeout=60000) - editor = await page.query_selector("div[class*='Editor_editor__']") - await editor.focus() - await editor.click() - - for line in cleaned_text.split("\n"): - await page.keyboard.type(line) - await page.keyboard.press("Enter") - - await page.evaluate("""() => { - const button = document.querySelector('button[aria-label="Export as PNG"]'); - button.click(); - }""") - - async with page.expect_download() as download_info: - download = await download_info.value - await download.save_as(name) - - except playwright._impl._errors.TimeoutError: - LOGS.info("Timeout error: Selector not found within 60 seconds.") - await proc.eor("Failed to find the editor within 60 seconds.") - return - - except Exception as e: - LOGS.info(f"Error occurred during playwright operation: {e}") - await proc.eor("An error occurred during the operation.") - return - - finally: - if os.path.exists(name): - try: - await ult.reply(file=name) - await proc.try_delete() - os.remove(name) - except Exception as e: - LOGS.info(f"Error occurred while replying with the file: {e}") - await proc.eor("Failed to send the file.") - else: - LOGS.info(f"Error: File {name} not found or inaccessible.") - await proc.eor("Failed to save the file.") diff --git a/plugins/blacklist.py b/plugins/blacklist.py deleted file mode 100644 index 78f2d42afe65f3cf377a7b28654333fa806446ba..0000000000000000000000000000000000000000 --- a/plugins/blacklist.py +++ /dev/null @@ -1,69 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_blacklist") - - -from pyUltroid.dB.blacklist_db import ( - add_blacklist, - get_blacklist, - list_blacklist, - rem_blacklist, -) - -from . import events, get_string, udB, ultroid_bot, ultroid_cmd - - -@ultroid_cmd(pattern="blacklist( (.*)|$)", admins_only=True) -async def af(e): - wrd = e.pattern_match.group(1).strip() - chat = e.chat_id - if not (wrd): - return await e.eor(get_string("blk_1"), time=5) - wrd = e.text[11:] - heh = wrd.split(" ") - for z in heh: - add_blacklist(int(chat), z.lower()) - ultroid_bot.add_handler(blacklist, events.NewMessage(incoming=True)) - await e.eor(get_string("blk_2").format(wrd)) - - -@ultroid_cmd(pattern="remblacklist( (.*)|$)", admins_only=True) -async def rf(e): - wrd = e.pattern_match.group(1).strip() - chat = e.chat_id - if not wrd: - return await e.eor(get_string("blk_3"), time=5) - wrd = e.text[14:] - heh = wrd.split(" ") - for z in heh: - rem_blacklist(int(chat), z.lower()) - await e.eor(get_string("blk_4").format(wrd)) - - -@ultroid_cmd(pattern="listblacklist$", admins_only=True) -async def lsnote(e): - if x := list_blacklist(e.chat_id): - sd = get_string("blk_5") - return await e.eor(sd + x) - await e.eor(get_string("blk_6")) - - -async def blacklist(e): - if x := get_blacklist(e.chat_id): - text = e.text.lower().split() - if any((z in text) for z in x): - try: - await e.delete() - except BaseException: - pass - - -if udB.get_key("BLACKLIST_DB"): - ultroid_bot.add_handler(blacklist, events.NewMessage(incoming=True)) diff --git a/plugins/bot.py b/plugins/bot.py deleted file mode 100644 index 2209c64b66ee550c74bcf0c991428b02b8e9eb02..0000000000000000000000000000000000000000 --- a/plugins/bot.py +++ /dev/null @@ -1,358 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_bot") - -import os -import sys -import time -from platform import python_version as pyver -from random import choice - -from telethon import __version__ -from telethon.errors.rpcerrorlist import ( - BotMethodInvalidError, - ChatSendMediaForbiddenError, -) - -from pyUltroid.version import __version__ as UltVer - -from . import HOSTED_ON, LOGS - -try: - from git import Repo -except ImportError: - LOGS.error("bot: 'gitpython' module not found!") - Repo = None - -from telethon.utils import resolve_bot_file_id - -from . import ( - ATRA_COL, - LOGS, - OWNER_NAME, - ULTROID_IMAGES, - Button, - Carbon, - Telegraph, - Var, - allcmds, - asst, - bash, - call_back, - callback, - def_logs, - eor, - get_string, - heroku_logs, - in_pattern, - inline_pic, - restart, - shutdown, - start_time, - time_formatter, - udB, - ultroid_cmd, - ultroid_version, - updater, -) - - -def ULTPIC(): - return inline_pic() or choice(ULTROID_IMAGES) - - -buttons = [ - [ - Button.url(get_string("bot_3"), "https://github.com/TeamUltroid/Ultroid"), - Button.url(get_string("bot_4"), "t.me/UltroidSupportChat"), - ] -] - -# Will move to strings -alive_txt = """ -The Ultroid Userbot - - ◍ Version - {} - ◍ Py-Ultroid - {} - ◍ Telethon - {} -""" - -in_alive = "{}\n\n🌀 Ultroid Version -> {}\n🌀 PyUltroid -> {}\n🌀 Python -> {}\n🌀 Uptime -> {}\n🌀 Branch ->[ {} ]\n\n• Join @TeamUltroid" - - -@callback("alive") -async def alive(event): - text = alive_txt.format(ultroid_version, UltVer, __version__) - await event.answer(text, alert=True) - - -@ultroid_cmd( - pattern="alive( (.*)|$)", -) -async def lol(ult): - match = ult.pattern_match.group(1).strip() - inline = None - if match in ["inline", "i"]: - try: - res = await ult.client.inline_query(asst.me.username, "alive") - return await res[0].click(ult.chat_id) - except BotMethodInvalidError: - pass - except BaseException as er: - LOGS.exception(er) - inline = True - pic = udB.get_key("ALIVE_PIC") - if isinstance(pic, list): - pic = choice(pic) - uptime = time_formatter((time.time() - start_time) * 1000) - header = udB.get_key("ALIVE_TEXT") or get_string("bot_1") -# y = Repo().active_branch - y = "main" -# xx = Repo().remotes[0].config_reader.get("url") - xx = "https://github.com/ufoptg/UltroidBackup.git" - rep = xx.replace(".git", f"/tree/{y}") - kk = f" `[{y}]({rep})` " - if inline: - kk = f"{y}" - parse = "html" - als = in_alive.format( - header, - f"{ultroid_version} [{HOSTED_ON}]", - UltVer, - pyver(), - uptime, - kk, - ) - - if _e := udB.get_key("ALIVE_EMOJI"): - als = als.replace("🌀", _e) - else: - parse = "md" - als = (get_string("alive_1")).format( - header, - OWNER_NAME, - f"{ultroid_version} [{HOSTED_ON}]", - UltVer, - uptime, - pyver(), - __version__, - kk, - ) - - if a := udB.get_key("ALIVE_EMOJI"): - als = als.replace("✵", a) - if pic: - try: - await ult.reply( - als, - file=pic, - parse_mode=parse, - link_preview=False, - buttons=buttons if inline else None, - ) - return await ult.try_delete() - except ChatSendMediaForbiddenError: - pass - except BaseException as er: - LOGS.exception(er) - try: - await ult.reply(file=pic) - await ult.reply( - als, - parse_mode=parse, - buttons=buttons if inline else None, - link_preview=False, - ) - return await ult.try_delete() - except BaseException as er: - LOGS.exception(er) - await eor( - ult, - als, - parse_mode=parse, - link_preview=False, - buttons=buttons if inline else None, - ) - - -@ultroid_cmd(pattern="ping$", chats=[], type=["official", "assistant"]) -async def _(event): - start = time.time() - x = await event.eor("Pong !") - end = round((time.time() - start) * 1000) - uptime = time_formatter((time.time() - start_time) * 1000) - await x.edit(get_string("ping").format(end, uptime)) - - -@ultroid_cmd( - pattern="cmds$", -) -async def cmds(event): - await allcmds(event, Telegraph) - - -heroku_api = Var.HEROKU_API - - -@ultroid_cmd( - pattern="restart$", - fullsudo=True, -) -async def restartbt(ult): - ok = await ult.eor(get_string("bot_5")) - call_back() - who = "bot" if ult.client._bot else "user" - udB.set_key("_RESTART", f"{who}_{ult.chat_id}_{ok.id}") - if heroku_api: - return await restart(ok) - await bash("git pull && pip3 install -r requirements.txt") - if len(sys.argv) > 1: - os.execl(sys.executable, sys.executable, "main.py") - else: - os.execl(sys.executable, sys.executable, "-m", "pyUltroid") - - -@ultroid_cmd( - pattern="shutdown$", - fullsudo=True, -) -async def shutdownbot(ult): - await shutdown(ult) - - -@ultroid_cmd( - pattern="logs( (.*)|$)", - chats=[], -) -async def _(event): - opt = event.pattern_match.group(1).strip() - file = f"ultroid{sys.argv[-1]}.log" if len(sys.argv) > 1 else "ultroid.log" - if opt == "heroku": - await heroku_logs(event) - elif opt == "carbon" and Carbon: - event = await event.eor(get_string("com_1")) - with open(file, "r") as f: - code = f.read()[-2500:] - file = await Carbon( - file_name="ultroid-logs", - code=code, - backgroundColor=choice(ATRA_COL), - ) - if isinstance(file, dict): - await event.eor(f"`{file}`") - return - await event.reply("**Ultroid Logs.**", file=file) - elif opt == "open": - with open("ultroid.log", "r") as f: - file = f.read()[-4000:] - return await event.eor(f"`{file}`") - else: - await def_logs(event, file) - await event.try_delete() - - -@in_pattern("alive", owner=True) -async def inline_alive(ult): - pic = udB.get_key("ALIVE_PIC") - if isinstance(pic, list): - pic = choice(pic) - uptime = time_formatter((time.time() - start_time) * 1000) - header = udB.get_key("ALIVE_TEXT") or get_string("bot_1") - y = Repo().active_branch - xx = Repo().remotes[0].config_reader.get("url") - rep = xx.replace(".git", f"/tree/{y}") - kk = f"{y}" - als = in_alive.format( - header, f"{ultroid_version} [{HOSTED_ON}]", UltVer, pyver(), uptime, kk - ) - - if _e := udB.get_key("ALIVE_EMOJI"): - als = als.replace("🌀", _e) - builder = ult.builder - if pic: - try: - if ".jpg" in pic: - results = [ - await builder.photo( - pic, text=als, parse_mode="html", buttons=buttons - ) - ] - else: - if _pic := resolve_bot_file_id(pic): - pic = _pic - buttons.insert( - 0, [Button.inline(get_string("bot_2"), data="alive")] - ) - results = [ - await builder.document( - pic, - title="Inline Alive", - description="@TeamUltroid", - parse_mode="html", - buttons=buttons, - ) - ] - return await ult.answer(results) - except BaseException as er: - LOGS.exception(er) - result = [ - await builder.article( - "Alive", text=als, parse_mode="html", link_preview=False, buttons=buttons - ) - ] - await ult.answer(result) - - -@ultroid_cmd(pattern="update( (.*)|$)") -async def _(e): - xx = await e.eor(get_string("upd_1")) - if e.pattern_match.group(1).strip() and ( - "fast" in e.pattern_match.group(1).strip() - or "soft" in e.pattern_match.group(1).strip() - ): - await bash("git pull -f && pip3 install -r requirements.txt") - call_back() - await xx.edit(get_string("upd_7")) - os.execl(sys.executable, "python3", "-m", "pyUltroid") - # return - m = await updater() - branch = (Repo.init()).active_branch - if m: - x = await asst.send_file( - udB.get_key("LOG_CHANNEL"), - ULTPIC(), - caption="• **Update Available** •", - force_document=False, - buttons=Button.inline("Changelogs", data="changes"), - ) - Link = x.message_link - await xx.edit( - f'[ChangeLogs]', - parse_mode="html", - link_preview=False, - ) - else: - await xx.edit( - f'Your BOT is up-to-date with [{branch}]', - parse_mode="html", - link_preview=False, - ) - - -@callback("updtavail", owner=True) -async def updava(event): - await event.delete() - await asst.send_file( - udB.get_key("LOG_CHANNEL"), - ULTPIC(), - caption="• **Update Available** •", - force_document=False, - buttons=Button.inline("Changelogs", data="changes"), - ) diff --git a/plugins/broadcast.py b/plugins/broadcast.py deleted file mode 100644 index f8aedf2f086d04c9a54d45d90b9d031af2ad66ae..0000000000000000000000000000000000000000 --- a/plugins/broadcast.py +++ /dev/null @@ -1,216 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - - -from . import get_help - -__doc__ = get_help("help_broadcast") - -import asyncio -import io - -from telethon.utils import get_display_name - -from pyUltroid.dB.base import KeyManager - -from . import HNDLR, LOGS, eor, get_string, udB, ultroid_bot, ultroid_cmd - -KeyM = KeyManager("BROADCAST", cast=list) - - -@ultroid_cmd( - pattern="addch( (.*)|$)", - allow_sudo=False, -) -async def broadcast_adder(event): - msgg = event.pattern_match.group(1).strip() - x = await event.eor(get_string("bd_1")) - if msgg == "all": - await x.edit(get_string("bd_2")) - chats = [ - e.entity - for e in await event.client.get_dialogs() - if (e.is_group or e.is_channel) - ] - new = 0 - for i in chats: - try: - if ( - i.broadcast - and (i.creator or i.admin_rights) - and not KeyM.contains(i.id) - ): - new += 1 - cid = f"-100{i.id}" - KeyM.add(int(cid)) - except Exception as Ex: - LOGS.exception(Ex) - await x.edit(get_string("bd_3").format(KeyM.count(), new)) - return - if event.reply_to_msg_id: - previous_message = await event.get_reply_message() - raw_text = previous_message.text - lines = raw_text.split("\n") - length = len(lines) - for line_number in range(1, length - 2): - channel_id = lines[line_number][4:-1] - if not KeyM.contains(channel_id): - KeyM.add(channel_id) - await x.edit(get_string("bd_4")) - await asyncio.sleep(3) - await event.delete() - return - chat_id = event.chat_id - if chat_id == udB.get_key("LOG_CHANNEL"): - return - if KeyM.contains(chat_id): - await x.edit(get_string("bd_6")) - elif xx := KeyM.add(chat_id): - await x.edit(get_string("bd_5")) - else: - await x.edit(get_string("sf_8")) - await asyncio.sleep(3) - await x.delete() - - -@ultroid_cmd( - pattern="remch( (.*)|$)", - allow_sudo=False, -) -async def broadcast_remover(event): - chat_id = event.pattern_match.group(1).strip() or event.chat_id - x = await event.eor(get_string("com_1")) - if chat_id == "all": - await x.edit(get_string("bd_8")) - udB.del_key("BROADCAST") - await x.edit("Database cleared.") - return - if KeyM.contains(chat_id): - KeyM.remove(chat_id) - await x.edit(get_string("bd_7")) - else: - await x.edit(get_string("bd_9")) - await asyncio.sleep(3) - await x.delete() - - -@ultroid_cmd( - pattern="listchannels$", -) -async def list_all(event): - x = await event.eor(get_string("com_1")) - channels = KeyM.get() - num = KeyM.count() - if not channels: - return await eor(x, "No chats were added.", time=5) - msg = "Channels in database:\n" - for channel in channels: - name = "" - try: - name = get_display_name(await event.client.get_entity(channel)) - except ValueError: - name = "" - msg += f"=> **{name}** [`{channel}`]\n" - msg += f"\nTotal {num} channels." - if len(msg) > 4096: - MSG = msg.replace("*", "").replace("`", "") - with io.BytesIO(str.encode(MSG)) as out_file: - out_file.name = "channels.txt" - await event.reply( - "Channels in Database", - file=out_file, - force_document=True, - allow_cache=False, - ) - await x.delete() - else: - await x.edit(msg) - - -@ultroid_cmd( - pattern="forward$", - allow_sudo=False, -) -async def forw(event): - if not event.is_reply: - return await event.eor(get_string("ex_1")) - ultroid_bot = event.client - channels = KeyM.get() - x = await event.eor("Sending...") - if not channels: - return await x.edit(f"Please add channels by using `{HNDLR}add` in them.") - error_count = 0 - sent_count = 0 - previous_message = await event.get_reply_message() - error_count = 0 - for channel in channels: - try: - await ultroid_bot.forward_messages(channel, previous_message) - sent_count += 1 - await x.edit( - f"Sent : {sent_count}\nError : {error_count}\nTotal : {len(channels)}", - ) - except Exception: - try: - await ultroid_bot.send_message( - udB.get_key("LOG_CHANNEL"), - f"Error in sending at {channel}.", - ) - except Exception as Em: - LOGS.info(Em) - error_count += 1 - await x.edit( - f"Sent : {sent_count}\nError : {error_count}\nTotal : {len(channels)}", - ) - await x.edit(f"{sent_count} messages sent with {error_count} errors.") - if error_count > 0: - await ultroid_bot.send_message( - udB.get_key("LOG_CHANNEL"), f"{error_count} Errors" - ) - - -@ultroid_cmd( - pattern="broadcast( (.*)|$)", - allow_sudo=False, -) -async def sending(event): - x = await event.eor(get_string("com_1")) - if not event.is_reply: - return await x.edit(get_string("ex_1")) - channels = KeyM.get() - if not channels: - return await x.edit(f"Please add channels by using `{HNDLR}add` in them.") - await x.edit("Sending....") - if event.reply_to_msg_id: - previous_message = await event.get_reply_message() - if previous_message.poll: - return await x.edit(f"Reply `{HNDLR}forward` for polls.") - if previous_message: - error_count = 0 - sent_count = 0 - for channel in channels: - try: - await ultroid_bot.send_message(channel, previous_message) - sent_count += 1 - await x.edit( - f"Sent : {sent_count}\nError : {error_count}\nTotal : {len(channels)}", - ) - except Exception as error: - await ultroid_bot.send_message( - udB.get_key("LOG_CHANNEL"), - f"Error in sending at {channel}.\n\n{error}", - ) - error_count += 1 - await x.edit( - f"Sent : {sent_count}\nError : {error_count}\nTotal : {len(channels)}", - ) - await x.edit(f"{sent_count} messages sent with {error_count} errors.") - if error_count > 0: - await ultroid_bot.send_message( - udB.get_key("LOG_CHANNEL"), - f"{error_count} Errors", - ) diff --git a/plugins/button.py b/plugins/button.py deleted file mode 100644 index b3d616d709be1a04ede2c6996d393bf12ac27f56..0000000000000000000000000000000000000000 --- a/plugins/button.py +++ /dev/null @@ -1,56 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_button") - -import os - -from telegraph import upload_file as uf -from telethon.utils import pack_bot_file_id - -from pyUltroid.fns.tools import create_tl_btn, get_msg_button - -from . import HNDLR, get_string, mediainfo, ultroid_cmd -from ._inline import something - - -@ultroid_cmd(pattern="button") -async def butt(event): - media, wut, text = None, None, None - if event.reply_to: - wt = await event.get_reply_message() - if wt.text: - text = wt.text - if wt.media: - wut = mediainfo(wt.media) - if wut and wut.startswith(("pic", "gif")): - dl = await wt.download_media() - variable = uf(dl) - media = f"https://graph.org{variable[0]}" - elif wut == "video": - if wt.media.document.size > 8 * 1000 * 1000: - return await event.eor(get_string("com_4"), time=5) - dl = await wt.download_media() - variable = uf(dl) - os.remove(dl) - media = f"https://graph.org{variable[0]}" - else: - media = pack_bot_file_id(wt.media) - try: - text = event.text.split(maxsplit=1)[1] - except IndexError: - if not text: - return await event.eor( - f"**Please give some text in correct format.**\n\n`{HNDLR}help button`", - ) - text, buttons = get_msg_button(text) - if buttons: - buttons = create_tl_btn(buttons) - await something(event, text, media, buttons) - await event.delete() diff --git a/plugins/calculator.py b/plugins/calculator.py deleted file mode 100644 index 28f2bae144d25287460e4a08daa452c6acba2f9f..0000000000000000000000000000000000000000 --- a/plugins/calculator.py +++ /dev/null @@ -1,153 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - - -from . import get_help - -__doc__ = get_help("help_calculator") - -import re - -from . import Button, asst, callback, get_string, in_pattern, udB, ultroid_cmd - -CALC = {} - -m = [ - "AC", - "C", - "⌫", - "%", - "7", - "8", - "9", - "+", - "4", - "5", - "6", - "-", - "1", - "2", - "3", - "x", - "00", - "0", - ".", - "÷", -] -tultd = [Button.inline(f"{x}", data=f"calc{x}") for x in m] -lst = list(zip(tultd[::4], tultd[1::4], tultd[2::4], tultd[3::4])) -lst.append([Button.inline("=", data="calc=")]) - - -@ultroid_cmd(pattern="calc") -async def icalc(e): - udB.del_key("calc") - if e.client._bot: - return await e.reply(get_string("calc_1"), buttons=lst) - results = await e.client.inline_query(asst.me.username, "calc") - await results[0].click(e.chat_id, silent=True, hide_via=True) - await e.delete() - - -@in_pattern("calc", owner=True) -async def _(e): - calc = e.builder.article("Calc", text=get_string("calc_1"), buttons=lst) - await e.answer([calc]) - - -@callback(re.compile("calc(.*)"), owner=True) -async def _(e): - x = (e.data_match.group(1)).decode() - user = e.query.user_id - get = None - if x == "AC": - if CALC.get(user): - CALC.pop(user) - await e.edit( - get_string("calc_1"), - buttons=[Button.inline(get_string("calc_2"), data="recalc")], - ) - elif x == "C": - if CALC.get(user): - CALC.pop(user) - await e.answer("cleared") - elif x == "⌫": - if CALC.get(user): - get = CALC[user] - if get: - CALC.update({user: get[:-1]}) - await e.answer(str(get[:-1])) - elif x == "%": - if CALC.get(user): - get = CALC[user] - if get: - CALC.update({user: f"{get}/100"}) - await e.answer(str(f"{get}/100")) - elif x == "÷": - if CALC.get(user): - get = CALC[user] - if get: - CALC.update({user: f"{get}/"}) - await e.answer(str(f"{get}/")) - elif x == "x": - if CALC.get(user): - get = CALC[user] - if get: - CALC.update({user: f"{get}*"}) - await e.answer(str(f"{get}*")) - elif x == "=": - if CALC.get(user): - get = CALC[user] - if get: - if get.endswith(("*", ".", "/", "-", "+")): - get = get[:-1] - out = eval(get) - try: - num = float(out) - await e.answer(f"Answer : {num}", cache_time=0, alert=True) - except BaseException: - CALC.pop(user) - await e.answer(get_string("sf_8"), cache_time=0, alert=True) - await e.answer("None") - else: - if CALC.get(user): - get = CALC[user] - if get: - CALC.update({user: get + x}) - return await e.answer(str(get + x)) - CALC.update({user: x}) - await e.answer(str(x)) - - -@callback("recalc", owner=True) -async def _(e): - m = [ - "AC", - "C", - "⌫", - "%", - "7", - "8", - "9", - "+", - "4", - "5", - "6", - "-", - "1", - "2", - "3", - "x", - "00", - "0", - ".", - "÷", - ] - tultd = [Button.inline(f"{x}", data=f"calc{x}") for x in m] - lst = list(zip(tultd[::4], tultd[1::4], tultd[2::4], tultd[3::4])) - lst.append([Button.inline("=", data="calc=")]) - await e.edit(get_string("calc_1"), buttons=lst) diff --git a/plugins/channelhacks.py b/plugins/channelhacks.py deleted file mode 100644 index d333249a0fc0a82ec5cd8f37ec3014b25c21bcb6..0000000000000000000000000000000000000000 --- a/plugins/channelhacks.py +++ /dev/null @@ -1,224 +0,0 @@ -# Ultroid - UserBot -# 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 -# . -from . import get_help - -__doc__ = get_help("help_channelhacks") - - -import asyncio -import io - -from telethon.errors.rpcerrorlist import FloodWaitError -from telethon.utils import get_display_name, get_peer_id - -from pyUltroid.dB.base import KeyManager - -from . import LOGS, asst, eor, events, get_string, udB, ultroid_bot, ultroid_cmd - -ERROR = {} -SourceM = KeyManager("CH_SOURCE", cast=list) -DestiM = KeyManager("CH_DESTINATIONS", cast=list) - - -async def autopost_func(e): - if not udB.get_key("AUTOPOST"): - return - x = SourceM.get() - th = await e.get_chat() - if get_peer_id(th) not in x: - return - y = DestiM.get() - for ys in y: - try: - await e.client.send_message(int(ys), e.message) - except Exception as ex: - try: - ERROR[str(ex)] - except KeyError: - ERROR.update({str(ex): ex}) - Error = f"**Error on AUTOPOST**\n\n`{ex}`" - await asst.send_message(udB.get_key("LOG_CHANNEL"), Error) - - -@ultroid_cmd(pattern="shift (.*)") -async def _(e): - x = e.pattern_match.group(1).strip() - z = await e.eor(get_string("com_1")) - a, b = x.split("|") - try: - c = await e.client.parse_id(a) - except Exception: - await z.edit(get_string("cha_1")) - return - try: - d = await e.client.parse_id(b) - except Exception as er: - LOGS.exception(er) - await z.edit(get_string("cha_1")) - return - async for msg in e.client.iter_messages(int(c), reverse=True): - try: - await asyncio.sleep(2) - await e.client.send_message(int(d), msg) - except FloodWaitError as er: - await asyncio.sleep(er.seconds + 5) - await e.client.send_message(int(d), msg) - except BaseException as er: - LOGS.exception(er) - await z.edit("Done") - - -@ultroid_cmd(pattern="asource (.*)") -async def source(e): - if x := e.pattern_match.group(1).strip(): - try: - y = await e.client.parse_id(x) - except Exception as er: - LOGS.exception(er) - return - else: - y = e.chat_id - if not SourceM.contains(y): - SourceM.add(y) - await e.eor(get_string("cha_2")) - ultroid_bot.add_handler(autopost_func, events.NewMessage()) - else: - await e.eor(get_string("cha_3")) - - -@ultroid_cmd(pattern="dsource( (.*)|$)") -async def dd(event): - chat_id = event.pattern_match.group(1).strip() - x = await event.eor(get_string("com_1")) - if chat_id == "all": - await x.edit(get_string("bd_8")) - udB.del_key("CH_SOURCE") - await x.edit(get_string("cha_4")) - return - if chat_id: - try: - y = await event.client.parse_id(chat_id) - except Exception as er: - LOGS.exception(er) - return - else: - y = event.chat_id - if SourceM.contains(y): - SourceM.remove(y) - await eor(x, get_string("cha_5"), time=5) - else: - await eor(x, "Source channel is already removed from database. ", time=3) - - -@ultroid_cmd(pattern="listsource") -async def list_all(event): - x = await event.eor(get_string("com_1")) - num = SourceM.count() - if not num: - return await eor(x, "No chats were added.", time=5) - msg = get_string("cha_8") - channels = SourceM.get() - for channel in channels: - name = "" - try: - name = get_display_name(await event.client.get_entity(int(channel))) - except BaseException: - name = "" - msg += f"\n=> **{name}** [`{channel}`]" - msg += f"\nTotal {num} channels." - if len(msg) > 4096: - MSG = msg.replace("*", "").replace("`", "") - with io.BytesIO(str.encode(MSG)) as out_file: - out_file.name = "channels.txt" - await event.reply( - "Channels in database", - file=out_file, - force_document=True, - allow_cache=False, - ) - await x.delete() - else: - await x.edit(msg) - - -@ultroid_cmd(pattern="adest (.*)") -async def destination(e): - if x := e.pattern_match.group(1).strip(): - try: - y = await e.client.parse_id(x) - except Exception as er: - LOGS.exception(er) - return - else: - y = e.chat_id - if not DestiM.contains(y): - DestiM.add(y) - await e.eor("Destination added succesfully") - else: - await e.eor("Destination channel already added") - - -@ultroid_cmd(pattern="ddest( (.*)|$)") -async def dd(event): - chat_id = event.pattern_match.group(1).strip() - x = await event.eor(get_string("com_1")) - if chat_id == "all": - await x.edit(get_string("bd_8")) - udB.del_key("CH_DESTINATION") - await x.edit("Destinations database cleared.") - return - if chat_id: - try: - y = await event.client.parse_id(chat_id) - except Exception as er: - LOGS.exception(er) - return - else: - y = event.chat_id - if DestiM.contains(y): - DestiM.remove(y) - await eor(x, "Destination removed from database") - else: - await eor(x, "Destination channel is already removed from database. ", time=5) - - -@ultroid_cmd(pattern="listdest") -async def list_all(event): - ultroid_bot = event.client - x = await event.eor(get_string("com_1")) - channels = DestiM.get() - num = len(channels) - if not num: - return await eor(x, "No chats were added.", time=5) - msg = get_string("cha_7") - for channel in channels: - name = "" - try: - name = get_display_name(await ultroid_bot.get_entity(int(channel))) - except BaseException: - name = "" - msg += f"\n=> **{name}** [`{channel}`]" - msg += f"\nTotal {num} channels." - if len(msg) > 4096: - MSG = msg.replace("*", "").replace("`", "") - with io.BytesIO(str.encode(MSG)) as out_file: - out_file.name = "channels.txt" - await ultroid_bot.send_file( - event.chat_id, - out_file, - force_document=True, - allow_cache=False, - caption="Destination channels in database", - reply_to=event, - ) - await x.delete() - else: - await x.edit(msg) - - -if udB.get_key("AUTOPOST"): - ultroid_bot.add_handler(autopost_func, events.NewMessage()) diff --git a/plugins/chatbot.py b/plugins/chatbot.py deleted file mode 100644 index 0dfcec7359f0976288e4ef885567bd21180e90ba..0000000000000000000000000000000000000000 --- a/plugins/chatbot.py +++ /dev/null @@ -1,174 +0,0 @@ -# Ultroid - UserBot -# Copyright (C) 2021-2024 TeamUltroid -# -# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > -# PLease read the GNU Affero General Public License in -# . - -from . import get_help - -__doc__ = get_help("help_chatbot") - - -from pyUltroid.fns.tools import get_chatbot_reply, get_oracle_reply - -from . import LOGS, eod, get_string, inline_mention, udB, ultroid_bot, ultroid_cmd - -try: - mongouri = udB.get_key("MONGO_URI") -except AttributeError: - if udB.get_key("MONGO_URI"): - mongouri = udB.get_key("MONGO_URI") - else: - udB.set_key("MONGO_URI", "") - LOGS.error("PLeasde set a MONGO_URI") - - -@ultroid_cmd(pattern="repoai") -async def im_oracle(event): - if event.reply_to: - message = (await event.get_reply_message()).text.strip() - else: - try: - message = event.text.split(" ", 1)[1] - except IndexError: - return await eod(event, get_string("tban_1"), time=10) - reply_ = await get_oracle_reply( - query=message, user_id=ultroid_bot.me.id, mongo_url=mongouri - ) - await event.eor(reply_) - - -@ultroid_cmd(pattern="addoai") -async def add_oracle(event): - await oracle_bot_fn(event, type_="add") - - -@ultroid_cmd(pattern="remoai") -async def rem_oracle(event): - await oracle_bot_fn(event, type_="remov") - - -@ultroid_cmd(pattern="listoai") -async def listoracle(event): - key = udB.get_key("ORACLE_USERS") or {} - users = key.get(event.chat_id, []) - if not users: - return await event.eor(get_string("chab_2"), time=5) - msg = "**Total List Of Oracle Enabled Users In This Chat :**\n\n" - for i in users: - try: - user = await event.client.get_entity(int(i)) - user = inline_mention(user) - except BaseException: - user = f"`{i}`" - msg += f"• {user}\n" - await event.eor(msg, link_preview=False) - - -async def oracle_bot_fn(event, type_): - if event.reply_to: - user_ = (await event.get_reply_message()).sender - else: - temp = event.text.split(maxsplit=1) - try: - user_ = await event.client.get_entity(await event.client.parse_id(temp[1])) - except BaseException as er: - LOGS.exception(er) - user_ = event.chat if event.is_private else None - if not user_: - return await eod( - event, - get_string("chab_1"), - ) - key = udB.get_key("ORACLE_USERS") or {} - chat = event.chat_id - user = user_.id - if type_ == "add": - if key.get(chat): - if user not in key[chat]: - key[chat].append(user) - else: - key.update({chat: [user]}) - elif type_ == "remov": - if key.get(chat): - if user in key[chat]: - key[chat].remove(user) - if chat in key and not key[chat]: - del key[chat] - udB.set_key("ORACLE_USERS", key) - await event.eor(f"**Oracle:**\n{type_}ed {inline_mention(user_)}") - - -@ultroid_cmd(pattern="repai") -async def im_lonely_chat_with_me(event): - if event.reply_to: - message = (await event.get_reply_message()).message - else: - try: - message = event.text.split(" ", 1)[1] - except IndexError: - return await eod(event, get_string("tban_1"), time=10) - reply_ = await get_chatbot_reply(message=message) - await event.eor(reply_) - - -@ultroid_cmd(pattern="addai") -async def add_chatBot(event): - await chat_bot_fn(event, type_="add") - - -@ultroid_cmd(pattern="remai") -async def rem_chatBot(event): - await chat_bot_fn(event, type_="remov") - - -@ultroid_cmd(pattern="listai") -async def lister(event): - key = udB.get_key("CHATBOT_USERS") or {} - users = key.get(event.chat_id, []) - if not users: - return await event.eor(get_string("chab_2"), time=5) - msg = "**Total List Of AI Enabled Users In This Chat :**\n\n" - for i in users: - try: - user = await event.client.get_entity(int(i)) - user = inline_mention(user) - except BaseException: - user = f"`{i}`" - msg += f"• {user}\n" - await event.eor(msg, link_preview=False) - - -async def chat_bot_fn(event, type_): - if event.reply_to: - user_ = (await event.get_reply_message()).sender - else: - temp = event.text.split(maxsplit=1) - try: - user_ = await event.client.get_entity(await event.client.parse_id(temp[1])) - except BaseException as er: - LOGS.exception(er) - user_ = event.chat if event.is_private else None - if not user_: - return await eod( - event, - get_string("chab_1"), - ) - key = udB.get_key("CHATBOT_USERS") or {} - chat = event.chat_id - user = user_.id - if type_ == "add": - if key.get(chat): - if user not in key[chat]: - key[chat].append(user) - else: - key.update({chat: [user]}) - elif type_ == "remov": - if key.get(chat): - if user in key[chat]: - key[chat].remove(user) - if chat in key and not key[chat]: - del key[chat] - udB.set_key("CHATBOT_USERS", key) - await event.eor(f"**ChatBot:**\n{type_}ed {inline_mention(user_)}") diff --git a/plugins/chats.py b/plugins/chats.py deleted file mode 100644 index 2ef171b1de3fd9f5ac67936cd116d1c9885189fe..0000000000000000000000000000000000000000 --- a/plugins/chats.py +++ /dev/null @@ -1,368 +0,0 @@ -# Ultroid - UserBot -# 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 -# . -from . import get_help - -__doc__ = get_help("help_chats") - - -from telethon.errors import ChatAdminRequiredError as no_admin -from telethon.tl.functions.channels import ( - CreateChannelRequest, - DeleteChannelRequest, - EditPhotoRequest, - GetFullChannelRequest, - UpdateUsernameRequest, -) -from telethon.tl.functions.messages import ( - CreateChatRequest, - ExportChatInviteRequest, - GetFullChatRequest, -) -from telethon.tl.types import ( - ChannelParticipantsKicked, - User, - UserStatusEmpty, - UserStatusLastMonth, - UserStatusLastWeek, - UserStatusOffline, - UserStatusOnline, - UserStatusRecently, -) - -from . import HNDLR, LOGS, asst, con, get_string, mediainfo, os, types, udB, ultroid_cmd - - -@ultroid_cmd( - pattern="delchat", - groups_only=True, -) -async def _(e): - xx = await e.eor(get_string("com_1")) - try: - match = e.text.split(" ", maxsplit=1)[1] - chat = await e.client.parse_id(match) - except IndexError: - chat = e.chat_id - try: - await e.client(DeleteChannelRequest(chat)) - except TypeError: - return await xx.eor(get_string("chats_1"), time=10) - except no_admin: - return await xx.eor(get_string("chats_2"), time=10) - await e.client.send_message( - int(udB.get_key("LOG_CHANNEL")), get_string("chats_6").format(e.chat_id) - ) - - -@ultroid_cmd( - pattern="getlink( (.*)|$)", - groups_only=True, - manager=True, -) -async def _(e): - reply = await e.get_reply_message() - match = e.pattern_match.group(1).strip() - if reply and not isinstance(reply.sender, User): - chat = await reply.get_sender() - else: - chat = await e.get_chat() - if hasattr(chat, "username") and chat.username: - return await e.eor(f"Username: @{chat.username}") - request, usage, title, link = None, None, None, None - if match: - split = match.split(maxsplit=1) - request = split[0] in ["r", "request"] - title = "Created by Ultroid" - if len(split) > 1: - match = split[1] - spli = match.split(maxsplit=1) - if spli[0].isdigit(): - usage = int(spli[0]) - if len(spli) > 1: - title = spli[1] - elif not request: - if match.isdigit(): - usage = int(match) - else: - title = match - if request and usage: - usage = 0 - if request or title: - try: - r = await e.client( - ExportChatInviteRequest( - e.chat_id, - request_needed=request, - usage_limit=usage, - title=title, - ), - ) - except no_admin: - return await e.eor(get_string("chats_2"), time=10) - link = r.link - else: - if isinstance(chat, types.Chat): - FC = await e.client(GetFullChatRequest(chat.id)) - elif isinstance(chat, types.Channel): - FC = await e.client(GetFullChannelRequest(chat.id)) - else: - return - Inv = FC.full_chat.exported_invite - if Inv and not Inv.revoked: - link = Inv.link - if link: - return await e.eor(f"Link:- {link}") - await e.eor("`Failed to getlink!\nSeems like link is inaccessible to you...`") - - -@ultroid_cmd( - pattern="create (b|g|c)(?: |$)(.*)", -) -async def _(e): - type_of_group = e.pattern_match.group(1).strip() - group_name = e.pattern_match.group(2) - username = None - if " ; " in group_name: - group_ = group_name.split(" ; ", maxsplit=1) - group_name = group_[0] - username = group_[1] - xx = await e.eor(get_string("com_1")) - if type_of_group == "b": - try: - r = await e.client( - CreateChatRequest( - users=[asst.me.username], - title=group_name, - ), - ) - created_chat_id = r.chats[0].id - result = await e.client( - ExportChatInviteRequest( - peer=created_chat_id, - ), - ) - await xx.edit( - get_string("chats_4").format(group_name, result.link), - link_preview=False, - ) - except Exception as ex: - await xx.edit(str(ex)) - elif type_of_group in ["g", "c"]: - try: - r = await e.client( - CreateChannelRequest( - title=group_name, - about=get_string("chats_5"), - megagroup=type_of_group != "c", - ) - ) - - created_chat_id = r.chats[0].id - if username: - await e.client(UpdateUsernameRequest(created_chat_id, username)) - result = f"https://t.me/{username}" - else: - result = ( - await e.client( - ExportChatInviteRequest( - peer=created_chat_id, - ), - ) - ).link - await xx.edit( - get_string("chats_6").format(f"[{group_name}]({result})"), - link_preview=False, - ) - except Exception as ex: - await xx.edit(str(ex)) - - -# ---------------------------------------------------------------- # - - -@ultroid_cmd( - pattern="setgpic( (.*)|$)", admins_only=True, manager=True, require="change_info" -) -async def _(ult): - if not ult.is_reply: - return await ult.eor("`Reply to a Media..`", time=5) - match = ult.pattern_match.group(1).strip() - if not ult.client._bot and match: - try: - chat = await ult.client.parse_id(match) - except Exception as ok: - return await ult.eor(str(ok)) - else: - chat = ult.chat_id - reply = await ult.get_reply_message() - if reply.photo or reply.sticker or reply.video: - replfile = await reply.download_media() - elif reply.document and reply.document.thumbs: - replfile = await reply.download_media(thumb=-1) - else: - return await ult.eor("Reply to a Photo or Video..") - mediain = mediainfo(reply.media) - if "animated" in mediain: - replfile = await con.convert(replfile, convert_to="mp4") - else: - replfile = await con.convert( - replfile, outname="chatphoto", allowed_formats=["jpg", "png", "mp4"] - ) - file = await ult.client.upload_file(replfile) - try: - if "pic" not in mediain: - file = types.InputChatUploadedPhoto(video=file) - await ult.client(EditPhotoRequest(chat, file)) - await ult.eor("`Group Photo has Successfully Changed !`", time=5) - except Exception as ex: - await ult.eor(f"Error occured.\n`{str(ex)}`", time=5) - os.remove(replfile) - - -@ultroid_cmd( - pattern="delgpic( (.*)|$)", admins_only=True, manager=True, require="change_info" -) -async def _(ult): - match = ult.pattern_match.group(1).strip() - chat = ult.chat_id - if not ult.client._bot and match: - chat = match - try: - await ult.client(EditPhotoRequest(chat, types.InputChatPhotoEmpty())) - text = "`Removed Chat Photo..`" - except Exception as E: - text = str(E) - return await ult.eor(text, time=5) - - -@ultroid_cmd(pattern="unbanall$", manager=True, admins_only=True, require="ban_users") -async def _(event): - xx = await event.eor("Searching Participant Lists.") - p = 0 - title = (await event.get_chat()).title - async for i in event.client.iter_participants( - event.chat_id, - filter=ChannelParticipantsKicked, - aggressive=True, - ): - try: - await event.client.edit_permissions(event.chat_id, i, view_messages=True) - p += 1 - except no_admin: - pass - except BaseException as er: - LOGS.exception(er) - await xx.eor(f"{title}: {p} unbanned", time=5) - - -@ultroid_cmd( - pattern="rmusers( (.*)|$)", - groups_only=True, - admins_only=True, - fullsudo=True, -) -async def _(event): - xx = await event.eor(get_string("com_1")) - input_str = event.pattern_match.group(1).strip() - p, a, b, c, d, m, n, y, w, o, q, r = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - async for i in event.client.iter_participants(event.chat_id): - p += 1 # Total Count - if isinstance(i.status, UserStatusEmpty): - if "empty" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - y += 1 - if isinstance(i.status, UserStatusLastMonth): - if "month" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - m += 1 - if isinstance(i.status, UserStatusLastWeek): - if "week" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - w += 1 - if isinstance(i.status, UserStatusOffline): - if "offline" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - o += 1 - if isinstance(i.status, UserStatusOnline): - if "online" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - q += 1 - if isinstance(i.status, UserStatusRecently): - if "recently" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - r += 1 - if i.bot: - if "bot" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - b += 1 - elif i.deleted: - if "deleted" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - d += 1 - elif i.status is None: - if "none" in input_str: - try: - await event.client.kick_participant(event.chat_id, i) - c += 1 - except BaseException: - pass - else: - n += 1 - if input_str: - required_string = f"**>> Kicked** `{c} / {p}` **users**\n\n" - else: - required_string = f"**>> Total** `{p}` **users**\n\n" - required_string += f" `{HNDLR}rmusers deleted` **••** `{d}`\n" - required_string += f" `{HNDLR}rmusers empty` **••** `{y}`\n" - required_string += f" `{HNDLR}rmusers month` **••** `{m}`\n" - required_string += f" `{HNDLR}rmusers week` **••** `{w}`\n" - required_string += f" `{HNDLR}rmusers offline` **••** `{o}`\n" - required_string += f" `{HNDLR}rmusers online` **••** `{q}`\n" - required_string += f" `{HNDLR}rmusers recently` **••** `{r}`\n" - required_string += f" `{HNDLR}rmusers bot` **••** `{b}`\n" - required_string += f" `{HNDLR}rmusers none` **••** `{n}`" - await xx.eor(required_string) diff --git a/plugins/cleanaction.py b/plugins/cleanaction.py deleted file mode 100644 index ebc65752f3267e175da561ea383edc31cb5bfa20..0000000000000000000000000000000000000000 --- a/plugins/cleanaction.py +++ /dev/null @@ -1,48 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_cleanaction") - - -from telethon.utils import get_display_name - -from . import get_string, udB, ultroid_cmd - - -@ultroid_cmd(pattern="addclean$", admins_only=True) -async def _(e): - key = udB.get_key("CLEANCHAT") or [] - if e.chat_id in key: - return await eod(e, get_string("clan_5")) - key.append(e.chat_id) - udB.set_key("CLEANCHAT", key) - await e.eor(get_string("clan_1"), time=5) - - -@ultroid_cmd(pattern="remclean$") -async def _(e): - key = udB.get_key("CLEANCHAT") or [] - if e.chat_id in key: - key.remove(e.chat_id) - udB.set_key("CLEANCHAT", key) - await e.eor(get_string("clan_2"), time=5) - - -@ultroid_cmd(pattern="listclean$") -async def _(e): - if k := udB.get_key("CLEANCHAT"): - o = "" - for x in k: - try: - title = get_display_name(await e.client.get_entity(x)) - except BaseException: - title = get_string("clan_3") - o += f"{x} {title}\n" - return await e.eor(o) - await e.eor(get_string("clan_4"), time=5) diff --git a/plugins/codefix.py b/plugins/codefix.py deleted file mode 100644 index 1340eabeacb96651cdf196fc8ddd93274af246a1..0000000000000000000000000000000000000000 --- a/plugins/codefix.py +++ /dev/null @@ -1,241 +0,0 @@ -import os -from collections import deque -from io import BytesIO - -from . import ( - ultroid_cmd, - async_searcher, - udB, - LOGS, - get_paste, -) - -CR_O_CHAT_HISTORY = deque(maxlen=30) - -TELEGRAM_CHAR_LIMIT = 4096 # Telegram's message character limit - -initprompt = """ -You are an expert coding assistant. Your primary goal is to analyze, repair, and enhance the code provided by the user. - -Follow this structured approach: - -1. **Clarify Code Intent:** - * If the purpose of the code is unclear, ask the user for clarification. - * Understand what the code is supposed to achieve. - -2. **Analyze and Diagnose:** - * Identify errors, bugs, security vulnerabilities, or logical flaws. - * Look for performance inefficiencies and suggest improvements. - * Ensure adherence to coding standards and best practices (e.g., PEP 8 for Python). - -3. **Repair and Optimize:** - * Correct bugs, errors, and vulnerabilities, providing explanations for each fix. - * Optimize the code for speed, memory usage, or overall efficiency. - * Recommend alternative libraries or methods where they might offer better solutions. - -4. **Enhance Readability and Maintainability:** - * Apply consistent formatting and clean coding practices. - * Add meaningful comments to clarify complex logic or structures. - -5. **Summarize Improvements:** - * Present the corrected, optimized code. - * Provide a brief summary of the changes made and explain the benefits of each. -""" - -initset = False - -async def pastee(data): - err, linky = await get_paste(data) - if err: - return f">> [Raw Code Pasted Here](https://spaceb.in/{linky})\n" - else: - LOGS.error(linky) - return "" - - -@ultroid_cmd( - pattern=r"codefix( ([\s\S]*))?$", -) -async def openai_chat_gpt(e): - global initset - api_key = "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" - if not api_key: - return await e.eor("`OPENAI_API` key missing..", time=10) - - query = e.pattern_match.group(2) - reply = await e.get_reply_message() - - file_content = None - - if query: - # Check if query contains 'from filename' - if ' from ' in query: - query_text, filename = query.split(' from ', 1) - query_text = query_text.strip() - filename = filename.strip() - # Attempt to find and read the file from media in chat - file_found = False - async for message in e.client.iter_messages(e.chat_id, reverse=True, limit=50): - if message.media and message.file.name == filename: - if (message.file.name.endswith(".txt") or message.file.name.endswith(".py")): - file = await e.client.download_media(message) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - file_found = True - break - if not file_found: - return await e.eor(f"`File {filename} not found in recent messages.`", time=5) - if file_content: - query = f"{query_text}\n\n{file_content}" if query_text else file_content - else: - return await e.eor("`Failed to read file content.`", time=5) - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the query and the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = f"{query}\n\n{file_content}" - elif reply and reply.message: - # Use the query and the replied text message content - query = f"{query}\n\n{reply.message}" - # Else, use query as is - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = file_content - elif reply and reply.message: - # Use the replied text message content - query = reply.message - else: - return await e.eor("`Please provide a question or reply to a message or .txt/.py file.`", time=5) - - if query.strip() == "-c": - initset = False - CR_O_CHAT_HISTORY.clear() - return await e.eor("__Cleared o1-mini Chat History!__", time=6) - - if initset == False: - CR_O_CHAT_HISTORY.append({"role": "user", "content": initprompt}) - try: - data = { - "model": "o1-mini", - "messages": list(CR_O_CHAT_HISTORY), - } - request = await async_searcher( - "https://api.openai.com/v1/chat/completions", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}", - }, - json=data, - re_json=True, - post=True, - ) - response = request["choices"][0]["message"]["content"] - CR_O_CHAT_HISTORY.append({"role": "assistant", "content": response}) - initset = True - except Exception as exc: - LOGS.warning(exc, exc_info=True) - CR_O_CHAT_HISTORY.pop() - return await e.edit( - f"**Error while requesting data from OpenAI:** \n> `{exc}`" - ) - - eris = await e.eor(f"__Generating answer for:__\n`{query[:20]} ...`") - CR_O_CHAT_HISTORY.append({"role": "user", "content": query}) - - try: - data = { - "model": "o1-mini", - "messages": list(CR_O_CHAT_HISTORY), - } - request = await async_searcher( - "https://api.openai.com/v1/chat/completions", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}", - }, - json=data, - re_json=True, - post=True, - ) - response = request["choices"][0]["message"]["content"] - CR_O_CHAT_HISTORY.append({"role": "assistant", "content": response}) - except Exception as exc: - LOGS.warning(exc, exc_info=True) - CR_O_CHAT_HISTORY.pop() - return await eris.edit( - f"**Error while requesting data from OpenAI:** \n> `{exc}`" - ) - - LOGS.debug(f'Tokens Used on query: {request["usage"]["completion_tokens"]}') - - # Truncate query to 50 characters for display - truncated_query = query[:100] - - # Prepare the full message - full_message = f"**Query:**\n~ __{truncated_query}__\n\n**o1-mini:**\n~ {response}" - - # Check if response contains code blocks - code_blocks = [] - in_code_block = False - code_block_lines = [] - for line in response.split('\n'): - if line.strip().startswith('```'): - if in_code_block: - # End of code block - in_code_block = False - code_blocks.append('\n'.join(code_block_lines)) - code_block_lines = [] - else: - # Start of code block - in_code_block = True - elif in_code_block: - code_block_lines.append(line) - - # If the response contains code blocks, select the largest one and paste it - if code_blocks: - # Select the largest code block based on length - largest_code_block = max(code_blocks, key=lambda block: len(block)) - # Upload the largest code block to spaceb.in and get the link - paste_link = await pastee(largest_code_block) - else: - paste_link = "" - - if len(full_message) <= TELEGRAM_CHAR_LIMIT: - # If it fits within the limit, send as a message - await eris.edit(full_message + f"\n\n{paste_link}") - else: - # If it exceeds the limit, send as a file and include paste link - file = BytesIO(full_message.encode('utf-8')) - file.name = "o1-mini-output.txt" - await eris.respond( - "__The query and response were too long, so they have been sent as a file.__\n\n" + paste_link, - file=file, - reply_to=e.reply_to_msg_id or e.id, - link_preview=False - ) - await eris.delete() - diff --git a/plugins/codegpt.py b/plugins/codegpt.py deleted file mode 100644 index ca3b6d545ac389119aaddd155722c1bc9852aa0d..0000000000000000000000000000000000000000 --- a/plugins/codegpt.py +++ /dev/null @@ -1,302 +0,0 @@ -import os -from collections import deque -from io import BytesIO - -from . import ( - ultroid_cmd, - async_searcher, - udB, - LOGS, - get_paste, -) - -CG_GPT_CHAT_HISTORY = deque(maxlen=30) - -TELEGRAM_CHAR_LIMIT = 4096 # Telegram's message character limit - -initprompt = """ -Your name is User Coding Helper. Your task is to create plugins for the Ultroid Telegram userbot. Follow these guidelines: -1. Imports: Include all necessary imports as demonstrated in the example code provided below. -2. Command Creation: Generate a random, suitable Ultroid command. Ensure that this command can either: - - Process a query, or - - Be used directly with the command. -3. Code Submission: Do not send any code without a corresponding post request or without the user providing a code snippet. - -Example Code: -``` -from os import system, remove -from io import BytesIO - -try: - import openai -except ImportError: - system("pip install -q openai") - import openai - -from . import ultroid_cmd, check_filename, udB, LOGS, fast_download, run_async - -@run_async -def get_gpt_answer(gen_image, question, api_key): - openai.api_key = api_key - if gen_image: - x = openai.Image.create( - prompt=question, - n=1, - size="1024x1024", - user="arc", - ) - return x["data"][0]["url"] - x = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[{"role": "user", "content": question}], - ) - LOGS.debug(f'Token Used on ({question}) > {x["usage"]["total_tokens"]}') - return x["choices"][0]["message"]["content"].lstrip("+AFw-n") - -@ultroid_cmd(pattern="(chat)?gpt( (.*)|$)") -async def openai_chat_gpt(e): - api_key = udB.get_key("OPENAI_API") - gen_image = False - if not api_key: - return await e.eor("OPENAI_API key missing..") - - args = e.pattern_match.group(3) - reply = await e.get_reply_message() - if not args: - if reply and reply.text: - args = reply.message - if not args: - return await e.eor("Gimme a Question to ask from ChatGPT") - - moi = await e.eor(f"+2D3cIw") - if args.startswith("-i"): - gen_image = True - args = args[2:].strip() - try: - response = await get_gpt_answer(gen_image, args, api_key) - except Exception as exc: - LOGS.warning(exc, exc_info=True) - return await moi.edit(f"Error: +AFw-n> {exc}") - else: - if gen_image: - path, _ = await fast_download( - response, filename=check_filename("dall-e.png") - ) - await e.client.send_file( - e.chat_id, - path, - caption=f"{args[:1020]}", - reply_to=e.reply_to_msg_id, - ) - await moi.delete() - return remove(path) - if len(response) < 4095: - answer = f"+AFw-n {response}" - return await moi.edit(answer, parse_mode="html") - with BytesIO(response.encode()) as file: - file.name = "gpt_response.txt" - await e.client.send_file( - e.chat_id, file, caption=f"{args[:1020]}", reply_to=e.reply_to_msg_id - ) - await moi.delete() -``` - -Based on this template, whenever a new prompt is given, create a suitable Ultroid plugin code snippet that includes a POST request, handles the query, and assigns a new command. -""" - -initset = False - -async def pastee(data): - err, linky = await get_paste(data) - if err: - return f">> [Raw Code Pasted Here](https://spaceb.in/{linky})\n" - else: - LOGS.error(linky) - return "" - - -@ultroid_cmd( - pattern=r"codegen( ([\s\S]*))?$", -) -async def openai_chat_gpt(e): - global initset - api_key = "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" - if not api_key: - return await e.eor("`OPENAI_API` key missing..", time=10) - - query = e.pattern_match.group(2) - reply = await e.get_reply_message() - - file_content = None - - if query: - # Check if query contains 'from filename' - if ' from ' in query: - query_text, filename = query.split(' from ', 1) - query_text = query_text.strip() - filename = filename.strip() - # Attempt to find and read the file from media in chat - file_found = False - async for message in e.client.iter_messages(e.chat_id, reverse=True, limit=50): - if message.media and message.file.name == filename: - if (message.file.name.endswith(".txt") or message.file.name.endswith(".py")): - file = await e.client.download_media(message) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - file_found = True - break - if not file_found: - return await e.eor(f"`File {filename} not found in recent messages.`", time=5) - if file_content: - query = f"{query_text}\n\n{file_content}" if query_text else file_content - else: - return await e.eor("`Failed to read file content.`", time=5) - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the query and the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = f"{query}\n\n{file_content}" - elif reply and reply.message: - # Use the query and the replied text message content - query = f"{query}\n\n{reply.message}" - # Else, use query as is - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = file_content - elif reply and reply.message: - # Use the replied text message content - query = reply.message - else: - return await e.eor("`Please provide a question or reply to a message or .txt/.py file.`", time=5) - - if query.strip() == "-c": - CG_GPT_CHAT_HISTORY.clear() - return await e.eor("__Cleared o1-mini Chat History!__", time=6) - - if initset == False: - CG_GPT_CHAT_HISTORY.append({"role": "user", "content": initprompt}) - try: - data = { - "model": "o1-mini", - "messages": list(CG_GPT_CHAT_HISTORY), - } - request = await async_searcher( - "https://api.openai.com/v1/chat/completions", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}", - }, - json=data, - re_json=True, - post=True, - ) - response = request["choices"][0]["message"]["content"] - CG_GPT_CHAT_HISTORY.append({"role": "assistant", "content": response}) - initset = True - except Exception as exc: - LOGS.warning(exc, exc_info=True) - CG_GPT_CHAT_HISTORY.pop() - return await eris.edit( - f"**Error while requesting data from OpenAI:** \n> `{exc}`" - ) - - eris = await e.eor(f"__Generating answer for:__\n`{query[:20]} ...`") - CG_GPT_CHAT_HISTORY.append({"role": "user", "content": query}) - - try: - data = { - "model": "o1-mini", - "messages": list(CG_GPT_CHAT_HISTORY), - } - request = await async_searcher( - "https://api.openai.com/v1/chat/completions", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}", - }, - json=data, - re_json=True, - post=True, - ) - response = request["choices"][0]["message"]["content"] - CG_GPT_CHAT_HISTORY.append({"role": "assistant", "content": response}) - except Exception as exc: - LOGS.warning(exc, exc_info=True) - CG_GPT_CHAT_HISTORY.pop() - return await eris.edit( - f"**Error while requesting data from OpenAI:** \n> `{exc}`" - ) - - LOGS.debug(f'Tokens Used on query: {request["usage"]["completion_tokens"]}') - - # Truncate query to 50 characters for display - truncated_query = query[:100] - - # Prepare the full message - full_message = f"**Query:**\n~ __{truncated_query}__\n\n**o1-mini:**\n~ {response}" - - # Check if response contains code blocks - code_blocks = [] - in_code_block = False - code_block_lines = [] - for line in response.split('\n'): - if line.strip().startswith('```'): - if in_code_block: - # End of code block - in_code_block = False - code_blocks.append('\n'.join(code_block_lines)) - code_block_lines = [] - else: - # Start of code block - in_code_block = True - elif in_code_block: - code_block_lines.append(line) - - # If the response contains code blocks, select the largest one and paste it - if code_blocks: - # Select the largest code block based on length - largest_code_block = max(code_blocks, key=lambda block: len(block)) - # Upload the largest code block to spaceb.in and get the link - paste_link = await pastee(largest_code_block) - else: - paste_link = "" - - if len(full_message) <= TELEGRAM_CHAR_LIMIT: - # If it fits within the limit, send as a message - await eris.edit(full_message + f"\n\n{paste_link}") - else: - # If it exceeds the limit, send as a file and include paste link - file = BytesIO(full_message.encode('utf-8')) - file.name = "o1-mini-output.txt" - await eris.respond( - "__The query and response were too long, so they have been sent as a file.__\n\n" + paste_link, - file=file, - reply_to=e.reply_to_msg_id or e.id, - link_preview=False - ) - await eris.delete() - diff --git a/plugins/compressor.py b/plugins/compressor.py deleted file mode 100644 index 4161a9f4fa6d397ccd225ceda0ef031f80458a1b..0000000000000000000000000000000000000000 --- a/plugins/compressor.py +++ /dev/null @@ -1,175 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_compressor") - - -import asyncio -import os -import re -import time -from datetime import datetime as dt - -from telethon.errors.rpcerrorlist import MessageNotModifiedError -from telethon.tl.types import DocumentAttributeVideo - -from pyUltroid.fns.tools import metadata - -from . import ( - ULTConfig, - bash, - downloader, - get_string, - humanbytes, - math, - mediainfo, - time_formatter, - ultroid_cmd, - uploader, -) - - -@ultroid_cmd(pattern="compress( (.*)|$)") -async def _(e): - cr = e.pattern_match.group(1).strip() - crf = 27 - to_stream = False - if cr: - k = e.text.split() - if len(k) == 2: - crf = int(k[1]) if k[1].isdigit() else 27 - elif len(k) > 2: - crf = int(k[1]) if k[1].isdigit() else 27 - to_stream = "stream" in k[2] - vido = await e.get_reply_message() - if vido and vido.media and "video" in mediainfo(vido.media): - if hasattr(vido.media, "document"): - vfile = vido.media.document - name = vido.file.name - else: - vfile = vido.media - name = "" - if not name: - name = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" - xxx = await e.eor(get_string("audiotools_5")) - c_time = time.time() - file = await downloader( - f"resources/downloads/{name}", - vfile, - xxx, - c_time, - f"Downloading {name}...", - ) - - o_size = os.path.getsize(file.name) - d_time = time.time() - diff = time_formatter((d_time - c_time) * 1000) - file_name = (file.name).split("/")[-1] - out = file_name.replace(file_name.split(".")[-1], "compressed.mkv") - await xxx.edit( - f"`Downloaded {file.name} of {humanbytes(o_size)} in {diff}.\nNow Compressing...`" - ) - x, y = await bash( - f'mediainfo --fullscan """{file.name}""" | grep "Frame count"' - ) - if y and y.endswith("NOT_FOUND"): - return await xxx.edit(f"ERROR: `{y}`") - total_frames = x.split(":")[1].split("\n")[0] - progress = f"progress-{c_time}.txt" - with open(progress, "w"): - pass - proce = await asyncio.create_subprocess_shell( - f'ffmpeg -hide_banner -loglevel quiet -progress {progress} -i """{file.name}""" -preset ultrafast -vcodec libx265 -crf {crf} -c:a copy """{out}""" -y', - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - while proce.returncode != 0: - await asyncio.sleep(3) - with open(progress, "r+") as fil: - text = fil.read() - frames = re.findall("frame=(\\d+)", text) - size = re.findall("total_size=(\\d+)", text) - speed = 0 - if len(frames): - elapse = int(frames[-1]) - if len(size): - size = int(size[-1]) - per = elapse * 100 / int(total_frames) - time_diff = time.time() - int(d_time) - speed = round(elapse / time_diff, 2) - if int(speed) != 0: - some_eta = ((int(total_frames) - elapse) / speed) * 1000 - text = f"`Compressing {file_name} at {crf} CRF.\n`" - progress_str = "`[{0}{1}] {2}%\n\n`".format( - "".join("●" for _ in range(math.floor(per / 5))), - "".join("" for _ in range(20 - math.floor(per / 5))), - round(per, 2), - ) - - e_size = f"{humanbytes(size)} of ~{humanbytes((size / per) * 100)}" - eta = f"~{time_formatter(some_eta)}" - try: - await xxx.edit( - text - + progress_str - + "`" - + e_size - + "`" - + "\n\n`" - + eta - + "`" - ) - except MessageNotModifiedError: - pass - os.remove(file.name) - c_size = os.path.getsize(out) - f_time = time.time() - difff = time_formatter((f_time - d_time) * 1000) - await xxx.edit( - f"`Compressed {humanbytes(o_size)} to {humanbytes(c_size)} in {difff}\nTrying to Upload...`" - ) - differ = 100 - ((c_size / o_size) * 100) - caption = f"**Original Size: **`{humanbytes(o_size)}`\n" - caption += f"**Compressed Size: **`{humanbytes(c_size)}`\n" - caption += f"**Compression Ratio: **`{differ:.2f}%`\n" - caption += f"\n**Time Taken To Compress: **`{difff}`" - mmmm = await uploader(out, out, f_time, xxx, f"Uploading {out}...") - if to_stream: - data = await metadata(out) - width = data["width"] - height = data["height"] - duration = data["duration"] - attributes = [ - DocumentAttributeVideo( - duration=duration, w=width, h=height, supports_streaming=True - ) - ] - await e.client.send_file( - e.chat_id, - mmmm, - thumb=ULTConfig.thumb, - caption=caption, - attributes=attributes, - force_document=False, - reply_to=e.reply_to_msg_id, - ) - else: - await e.client.send_file( - e.chat_id, - mmmm, - thumb=ULTConfig.thumb, - caption=caption, - force_document=True, - reply_to=e.reply_to_msg_id, - ) - await xxx.delete() - os.remove(out) - os.remove(progress) - else: - await e.eor(get_string("audiotools_8"), time=5) diff --git a/plugins/converter.py b/plugins/converter.py deleted file mode 100644 index 0ed3e36037be740b8b23b96ef8f9073644f8dd47..0000000000000000000000000000000000000000 --- a/plugins/converter.py +++ /dev/null @@ -1,191 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_converter") - -import os -import time - -from . import LOGS - -try: - import cv2 -except ImportError: - cv2 = None - -try: - from PIL import Image -except ImportError: - LOGS.info(f"{__file__}: PIL not Installed.") - Image = None - -from telegraph import upload_file as uf - -from . import ( - ULTConfig, - bash, - con, - downloader, - get_paste, - get_string, - udB, - ultroid_cmd, - uploader, -) - -opn = [] - - -@ultroid_cmd( - pattern="thumbnail$", -) -async def _(e): - r = await e.get_reply_message() - if r.photo: - dl = await r.download_media() - elif r.document and r.document.thumbs: - dl = await r.download_media(thumb=-1) - else: - return await e.eor("`Reply to Photo or media with thumb...`") - variable = uf(dl) - os.remove(dl) - nn = f"https://graph.org{variable[0]}" - udB.set_key("CUSTOM_THUMBNAIL", str(nn)) - await bash(f"wget {nn} -O resources/extras/ultroid.jpg") - await e.eor(get_string("cvt_6").format(nn), link_preview=False) - - -@ultroid_cmd( - pattern="rename( (.*)|$)", -) -async def imak(event): - reply = await event.get_reply_message() - t = time.time() - if not reply: - return await event.eor(get_string("cvt_1")) - inp = event.pattern_match.group(1).strip() - if not inp: - return await event.eor(get_string("cvt_2")) - xx = await event.eor(get_string("com_1")) - if reply.media: - if hasattr(reply.media, "document"): - file = reply.media.document - image = await downloader( - reply.file.name or str(time.time()), - reply.media.document, - xx, - t, - get_string("com_5"), - ) - - file = image.name - else: - file = await event.client.download_media(reply.media) - if os.path.exists(inp): - os.remove(inp) - await bash(f'mv """{file}""" """{inp}"""') - if not os.path.exists(inp) or os.path.exists(inp) and not os.path.getsize(inp): - os.rename(file, inp) - k = time.time() - xxx = await uploader(inp, inp, k, xx, get_string("com_6")) - await event.reply( - f"`{xxx.name}`", - file=xxx, - force_document=True, - thumb=ULTConfig.thumb, - ) - os.remove(inp) - await xx.delete() - - -conv_keys = { - "img": "png", - "sticker": "webp", - "webp": "webp", - "image": "png", - "webm": "webm", - "gif": "gif", - "json": "json", - "tgs": "tgs", -} - - -@ultroid_cmd( - pattern="convert( (.*)|$)", -) -async def uconverter(event): - xx = await event.eor(get_string("com_1")) - a = await event.get_reply_message() - if a is None: - return await event.eor("`Reply to Photo or media with thumb...`") - input_ = event.pattern_match.group(1).strip() - b = await a.download_media("resources/downloads/") - if not b and (a.document and a.document.thumbs): - b = await a.download_media(thumb=-1) - if not b: - return await xx.edit(get_string("cvt_3")) - try: - convert = conv_keys[input_] - except KeyError: - return await xx.edit(get_string("sts_3").format("gif/img/sticker/webm")) - file = await con.convert(b, outname="ultroid", convert_to=convert) - if file: - await event.client.send_file( - event.chat_id, file, reply_to=event.reply_to_msg_id or event.id - ) - os.remove(file) - await xx.delete() - - -@ultroid_cmd( - pattern="doc( (.*)|$)", -) -async def _(event): - input_str = event.pattern_match.group(1).strip() - if not (input_str and event.is_reply): - return await event.eor(get_string("cvt_1"), time=5) - xx = await event.eor(get_string("com_1")) - a = await event.get_reply_message() - if not a.message: - return await xx.edit(get_string("ex_1")) - with open(input_str, "w") as b: - b.write(str(a.message)) - await xx.edit(f"**Packing into** `{input_str}`") - await event.reply(file=input_str, thumb=ULTConfig.thumb) - await xx.delete() - os.remove(input_str) - - -@ultroid_cmd( - pattern="open( (.*)|$)", -) -async def _(event): - a = await event.get_reply_message() - b = event.pattern_match.group(1).strip() - if not ((a and a.media) or (b and os.path.exists(b))): - return await event.eor(get_string("cvt_7"), time=5) - xx = await event.eor(get_string("com_1")) - rem = None - if not b: - b = await a.download_media() - rem = True - try: - with open(b) as c: - d = c.read() - except UnicodeDecodeError: - return await xx.eor(get_string("cvt_8"), time=5) - try: - await xx.edit(f"```{d}```") - except BaseException: - what, key = await get_paste(d) - await xx.edit( - f"**MESSAGE EXCEEDS TELEGRAM LIMITS**\n\nSo Pasted It On [SPACEBIN](https://spaceb.in/{key})" - ) - if rem: - os.remove(b) diff --git a/plugins/core.py b/plugins/core.py deleted file mode 100644 index 6664fa5800275464bee832f87e88a1b2238cc5e5..0000000000000000000000000000000000000000 --- a/plugins/core.py +++ /dev/null @@ -1,124 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - - -from . import get_help - -__doc__ = get_help("help_core") - - -import os - -from pyUltroid.startup.loader import load_addons - -from . import LOGS, async_searcher, eod, get_string, safeinstall, ultroid_cmd, un_plug - - -@ultroid_cmd(pattern="install", fullsudo=True) -async def install(event): - await safeinstall(event) - - -@ultroid_cmd( - pattern=r"unload( (.*)|$)", -) -async def unload(event): - shortname = event.pattern_match.group(1).strip() - if not shortname: - await event.eor(get_string("core_9")) - return - lsd = os.listdir("addons") - zym = f"{shortname}.py" - if zym in lsd: - try: - un_plug(shortname) - await event.eor(f"**Uɴʟᴏᴀᴅᴇᴅ** `{shortname}` **Sᴜᴄᴄᴇssғᴜʟʟʏ.**", time=3) - except Exception as ex: - LOGS.exception(ex) - return await event.eor(str(ex)) - elif zym in os.listdir("plugins"): - return await event.eor(get_string("core_11"), time=3) - else: - await event.eor(f"**Nᴏ Pʟᴜɢɪɴ Nᴀᴍᴇᴅ** `{shortname}`", time=3) - - -@ultroid_cmd( - pattern=r"uninstall( (.*)|$)", -) -async def uninstall(event): - shortname = event.pattern_match.group(1).strip() - if not shortname: - await event.eor(get_string("core_13")) - return - lsd = os.listdir("addons") - zym = f"{shortname}.py" - if zym in lsd: - try: - un_plug(shortname) - await event.eor(f"**Uɴɪɴsᴛᴀʟʟᴇᴅ** `{shortname}` **Sᴜᴄᴄᴇssғᴜʟʟʏ.**", time=3) - os.remove(f"addons/{shortname}.py") - except Exception as ex: - return await event.eor(str(ex)) - elif zym in os.listdir("plugins"): - return await event.eor(get_string("core_15"), time=3) - else: - return await event.eor(f"**Nᴏ Pʟᴜɢɪɴ Nᴀᴍᴇᴅ** `{shortname}`", time=3) - - -@ultroid_cmd( - pattern=r"load( (.*)|$)", - fullsudo=True, -) -async def load(event): - shortname = event.pattern_match.group(1).strip() - if not shortname: - await event.eor(get_string("core_16")) - return - try: - try: - un_plug(shortname) - except BaseException: - pass - load_addons(f"addons/{shortname}.py") - await event.eor(get_string("core_17").format(shortname), time=3) - except Exception as e: - LOGS.exception(e) - await eod( - event, - get_string("core_18").format(shortname, e), - time=3, - ) - - -@ultroid_cmd(pattern="getaddons( (.*)|$)", fullsudo=True) -async def get_the_addons_lol(event): - thelink = event.pattern_match.group(1).strip() - xx = await event.eor(get_string("com_1")) - fool = get_string("gas_1") - if thelink is None: - return await xx.eor(fool, time=10) - split_thelink = thelink.split("/") - if not ("raw" in thelink and thelink.endswith(".py")): - return await xx.eor(fool, time=10) - name_of_it = split_thelink[-1] - plug = await async_searcher(thelink) - fil = f"addons/{name_of_it}" - await xx.edit("Packing the codes...") - with open(fil, "w", encoding="utf-8") as uult: - uult.write(plug) - await xx.edit("Packed. Now loading the plugin..") - shortname = name_of_it.split(".")[0] - try: - load_addons(fil) - await xx.eor(get_string("core_17").format(shortname), time=15) - except Exception as e: - LOGS.exception(e) - await eod( - xx, - get_string("core_18").format(shortname, e), - time=3, - ) diff --git a/plugins/database.py b/plugins/database.py deleted file mode 100644 index 8c50ea2a3a80b452217dfdfdeca18fa4ae380279..0000000000000000000000000000000000000000 --- a/plugins/database.py +++ /dev/null @@ -1,77 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - - -from . import get_help - -__doc__ = get_help("help_database") - - -import re - -from . import Redis, eor, get_string, udB, ultroid_cmd - - -@ultroid_cmd(pattern="setdb( (.*)|$)", fullsudo=True) -async def _(ult): - match = ult.pattern_match.group(1).strip() - if not match: - return await ult.eor("Provide key and value to set!") - try: - delim = " " if re.search("[|]", match) is None else " | " - data = match.split(delim, maxsplit=1) - if data[0] in ["--extend", "-e"]: - data = data[1].split(maxsplit=1) - data[1] = f"{str(udB.get_key(data[0]))} {data[1]}" - udB.set_key(data[0], data[1]) - await ult.eor( - f"**DB Key Value Pair Updated\nKey :** `{data[0]}`\n**Value :** `{data[1]}`" - ) - - except BaseException: - await ult.eor(get_string("com_7")) - - -@ultroid_cmd(pattern="deldb( (.*)|$)", fullsudo=True) -async def _(ult): - key = ult.pattern_match.group(1).strip() - if not key: - return await ult.eor("Give me a key name to delete!", time=5) - _ = key.split(maxsplit=1) - try: - if _[0] == "-m": - for key in _[1].split(): - k = udB.del_key(key) - key = _[1] - else: - k = udB.del_key(key) - if k == 0: - return await ult.eor("`No Such Key.`") - await ult.eor(f"`Successfully deleted key {key}`") - except BaseException: - await ult.eor(get_string("com_7")) - - -@ultroid_cmd(pattern="rendb( (.*)|$)", fullsudo=True) -async def _(ult): - match = ult.pattern_match.group(1).strip() - if not match: - return await ult.eor("`Provide Keys name to rename..`") - delim = " " if re.search("[|]", match) is None else " | " - data = match.split(delim) - if Redis(data[0]): - try: - udB.rename(data[0], data[1]) - await eor( - ult, - f"**DB Key Rename Successful\nOld Key :** `{data[0]}`\n**New Key :** `{data[1]}`", - ) - - except BaseException: - await ult.eor(get_string("com_7")) - else: - await ult.eor("Key not found") diff --git a/plugins/dbx.py b/plugins/dbx.py deleted file mode 100644 index 970a5a0000b89ff68a54a4dc54dcd50a5d466b34..0000000000000000000000000000000000000000 --- a/plugins/dbx.py +++ /dev/null @@ -1,123 +0,0 @@ -import dns.resolver -import re - -from motor.motor_asyncio import AsyncIOMotorClient -from telethon import errors - -from . import ultroid_cmd, LOGS, run_async - -dns.resolver.default_resolver = dns.resolver.Resolver(configure=False) -dns.resolver.default_resolver.nameservers = ['8.8.8.8'] - -MONGO_URI = "mongodb+srv://xannychef:GlZdS1tZ4CiKDrcN@vouchdb.elfcz.mongodb.net/?retryWrites=true&w=majority&appName=vouchdb" -mongo_client = AsyncIOMotorClient(MONGO_URI) -db = mongo_client['vouchdata'] -vouch_collection = db['vouches'] - -BATCH_SIZE = 1000 - -AUTHORIZED_USERS = [5575183435] - -@ultroid_cmd(pattern=r"dbx(?: |$)(.*)", allow_sudo=True) -async def db_command_handler(event): - try: - args = event.pattern_match.group(1).split() - user_id = event.sender_id - - if user_id not in AUTHORIZED_USERS: - await event.reply("❌ You are not authorized to use this command.") - return - - if len(args) < 2: - await event.reply("❌ Invalid command. Usage:\n.db -index \n.db -update ") - return - - command = args[0] - try: - channel_id = int(args[1]) - except ValueError: - await event.reply("❌ Channel ID must be an integer.") - return - - from_message_id = int(args[2]) if command == "-update" and len(args) > 2 else None - - if command not in ["-index", "-update"]: - await event.reply("❌ Invalid flag. Use -index or -update.") - return - - processing_msg = await event.reply("🔍 Starting to process messages from the channel...") - - total_message_count = 0 - batch_data = [] - progress_update_interval = 10000 - - try: - channel = await event.client.get_entity(channel_id) - except errors.ChannelPrivateError: - await processing_msg.edit("❌ Cannot access the specified channel. It might be private or you lack permissions.") - return - except Exception as e: - await processing_msg.edit(f"❌ Error accessing the channel: {str(e)}") - return - - try: - if command == "-index": - total_messages = (await event.client.get_messages(channel, limit=1)).total - await processing_msg.edit(f"🔍 Total messages to process: {total_messages}") - - async for message in event.client.iter_messages(channel_id): - await process_message(message, batch_data, processing_msg, total_message_count, progress_update_interval) - total_message_count += 1 - - elif command == "-update": - if not from_message_id: - await processing_msg.edit("❌ For -update, you must provide a from_message_id.") - return - - async for message in event.client.iter_messages(channel_id, min_id=from_message_id): - await process_message(message, batch_data, processing_msg, total_message_count, progress_update_interval) - total_message_count += 1 - - if batch_data: - await vouch_collection.insert_many(batch_data) - batch_data.clear() - - await processing_msg.edit(f"✅ Completed {command[1:]}ing {total_message_count} messages.") - except Exception as e: - LOGS.error(f"Error during {command[1:]}ing: {str(e)}") - await processing_msg.edit(f"❌ Error during {command[1:]}ing: {str(e)}") - except Exception as e: - LOGS.error(f"Unexpected error: {str(e)}") - await event.reply(f"❌ An unexpected error occurred: {str(e)}") - -async def process_message(message, batch_data, processing_msg, total_message_count, progress_update_interval): - if message.sender and message.sender.username and message.sender.username.lower().endswith('bot'): - return - - vouched_by = message.sender.username if message.sender else "Unknown" - description = message.message or "No description" - message_id = message.id - - vouched_user_match = re.search(r"@\w+", description) - vouched_user = vouched_user_match.group(0) if vouched_user_match else "Unknown" - - vouch_data = { - "vouched_by": vouched_by, - "description": description, - "vouched_user": vouched_user, - "message_id": message_id, - "channel_id": message.chat_id - } - - existing_document = await vouch_collection.find_one({"message_id": message_id, "channel_id": message.chat_id}) - if existing_document: - await vouch_collection.update_one({"_id": existing_document["_id"]}, {"$set": vouch_data}) - else: - batch_data.append(vouch_data) - - if len(batch_data) >= BATCH_SIZE: - await vouch_collection.insert_many(batch_data) - batch_data.clear() - - if total_message_count and total_message_count % progress_update_interval == 0: - await processing_msg.edit(f"🔄 Processed {total_message_count} messages...") \ No newline at end of file diff --git a/plugins/devtools.py b/plugins/devtools.py deleted file mode 100644 index bd773ba97c7245739d3db4fd169a54b6ff246856..0000000000000000000000000000000000000000 --- a/plugins/devtools.py +++ /dev/null @@ -1,404 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_devtools") - -import inspect -import sys -import traceback -from io import BytesIO, StringIO -from os import remove -from pprint import pprint - -from telethon.utils import get_display_name - -from pyUltroid import _ignore_eval - -from . import * - -# Used for Formatting Eval Code, if installed -try: - import black -except ImportError: - black = None -from random import choice - -try: - from yaml import safe_load -except ImportError: - from pyUltroid.fns.tools import safe_load -try: - from telegraph import upload_file as uf -except ImportError: - uf = None -from telethon.tl import functions - -fn = functions - - -@ultroid_cmd( - pattern="sysinfo$", -) -async def _(e): - try: - remove("Dockerfile") - except Exception: - pass - xx = await e.eor(get_string("com_1")) - x, y = await bash("neofetch|sed 's/\x1B\\[[0-9;\\?]*[a-zA-Z]//g' >> neo.txt") - if y and y.endswith("NOT_FOUND"): - return await xx.edit(f"Error: `{y}`") - with open("neo.txt", "r", encoding="utf-8") as neo: - p = (neo.read()).replace("\n\n", "") - haa = await Carbon(code=p, file_name="neofetch", backgroundColor=choice(ATRA_COL)) - if isinstance(haa, dict): - await xx.edit(f"`{haa}`") - else: - await e.reply(file=haa) - await xx.delete() - remove("neo.txt") - - -@ultroid_cmd(pattern="bash", fullsudo=True, only_devs=True) -async def _(event): - try: - remove("Dockerfile") - except Exception: - pass - carb, rayso, yamlf = None, None, False - try: - cmd = event.text.split(" ", maxsplit=1)[1] - if cmd.split()[0] in ["-c", "--carbon"]: - cmd = cmd.split(maxsplit=1)[1] - carb = True - if cmd.split()[0] in ["-r", "--rayso"]: - cmd = cmd.split(maxsplit=1)[1] - rayso = True - except IndexError: - return await event.eor(get_string("devs_1"), time=10) - xx = await event.eor(get_string("com_1")) - reply_to_id = event.reply_to_msg_id or event.id - stdout, stderr = await bash(cmd, run_code=1) - OUT = f"**[👩‍💻](emoji/5301083932211550593) Ⲃⲁⲋⲏ\n\n• COMMAND:**\n`{cmd}` \n\n" - err, out = "", "" - if stderr: - err = f"**[⚠️](emoji/5213205860498549992) Ⲉɴfⲟʀmⲁtⲓⲟɴ:** \n`{stderr}`\n\n" - if stdout: - if (carb or udB.get_key("CARBON_ON_BASH")) and ( - event.is_private - or event.chat.admin_rights - or event.chat.creator - or event.chat.default_banned_rights.embed_links - ): - li = await Carbon( - code=stdout, - file_name="bash", - download=True, - backgroundColor=choice(ATRA_COL), - ) - if isinstance(li, dict): - await xx.edit( - f"Unknown Response from Carbon: `{li}`\n\nstdout`:{stdout}`\nstderr: `{stderr}`" - ) - return - url = f"https://graph.org{uf(li)[-1]}" - OUT = f"[\xad]({url}){OUT}" - out = f"**[👨‍💻](emoji/5319161050128459957) Ⲟυⲧⲣυⲧ:**" - remove(li) - elif (rayso or udB.get_key("RAYSO_ON_BASH")) and ( - event.is_private - or event.chat.admin_rights - or event.chat.creator - or event.chat.default_banned_rights.embed_links - ): - li = await Carbon( - code=stdout, - file_name="bash", - download=True, - backgroundColor=choice(ATRA_COL), - rayso=True, - ) - if isinstance(li, dict): - await xx.edit( - f"Unknown Response from Carbon: `{li}`\n\nstdout`:{stdout}`\nstderr: `{stderr}`" - ) - return - url = f"https://graph.org{uf(li)[-1]}" - OUT = f"[\xad]({url}){OUT}" - out = f"**[👨‍💻](emoji/5319161050128459957) Ⲟυⲧⲣυⲧ:**" - remove(li) - else: - if "pip" in cmd and all(":" in line for line in stdout.split("\n")): - try: - load = safe_load(stdout) - stdout = "" - for data in list(load.keys()): - res = load[data] or "" - if res and "http" not in str(res): - res = f"`{res}`" - stdout += f"**{data}** : {res}\n" - yamlf = True - except Exception as er: - stdout = f"`{stdout}`" - LOGS.exception(er) - else: - stdout = f"`{stdout}`" - out = f"**[👨‍💻](emoji/5319161050128459957) Ⲟυⲧⲣυⲧ:**\n{stdout}" - if not stderr and not stdout: - out = f"**[👨‍💻](emoji/5319161050128459957) Ⲟυⲧⲣυⲧ:**\n`Ⲋυⲥⲥⲉⲋⲋ`" - OUT += err + out - if len(OUT) > 4096: - ultd = err + out - with BytesIO(str.encode(ultd)) as out_file: - out_file.name = "bash.txt" - await event.client.send_file( - event.chat_id, - out_file, - force_document=True, - thumb=ULTConfig.thumb, - allow_cache=False, - caption=f"`{cmd}`" if len(cmd) < 998 else None, - reply_to=reply_to_id, - ) - - await xx.delete() - else: - await xx.edit(OUT, link_preview=not yamlf) - - -pp = pprint # ignore: pylint -bot = ultroid = ultroid_bot - - -class u: - _ = "" - - -def _parse_eval(value=None): - if not value: - return value - if hasattr(value, "stringify"): - try: - return value.stringify() - except TypeError: - pass - elif isinstance(value, dict): - try: - return json_parser(value, indent=1) - except BaseException: - pass - elif isinstance(value, list): - newlist = "[" - for index, child in enumerate(value): - newlist += "\n " + str(_parse_eval(child)) - if index < len(value) - 1: - newlist += "," - newlist += "\n]" - return newlist - return str(value) - - -@ultroid_cmd(pattern="eval", fullsudo=True, only_devs=True) -async def _(event): - try: - remove("Dockerfile") - except Exception: - pass - try: - cmd = event.text.split(maxsplit=1)[1] - except IndexError: - return await event.eor(get_string("devs_2"), time=5) - xx = None - mode = "" - spli = cmd.split() - - async def get_(): - try: - cm = cmd.split(maxsplit=1)[1] - except IndexError: - await event.eor("->> Wrong Format <<-") - cm = None - return cm - - if spli[0] in ["-s", "--silent"]: - await event.delete() - mode = "silent" - elif spli[0] in ["-n", "-noedit"]: - mode = "no-edit" - xx = await event.reply(get_string("com_1")) - elif spli[0] in ["-gs", "--source"]: - mode = "gsource" - elif spli[0] in ["-ga", "--args"]: - mode = "g-args" - if mode: - cmd = await get_() - if not cmd: - return - if mode != "silent" and not xx: - xx = await event.eor(get_string("com_1")) - if black: - try: - cmd = black.format_str(cmd, mode=black.Mode()) - except BaseException: - # Consider it as Code Error, and move on to be shown ahead. - pass - reply_to_id = event.reply_to_msg_id or event - if ( - any(item in cmd for item in KEEP_SAFE().All) - and not event.out - and event.sender_id != ultroid_bot.uid - ): - warning = await event.forward_to(udB.get_key("LOG_CHANNEL")) - await warning.reply( - f"Malicious Activities suspected by {inline_mention(await event.get_sender())}" - ) - _ignore_eval.append(event.sender_id) - return await xx.edit( - f"`Malicious Activities suspected![⚠️](emoji/5213205860498549992)\nReported to owner. Aborted this request!`" - ) - old_stderr = sys.stderr - old_stdout = sys.stdout - redirected_output = sys.stdout = StringIO() - redirected_error = sys.stderr = StringIO() - stdout, stderr, exc, timeg = None, None, None, None - tima = time.time() - try: - value = await aexec(cmd, event) - except Exception: - value = None - exc = traceback.format_exc() - tima = time.time() - tima - stdout = redirected_output.getvalue() - stderr = redirected_error.getvalue() - sys.stdout = old_stdout - sys.stderr = old_stderr - if value: - try: - if mode == "gsource": - exc = inspect.getsource(value) - elif mode == "g-args": - args = inspect.signature(value).parameters.values() - name = "" - if hasattr(value, "__name__"): - name = value.__name__ - exc = f"**{name}**\n\n" + "\n ".join([str(arg) for arg in args]) - except Exception: - exc = traceback.format_exc() - evaluation = exc or stderr or stdout or _parse_eval(value) or get_string("instu_4") - if mode == "silent": - if exc: - msg = f"[⚠️](emoji/5213205860498549992) EVAL Ⲉʀʀⲟʀ\n\n• CHAT: {get_display_name(event.chat)} [{event.chat_id}]" - msg += f"\n\n∆ CODE:\n{cmd}\n\n∆ Ⲉʀʀⲟʀ:\n{exc}" - log_chat = udB.get_key("LOG_CHANNEL") - if len(msg) > 4000: - with BytesIO(msg.encode()) as out_file: - out_file.name = "Eval-Error.txt" - return await event.client.send_message( - log_chat, f"`{cmd}`", file=out_file - ) - await event.client.send_message(log_chat, msg, parse_mode="html") - return - tmt = tima * 1000 - timef = time_formatter(tmt) - timeform = timef if timef != "0s" else f"{tmt:.3f}ms" - final_output = ( - "{} **Ⲉⳳⲁⳑ** (__in {}__)\n```{}``` \n\n{} **Ⲟυⲧⲣυⲧ**: \n```{}``` \n".format( - f"[👩‍💻](emoji/5300928913956938544)", - timeform, - cmd, - f"[👨‍💻](emoji/5319161050128459957)", - evaluation, - ) - ) - if len(final_output) > 4096: - final_output = evaluation - with BytesIO(str.encode(final_output)) as out_file: - out_file.name = "eval.txt" - await event.client.send_file( - event.chat_id, - out_file, - force_document=True, - thumb=ULTConfig.thumb, - allow_cache=False, - caption=f"```{cmd}```" if len(cmd) < 998 else None, - reply_to=reply_to_id, - ) - return await xx.delete() - await xx.edit(final_output) - - -def _stringify(text=None, *args, **kwargs): - if text: - u._ = text - text = _parse_eval(text) - return print(text, *args, **kwargs) - - -async def aexec(code, event): - exec( - ( - "async def __aexec(e, client): " - + "\n print = p = _stringify" - + "\n message = event = e" - + "\n u.r = reply = await event.get_reply_message()" - + "\n chat = event.chat_id" - + "\n u.lr = locals()" - ) - + "".join(f"\n {l}" for l in code.split("\n")) - ) - - return await locals()["__aexec"](event, event.client) - - -DUMMY_CPP = """#include -using namespace std; - -int main(){ -!code -} -""" - - -@ultroid_cmd(pattern="cpp", only_devs=True) -async def doie(e): - match = e.text.split(" ", maxsplit=1) - try: - match = match[1] - except IndexError: - return await e.eor(get_string("devs_3")) - msg = await e.eor(get_string("com_1")) - if "main(" not in match: - new_m = "".join(" " * 4 + i + "\n" for i in match.split("\n")) - match = DUMMY_CPP.replace("!code", new_m) - open("cpp-ultroid.cpp", "w").write(match) - m = await bash("g++ -o CppUltroid cpp-ultroid.cpp") - o_cpp = f"• **Eval-Cpp**\n`{match}`" - if m[1]: - o_cpp += f"\n\n**• Error :**\n`{m[1]}`" - if len(o_cpp) > 3000: - os.remove("cpp-ultroid.cpp") - if os.path.exists("CppUltroid"): - os.remove("CppUltroid") - with BytesIO(str.encode(o_cpp)) as out_file: - out_file.name = "error.txt" - return await msg.reply(f"`{match}`", file=out_file) - return await eor(msg, o_cpp) - m = await bash("./CppUltroid") - if m[0] != "": - o_cpp += f"\n\n**• Output :**\n`{m[0]}`" - if m[1]: - o_cpp += f"\n\n**• Error :**\n`{m[1]}`" - if len(o_cpp) > 3000: - with BytesIO(str.encode(o_cpp)) as out_file: - out_file.name = "eval.txt" - await msg.reply(f"`{match}`", file=out_file) - else: - await eor(msg, o_cpp) - os.remove("CppUltroid") - os.remove("cpp-ultroid.cpp") diff --git a/plugins/downloadupload.py b/plugins/downloadupload.py deleted file mode 100644 index 003da9fad7ae8c7bd92c83f4c71a44b1b18a83d0..0000000000000000000000000000000000000000 --- a/plugins/downloadupload.py +++ /dev/null @@ -1,222 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_downloadupload") - -import asyncio -import glob -import os -import time -from datetime import datetime as dt - -from aiohttp.client_exceptions import InvalidURL -from telethon.errors.rpcerrorlist import MessageNotModifiedError - -from pyUltroid.fns.helper import time_formatter -from pyUltroid.fns.tools import get_chat_and_msgid, set_attributes - -from . import ( - LOGS, - ULTConfig, - downloader, - eor, - fast_download, - get_all_files, - get_string, - progress, - time_formatter, - ultroid_cmd, -) - - -@ultroid_cmd( - pattern="download( (.*)|$)", -) -async def down(event): - matched = event.pattern_match.group(1).strip() - msg = await event.eor(get_string("udl_4")) - if not matched: - return await eor(msg, get_string("udl_5"), time=5) - try: - splited = matched.split(" | ") - link = splited[0] - filename = splited[1] - except IndexError: - filename = None - s_time = time.time() - try: - filename, d = await fast_download( - link, - filename, - progress_callback=lambda d, t: asyncio.get_event_loop().create_task( - progress( - d, - t, - msg, - s_time, - f"Downloading from {link}", - ) - ), - ) - except InvalidURL: - return await msg.eor("`Invalid URL provided :(`", time=5) - await msg.eor(f"`{filename}` `downloaded in {time_formatter(d*1000)}.`") - - -@ultroid_cmd( - pattern="dl( (.*)|$)", -) -async def download(event): - match = event.pattern_match.group(1).strip() - if match and "t.me/" in match: - chat, msg = get_chat_and_msgid(match) - if not (chat and msg): - return await event.eor(get_string("gms_1")) - match = "" - ok = await event.client.get_messages(chat, ids=msg) - elif event.reply_to_msg_id: - ok = await event.get_reply_message() - else: - return await event.eor(get_string("cvt_3"), time=8) - xx = await event.eor(get_string("com_1")) - if not (ok and ok.media): - return await xx.eor(get_string("udl_1"), time=5) - s = dt.now() - k = time.time() - if hasattr(ok.media, "document"): - file = ok.media.document - mime_type = file.mime_type - filename = match or ok.file.name - if not filename: - if "audio" in mime_type: - filename = "audio_" + dt.now().isoformat("_", "seconds") + ".ogg" - elif "video" in mime_type: - filename = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" - try: - result = await downloader( - f"resources/downloads/{filename}", - file, - xx, - k, - f"Downloading {filename}...", - ) - - except MessageNotModifiedError as err: - return await xx.edit(str(err)) - file_name = result.name - else: - d = "resources/downloads/" - file_name = await event.client.download_media( - ok, - d, - progress_callback=lambda d, t: asyncio.get_event_loop().create_task( - progress( - d, - t, - xx, - k, - get_string("com_5"), - ), - ), - ) - e = dt.now() - t = time_formatter(((e - s).seconds) * 1000) - await xx.eor(get_string("udl_2").format(file_name, t)) - - -@ultroid_cmd( - pattern="ul( (.*)|$)", -) -async def _(event): - msg = await event.eor(get_string("com_1")) - match = event.pattern_match.group(1) - if match: - match = match.strip() - if not event.out and match == ".env": - return await event.reply("`You can't do this...`") - stream, force_doc, delete, thumb = ( - False, - True, - False, - ULTConfig.thumb, - ) - if "--stream" in match: - stream = True - force_doc = False - if "--delete" in match: - delete = True - if "--no-thumb" in match: - thumb = None - arguments = ["--stream", "--delete", "--no-thumb"] - if any(item in match for item in arguments): - match = ( - match.replace("--stream", "") - .replace("--delete", "") - .replace("--no-thumb", "") - .strip() - ) - if match.endswith("/"): - match += "*" - results = glob.glob(match) - if not results and os.path.exists(match): - results = [match] - if not results: - try: - await event.reply(file=match) - return await event.try_delete() - except Exception as er: - LOGS.exception(er) - return await msg.eor(get_string("ls1")) - for result in results: - if os.path.isdir(result): - c, s = 0, 0 - for files in get_all_files(result): - attributes = None - if stream: - try: - attributes = await set_attributes(files) - except KeyError as er: - LOGS.exception(er) - try: - file, _ = await event.client.fast_uploader( - files, show_progress=True, event=msg, to_delete=delete - ) - await event.client.send_file( - event.chat_id, - file, - supports_streaming=stream, - force_document=force_doc, - thumb=thumb, - attributes=attributes, - caption=f"`Uploaded` `{files}` `in {time_formatter(_*1000)}`", - reply_to=event.reply_to_msg_id or event, - ) - s += 1 - except (ValueError, IsADirectoryError): - c += 1 - break - attributes = None - if stream: - try: - attributes = await set_attributes(result) - except KeyError as er: - LOGS.exception(er) - file, _ = await event.client.fast_uploader( - result, show_progress=True, event=msg, to_delete=delete - ) - await event.client.send_file( - event.chat_id, - file, - supports_streaming=stream, - force_document=force_doc, - thumb=thumb, - attributes=attributes, - caption=f"`Uploaded` `{result}` `in {time_formatter(_*1000)}`", - ) - await msg.try_delete() diff --git a/plugins/echo.py b/plugins/echo.py deleted file mode 100644 index 03c4d0e860a4988ec57111db09abb2216c0102b8..0000000000000000000000000000000000000000 --- a/plugins/echo.py +++ /dev/null @@ -1,76 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_echo") - - -from telethon.utils import get_display_name - -from pyUltroid.dB.echo_db import add_echo, check_echo, list_echo, rem_echo - -from . import inline_mention, ultroid_cmd - - -@ultroid_cmd(pattern="addecho( (.*)|$)") -async def echo(e): - r = await e.get_reply_message() - if r: - user = r.sender_id - else: - try: - user = e.text.split()[1] - if user.startswith("@"): - ok = await e.client.get_entity(user) - user = ok.id - else: - user = int(user) - except BaseException: - return await e.eor("Reply To A user.", time=5) - if check_echo(e.chat_id, user): - return await e.eor("Echo already activated for this user.", time=5) - add_echo(e.chat_id, user) - ok = await e.client.get_entity(user) - user = inline_mention(ok) - await e.eor(f"Activated Echo For {user}.") - - -@ultroid_cmd(pattern="remecho( (.*)|$)") -async def rm(e): - r = await e.get_reply_message() - if r: - user = r.sender_id - else: - try: - user = e.text.split()[1] - if user.startswith("@"): - ok = await e.client.get_entity(user) - user = ok.id - else: - user = int(user) - except BaseException: - return await e.eor("Reply To A User.", time=5) - if check_echo(e.chat_id, user): - rem_echo(e.chat_id, user) - ok = await e.client.get_entity(user) - user = f"[{get_display_name(ok)}](tg://user?id={ok.id})" - return await e.eor(f"Deactivated Echo For {user}.") - await e.eor("Echo not activated for this user") - - -@ultroid_cmd(pattern="listecho$") -async def lstecho(e): - if k := list_echo(e.chat_id): - user = "**Activated Echo For Users:**\n\n" - for x in k: - ok = await e.client.get_entity(int(x)) - kk = f"[{get_display_name(ok)}](tg://user?id={ok.id})" - user += f"•{kk}" + "\n" - await e.eor(user) - else: - await e.eor("`List is Empty, For echo`", time=5) diff --git a/plugins/extra.py b/plugins/extra.py deleted file mode 100644 index f9abda572addb4a676be73d4faf38abe6cb60bbc..0000000000000000000000000000000000000000 --- a/plugins/extra.py +++ /dev/null @@ -1,85 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("extra") - -import asyncio - -from . import get_string, ultroid_cmd - - -@ultroid_cmd( - pattern="del$", - manager=True, -) -async def delete_it(delme): - msg_src = await delme.get_reply_message() - if not msg_src: - return - await msg_src.try_delete() - await delme.try_delete() - - -@ultroid_cmd( - pattern="copy$", -) -async def copy(e): - reply = await e.get_reply_message() - if reply: - await reply.reply(reply) - return await e.try_delete() - await e.eor(get_string("ex_1"), time=5) - - -@ultroid_cmd( - pattern="edit", -) -async def editer(edit): - message = edit.text - chat = await edit.get_input_chat() - string = str(message[6:]) - reply = await edit.get_reply_message() - if reply and reply.text: - try: - await reply.edit(string) - await edit.delete() - except BaseException: - pass - else: - i = 1 - async for message in edit.client.iter_messages(chat, from_user="me", limit=2): - if i == 2: - await message.edit(string) - await edit.delete() - break - i += 1 - - -@ultroid_cmd( - pattern="reply$", -) -async def _(e): - if e.reply_to_msg_id: - chat = e.chat_id - try: - msg = (await e.client.get_messages(e.chat_id, limit=1, max_id=e.id))[0] - except IndexError: - return await e.eor( - "`You have previously sent no message to reply again...`", time=5 - ) - except BaseException as er: - return await e.eor(f"**ERROR:** `{er}`") - await asyncio.wait( - [ - e.client.delete_messages(chat, [e.id, msg.id]), - e.client.send_message(chat, msg, reply_to=e.reply_to_msg_id), - ] - ) - else: - await e.try_delete() diff --git a/plugins/fakeaction.py b/plugins/fakeaction.py deleted file mode 100644 index 0f4b25492e2c4b9afbae3f6972dd400f2acf504a..0000000000000000000000000000000000000000 --- a/plugins/fakeaction.py +++ /dev/null @@ -1,36 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_fakeaction") - -import math -import time - -from pyUltroid.fns.admins import ban_time - -from . import asyncio, get_string, ultroid_cmd - - -@ultroid_cmd( - pattern="f(typing|audio|contact|document|game|location|sticker|photo|round|video)( (.*)|$)" -) -async def _(e): - act = e.pattern_match.group(1).strip() - t = e.pattern_match.group(2) - if act in ["audio", "round", "video"]: - act = f"record-{act}" - if t.isdigit(): - t = int(t) - elif t.endswith(("s", "h", "d", "m")): - t = math.ceil((ban_time(t)) - time.time()) - else: - t = 60 - await e.eor(get_string("fka_1").format(str(t)), time=5) - async with e.client.action(e.chat_id, act): - await asyncio.sleep(t) diff --git a/plugins/fileshare.py b/plugins/fileshare.py deleted file mode 100644 index 430e8cd5beddec9e679000014085639e3926bf29..0000000000000000000000000000000000000000 --- a/plugins/fileshare.py +++ /dev/null @@ -1,95 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_fileshare") - -import os - -from pyUltroid.dB.filestore_db import del_stored, get_stored_msg, list_all_stored_msgs -from pyUltroid.fns.tools import get_file_link - -from . import HNDLR, asst, get_string, in_pattern, udB, ultroid_bot, ultroid_cmd - - -@ultroid_cmd(pattern="store$") -async def filestoreplg(event): - msg = await event.get_reply_message() - if not msg: - return await event.eor(get_string("fsh_3"), time=10) - # allow storing both messages and media. - filehash = await get_file_link(msg) - link_to_file = f"https://t.me/{asst.me.username}?start={filehash}" - await event.eor( - get_string("fsh_2").format(link_to_file), - link_preview=False, - ) - - -@ultroid_cmd("delstored ?(.*)") -async def _(event): - match = event.pattern_match.group(1) - if not match: - return await event.eor("`Give stored film's link to delete.`", time=5) - match = match.split("?start=") - botusername = match[0].split("/")[-1] - if botusername != asst.me.username: - return await event.eor( - "`Message/Media of provided link was not stored by this bot.`", time=5 - ) - msg_id = get_stored_msg(match[1]) - if not msg_id: - return await event.eor( - "`Message/Media of provided link was already deleted.`", time=5 - ) - del_stored(match[1]) - await ultroid_bot.delete_messages(udB.get_key("LOG_CHANNEL"), int(msg_id)) - await event.eor("__Deleted__") - - -@ultroid_cmd("liststored$") -async def liststored(event): - files = list_all_stored_msgs() - if not files: - return await event.eor(get_string("fsh_4"), time=5) - msg = "**Stored files:**\n" - for c, i in enumerate(files, start=1): - msg += f"`{c}`. https://t.me/{asst.me.username}?start={i}\n" - if len(msg) > 4095: - with open("liststored.txt", "w") as f: - f.write(msg.replace("**", "").replace("`", "")) - await event.reply(get_string("fsh_1"), file="liststored.txt") - os.remove("liststored.txt") - return - await event.eor(msg, link_preview=False) - - -@in_pattern("filestore", owner=True) -async def file_short(event): - all_ = list_all_stored_msgs() - res = [] - if all_: - LOG_CHA = udB.get_key("LOG_CHANNEL") - for msg in all_[:50]: - m_id = get_stored_msg(msg) - if not m_id: - continue - message = await asst.get_messages(LOG_CHA, ids=m_id) - if not message: - continue - if message.media: - res.append(await event.builder.document(title=msg, file=message.media)) - elif message.text: - res.append( - await event.builder.article(title=message.text, text=message.text) - ) - if not res: - title = "You have no stored file :(" - text = f"{title}\n\nRead `{HNDLR}help fileshare` to know how to store." - return await event.answer([await event.builder.article(title=title, text=text)]) - await event.answer(res, switch_pm="• File Store •", switch_pm_param="start") diff --git a/plugins/filter.py b/plugins/filter.py deleted file mode 100644 index 84ab5931efb3e1d9c9ee359f52483ae45f6a5731..0000000000000000000000000000000000000000 --- a/plugins/filter.py +++ /dev/null @@ -1,102 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_filter") - -import os -import re - -from telegraph import upload_file as uf -from telethon.tl.types import User -from telethon.utils import pack_bot_file_id - -from pyUltroid.dB.filter_db import add_filter, get_filter, list_filter, rem_filter -from pyUltroid.fns.tools import create_tl_btn, format_btn, get_msg_button - -from . import events, get_string, mediainfo, udB, ultroid_bot, ultroid_cmd -from ._inline import something - - -@ultroid_cmd(pattern="addfilter( (.*)|$)") -async def af(e): - wrd = (e.pattern_match.group(1).strip()).lower() - wt = await e.get_reply_message() - chat = e.chat_id - if not (wt and wrd): - return await e.eor(get_string("flr_1")) - btn = format_btn(wt.buttons) if wt.buttons else None - if wt and wt.media: - wut = mediainfo(wt.media) - if wut.startswith(("pic", "gif")): - dl = await wt.download_media() - variable = uf(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "video": - if wt.media.document.size > 8 * 1000 * 1000: - return await e.eor(get_string("com_4"), time=5) - dl = await wt.download_media() - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - else: - m = pack_bot_file_id(wt.media) - if wt.text: - txt = wt.text - if not btn: - txt, btn = get_msg_button(wt.text) - add_filter(chat, wrd, txt, m, btn) - else: - add_filter(chat, wrd, None, m, btn) - else: - txt = wt.text - if not btn: - txt, btn = get_msg_button(wt.text) - add_filter(chat, wrd, txt, None, btn) - await e.eor(get_string("flr_4").format(wrd)) - ultroid_bot.add_handler(filter_func, events.NewMessage()) - - -@ultroid_cmd(pattern="remfilter( (.*)|$)") -async def rf(e): - wrd = (e.pattern_match.group(1).strip()).lower() - chat = e.chat_id - if not wrd: - return await e.eor(get_string("flr_3")) - rem_filter(int(chat), wrd) - await e.eor(get_string("flr_5").format(wrd)) - - -@ultroid_cmd(pattern="listfilter$") -async def lsnote(e): - if x := list_filter(e.chat_id): - sd = "Filters Found In This Chats Are\n\n" - return await e.eor(sd + x) - await e.eor(get_string("flr_6")) - - -async def filter_func(e): - if isinstance(e.sender, User) and e.sender.bot: - return - xx = (e.text).lower() - chat = e.chat_id - if x := get_filter(chat): - for c in x: - pat = r"( |^|[^\w])" + re.escape(c) + r"( |$|[^\w])" - if re.search(pat, xx): - if k := x.get(c): - msg = k["msg"] - media = k["media"] - if k.get("button"): - btn = create_tl_btn(k["button"]) - return await something(e, msg, media, btn) - await e.reply(msg, file=media) - - -if udB.get_key("FILTERS"): - ultroid_bot.add_handler(filter_func, events.NewMessage()) diff --git a/plugins/flux2.py b/plugins/flux2.py deleted file mode 100644 index 8aded2e5955ecf309c1a03e8dc132c2ac98664d3..0000000000000000000000000000000000000000 --- a/plugins/flux2.py +++ /dev/null @@ -1,95 +0,0 @@ -import requests -import os -import json -from . import ultroid_cmd, LOGS, fast_download - -@ultroid_cmd(pattern="flux2(?:\s+(-p1|-p2|-l1|-l2|-s1|-s2|-hd)\s+(.*))?$") -async def codegen(e): - # Default to "portrait_16_9" if no specific command is provided - args = e.pattern_match.group(2) - size_option = e.pattern_match.group(1) or "portrait_16_9" - - # Map the size_option to the corresponding image size - size_mapping = { - "-p1": "portrait_4_3", - "-p2": "portrait_16_9", - "-l1": "landscape_4_3", - "-l2": "landscape_16_9", - "-s1": "square", - "-s2": "square_hd", - "-hd": "square_hd" - } - image_size = size_mapping.get(size_option, "portrait_16_9") - - # Handle when no prompt is provided - if not args: - reply = await e.get_reply_message() - if reply and reply.text: - args = reply.text - if not args: - return await e.eor("Please provide a prompt to generate images.") - - # Prepare the request - API_URL = "http://fal.run/fal-ai/flux/schnell" - headers = { - "user-agent": "Python/3.x", - "content-type": "application/json; charset=utf-8", - "accept-encoding": "gzip", - "authorization": "Key f2438e21-b687-46c3-998f-0ed0deed8778:6a073a3d9bb73a9ed1c7aa8e8d905ced" - } - data = { - "prompt": args, - "image_size": image_size, - "num_inference_steps": 4, - "num_images": 4, - "embeddings": [], - "format": "jpeg", - "sync_mode": False, - "seed": "0", - "enable_safety_checker": False - } - - # Notify the user that image generation is in progress - moi = await e.eor("🔄 Generating images, please wait...") - - try: - response = requests.post(API_URL, headers=headers, json=data) - - if response.status_code != 200: - LOGS.error(f"Request failed with status code {response.status_code}") - return await moi.edit("Failed to generate images. Please try again later.") - - images = response.json().get("images", []) - if not images: - return await moi.edit("No images were generated.") - - # Download images - image_paths = await download_images([img["url"] for img in images]) - - # Send images as a group - await send_images_as_group(e, args, image_paths) - - # Clean up the files after sending - for path in image_paths: - os.remove(path) - - await moi.delete() - - except Exception as exc: - LOGS.error(f"Error: {exc}") - await moi.edit(f"An error occurred: {exc}") - -async def download_images(image_urls): - downloaded_paths = [] - for i, url in enumerate(image_urls, start=1): - filename = f"image_{i}.png" - path, _ = await fast_download(url, filename=filename) - downloaded_paths.append(path) - return downloaded_paths - -async def send_images_as_group(e, query, image_paths): - caption = f"^^{query}^^" - media = [await e.client.upload_file(path) for path in image_paths] - await e.client.send_message( - e.chat_id, caption, file=media, parse_mode="markdown", reply_to=e.reply_to_msg_id - ) \ No newline at end of file diff --git a/plugins/fontgen.py b/plugins/fontgen.py deleted file mode 100644 index 1cce172bef98b71597fbf085ce14ae1df696ac28..0000000000000000000000000000000000000000 --- a/plugins/fontgen.py +++ /dev/null @@ -1,60 +0,0 @@ -# Ultroid - UserBot -# 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 -# . - -from . import get_help - -__doc__ = get_help("help_fontgen") - -import string - -from . import eod, ultroid_cmd - -_default = string.ascii_letters -Fonts = { - "small caps": "ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘϙʀsᴛᴜᴠᴡxʏᴢABCDEFGHIJKLMNOPQRSTUVWXYZ", - "monospace": "𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉", - "double stroke": "𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ", - "script royal": "𝒶𝒷𝒸𝒹𝑒𝒻𝑔𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝑜𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵", -} - - -@ultroid_cmd( - pattern="font( (.*)|$)", -) -async def _(e): - input = e.pattern_match.group(1).strip() - reply = await e.get_reply_message() - if not input: - m = "**Available Fonts**\n\n" - for x in Fonts.keys(): - m += f"• `{x}`\n" - return await e.eor(m, time=5) - if not reply: - try: - _ = input.split(":", maxsplit=1) - font = _[0][:-1] - text = _[1] - except IndexError: - return await eod(e, help) - elif not input: - return await eod(e, "`Give font dude :/`") - else: - font = input - text = reply.message - if font not in Fonts.keys(): - return await e.eor(f"`{font} not in font list`.", time=5) - msg = gen_font(text, Fonts[font]) - await e.eor(msg) - - -def gen_font(text, new_font): - new_font = " ".join(new_font).split() - for q in text: - if q in _default: - new = new_font[_default.index(q)] - text = text.replace(q, new) - return text diff --git a/plugins/forcesubscribe.py b/plugins/forcesubscribe.py deleted file mode 100644 index 9804b28687bd4f6082783323a8aab989300e9ff4..0000000000000000000000000000000000000000 --- a/plugins/forcesubscribe.py +++ /dev/null @@ -1,179 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}fsub ` - Enable ForceSub in Used Chat ! - -• `{i}checkfsub` - Check/Get Active ForceSub Setting of Used Chat. - -• `{i}remfsub` - Remove ForceSub from Used Chat ! - - Note - You Need to be Admin in Both Channel/Chats - in order to Use ForceSubscribe. -""" - -import re - -from telethon.errors.rpcerrorlist import ChatAdminRequiredError, UserNotParticipantError -from telethon.tl.custom import Button -from telethon.tl.functions.channels import GetParticipantRequest -from telethon.tl.functions.messages import ExportChatInviteRequest -from telethon.tl.types import ( - Channel, - ChannelParticipantBanned, - ChannelParticipantLeft, - User, -) - -from pyUltroid.dB.forcesub_db import add_forcesub, get_forcesetting, rem_forcesub - -from . import ( - LOGS, - asst, - callback, - events, - get_string, - in_pattern, - inline_mention, - udB, - ultroid_bot, - ultroid_cmd, -) - -CACHE = {} - - -@ultroid_cmd(pattern="fsub( (.*)|$)", admins_only=True, groups_only=True) -async def addfor(e): - match = e.pattern_match.group(1).strip() - if not match: - return await e.eor(get_string("fsub_1"), time=5) - try: - match = await e.client.parse_id(match) - except BaseException: - return await e.eor(get_string("fsub_2"), time=5) - add_forcesub(e.chat_id, match) - await e.eor("Added ForceSub in This Chat !") - ultroid_bot.add_handler(force_sub, events.NewMessage(incoming=True)) - - -@ultroid_cmd(pattern="remfsub$") -async def remor(e): - res = rem_forcesub(e.chat_id) - if not res: - return await e.eor(get_string("fsub_3"), time=5) - await e.eor("Removed ForceSub...") - - -@ultroid_cmd(pattern="checkfsub$") -async def getfsr(e): - res = get_forcesetting(e.chat_id) - if not res: - return await e.eor("ForceSub is Not Active In This Chat !", time=5) - cha = await e.client.get_entity(int(res)) - await e.eor(f"**ForceSub Status** : `Active`\n- **{cha.title}** `({res})`") - - -@in_pattern("fsub( (.*)|$)", owner=True) -async def fcall(e): - match = e.pattern_match.group(1).strip() - spli = match.split("_") - user = await ultroid_bot.get_entity(int(spli[0])) - cl = await ultroid_bot.get_entity(int(spli[1])) - text = f"Hi {inline_mention(user)}, You Need to Join" - text += f" {cl.title} in order to Chat in this Group." - el = ( - f"https://t.me/{cl.username}" - if cl.username - else (await ultroid_bot(ExportChatInviteRequest(cl))).link - ) - - res = [ - await e.builder.article( - title="forcesub", - text=text, - buttons=[ - [Button.url(text=get_string("fsub_4"), url=el)], - [Button.inline(get_string("fsub_5"), data=f"unm_{match}")], - ], - ) - ] - await e.answer(res) - - -@callback(re.compile("unm_(.*)")) -async def diesoon(e): - match = (e.data_match.group(1)).decode("UTF-8") - spli = match.split("_") - if e.sender_id != int(spli[0]): - return await e.answer(get_string("fsub_7"), alert=True) - try: - values = await ultroid_bot(GetParticipantRequest(int(spli[1]), int(spli[0]))) - if isinstance(values.participant, ChannelParticipantLeft) or ( - isinstance(values.participant, ChannelParticipantBanned) and values.left - ): - raise UserNotParticipantError("") - except UserNotParticipantError: - return await e.answer( - "Please Join That Channel !\nThen Click This Button !", alert=True - ) - await ultroid_bot.edit_permissions( - e.chat_id, int(spli[0]), send_messages=True, until_date=None - ) - await e.edit(get_string("fsub_8")) - - -async def force_sub(ult): - if not udB.get_key("FORCESUB"): - return - user = await ult.get_sender() - joinchat = get_forcesetting(ult.chat_id) - if (not joinchat) or (isinstance(user, User) and user.bot): - return - if CACHE.get(ult.chat_id): - if CACHE[ult.chat_id].get(user.id): - CACHE[ult.chat_id].update({user.id: CACHE[ult.chat_id][user.id] + 1}) - else: - CACHE[ult.chat_id].update({user.id: 1}) - else: - CACHE.update({ult.chat_id: {user.id: 1}}) - count = CACHE[ult.chat_id][user.id] - if count == 11: - CACHE[ult.chat_id][user.id] = 1 - return - if count in range(2, 11): - return - try: - await ultroid_bot.get_permissions(int(joinchat), user.id) - return - except UserNotParticipantError: - pass - if isinstance(user, Channel): - try: - await ultroid_bot.edit_permissions( - ult.chat_id, user.id, view_messages=False - ) - return - except BaseException as er: - LOGS.exception(er) - try: - await ultroid_bot.edit_permissions(ult.chat_id, user.id, send_messages=False) - except ChatAdminRequiredError: - return - except Exception as e: - await ult.delete() - LOGS.info(e) - res = await ultroid_bot.inline_query(asst.me.username, f"fsub {user.id}_{joinchat}") - await res[0].click(ult.chat_id, reply_to=ult.id) - - -if udB.get_key("FORCESUB"): - ultroid_bot.add_handler(force_sub, events.NewMessage(incoming=True)) diff --git a/plugins/gdrive.py b/plugins/gdrive.py deleted file mode 100644 index fbadce676830ef2d2b582eed78f7646c572dd606..0000000000000000000000000000000000000000 --- a/plugins/gdrive.py +++ /dev/null @@ -1,232 +0,0 @@ -# Ultroid - UserBot -# 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 - -• `{i}gdul ` - Reply to file to upload on Google Drive. - Add file name to upload on Google Drive. - -• `{i}gdown | ` - Download from Gdrive link or file id. - -• `{i}gdsearch ` - Search file name on Google Drive and get link. - -• `{i}gdlist` - List all GDrive files. - -• `{i}gdfolder` - Link to your Google Drive Folder. - If added then all files will be uploaded in this folder. -""" - -import os -import time - -from telethon.tl.types import Message - -from pyUltroid.fns.gDrive import GDriveManager -from pyUltroid.fns.helper import time_formatter - -from . import ULTConfig, asst, eod, eor, get_string, ultroid_cmd - - -@ultroid_cmd( - pattern="gdown( (.*)|$)", - fullsudo=True, -) -async def gdown(event): - GDrive = GDriveManager() - match = event.pattern_match.group(1).strip() - if not match: - return await eod(event, "`Give file id or Gdrive link to download from!`") - filename = match.split(" | ")[1].strip() if " | " in match else None - eve = await event.eor(get_string("com_1")) - _start = time.time() - status, response = await GDrive._download_file(eve, match, filename) - if not status: - return await eve.edit(response) - await eve.edit( - f"`Downloaded ``{response}`` in {time_formatter((time.time() - _start)*1000)}`" - ) - - -@ultroid_cmd( - pattern="gdlist$", - fullsudo=True, -) -async def files(event): - GDrive = GDriveManager() - if not os.path.exists(GDrive.token_file): - return await event.eor(get_string("gdrive_6").format(asst.me.username)) - eve = await event.eor(get_string("com_1")) - msg = "" - if files := GDrive._list_files: - msg += f"{len(files.keys())} files found in gdrive.\n\n" - for _ in files: - msg += f"> [{files[_]}]({_})\n" - else: - msg += "Nothing in Gdrive" - if len(msg) < 4096: - await eve.edit(msg, link_preview=False) - else: - with open("drive-files.txt", "w") as f: - f.write( - msg.replace("[", "File Name: ") - .replace("](", "\n» Link: ") - .replace(")\n", "\n\n") - ) - try: - await eve.delete() - except BaseException: - pass - await event.client.send_file( - event.chat_id, - "drive-files.txt", - thumb=ULTConfig.thumb, - reply_to=event, - ) - os.remove("drive-files.txt") - - -@ultroid_cmd( - pattern="gdul( (.*)|$)", - fullsudo=True, -) -async def _(event): - GDrive = GDriveManager() - if not os.path.exists(GDrive.token_file): - return await eod(event, get_string("gdrive_6").format(asst.me.username)) - input_file = event.pattern_match.group(1).strip() or await event.get_reply_message() - if not input_file: - return await eod(event, "`Reply to file or give its location.`") - mone = await event.eor(get_string("com_1")) - if isinstance(input_file, Message): - location = "resources/downloads" - if input_file.photo: - filename = await input_file.download_media(location) - else: - filename = input_file.file.name - if not filename: - filename = str(round(time.time())) - filename = f"{location}/{filename}" - try: - filename, downloaded_in = await event.client.fast_downloader( - file=input_file.media.document, - filename=filename, - show_progress=True, - event=mone, - message=get_string("com_5"), - ) - filename = filename.name - except Exception as e: - return await eor(mone, str(e), time=10) - await mone.edit( - f"`Downloaded to ``{filename}`.`", - ) - else: - filename = input_file.strip() - if not os.path.exists(filename): - return await eod( - mone, - "File Not found in local server. Give me a file path :((", - time=5, - ) - folder_id = None - if os.path.isdir(filename): - files = os.listdir(filename) - if not files: - return await eod( - mone, "`Requested directory is empty. Can't create empty directory.`" - ) - folder_id = GDrive.create_directory(filename) - c = 0 - for files in sorted(files): - file = f"{filename}/{files}" - if not os.path.isdir(file): - try: - await GDrive._upload_file(mone, path=file, folder_id=folder_id) - c += 1 - except Exception as e: - return await mone.edit( - f"Exception occurred while uploading to gDrive {e}" - ) - return await mone.edit( - f"`Uploaded `[{filename}](https://drive.google.com/folderview?id={folder_id})` with {c} files.`" - ) - try: - g_drive_link = await GDrive._upload_file( - mone, - filename, - ) - await mone.edit( - get_string("gdrive_7").format(filename.split("/")[-1], g_drive_link) - ) - except Exception as e: - await mone.edit(f"Exception occurred while uploading to gDrive {e}") - - -@ultroid_cmd( - pattern="gdsearch( (.*)|$)", - fullsudo=True, -) -async def _(event): - GDrive = GDriveManager() - if not os.path.exists(GDrive.token_file): - return await event.eor(get_string("gdrive_6").format(asst.me.username)) - input_str = event.pattern_match.group(1).strip() - if not input_str: - return await event.eor("`Give filename to search on GDrive...`") - eve = await event.eor(f"`Searching for {input_str} in G-Drive...`") - files = GDrive.search(input_str) - msg = "" - if files: - msg += ( - f"{len(files.keys())} files with {input_str} in title found in GDrive.\n\n" - ) - for _ in files: - msg += f"> [{files[_]}]({_})\n" - else: - msg += f"`No files with title {input_str}`" - if len(msg) < 4096: - await eve.eor(msg, link_preview=False) - else: - with open("drive-files.txt", "w") as f: - f.write( - msg.replace("[", "File Name: ") - .replace("](", "\n» Link: ") - .replace(")\n", "\n\n") - ) - try: - await eve.delete() - except BaseException: - pass - await event.client.send_file( - event.chat_id, - f"{input_str}.txt", - thumb=ULTConfig.thumb, - reply_to=event, - ) - os.remove(f"{input_str}.txt") - - -@ultroid_cmd( - pattern="gdfolder$", - fullsudo=True, -) -async def _(event): - GDrive = GDriveManager() - if not os.path.exists(GDrive.token_file): - return await event.eor(get_string("gdrive_6").format(asst.me.username)) - if GDrive.folder_id: - await event.eor( - "`Your G-Drive Folder link : `\n" - + GDrive._create_folder_link(GDrive.folder_id) - ) - else: - await eod(event, "Set FOLDERID from your Assistant bot's Settings ") diff --git a/plugins/gemi.py b/plugins/gemi.py deleted file mode 100644 index 876302a6b7af85edfe0a647d956354184ace472a..0000000000000000000000000000000000000000 --- a/plugins/gemi.py +++ /dev/null @@ -1,413 +0,0 @@ -# Nimbus ~ UserBot -# Copyright (C) 2023 NimbusTheCloud -# -# This file is a part of < https://github.com/ufoptg/Nimbus/ > -# PLease read the GNU Affero General Public License in -# . -# by @SoulOfSukuna -""" -Gemini Command Handler - -This script provides the `.gemini` command to interact with Google's Gemini AI for generating content, selecting models, and managing chat history. - -Available Gemini Models: -- `gemini-2.0-flash-exp` ➔ Trait: `g2f-exp` (Default model) -- `gemini-1.5-flash` ➔ Trait: `g1f` -- `gemini-1.5-flash-8b` ➔ Trait: `g1f8b` -- `gemini-1.5-pro` ➔ Trait: `g1p` - -Features: -1. Query Gemini AI: - - `.gemini ` ➔ Generates a response using the currently selected model. - - Example: `.gemini Write a poem about the stars.` - -2. Select a Model: - - `.gemini -m ` ➔ Selects a specific model based on its trait. - - Example: `.gemini -m g1f` ➔ Switches to the `gemini-1.5-flash` model. - - If an invalid trait is provided, an error message will be returned. - -3. Clear Chat History: - - `.gemini -c` ➔ Clears the chat history stored in memory. - - Example: `.gemini -c` ➔ Removes all previous queries and responses. - -4. Handle Long Responses: - - If the response exceeds Telegram's character limit (4096 characters), it will be sent as a `.txt` file. - -5. Reply-Based Query: - - Reply to a message with `.gemini write a cool caption for this image` ➔ Uses the replied message's content as the query and processes the image. - -Examples: -- `.gemini Tell me a joke about programmers.` -- `.gemini -m g2f-exp` -- `.gemini -c` -- Reply to an image with `.gemini write a cool caption for this image` -""" - -import asyncio -import mimetypes -from collections import deque, defaultdict -from io import BytesIO -from os import system, path, remove -from googleapiclient.discovery import build -import time -import logging -from bs4 import BeautifulSoup - -try: - import google.generativeai as genai -except ImportError: - system("pip install -q google-generativeai") - import google.generativeai as genai - -try: - from PIL import Image -except ImportError: - system("pip install -q Pillow") - from PIL import Image - -from typing import Optional - -from . import ( - ultroid_cmd, - async_searcher, - check_filename, - udB, - LOGS, - download_file, - run_async, -) - -MODELS = [ - {"id": "gemini-2.0-flash-exp", "traits": ["g2f-exp"]}, - {"id": "gemini-1.5-flash", "traits": ["g1f"]}, - {"id": "gemini-1.5-flash-8b", "traits": ["g1f8b"]}, - {"id": "gemini-1.5-pro", "traits": ["g1p"]}, -] - - -def select_model(trait: str) -> Optional[str]: - """Selects the Gemini model ID based on the provided trait.""" - for model in MODELS: - if trait in model["traits"]: - return model["id"] - return None - -logging.getLogger("googleapiclient.discovery_cache").setLevel(logging.WARNING) - -CONFIG = {"model": select_model("g2f-exp")} - -GEMINI_CHAT_HISTORY = defaultdict(lambda: deque(maxlen=80)) - -async def generate_content_with_search(prompt, model): - try: - search_results = await google_search(prompt) - - search_summary = "\n".join( - [f"{idx + 1}. {res['title']} - {res['snippet']}" for idx, res in enumerate(search_results)] - ) - - - enhanced_prompt = ( - f"Use the following search results to create a comprehensive response:\n\n" - f"{search_summary}\n\n" - f"Original Query: {prompt}" - ) - - response = await model.generate_content_async(enhanced_prompt) - return response.text.strip() - - except Exception as e: - return f"An error occurred while including search results: {e}. Generating content...\n\n{model.generate_content(prompt).text.strip()}" - -async def fetch_full_content(url): - try: - api_url = f"https://scraper.api.airforce/scrape?url={url}" - response = await async_searcher(api_url) - - soup = BeautifulSoup(response, "html.parser") - main_content = soup.select_one("article") or soup.select_one("main") or soup - paragraphs = [ - para.get_text(separator=" ").strip() - for para in main_content.find_all("p") - if len(para.get_text(strip=True)) > 30 - and not any( - keyword in para.get_text().lower() - for keyword in [ - "privacy", - "cookie", - "subscribe", - "sign up", - "terms", - "all rights reserved", - "see all", - "see more", - ] - ) - ] - full_text = ( - " ".join(paragraphs[:5]) if paragraphs else "No main content available." - ) - return full_text - - except Exception as e: - return f"Error fetching content: {e}" - -async def google_search(query): - api_key = "AIzaSyAOhKEVXRX-DJbxjyUz5Ol54qCygeRQRTA" - cse_id = "a44275f02ca2946da" - service = build("customsearch", "v1", developerKey=api_key) - - results = service.cse().list(q=query, cx=cse_id, gl="AU").execute() - search_items = results.get("items", []) - - search_results = await asyncio.gather( - *(fetch_search_result(item) for item in search_items) - ) - - return search_results - -async def fetch_search_result(item): - title = item.get("title") - link = item.get("link") - snippet = item.get("snippet") - full_content = await fetch_full_content(link) - return { - "title": title, - "link": link, - "snippet": snippet, - "full_content": full_content or "No additional content available." - } - -async def process_file(file_path: str) -> str: - """ - Uploads a file to Gemini and returns the file URL. - """ - try: - mime_type, _ = mimetypes.guess_type(file_path) - if not mime_type: - mime_type = 'application/octet-stream' - file_url = await asyncio.to_thread(genai.upload_file, file_path, mime_type=mime_type) - return file_url - except Exception as exc: - LOGS.error(f"File upload failed: {exc}") - raise - -async def process_video_file(file_path: str) -> str: - """ - Uploads a video to Gemini and returns the file URL. - """ - try: - video_file = await asyncio.to_thread(genai.upload_file, path=file_path) - while video_file.state.name == "PROCESSING": - await asyncio.sleep(10) - video_file = genai.get_file(video_file.name) - - if video_file.state.name == "FAILED": - raise ValueError(video_file.state.name) - return video_file - except Exception as exc: - LOGS.error(f"File upload failed: {exc}") - raise - -async def process_image_with_pillow(file_path: str) -> Optional[str]: - """ - Processes an image file using PIL.Image, saves it temporarily, - uploads it to Gemini, and returns the file URL. - """ - try: - with Image.open(file_path) as img: - img = img.convert("RGB") - buffer = BytesIO() - buffer.name = "processed_image.jpeg" - img.save(buffer, format="JPEG", quality=90) - buffer.seek(0) - - temp_image_path = "temp_processed_image.jpeg" - with open(temp_image_path, "wb") as temp_file: - temp_file.write(buffer.read()) - - file_url = await process_file(temp_image_path) - - remove(temp_image_path) - - return file_url - except Exception as exc: - LOGS.error(f"Image processing failed: {exc}") - return None - - -async def handle_multimodal_input(event, e) -> Optional[str]: - """ - Checks and processes images, audio, or video in a replied message. - Ensures cleanup of downloaded files. - Returns the file URL or None if processing fails. - """ - temp_file = None - try: - if event.photo: - temp_file = await event.download_media() - await e.eor("Processing image with Pillow...") - return await process_image_with_pillow(temp_file) - elif event.voice or event.audio: - temp_file = await event.download_media() - await e.eor("Uploading audio...") - return await process_file(temp_file) - elif event.video: - temp_file = await event.download_media() - await e.eor("Uploading video...") - return await process_video_file(temp_file) - except Exception as exc: - LOGS.error(f"Error processing media: {exc}") - finally: - if temp_file and path.exists(temp_file): - try: - remove(temp_file) - LOGS.info(f"Cleaned up temporary file: {temp_file}") - except Exception as cleanup_exc: - LOGS.warning(f"Failed to clean up temporary file: {cleanup_exc}") - return None - - -async def get_gemini_response(user_id: int, query: str, api_key: str, file_url: Optional[str] = None) -> str: - """ - Generates a response from the selected Gemini model based on the user query. - Includes the user's chat history in the request. - If a file URL is provided, it is included in the content generation. - """ - try: - genai.configure(api_key=api_key) - model = genai.GenerativeModel(CONFIG["model"]) - - chat_history = GEMINI_CHAT_HISTORY[user_id] - - if chat_history: - formatted_history = "\n".join( - [f"{msg['role']}: {msg['content']}" for msg in chat_history] - ) - if file_url: - content = [file_url, "\n\n", f"{formatted_history}\nuser: {query}"] - else: - content = f"{formatted_history}\nuser: {query}" - else: - if file_url: - content = [file_url, "\n\n", query] - else: - content = query - - # Key Addition: Handle queries without file_url using Google Search - if not file_url: - response = await generate_content_with_search(query, model) - return response - - response = await asyncio.to_thread(model.generate_content, content) - return response.text.strip() - except Exception as exc: - LOGS.error(f"Error generating response: {exc}") - raise - - -@ultroid_cmd(pattern=r"gemi(?:\s+([\s\S]*))?$") -async def gemini_handler(e): - """ - Handles the .gemini command with optional model selection. - """ - args = e.pattern_match.group(1) - - trait = None - user_query = None - file_url = None - - try: - user_id = e.sender.id - except AttributeError: - user_id = e.from_id.user_id - - if args: - if args.startswith("-m"): - trait = args[3:].lower().strip() - selected_model = select_model(trait) - if not selected_model: - return await e.eor("❌ **Error:** Invalid model trait specified.", time=10) - CONFIG["model"] = selected_model - return await e.eor(f"✅ **Success:** Selected Model: `{CONFIG['model']}`", time=10) - elif args.strip().lower() == "-c": - GEMINI_CHAT_HISTORY[user_id].clear() - return await e.eor("🧹 **Success:** Cleared your Gemini Chat History!", time=6) - else: - user_query = args.strip() - - api_key = udB.get_key("GEMINI_API") - if not api_key: - return await e.eor( - "⚠️ **Error:** `GEMINI_API` key missing. Please set it using `.setvar GEMINI_API your_api_key_here`.", - time=10, - ) - - query = user_query - file_url = None - - reply = await e.get_reply_message() - if reply: - # New logic to handle file content - if ( - reply.file - and reply.file.mime_type in ["text/x-python", "text/plain"] - ): - # Download the file and read its content - file = await reply.download_media(BytesIO()) - file.seek(0) - query = file.read().decode("utf-8") - - multimodal_content = await handle_multimodal_input(reply, e) - if multimodal_content: - file_url = multimodal_content - if not query: - if reply.photo: - query = "Analyse this image" - elif reply.voice or reply.audio: - query = "Analyse this audio." - elif reply.video: - query = "Analyse this video" - elif reply.text and not query: - query = reply.text.strip() - - if not query and not file_url: - return await e.eor( - "💬 **Usage:** `.gemini `\n*Provide a query or reply with media to generate content using Gemini AI.*", - time=5, - ) - - processing_message = await e.eor(f"🔄 **Processing your request using `{CONFIG['model']}`...**") - - GEMINI_CHAT_HISTORY[user_id].append({"role": "user", "content": query}) - - try: - response = await get_gemini_response(user_id, query, api_key, file_url=file_url) - GEMINI_CHAT_HISTORY[user_id].append({"role": "assistant", "content": response}) - except Exception as exc: - LOGS.warning(f"Gemini response generation failed: {exc}", exc_info=True) - if query: - GEMINI_CHAT_HISTORY[user_id].pop() - return await processing_message.edit(f"❌ **Error:** {exc}") - - if len(response) < 4096: - reply_text = f"📄 **Gemini Response:**\n\n{response}" - await processing_message.edit(reply_text, parse_mode="markdown") - else: - buffer = BytesIO() - try: - buffer.write(response.encode('utf-8')) - buffer.seek(0) - buffer.name = "gemini_response.txt" - await e.client.send_file( - e.chat_id, - buffer, - caption="📄 **Gemini Response:**", - reply_to=e.reply_to_msg_id, - ) - except Exception as exc: - LOGS.error(f"Error sending file: {exc}") - await processing_message.edit("❌ **Error:** Failed to send the response as a file.") - finally: - buffer.close() - await processing_message.delete() diff --git a/plugins/giftools.py b/plugins/giftools.py deleted file mode 100644 index 38fdb1f79e4869ac71b7e170d692abf13697f3d1..0000000000000000000000000000000000000000 --- a/plugins/giftools.py +++ /dev/null @@ -1,128 +0,0 @@ -# Ultroid - UserBot -# 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 - -•`{i}invertgif` - Make Gif Inverted(negative). - -•`{i}bwgif` - Make Gif black and white - -•`{i}rvgif` - Reverse a gif - -•`{i}vtog` - Reply To Video , It will Create Gif - Video to Gif - -•`{i}gif ` - Send video regarding to query. -""" -import os -import random -import time -from datetime import datetime as dt - -from . import HNDLR, LOGS, bash, downloader, get_string, mediainfo, ultroid_cmd - - -@ultroid_cmd(pattern="(bw|invert)gif$") -async def igif(e): - match = e.pattern_match.group(1).strip() - a = await e.get_reply_message() - if not (a and a.media): - return await e.eor("`Reply To gif only`", time=5) - wut = mediainfo(a.media) - if "gif" not in wut: - return await e.eor("`Reply To Gif Only`", time=5) - xx = await e.eor(get_string("com_1")) - z = await a.download_media() - if match == "bw": - cmd = f'ffmpeg -i "{z}" -vf format=gray ult.gif -y' - else: - cmd = f'ffmpeg -i "{z}" -vf lutyuv="y=negval:u=negval:v=negval" ult.gif -y' - try: - await bash(cmd) - await e.client.send_file(e.chat_id, "ult.gif", supports_streaming=True) - os.remove(z) - os.remove("ult.gif") - await xx.delete() - except Exception as er: - LOGS.info(er) - - -@ultroid_cmd(pattern="rvgif$") -async def reverse_gif(event): - a = await event.get_reply_message() - if not (a and a.media) and "video" not in mediainfo(a.media): - return await event.eor("`Reply To Video only`", time=5) - msg = await event.eor(get_string("com_1")) - file = await a.download_media() - await bash(f'ffmpeg -i "{file}" -vf reverse -af areverse reversed.mp4 -y') - await event.respond("- **Reversed Video/GIF**", file="reversed.mp4") - await msg.delete() - os.remove(file) - os.remove("reversed.mp4") - - -@ultroid_cmd(pattern="gif( (.*)|$)") -async def gifs(ult): - get = ult.pattern_match.group(1).strip() - xx = random.randint(0, 5) - n = 0 - if ";" in get: - try: - n = int(get.split(";")[-1]) - except IndexError: - pass - if not get: - return await ult.eor(f"`{HNDLR}gif `") - m = await ult.eor(get_string("com_2")) - gifs = await ult.client.inline_query("gif", get) - if not n: - await gifs[xx].click( - ult.chat_id, reply_to=ult.reply_to_msg_id, silent=True, hide_via=True - ) - else: - for x in range(n): - await gifs[x].click( - ult.chat_id, reply_to=ult.reply_to_msg_id, silent=True, hide_via=True - ) - await m.delete() - - -@ultroid_cmd(pattern="vtog$") -async def vtogif(e): - a = await e.get_reply_message() - if not (a and a.media): - return await e.eor("`Reply To video only`", time=5) - wut = mediainfo(a.media) - if "video" not in wut: - return await e.eor("`Reply To Video Only`", time=5) - xx = await e.eor(get_string("com_1")) - dur = a.media.document.attributes[0].duration - tt = time.time() - if int(dur) < 120: - z = await a.download_media() - await bash( - f'ffmpeg -i {z} -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 ult.gif -y' - ) - else: - filename = a.file.name - if not filename: - filename = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" - vid = await downloader(filename, a.media.document, xx, tt, get_string("com_5")) - z = vid.name - await bash( - f'ffmpeg -ss 3 -t 100 -i {z} -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 ult.gif' - ) - - await e.client.send_file(e.chat_id, "ult.gif", support_stream=True) - os.remove(z) - os.remove("ult.gif") - await xx.delete() diff --git a/plugins/glitch.py b/plugins/glitch.py deleted file mode 100644 index a612e959e57fe8a9c75c9af5965d03b3d8368612..0000000000000000000000000000000000000000 --- a/plugins/glitch.py +++ /dev/null @@ -1,42 +0,0 @@ -# Ultroid - UserBot -# 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 - - -•`{i}glitch ` - gives a glitchy gif. -""" -import os - -from . import bash, get_string, mediainfo, ultroid_cmd - - -@ultroid_cmd(pattern="glitch$") -async def _(e): - try: - import glitch_me # ignore :pylint - except ModuleNotFoundError: - await bash( - "pip install -e git+https://github.com/1Danish-00/glitch_me.git#egg=glitch_me" - ) - reply = await e.get_reply_message() - if not reply or not reply.media: - return await e.eor(get_string("cvt_3")) - xx = await e.eor(get_string("glitch_1")) - wut = mediainfo(reply.media) - if wut.startswith(("pic", "sticker")): - ok = await reply.download_media() - elif reply.document and reply.document.thumbs: - ok = await reply.download_media(thumb=-1) - else: - return await xx.eor(get_string("com_4")) - cmd = f"glitch_me gif --line_count 200 -f 10 -d 50 '{ok}' ult.gif" - await bash(cmd) - await e.reply(file="ult.gif", force_document=False) - await xx.delete() - os.remove(ok) - os.remove("ult.gif") diff --git a/plugins/globaltools.py b/plugins/globaltools.py deleted file mode 100644 index 087db364c488745a470477c022f0b978c7cbc6a7..0000000000000000000000000000000000000000 --- a/plugins/globaltools.py +++ /dev/null @@ -1,753 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}gban ` -• `{i}ungban` - Ban/Unban Globally. - -• `{i}gstat ` - Check if user is GBanned. - -• `{i}listgban` : List all GBanned users. - -• `{i}gmute` | `{i}ungmute` - Mute/UnMute Globally. - -• `{i}gkick ` `Globally Kick User` -• `{i}gcast ` `Globally Send msg in all grps` - -• `{i}gadmincast ` `Globally broadcast in your admin chats` -• `{i}gucast ` `Globally send msg in all pm users` - -• `{i}gblacklist ` - globally promote user where you are admin - - Set whether To promote only in groups/channels/all. - Eg- `gpromote group boss` ~ promotes user in all grps. - `gpromote @username all sar` ~ promote the user in all group & channel -• `{i}gdemote` - `demote user globally` -""" -import asyncio -import os - -from telethon.errors.rpcerrorlist import ChatAdminRequiredError, FloodWaitError -from telethon.tl.functions.channels import EditAdminRequest -from telethon.tl.functions.contacts import BlockRequest, UnblockRequest -from telethon.tl.types import ChatAdminRights, User - -from pyUltroid.dB import DEVLIST -from pyUltroid.dB.base import KeyManager -from pyUltroid.dB.gban_mute_db import ( - gban, - gmute, - is_gbanned, - is_gmuted, - list_gbanned, - ungban, - ungmute, -) -from pyUltroid.fns.tools import create_tl_btn, format_btn, get_msg_button - -from . import ( - HNDLR, - LOGS, - NOSPAM_CHAT, - OWNER_NAME, - eod, - eor, - get_string, - inline_mention, - ultroid_bot, - ultroid_cmd, -) -from ._inline import something - -_gpromote_rights = ChatAdminRights( - add_admins=False, - invite_users=True, - change_info=False, - ban_users=True, - delete_messages=True, - pin_messages=True, -) - -_gdemote_rights = ChatAdminRights( - add_admins=False, - invite_users=False, - change_info=False, - ban_users=False, - delete_messages=False, - pin_messages=False, -) - -keym = KeyManager("GBLACKLISTS", cast=list) - - -@ultroid_cmd(pattern="gpromote( (.*)|$)", fullsudo=True) -async def _(e): - x = e.pattern_match.group(1).strip() - ultroid_bot = e.client - if not x: - return await e.eor(get_string("schdl_2"), time=5) - user = await e.get_reply_message() - if user: - ev = await e.eor("`Promoting Replied User Globally`") - ok = e.text.split() - key = "all" - if len(ok) > 1 and (("group" in ok[1]) or ("channel" in ok[1])): - key = ok[1] - rank = ok[2] if len(ok) > 2 else "AdMin" - c = 0 - user.id = user.peer_id.user_id if e.is_private else user.from_id.user_id - async for x in e.client.iter_dialogs(): - if ( - "group" in key.lower() - and x.is_group - or "group" not in key.lower() - and "channel" in key.lower() - and x.is_channel - ): - try: - await e.client( - EditAdminRequest( - x.id, - user.id, - _gpromote_rights, - rank, - ), - ) - c += 1 - except BaseException: - pass - elif ( - ("group" not in key.lower() or x.is_group) - and ( - "group" in key.lower() - or "channel" not in key.lower() - or x.is_channel - ) - and ( - "group" in key.lower() - or "channel" in key.lower() - or x.is_group - or x.is_channel - ) - ): - try: - await e.client( - EditAdminRequest( - x.id, - user.id, - _gpromote_rights, - rank, - ), - ) - c += 1 - except Exception as er: - LOGS.info(er) - await eor(ev, f"Promoted The Replied Users in Total : {c} {key} chats") - else: - k = e.text.split() - if not k[1]: - return await eor( - e, "`Give someone's username/id or replied to user.", time=5 - ) - user = k[1] - if user.isdigit(): - user = int(user) - try: - name = await e.client.get_entity(user) - except BaseException: - return await e.eor(f"`No User Found Regarding {user}`", time=5) - ev = await e.eor(f"`Promoting {name.first_name} globally.`") - key = "all" - if len(k) > 2 and (("group" in k[2]) or ("channel" in k[2])): - key = k[2] - rank = k[3] if len(k) > 3 else "AdMin" - c = 0 - async for x in e.client.iter_dialogs(): - if ( - "group" in key.lower() - and x.is_group - or "group" not in key.lower() - and "channel" in key.lower() - and x.is_channel - or "group" not in key.lower() - and "channel" not in key.lower() - and (x.is_group or x.is_channel) - ): - try: - await ultroid_bot( - EditAdminRequest( - x.id, - user, - _gpromote_rights, - rank, - ), - ) - c += 1 - except BaseException: - pass - await eor(ev, f"Promoted {name.first_name} in Total : {c} {key} chats.") - - -@ultroid_cmd(pattern="gdemote( (.*)|$)", fullsudo=True) -async def _(e): - x = e.pattern_match.group(1).strip() - ultroid_bot = e.client - if not x: - return await e.eor(get_string("schdl_2"), time=5) - user = await e.get_reply_message() - if user: - user.id = user.peer_id.user_id if e.is_private else user.from_id.user_id - ev = await e.eor("`Demoting Replied User Globally`") - ok = e.text.split() - key = "all" - if len(ok) > 1 and (("group" in ok[1]) or ("channel" in ok[1])): - key = ok[1] - rank = "Not AdMin" - c = 0 - async for x in e.client.iter_dialogs(): - if ( - "group" in key.lower() - and x.is_group - or "group" not in key.lower() - and "channel" in key.lower() - and x.is_channel - or "group" not in key.lower() - and "channel" not in key.lower() - and (x.is_group or x.is_channel) - ): - try: - await ultroid_bot( - EditAdminRequest( - x.id, - user.id, - _gdemote_rights, - rank, - ), - ) - c += 1 - except BaseException: - pass - await eor(ev, f"Demoted The Replied Users in Total : {c} {key} chats") - else: - k = e.text.split() - if not k[1]: - return await eor( - e, "`Give someone's username/id or replied to user.", time=5 - ) - user = k[1] - if user.isdigit(): - user = int(user) - try: - name = await ultroid_bot.get_entity(user) - except BaseException: - return await e.eor(f"`No User Found Regarding {user}`", time=5) - ev = await e.eor(f"`Demoting {name.first_name} globally.`") - key = "all" - if len(k) > 2 and (("group" in k[2]) or ("channel" in k[2])): - key = k[2] - rank = "Not AdMin" - c = 0 - async for x in ultroid_bot.iter_dialogs(): - if ( - "group" in key.lower() - and x.is_group - or "group" not in key.lower() - and "channel" in key.lower() - and x.is_channel - or "group" not in key.lower() - and "channel" not in key.lower() - and (x.is_group or x.is_channel) - ): - try: - await ultroid_bot( - EditAdminRequest( - x.id, - user, - _gdemote_rights, - rank, - ), - ) - c += 1 - except BaseException: - pass - await eor(ev, f"Demoted {name.first_name} in Total : {c} {key} chats.") - - -@ultroid_cmd(pattern="ungban( (.*)|$)", fullsudo=True) -async def _(e): - xx = await e.eor("`UnGbanning...`") - match = e.pattern_match.group(1).strip() - peer = None - if e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - elif match: - try: - userid = int(match) - except ValueError: - userid = match - try: - userid = (await e.client.get_entity(userid)).id - except Exception as er: - return await xx.edit(f"Failed to get User...\nError: {er}") - elif e.is_private: - userid = e.chat_id - else: - return await xx.eor("`Reply to some msg or add their id.`", time=5) - if not is_gbanned(userid): - return await xx.edit("`User/Channel is not Gbanned...`") - try: - if not peer: - peer = await e.client.get_entity(userid) - name = inline_mention(peer) - except BaseException: - userid = int(userid) - name = str(userid) - chats = 0 - if e.client._dialogs: - dialog = e.client._dialogs - else: - dialog = await e.client.get_dialogs() - e.client._dialogs.extend(dialog) - for ggban in dialog: - if ggban.is_group or ggban.is_channel: - try: - await e.client.edit_permissions(ggban.id, userid, view_messages=True) - chats += 1 - except FloodWaitError as fw: - LOGS.info( - f"[FLOOD_WAIT_ERROR] : on Ungban\nSleeping for {fw.seconds+10}" - ) - await asyncio.sleep(fw.seconds + 10) - try: - await e.client.edit_permissions( - ggban.id, userid, view_messages=True - ) - chats += 1 - except BaseException as er: - LOGS.exception(er) - except (ChatAdminRequiredError, ValueError): - pass - except BaseException as er: - LOGS.exception(er) - ungban(userid) - if isinstance(peer, User): - await e.client(UnblockRequest(userid)) - await xx.edit( - f"`Ungbaned` {name} in {chats} `chats.\nRemoved from gbanwatch.`", - ) - - -@ultroid_cmd(pattern="gban( (.*)|$)", fullsudo=True) -async def _(e): - xx = await e.eor("`Gbanning...`") - reason = "" - if e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - try: - reason = e.text.split(" ", maxsplit=1)[1] - except IndexError: - pass - elif e.pattern_match.group(1).strip(): - usr = e.text.split(maxsplit=2)[1] - try: - userid = await e.client.parse_id(usr) - except ValueError: - userid = usr - try: - reason = e.text.split(maxsplit=2)[2] - except IndexError: - pass - elif e.is_private: - userid = e.chat_id - try: - reason = e.text.split(" ", maxsplit=1)[1] - except IndexError: - pass - else: - return await xx.eor("`Reply to some msg or add their id.`", time=5) - user = None - try: - user = await e.client.get_entity(userid) - name = inline_mention(user) - except BaseException: - userid = int(userid) - name = str(userid) - chats = 0 - if userid == ultroid_bot.uid: - return await xx.eor("`I can't gban myself.`", time=3) - elif userid in DEVLIST: - return await xx.eor("`I can't gban my Developers.`", time=3) - elif is_gbanned(userid): - return await eod( - xx, - "`User is already gbanned and added to gbanwatch.`", - time=4, - ) - if e.client._dialogs: - dialog = e.client._dialogs - else: - dialog = await e.client.get_dialogs() - e.client._dialogs.extend(dialog) - for ggban in dialog: - if ggban.is_group or ggban.is_channel: - try: - await e.client.edit_permissions(ggban.id, userid, view_messages=False) - chats += 1 - except FloodWaitError as fw: - LOGS.info( - f"[FLOOD_WAIT_ERROR] : on GBAN Command\nSleeping for {fw.seconds+10}" - ) - await asyncio.sleep(fw.seconds + 10) - try: - await e.client.edit_permissions( - ggban.id, userid, view_messages=False - ) - chats += 1 - except BaseException as er: - LOGS.exception(er) - except (ChatAdminRequiredError, ValueError): - pass - except BaseException as er: - LOGS.exception(er) - gban(userid, reason) - if isinstance(user, User): - await e.client(BlockRequest(userid)) - gb_msg = f"**#Gbanned** {name} `in {chats} chats and added to gbanwatch!`" - if reason: - gb_msg += f"\n**Reason** : {reason}" - await xx.edit(gb_msg) - - -@ultroid_cmd(pattern="g(admin|)cast( (.*)|$)", fullsudo=True) -async def gcast(event): - text, btn, reply = "", None, None - if xx := event.pattern_match.group(2): - msg, btn = get_msg_button(event.text.split(maxsplit=1)[1]) - elif event.is_reply: - reply = await event.get_reply_message() - msg = reply.text - if reply.buttons: - btn = format_btn(reply.buttons) - else: - msg, btn = get_msg_button(msg) - else: - return await eor( - event, "`Give some text to Globally Broadcast or reply a message..`" - ) - - kk = await event.eor("`Globally Broadcasting Msg...`") - er = 0 - done = 0 - err = "" - if event.client._dialogs: - dialog = event.client._dialogs - else: - dialog = await event.client.get_dialogs() - event.client._dialogs.extend(dialog) - for x in dialog: - if x.is_group: - chat = x.entity.id - if ( - not keym.contains(chat) - and int(f"-100{str(chat)}") not in NOSPAM_CHAT - and ( - ( - event.text[2:7] != "admin" - or (x.entity.admin_rights or x.entity.creator) - ) - ) - ): - try: - if btn: - bt = create_tl_btn(btn) - await something( - event, - msg, - reply.media if reply else None, - bt, - chat=chat, - reply=False, - ) - else: - await event.client.send_message( - chat, msg, file=reply.media if reply else None - ) - done += 1 - except FloodWaitError as fw: - await asyncio.sleep(fw.seconds + 10) - try: - if btn: - bt = create_tl_btn(btn) - await something( - event, - msg, - reply.media if reply else None, - bt, - chat=chat, - reply=False, - ) - else: - await event.client.send_message( - chat, msg, file=reply.media if reply else None - ) - done += 1 - except Exception as rr: - err += f"• {rr}\n" - er += 1 - except BaseException as h: - err += f"• {str(h)}" + "\n" - er += 1 - text += f"Done in {done} chats, error in {er} chat(s)" - if err != "": - open("gcast-error.log", "w+").write(err) - text += f"\nYou can do `{HNDLR}ul gcast-error.log` to know error report." - await kk.edit(text) - - -@ultroid_cmd(pattern="gucast( (.*)|$)", fullsudo=True) -async def gucast(event): - msg, btn, reply = "", None, None - if xx := event.pattern_match.group(1).strip(): - msg, btn = get_msg_button(event.text.split(maxsplit=1)[1]) - elif event.is_reply: - reply = await event.get_reply_message() - msg = reply.text - if reply.buttons: - btn = format_btn(reply.buttons) - else: - msg, btn = get_msg_button(msg) - else: - return await eor( - event, "`Give some text to Globally Broadcast or reply a message..`" - ) - kk = await event.eor("`Globally Broadcasting Msg...`") - er = 0 - done = 0 - if event.client._dialogs: - dialog = event.client._dialogs - else: - dialog = await event.client.get_dialogs() - event.client._dialogs.extend(dialog) - for x in dialog: - if x.is_user and not x.entity.bot: - chat = x.id - if not keym.contains(chat): - try: - if btn: - bt = create_tl_btn(btn) - await something( - event, - msg, - reply.media if reply else None, - bt, - chat=chat, - reply=False, - ) - else: - await event.client.send_message( - chat, msg, file=reply.media if reply else None - ) - done += 1 - except BaseException: - er += 1 - await kk.edit(f"Done in {done} chats, error in {er} chat(s)") - - -@ultroid_cmd(pattern="gkick( (.*)|$)", fullsudo=True) -async def gkick(e): - xx = await e.eor("`Gkicking...`") - if e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - elif e.pattern_match.group(1).strip(): - userid = await e.client.parse_id(e.pattern_match.group(1).strip()) - elif e.is_private: - userid = e.chat_id - else: - return await xx.edit("`Reply to some msg or add their id.`", time=5) - name = (await e.client.get_entity(userid)).first_name - chats = 0 - if userid == ultroid_bot.uid: - return await xx.eor("`I can't gkick myself.`", time=3) - if userid in DEVLIST: - return await xx.eor("`I can't gkick my Developers.`", time=3) - if e.client._dialogs: - dialog = e.client._dialogs - else: - dialog = await e.client.get_dialogs() - e.client._dialogs.extend(dialog) - for gkick in dialog: - if gkick.is_group or gkick.is_channel: - try: - await e.client.kick_participant(gkick.id, userid) - chats += 1 - except BaseException: - pass - await xx.edit(f"`Gkicked` [{name}](tg://user?id={userid}) `in {chats} chats.`") - - -@ultroid_cmd(pattern="gmute( (.*)|$)", fullsudo=True) -async def _(e): - xx = await e.eor("`Gmuting...`") - if e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - elif e.pattern_match.group(1).strip(): - userid = await e.client.parse_id(e.pattern_match.group(1).strip()) - elif e.is_private: - userid = e.chat_id - else: - return await xx.eor("`Reply to some msg or add their id.`", tome=5, time=5) - name = await e.client.get_entity(userid) - chats = 0 - if userid == ultroid_bot.uid: - return await xx.eor("`I can't gmute myself.`", time=3) - if userid in DEVLIST: - return await xx.eor("`I can't gmute my Developers.`", time=3) - if is_gmuted(userid): - return await xx.eor("`User is already gmuted.`", time=4) - if e.client._dialogs: - dialog = e.client._dialogs - else: - dialog = await e.client.get_dialogs() - e.client._dialogs.extend(dialog) - for onmute in dialog: - if onmute.is_group: - try: - await e.client.edit_permissions(onmute.id, userid, send_messages=False) - chats += 1 - except BaseException: - pass - gmute(userid) - await xx.edit(f"`Gmuted` {inline_mention(name)} `in {chats} chats.`") - - -@ultroid_cmd(pattern="ungmute( (.*)|$)", fullsudo=True) -async def _(e): - xx = await e.eor("`UnGmuting...`") - if e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - elif e.pattern_match.group(1).strip(): - userid = await e.client.parse_id(e.pattern_match.group(1).strip()) - elif e.is_private: - userid = e.chat_id - else: - return await xx.eor("`Reply to some msg or add their id.`", time=5) - name = (await e.client.get_entity(userid)).first_name - chats = 0 - if not is_gmuted(userid): - return await xx.eor("`User is not gmuted.`", time=3) - if e.client._dialogs: - dialog = e.client._dialogs - else: - dialog = await e.client.get_dialogs() - e.client._dialogs.extend(dialog) - for hurr in dialog: - if hurr.is_group: - try: - await e.client.edit_permissions(hurr.id, userid, send_messages=True) - chats += 1 - except BaseException: - pass - ungmute(userid) - await xx.edit(f"`Ungmuted` {inline_mention(name)} `in {chats} chats.`") - - -@ultroid_cmd( - pattern="listgban$", -) -async def list_gengbanned(event): - users = list_gbanned() - x = await event.eor(get_string("com_1")) - msg = "" - if not users: - return await x.edit("`You haven't GBanned anyone!`") - for i in users: - try: - name = await event.client.get_entity(int(i)) - except BaseException: - name = i - msg += f"User: {inline_mention(name, html=True)}\n" - reason = users[i] - msg += f"Reason: {reason}\n\n" if reason is not None else "\n" - gbanned_users = f"List of users GBanned by {OWNER_NAME}:\n\n{msg}" - if len(gbanned_users) > 4096: - with open("gbanned.txt", "w") as f: - f.write( - gbanned_users.replace("", "") - .replace("", "") - .replace("", "") - ) - await x.reply( - file="gbanned.txt", - message=f"List of users GBanned by {inline_mention(ultroid_bot.me)}", - ) - os.remove("gbanned.txt") - await x.delete() - else: - await x.edit(gbanned_users, parse_mode="html") - - -@ultroid_cmd( - pattern="gstat( (.*)|$)", -) -async def gstat_(e): - xx = await e.eor(get_string("com_1")) - if e.is_private: - userid = (await e.get_chat()).id - elif e.reply_to_msg_id: - userid = (await e.get_reply_message()).sender_id - elif e.pattern_match.group(1).strip(): - try: - userid = await e.client.parse_id(e.pattern_match.group(1).strip()) - except Exception as err: - return await xx.eor(f"{err}", time=10) - else: - return await xx.eor("`Reply to some msg or add their id.`", time=5) - name = (await e.client.get_entity(userid)).first_name - msg = f"**{name} is " - is_banned = is_gbanned(userid) - reason = list_gbanned().get(userid) - if is_banned: - msg += "Globally Banned" - msg += f" with reason** `{reason}`" if reason else ".**" - else: - msg += "not Globally Banned.**" - await xx.edit(msg) - - -@ultroid_cmd(pattern="gblacklist$") -async def blacklist_(event): - await gblacker(event, "add") - - -@ultroid_cmd(pattern="ungblacklist$") -async def ungblacker(event): - await gblacker(event, "remove") - - -async def gblacker(event, type_): - try: - chat_id = int(event.text.split(maxsplit=1)[1]) - try: - chat_id = (await event.client.get_entity(chat_id)).id - except Exception as e: - return await event.eor(f"**ERROR**\n`{str(e)}`") - except IndexError: - chat_id = event.chat_id - if type_ == "add": - keym.add(chat_id) - elif type_ == "remove": - keym.remove(chat_id) - await event.eor(f"Global Broadcasts: \n{type_}ed {chat_id}") diff --git a/plugins/gpt.py b/plugins/gpt.py deleted file mode 100644 index 11f9f577fc77394f34169eec2cfeca3974b5611f..0000000000000000000000000000000000000000 --- a/plugins/gpt.py +++ /dev/null @@ -1,183 +0,0 @@ -import os -from collections import deque -from io import BytesIO - -from . import ( - ultroid_cmd, - async_searcher, - udB, - LOGS, - get_paste, -) - -GPT_CHAT_HISTORY = deque(maxlen=30) - -TELEGRAM_CHAR_LIMIT = 4096 # Telegram's message character limit - - -async def pastee(data): - err, linky = await get_paste(data) - if err: - return f">> [Raw Code Pasted Here](https://spaceb.in/{linky})\n" - else: - LOGS.error(linky) - return "" - - -@ultroid_cmd( - pattern=r"gpt( ([\s\S]*))?$", -) -async def openai_chat_gpt(e): - api_key = "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" - if not api_key: - return await e.eor("`OPENAI_API` key missing..", time=10) - - query = e.pattern_match.group(2) - reply = await e.get_reply_message() - - file_content = None - - if query: - # Check if query contains 'from filename' - if ' from ' in query: - query_text, filename = query.split(' from ', 1) - query_text = query_text.strip() - filename = filename.strip() - # Attempt to find and read the file from media in chat - file_found = False - async for message in e.client.iter_messages(e.chat_id, reverse=True, limit=50): - if message.media and message.file.name == filename: - if (message.file.name.endswith(".txt") or message.file.name.endswith(".py")): - file = await e.client.download_media(message) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - file_found = True - break - if not file_found: - return await e.eor(f"`File {filename} not found in recent messages.`", time=5) - if file_content: - query = f"{query_text}\n\n{file_content}" if query_text else file_content - else: - return await e.eor("`Failed to read file content.`", time=5) - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the query and the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = f"{query}\n\n{file_content}" - elif reply and reply.message: - # Use the query and the replied text message content - query = f"{query}\n\n{reply.message}" - # Else, use query as is - else: - if reply and reply.media and (reply.file.name.endswith(".txt") or reply.file.name.endswith(".py")): - # Use the replied file content - file = await e.client.download_media(reply) - try: - with open(file, "r", encoding='utf-8') as f: - file_content = f.read() - except Exception as exc: - LOGS.error(f"Error reading file: {exc}") - return await e.eor("`Failed to read file content.`", time=5) - finally: - os.remove(file) - query = file_content - elif reply and reply.message: - # Use the replied text message content - query = reply.message - else: - return await e.eor("`Please provide a question or reply to a message or .txt/.py file.`", time=5) - - if query.strip() == "-c": - GPT_CHAT_HISTORY.clear() - return await e.eor("__Cleared o1-mini Chat History!__", time=6) - - eris = await e.eor(f"__Generating answer for:__\n`{query[:20]} ...`") - GPT_CHAT_HISTORY.append({"role": "user", "content": query}) - - try: - data = { - "model": "o1-mini", - "messages": list(GPT_CHAT_HISTORY), - } - request = await async_searcher( - "https://api.openai.com/v1/chat/completions", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}", - }, - json=data, - re_json=True, - post=True, - ) - response = request["choices"][0]["message"]["content"] - GPT_CHAT_HISTORY.append({"role": "assistant", "content": response}) - except Exception as exc: - LOGS.warning(exc, exc_info=True) - GPT_CHAT_HISTORY.pop() - return await eris.edit( - f"**Error while requesting data from OpenAI:** \n> `{exc}`" - ) - - LOGS.debug(f'Tokens Used on query: {request["usage"]["completion_tokens"]}') - - # Truncate query to 50 characters for display - truncated_query = query[:100] - - # Prepare the full message - full_message = f"**Query:**\n~ __{truncated_query}__\n\n**o1-mini:**\n~ {response}" - - # Check if response contains code blocks - code_blocks = [] - in_code_block = False - code_block_lines = [] - for line in response.split('\n'): - if line.strip().startswith('```'): - if in_code_block: - # End of code block - in_code_block = False - code_blocks.append('\n'.join(code_block_lines)) - code_block_lines = [] - else: - # Start of code block - in_code_block = True - elif in_code_block: - code_block_lines.append(line) - - # If the response contains code blocks, select the largest one and paste it - if code_blocks: - # Select the largest code block based on length - largest_code_block = max(code_blocks, key=lambda block: len(block)) - # Upload the largest code block to spaceb.in and get the link - paste_link = await pastee(largest_code_block) - else: - paste_link = "" - - if len(full_message) <= TELEGRAM_CHAR_LIMIT: - # If it fits within the limit, send as a message - await eris.edit(full_message + f"\n\n{paste_link}") - else: - # If it exceeds the limit, send as a file and include paste link - file = BytesIO(full_message.encode('utf-8')) - file.name = "o1-mini-output.txt" - await eris.respond( - "__The query and response were too long, so they have been sent as a file.__\n\n" + paste_link, - file=file, - reply_to=e.reply_to_msg_id or e.id, - link_preview=False - ) - await eris.delete() - diff --git a/plugins/greetings.py b/plugins/greetings.py deleted file mode 100644 index 6254a6be539c94ee6529ae141d12cb9ab7807bf1..0000000000000000000000000000000000000000 --- a/plugins/greetings.py +++ /dev/null @@ -1,205 +0,0 @@ -# Ultroid - UserBot -# 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 - - ----- Welcomes ---- -• `{i}setwelcome ` - Set welcome message in the current chat. - -• `{i}clearwelcome` - Delete the welcome in the current chat. - -• `{i}getwelcome` - Get the welcome message in the current chat. - ----- GoodByes ---- -• `{i}setgoodbye ` - Set goodbye message in the current chat. - -• `{i}cleargoodbye` - Delete the goodbye in the current chat. - -• `{i}getgoodbye` - Get the goodbye message in the current chat. - -• `{i}thankmembers on/off` - Send a thank you sticker on hitting a members count of 100*x in your groups. -""" -import os - -from telegraph import upload_file as uf -from telethon.utils import pack_bot_file_id - -from pyUltroid.dB.greetings_db import ( - add_goodbye, - add_thanks, - add_welcome, - delete_goodbye, - delete_welcome, - get_goodbye, - get_welcome, - must_thank, - remove_thanks, -) -from pyUltroid.fns.tools import create_tl_btn, format_btn, get_msg_button - -from . import HNDLR, eor, get_string, mediainfo, ultroid_cmd -from ._inline import something - -Note = "\n\nNote: `{mention}`, `{group}`, `{count}`, `{name}`, `{fullname}`, `{username}`, `{userid}` can be used as formatting parameters.\n\n" - - -@ultroid_cmd(pattern="setwelcome", groups_only=True) -async def setwel(event): - x = await event.eor(get_string("com_1")) - r = await event.get_reply_message() - btn = format_btn(r.buttons) if (r and r.buttons) else None - try: - text = event.text.split(maxsplit=1)[1] - except IndexError: - text = r.text if r else None - if r and r.media: - wut = mediainfo(r.media) - if wut.startswith(("pic", "gif")): - dl = await r.download_media() - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "video": - if r.media.document.size > 8 * 1000 * 1000: - return await eor(x, get_string("com_4"), time=5) - dl = await r.download_media() - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "web": - m = None - else: - m = pack_bot_file_id(r.media) - if r.text: - txt = r.text - if not btn: - txt, btn = get_msg_button(r.text) - add_welcome(event.chat_id, txt, m, btn) - else: - add_welcome(event.chat_id, None, m, btn) - await eor(x, get_string("grt_1")) - elif text: - if not btn: - txt, btn = get_msg_button(text) - add_welcome(event.chat_id, txt, None, btn) - await eor(x, get_string("grt_1")) - else: - await eor(x, get_string("grt_3"), time=5) - - -@ultroid_cmd(pattern="clearwelcome$", groups_only=True) -async def clearwel(event): - if not get_welcome(event.chat_id): - return await event.eor(get_string("grt_4"), time=5) - delete_welcome(event.chat_id) - await event.eor(get_string("grt_5"), time=5) - - -@ultroid_cmd(pattern="getwelcome$", groups_only=True) -async def listwel(event): - wel = get_welcome(event.chat_id) - if not wel: - return await event.eor(get_string("grt_4"), time=5) - msgg, med = wel["welcome"], wel["media"] - if wel.get("button"): - btn = create_tl_btn(wel["button"]) - return await something(event, msgg, med, btn) - await event.reply(f"**Welcome Note in this chat**\n\n`{msgg}`", file=med) - await event.delete() - - -@ultroid_cmd(pattern="setgoodbye", groups_only=True) -async def setgb(event): - x = await event.eor(get_string("com_1")) - r = await event.get_reply_message() - btn = format_btn(r.buttons) if (r and r.buttons) else None - try: - text = event.text.split(maxsplit=1)[1] - except IndexError: - text = r.text if r else None - if r and r.media: - wut = mediainfo(r.media) - if wut.startswith(("pic", "gif")): - dl = await r.download_media() - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "video": - if r.media.document.size > 8 * 1000 * 1000: - return await eor(x, get_string("com_4"), time=5) - dl = await r.download_media() - variable = uf(dl) - os.remove(dl) - m = f"https://graph.org{variable[0]}" - elif wut == "web": - m = None - else: - m = pack_bot_file_id(r.media) - if r.text: - txt = r.text - if not btn: - txt, btn = get_msg_button(r.text) - add_goodbye(event.chat_id, txt, m, btn) - else: - add_goodbye(event.chat_id, None, m, btn) - await eor(x, "`Goodbye note saved`") - elif text: - if not btn: - txt, btn = get_msg_button(text) - add_goodbye(event.chat_id, txt, None, btn) - await eor(x, "`Goodbye note saved`") - else: - await eor(x, get_string("grt_7"), time=5) - - -@ultroid_cmd(pattern="cleargoodbye$", groups_only=True) -async def clearwgb(event): - if not get_goodbye(event.chat_id): - return await event.eor(get_string("grt_6"), time=5) - delete_goodbye(event.chat_id) - await event.eor("`Goodbye Note Deleted`", time=5) - - -@ultroid_cmd(pattern="getgoodbye$", groups_only=True) -async def listgd(event): - wel = get_goodbye(event.chat_id) - if not wel: - return await event.eor(get_string("grt_6"), time=5) - msgg = wel["goodbye"] - med = wel["media"] - if wel.get("button"): - btn = create_tl_btn(wel["button"]) - return await something(event, msgg, med, btn) - await event.reply(f"**Goodbye Note in this chat**\n\n`{msgg}`", file=med) - await event.delete() - - -@ultroid_cmd(pattern="thankmembers (on|off)", groups_only=True) -async def thank_set(event): - type_ = event.pattern_match.group(1).strip() - if not type_ or type_ == "": - await eor( - event, - f"**Current Chat Settings:**\n**Thanking Members:** `{must_thank(event.chat_id)}`\n\nUse `{HNDLR}thankmembers on` or `{HNDLR}thankmembers off` to toggle current settings!", - ) - return - chat = event.chat_id - if type_.lower() == "on": - add_thanks(chat) - elif type_.lower() == "off": - remove_thanks(chat) - await eor( - event, - f"**Done! Thank you members has been turned** `{type_.lower()}` **for this chat**!", - ) diff --git a/plugins/imagetools.py b/plugins/imagetools.py deleted file mode 100644 index ef633427e4df89fb6d964a4fbce7f83001561f69..0000000000000000000000000000000000000000 --- a/plugins/imagetools.py +++ /dev/null @@ -1,292 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}border ` - To create border around that media.. - Ex - `{i}border 12,22,23` - - `{i}border 12,22,23 ; width (in number)` - -• `{i}grey ` - To make it black nd white. - -• `{i}color ` - To make it Colorfull. - -• `{i}toon ` - To make it toon. - -• `{i}danger ` - To make it look Danger. - -• `{i}negative ` - To make negative image. - -• `{i}blur ` - To make it blurry. - -• `{i}quad ` - create a Vortex. - -• `{i}mirror ` - To create mirror pic. - -• `{i}flip ` - To make it flip. - -• `{i}sketch ` - To draw its sketch. - -• `{i}blue ` - just cool. - -• `{i}csample ` - example : `{i}csample red` - `{i}csample #ffffff` - -• `{i}pixelator ` - Create a Pixelated Image.. -""" -import os - -from . import LOGS, con - -try: - import cv2 -except ImportError: - LOGS.error(f"{__file__}: OpenCv not Installed.") - -import numpy as np - -try: - from PIL import Image -except ImportError: - Image = None - LOGS.info(f"{__file__}: PIL not Installed.") -from telegraph import upload_file as upf -from telethon.errors.rpcerrorlist import ( - ChatSendMediaForbiddenError, - MessageDeleteForbiddenError, -) - -from . import ( - Redis, - async_searcher, - download_file, - get_string, - requests, - udB, - ultroid_cmd, -) - - -@ultroid_cmd(pattern="color$") -async def _(event): - reply = await event.get_reply_message() - if not (reply and reply.media): - return await event.eor("`Reply To a Black and White Image`") - xx = await event.eor("`Coloring image 🎨🖌️...`") - image = await reply.download_media() - img = cv2.VideoCapture(image) - ret, frame = img.read() - cv2.imwrite("ult.jpg", frame) - if udB.get_key("DEEP_API"): - key = Redis("DEEP_API") - else: - key = "quickstart-QUdJIGlzIGNvbWluZy4uLi4K" - r = requests.post( - "https://api.deepai.org/api/colorizer", - files={"image": open("ult.jpg", "rb")}, - headers={"api-key": key}, - ) - os.remove("ult.jpg") - os.remove(image) - if "status" in r.json(): - return await event.edit( - r.json()["status"] + "\nGet api nd set `{i}setdb DEEP_API key`" - ) - r_json = r.json()["output_url"] - await event.client.send_file(event.chat_id, r_json, reply_to=reply) - await xx.delete() - - -@ultroid_cmd(pattern="(grey|blur|negative|danger|mirror|quad|sketch|flip|toon)$") -async def ult_tools(event): - match = event.pattern_match.group(1) - ureply = await event.get_reply_message() - if not (ureply and (ureply.media)): - await event.eor(get_string("cvt_3")) - return - ultt = await ureply.download_media() - xx = await event.eor(get_string("com_1")) - if ultt.endswith(".tgs"): - xx = await xx.edit(get_string("sts_9")) - file = await con.convert(ultt, convert_to="png", outname="ult") - ult = cv2.imread(file) - if match == "grey": - ultroid = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY) - elif match == "blur": - ultroid = cv2.GaussianBlur(ult, (35, 35), 0) - elif match == "negative": - ultroid = cv2.bitwise_not(ult) - elif match == "danger": - dan = cv2.cvtColor(ult, cv2.COLOR_BGR2RGB) - ultroid = cv2.cvtColor(dan, cv2.COLOR_HSV2BGR) - elif match == "mirror": - ish = cv2.flip(ult, 1) - ultroid = cv2.hconcat([ult, ish]) - elif match == "flip": - trn = cv2.flip(ult, 1) - ish = cv2.rotate(trn, cv2.ROTATE_180) - ultroid = cv2.vconcat([ult, ish]) - elif match == "quad": - ult = cv2.imread(file) - roid = cv2.flip(ult, 1) - mici = cv2.hconcat([ult, roid]) - fr = cv2.flip(mici, 1) - trn = cv2.rotate(fr, cv2.ROTATE_180) - ultroid = cv2.vconcat([mici, trn]) - elif match == "sketch": - gray_image = cv2.cvtColor(ult, cv2.COLOR_BGR2GRAY) - inverted_gray_image = 255 - gray_image - blurred_img = cv2.GaussianBlur(inverted_gray_image, (21, 21), 0) - inverted_blurred_img = 255 - blurred_img - ultroid = cv2.divide(gray_image, inverted_blurred_img, scale=256.0) - elif match == "toon": - height, width, _ = ult.shape - samples = np.zeros([height * width, 3], dtype=np.float32) - count = 0 - for x in range(height): - for y in range(width): - samples[count] = ult[x][y] - count += 1 - _, labels, centers = cv2.kmeans( - samples, - 12, - None, - (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10000, 0.0001), - 5, - cv2.KMEANS_PP_CENTERS, - ) - centers = np.uint8(centers) - ish = centers[labels.flatten()] - ultroid = ish.reshape(ult.shape) - cv2.imwrite("ult.jpg", ultroid) - await ureply.reply( - file="ult.jpg", - force_document=False, - ) - await xx.delete() - os.remove("ult.jpg") - os.remove(file) - - -@ultroid_cmd(pattern="csample (.*)") -async def sampl(ult): - if color := ult.pattern_match.group(1).strip(): - img = Image.new("RGB", (200, 100), f"{color}") - img.save("csample.png") - try: - try: - await ult.delete() - await ult.respond(f"Colour Sample for `{color}` !", file="csample.png") - except MessageDeleteForbiddenError: - await ult.reply(f"Colour Sample for `{color}` !", file="csample.png") - except ChatSendMediaForbiddenError: - await ult.eor("Umm! Sending Media is disabled here!") - - else: - await ult.eor("Wrong Color Name/Hex Code specified!") - - -@ultroid_cmd( - pattern="blue$", -) -async def ultd(event): - ureply = await event.get_reply_message() - xx = await event.eor("`...`") - if not (ureply and (ureply.media)): - await xx.edit(get_string("cvt_3")) - return - ultt = await ureply.download_media() - if ultt.endswith(".tgs"): - await xx.edit(get_string("sts_9")) - file = await con.convert(ultt, convert_to="png", outname="ult") - got = upf(file) - lnk = f"https://graph.org{got[0]}" - r = await async_searcher( - f"https://nekobot.xyz/api/imagegen?type=blurpify&image={lnk}", re_json=True - ) - ms = r.get("message") - if not r["success"]: - return await xx.edit(ms) - await download_file(ms, "ult.png") - img = Image.open("ult.png").convert("RGB") - img.save("ult.webp", "webp") - await event.client.send_file( - event.chat_id, - "ult.webp", - force_document=False, - reply_to=event.reply_to_msg_id, - ) - await xx.delete() - os.remove("ult.png") - os.remove("ult.webp") - os.remove(ultt) - - -@ultroid_cmd(pattern="border( (.*)|$)") -async def ok(event): - hm = await event.get_reply_message() - if not (hm and (hm.photo or hm.sticker)): - return await event.eor("`Reply to Sticker or Photo..`") - col = event.pattern_match.group(1).strip() - wh = 20 - if not col: - col = [255, 255, 255] - else: - try: - if ";" in col: - col_ = col.split(";", maxsplit=1) - wh = int(col_[1]) - col = col_[0] - col = [int(col) for col in col.split(",")[:2]] - except ValueError: - return await event.eor("`Not a Valid Input...`") - okla = await hm.download_media() - img1 = cv2.imread(okla) - constant = cv2.copyMakeBorder(img1, wh, wh, wh, wh, cv2.BORDER_CONSTANT, value=col) - cv2.imwrite("output.png", constant) - await event.client.send_file(event.chat.id, "output.png") - os.remove("output.png") - os.remove(okla) - await event.delete() - - -@ultroid_cmd(pattern="pixelator( (.*)|$)") -async def pixelator(event): - reply_message = await event.get_reply_message() - if not (reply_message and (reply_message.photo or reply_message.sticker)): - return await event.eor("`Reply to a photo`") - hw = 50 - try: - hw = int(event.pattern_match.group(1).strip()) - except (ValueError, TypeError): - pass - msg = await event.eor(get_string("com_1")) - image = await reply_message.download_media() - input_ = cv2.imread(image) - height, width = input_.shape[:2] - w, h = (hw, hw) - temp = cv2.resize(input_, (w, h), interpolation=cv2.INTER_LINEAR) - output = cv2.resize(temp, (width, height), interpolation=cv2.INTER_NEAREST) - cv2.imwrite("output.jpg", output) - await msg.respond("• Pixelated by Ultroid", file="output.jpg") - await msg.delete() - os.remove("output.jpg") - os.remove(image) diff --git a/plugins/imagine.py b/plugins/imagine.py deleted file mode 100644 index 7bbffcb7af7b0debd8257fb48f1e3fbe74b56797..0000000000000000000000000000000000000000 --- a/plugins/imagine.py +++ /dev/null @@ -1,80 +0,0 @@ -from os import system, remove -import json -import requests -import urllib.request -import os -from . import ultroid_cmd, udB, LOGS, run_async - -# Ensure the necessary library is installed -try: - import requests -except ImportError: - system("pip install requests") - import requests - -@run_async -def generate_dalle_image(prompt, api_key): - url = "https://aiassistquizapp899573677638.openai.azure.com/openai/deployments/Dalle3/images/generations?api-version=2024-02-15-preview" - headers = { - "api-key": api_key, - "content-type": "application/json; charset=UTF-8", - "accept-encoding": "gzip", - "user-agent": "okhttp/4.10.0" - } - data = { - "response_format": "url", - "model": "dall-e-3", - "n": 1, - "prompt": prompt, - "size": "1024x1792" - } - - response = requests.post(url, headers=headers, data=json.dumps(data)) - if response.status_code == 200: - result = response.json() - return result["data"][0] - else: - return {"error": f"Error: {response.status_code} - {response.text}"} - -@ultroid_cmd(pattern="imagine(?: |$)(.*)") -async def dalle_generator(event): - api_key = udB.get_key("DALL_E_API") - if not api_key: - return await event.eor("DALL_E_API key missing..") - - query = event.pattern_match.group(1) - if not query: - reply = await event.get_reply_message() - if reply and reply.text: - query = reply.text - if not query: - return await event.eor("`need a prompt to generate image! `", time=6) - - eris = await event.eor(f"__Generating image for:__\n`{query[:128]} ...`") - - response = await generate_dalle_image(query, api_key) - if "error" in response: - await eris.edit(response["error"]) - else: - image_url = response["url"] - revised_prompt = response.get("revised_prompt", "No revised prompt available.") - image_path = "generated_image.png" - - try: - # Download the image - urllib.request.urlretrieve(image_url, image_path) - - # Send the image - await event.client.send_file( - event.chat_id, - image_path, - caption=f"Model: • ([source]({image_url}))\n• $${revised_prompt}$$", - reply_to=event.id - ) - await eris.delete() - except Exception as e: - await eris.edit(f"Failed to download or send image: {str(e)}") - finally: - # Remove the downloaded image after sending - if os.path.exists(image_path): - remove(image_path) \ No newline at end of file diff --git a/plugins/lastonult.py b/plugins/lastonult.py deleted file mode 100644 index 725113b93dd7b3a6073b215406a9f85703bcbecb..0000000000000000000000000000000000000000 --- a/plugins/lastonult.py +++ /dev/null @@ -1,387 +0,0 @@ -""" -❍ Commands Available - - -• `{i}lastonline` - -• `{i}seen ` - - 🌀 __@TrueSaiyan__ 🌀 -""" - -import html - -import motor.motor_asyncio -import pytz -from telethon import events, types -from telethon.tl.functions.channels import GetParticipantsRequest -from telethon.tl.types import ( - ChannelParticipantsSearch, - User, - UserStatusOffline, - UserStatusOnline, - UserStatusRecently, -) - -from . import * - -if udB.get_key("MONg"): - lastSeendB = udB.get_key("MONg") -else: - lastSeendB = "mongodb+srv://LastSeenUlt:YKzBfhfjtObPfQLD@cluster0.iil65vg.mongodb.net/" - -# MongoDB client setup -mongo_client = motor.motor_asyncio.AsyncIOMotorClient(lastSeendB) -db = mongo_client["User_Status"] -collection = db["user_data"] - -# Define the UTC timezone and Local timezone -if udB.get_key("TIMEZONE"): - localTZ = udB.get_key("TIMEZONE") -else: - localTZ = "Asia/Kolkata" - -utc_tz = pytz.utc -perth_tz = pytz.timezone(localTZ) - - -async def mention_user(user_id): - entity = await ultroid_bot.get_entity(user_id) - mention = get_display_name(entity) - escaped_mention = html.escape(mention) - permalink = f"{escaped_mention}" - return permalink - - -async def get_group_members_last_online(event): - group = await event.client.get_entity(event.chat_id) - participants = await event.client( - GetParticipantsRequest(group, ChannelParticipantsSearch(""), 0, 25, hash=0) - ) - - users_currently_online = [] - users_last_online = [] - users_unknown_status = [] - - for user in participants.users: - if isinstance(user, User) and not user.bot: - user_status = user.status - user_id = user.id - - if isinstance(user_status, UserStatusOffline): - was_online_utc = user_status.was_online.replace(tzinfo=utc_tz) - users_last_online.append((was_online_utc, user)) - elif isinstance(user_status, UserStatusOnline): - users_currently_online.append(user) - else: - # Check the database for last seen data - db_user = await collection.find_one({"user_id": user_id}) - if db_user: - last_online_db = db_user.get("last_online_time") - if last_online_db: - last_online_db = last_online_db.replace(tzinfo=utc_tz) - users_last_online.append((last_online_db, user)) - else: - users_unknown_status.append(user) - else: - users_unknown_status.append(user) - - users_last_online.sort(key=lambda x: x[0], reverse=True) - - result = "Last Online Times for Group Members:\n\n" - - for user in users_currently_online: - mention_text = await mention_user(user.id) - result += f"╭ User: {mention_text} ({user.id})\n" - result += f"⌬ Status: Currently online\n" - result += "╰──────────────\n\n" - - for last_online_time, user in users_last_online: - mention_text = await mention_user(user.id) - last_online_perth = last_online_time.astimezone(perth_tz) - readable_time = last_online_perth.strftime("%d/%m/%Y %I:%M:%S %p %Z%z") - result += f"╭ User: {mention_text} ({user.id})\n" - result += f"⌬ Last Online: {readable_time}\n" - result += "╰──────────────\n\n" - - for user in users_unknown_status: - mention_text = await mention_user(user.id) - result += f"╭ User: {mention_text} ({user.id})\n" - result += f"⌬ Status: Unknown or unsupported\n" - result += "╰──────────────\n\n" - - return result - - -@ultroid_cmd(pattern="lastonline$", manager=True) -async def _(event): - xx = await event.eor( - "Fetching last online times for group members...", parse_mode="html" - ) - try: - result = await get_group_members_last_online(event) - await xx.edit(result, parse_mode="html") - except Exception as er: - await xx.edit(f"ERROR : {er}") - - -async def get_user_last_online(event, user_id): - user = await event.client.get_entity(user_id) - mention_text = await mention_user(user.id) - - if not user.bot: - user_status = user.status - - # Check the database for last seen data - db_user = await collection.find_one({"user_id": user.id}) - if db_user: - first_seen = db_user.get("first_seen") - current_username = db_user.get("username") - last_online_db = db_user.get("last_online_time") - previous_usernames = db_user.get("previous_usernames", []) - - if isinstance(user_status, UserStatusOffline) or isinstance( - user_status, UserStatusRecently - ): - if last_online_db: - last_online_db = last_online_db.replace(tzinfo=utc_tz).astimezone( - perth_tz - ) - readable_last_online = last_online_db.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - if first_seen: - if user.id == 5575183435: - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ First Seen: {first_seen}\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Current Username: @{current_username}" - ) - first_seen = first_seen.replace(tzinfo=utc_tz).astimezone( - perth_tz - ) - readable_first_seen = first_seen.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ First Seen: {readable_first_seen}\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ First Seen: {readable_first_seen}\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Current Username: @{current_username}" - ) - - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Current Username: @{current_username}" - ) - - elif isinstance(user_status, UserStatusOnline): - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Status: Currently online\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Status: Currently online\n" - f"⌬ Current Username: @{current_username}" - ) - - else: - try: - was_online_utc = user_status.was_online.replace(tzinfo=utc_tz) - was_online_perth = was_online_utc.astimezone(perth_tz) - readable_time = was_online_perth.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_time}\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_time}\n" - f"⌬ Current Username: @{current_username}" - ) - except Exception: - if last_online_db: - last_online_db = last_online_db.replace( - tzinfo=utc_tz - ).astimezone(perth_tz) - readable_last_online = last_online_db.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - if first_seen: - first_seen = first_seen.replace(tzinfo=utc_tz).astimezone( - perth_tz - ) - readable_first_seen = first_seen.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ First Seen: {readable_first_seen}\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ First Seen: {readable_first_seen}\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Current Username: @{current_username}" - ) - if previous_usernames: - prev_usernames_text = ", @".join(previous_usernames) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Previous Usernames: @{prev_usernames_text}" - ) - return ( - f"User: {mention_text} ({user.id})\n" - f"⌬ Last Online: {readable_last_online}\n" - f"⌬ Current Username: @{current_username}" - ) - - return f"User: {mention_text} ({user.id})\n⌬ Status: Unknown or unsupported" - - else: - return f"User: {mention_text} ({user.id}) is a bot and their status is not tracked." - - -async def last_online_info(event, user_id): - user = await event.client.get_entity(user_id) - mention_text = inline_mention(user) - - if not user.bot: - user.status - - try: - db_user = await collection.find_one({"user_id": user.id}) - if db_user: - db_user.get("first_seen") - last_online_db = db_user.get("last_online_time") - if last_online_db: - last_online_db = last_online_db.replace(tzinfo=utc_tz).astimezone( - perth_tz - ) - readable_last_online = last_online_db.strftime( - "%d/%m/%Y %I:%M:%S %p %Z%z" - ) - return f"{readable_last_online}" - return f"\n⌬ Status: Unknown or unsupported" - except Exception as e: - LOGS.error(f"Error: {e}") - else: - return f"User: {mention_text} ({user.id}) is a bot and their status is not tracked." - - -@ultroid_cmd(pattern="seen(?: |$)(.*)", manager=True) -async def _(event): - input_str = event.pattern_match.group(1) - xx = await event.eor("Fetching last online time...", parse_mode="html") - - try: - if input_str: - if input_str.isdigit(): - user_id = int(input_str) - result = await get_user_last_online(event, user_id) - await xx.edit(result, parse_mode="html") - else: - user = await event.client.get_entity(input_str) - result = await get_user_last_online(event, user.id) - await xx.edit(result, parse_mode="html") - else: - reply = await event.get_reply_message() - if reply and reply.sender_id: - result = await get_user_last_online(event, reply.sender_id) - await xx.edit(result, parse_mode="html") - else: - await xx.edit( - "Please specify a username or user ID or reply to a user's message to get their last online time." - ) - except Exception as e: - await xx.edit(f"Error: {e}") - - -@ultroid_bot.on(events.NewMessage(incoming=True)) -@ultroid_bot.on(events.ChatAction) -async def all_messages_catcher(event): - if isinstance(event, events.NewMessage.Event): - sender = await event.get_sender() - utc_time = event.date.replace(tzinfo=utc_tz) - elif isinstance(event, events.ChatAction.Event): - utc_time = event.action_message.date.replace(tzinfo=utc_tz) - sender = await event.action_message.get_sender() - else: - return - - if sender is None: - return - - if isinstance(sender, types.User) and (sender.bot or sender.verified): - return - - - perth_time = utc_time.astimezone(perth_tz) - - user_id = sender.id - username = sender.username or None - - existing_user = await collection.find_one({"user_id": user_id}) - - if existing_user: - last_username = existing_user.get("username") - - if last_username != username: - previous_usernames = existing_user.get("previous_usernames", []) - if last_username: - previous_usernames.append(last_username) - - await collection.update_one( - {"user_id": user_id}, - { - "$set": { - "last_online_time": perth_time, - "username": username, - "previous_usernames": previous_usernames, - } - }, - ) - else: - await collection.update_one( - {"user_id": user_id}, {"$set": {"last_online_time": perth_time}} - ) - else: - await collection.insert_one( - { - "user_id": user_id, - "username": username, - "first_seen": perth_time, - "last_online_time": perth_time, - "previous_usernames": [], - } - ) \ No newline at end of file diff --git a/plugins/lipsync.py b/plugins/lipsync.py deleted file mode 100644 index 14311573db19762c84ed8db25ee7972c683b10f1..0000000000000000000000000000000000000000 --- a/plugins/lipsync.py +++ /dev/null @@ -1,73 +0,0 @@ -from os import remove -from io import BytesIO -import random - -try: - import requests -except ImportError: - system("pip install -q requests") - import requests - -from . import ultroid_cmd, check_filename, fast_download, run_async, LOGS, async_searcher - - -async def synthesize_lipsync(face_video_path, text): - url = "https://3v305hiwo6tem3-8888.proxy.runpod.net/synthesize" - headers = { - "User-Agent": "Dart/3.5 (dart:io)", - "Content-Type": "application/json", - "Accept-Encoding": "gzip", - } - data = { - "face": face_video_path, - "text": text, - "wav2lip_settings": { - "nosmooth": True, - "resize_factor": 2 - }, - "tts_settings": { - "voice_id": "LtPsVjX1k0Kl4StEMZPK" - } - } - response = await async_searcher(url, headers=headers, json=data, post=True, re_json=True) - return response - -@ultroid_cmd(pattern="lipsync( (.*)|$)") -async def lipsync(event): - text = event.pattern_match.group(2) - reply = await event.get_reply_message() - - if not text and reply and reply.text: - text = reply.text - - if not text: - return await event.eor("Please provide the text to lip-sync.") - - status_message = await event.eor("🔄 Processing lip-sync...") - face_video_path = None - - if reply and reply.media: - await status_message.edit("📥 Downloading face video...") - face_video_path = await event.client.download_media(reply.media) - else: - # Generate a random number between 1 and 10 for the face video path - random_number = random.randint(1, 10) - face_video_path = f"characters/2aigo/lipsync/{random_number}.mp4" - - try: - result = await synthesize_lipsync(face_video_path, text) - outfile_url = result.get('outfile') - if outfile_url: - await status_message.edit("📤 Uploading the result...") - result_file, _ = await fast_download(outfile_url, filename=check_filename("lipsynced_video.mp4")) - await event.client.send_file(event.chat_id, result_file, reply_to=event.reply_to_msg_id) - remove(result_file) - await status_message.delete() - else: - await status_message.edit("❌ Failed to generate the lip-synced video.") - except Exception as e: - LOGS.error(e, exc_info=True) - await status_message.edit(f"❌ An error occurred: {e}") - finally: - if face_video_path and not face_video_path.startswith("characters/2aigo/lipsync"): - remove(face_video_path) \ No newline at end of file diff --git a/plugins/locks.py b/plugins/locks.py deleted file mode 100644 index 849c242164be9a5b588b513a6d868742eeb51311..0000000000000000000000000000000000000000 --- a/plugins/locks.py +++ /dev/null @@ -1,39 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}lock ` - Lock the Used Setting in Used Group. - -• `{i}unlock ` - UNLOCK the Used Setting in Used Group. -""" -from telethon.tl.functions.messages import EditChatDefaultBannedRightsRequest - -from pyUltroid.fns.admins import lock_unlock - -from . import ultroid_cmd - - -@ultroid_cmd( - pattern="(un|)lock( (.*)|$)", admins_only=True, manager=True, require="change_info" -) -async def un_lock(e): - mat = e.pattern_match.group(2).strip() - if not mat: - return await e.eor("`Give some Proper Input..`", time=5) - lock = e.pattern_match.group(1) == "" - ml = lock_unlock(mat, lock) - if not ml: - return await e.eor("`Incorrect Input`", time=5) - msg = "Locked" if lock else "Unlocked" - try: - await e.client(EditChatDefaultBannedRightsRequest(e.chat_id, ml)) - except Exception as er: - return await e.eor(str(er)) - await e.eor(f"**{msg}** - `{mat}` ! ") diff --git a/plugins/logo.py b/plugins/logo.py deleted file mode 100644 index 92531bb1bf342597c0f3a9e1e4a12a1ce7cba95d..0000000000000000000000000000000000000000 --- a/plugins/logo.py +++ /dev/null @@ -1,101 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}logo ` - Generate a logo of the given Text - Or Reply To image , to write ur text on it. - Or Reply To Font File, To write with that font. - -""" -import glob -import os -import random - -from telethon.tl.types import InputMessagesFilterPhotos - -try: - from PIL import Image -except ImportError: - Image = None -from pyUltroid.fns.misc import unsplashsearch -from pyUltroid.fns.tools import LogoHelper - -from . import OWNER_ID, OWNER_NAME, download_file, get_string, mediainfo, ultroid_cmd - - -@ultroid_cmd(pattern="logo( (.*)|$)") -async def logo_gen(event): - xx = await event.eor(get_string("com_1")) - name = event.pattern_match.group(1).strip() - if not name: - return await xx.eor("`Give a name too!`", time=5) - bg_, font_ = None, None - if event.reply_to_msg_id: - temp = await event.get_reply_message() - if temp.media: - if hasattr(temp.media, "document") and ( - ("font" in temp.file.mime_type) - or (".ttf" in temp.file.name) - or (".otf" in temp.file.name) - ): - font_ = await temp.download_media("resources/fonts/") - elif "pic" in mediainfo(temp.media): - bg_ = await temp.download_media() - if not bg_: - SRCH = [ - "background", - "neon", - "anime", - "art", - "bridges", - "streets", - "computer", - "cyberpunk", - "nature", - "abstract", - "exoplanet", - "magic", - "3d render", - ] - res = await unsplashsearch(random.choice(SRCH), limit=1) - bg_, _ = await download_file(res[0], "resources/downloads/logo.png") - newimg = "resources/downloads/unsplash-temp.jpg" - img_ = Image.open(bg_) - img_.save(newimg) - os.remove(bg_) - bg_ = newimg - - if not font_: - fpath_ = glob.glob("resources/fonts/*") - font_ = random.choice(fpath_) - if len(name) <= 8: - strke = 10 - elif len(name) >= 9: - strke = 5 - else: - strke = 20 - name = LogoHelper.make_logo( - bg_, - name, - font_, - fill="white", - stroke_width=strke, - stroke_fill="black", - ) - await xx.edit("`Done!`") - await event.client.send_file( - event.chat_id, - file=name, - caption=f"Logo by [{OWNER_NAME}](tg://user?id={OWNER_ID})", - force_document=True, - ) - os.remove(name) - await xx.delete() - if os.path.exists(bg_): - os.remove(bg_) diff --git a/plugins/mediatools.py b/plugins/mediatools.py deleted file mode 100644 index 91773026da9ccf5e1d586cabd29d9c360d09b199..0000000000000000000000000000000000000000 --- a/plugins/mediatools.py +++ /dev/null @@ -1,146 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}mediainfo //` - To get info about it. - -• `{i}rotate ` - Rotate any video/photo/media.. - Note : for video it should be angle of 90's -""" -import os -import time -from datetime import datetime as dt - -from pyUltroid.fns.misc import rotate_image -from pyUltroid.fns.tools import make_html_telegraph - -from . import ( - LOGS, - Telegraph, - bash, - downloader, - get_string, - is_url_ok, - mediainfo, - ultroid_cmd, -) - -try: - import cv2 -except ImportError: - LOGS.info("WARNING: 'cv2' not found!") - cv2 = None - - -@ultroid_cmd(pattern="mediainfo( (.*)|$)") -async def mi(e): - r = await e.get_reply_message() - match = e.pattern_match.group(1).strip() - taime = time.time() - extra = "" - if r and r.media: - xx = mediainfo(r.media) - murl = r.media.stringify() - url = await make_html_telegraph("Mediainfo", f"
{murl}
") - extra = f"**[{xx}]({url})**\n\n" - e = await e.eor(f"{extra}`Loading More...`", link_preview=False) - - if hasattr(r.media, "document"): - file = r.media.document - mime_type = file.mime_type - filename = r.file.name - if not filename: - if "audio" in mime_type: - filename = "audio_" + dt.now().isoformat("_", "seconds") + ".ogg" - elif "video" in mime_type: - filename = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" - dl = await downloader( - f"resources/downloads/{filename}", - file, - e, - taime, - f"{extra}`Loading More...`", - ) - - naam = dl.name - else: - naam = await r.download_media() - elif match and ( - os.path.isfile(match) - or (match.startswith("https://") and (await is_url_ok(match))) - ): - naam, xx = match, "file" - else: - return await e.eor(get_string("cvt_3"), time=5) - out, er = await bash(f"mediainfo '{naam}'") - if er: - LOGS.info(er) - out = extra or str(er) - return await e.edit(out, link_preview=False) - makehtml = "" - if naam.endswith((".jpg", ".png")): - if os.path.exists(naam): - med = "https://graph.org" + Telegraph.upload_file(naam)[0]["src"] - else: - med = match - makehtml += f"
" - for line in out.split("\n"): - line = line.strip() - if not line: - makehtml += "
" - elif ":" not in line: - makehtml += f"

{line}

" - else: - makehtml += f"

{line}

" - try: - urll = await make_html_telegraph("Mediainfo", makehtml) - except Exception as er: - LOGS.exception(er) - return - await e.eor(f"{extra}[{get_string('mdi_1')}]({urll})", link_preview=False) - if not match: - os.remove(naam) - - -@ultroid_cmd(pattern="rotate( (.*)|$)") -async def rotate_(ult): - match = ult.pattern_match.group(1).strip() - if not ult.is_reply: - return await ult.eor("`Reply to a media...`") - if match: - try: - match = int(match) - except ValueError: - match = None - if not match: - return await ult.eor("`Please provide a valid angle to rotate media..`") - reply = await ult.get_reply_message() - msg = await ult.eor(get_string("com_1")) - photo = reply.game.photo if reply.game else None - if reply.video: - media = await reply.download_media() - file = f"{media}.mp4" - await bash( - f'ffmpeg -i "{media}" -c copy -metadata:s:v:0 rotate={match} "{file}" -y' - ) - elif photo or reply.photo or reply.sticker: - media = await ult.client.download_media(photo or reply) - img = cv2.imread(media) - new_ = rotate_image(img, match) - file = "ult.png" - cv2.imwrite(file, new_) - else: - return await msg.edit("`Unsupported Media..\nReply to Photo/Video`") - if os.path.exists(file): - await ult.client.send_file( - ult.chat_id, file=file, video_note=bool(reply.video_note), reply_to=reply.id - ) - os.remove(media) - await msg.try_delete() diff --git a/plugins/misc.py b/plugins/misc.py deleted file mode 100644 index 7a34a4ea6e1d2ebe64c530702053bc9b9189c3a3..0000000000000000000000000000000000000000 --- a/plugins/misc.py +++ /dev/null @@ -1,222 +0,0 @@ -# Ultroid - UserBot -# -# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > -# PLease read the GNU Affero General Public License in -# . -""" -✘ Commands Available - - -• `{i}eod` - `Get Event of the Today` - -• `{i}pntrst ` - Download and send pinterest pins - -• `{i}gadget ` - Gadget Search from Telegram. - -• `{i}randomuser` - Generate details about a random user. - -• `{i}ascii ` - Convert replied image into html. - -• `{i}igdl ` - Download Instagram media -""" - -import os -from datetime import datetime as dt - -from bs4 import BeautifulSoup as bs - -from telethon import events -from telethon.errors.rpcerrorlist import YouBlockedUserError -from telethon.tl.types import DocumentAttributeVideo - -try: - from htmlwebshot import WebShot -except ImportError: - WebShot = None -try: - from img2html.converter import Img2HTMLConverter -except ImportError: - Img2HTMLConverter = None - -from . import async_searcher, get_random_user_data, get_string, re, ultroid_cmd, eod - - -async def get_gallery(msg_id): - msgs = await nimbus_bot.get_messages( - 5210630997, ids=[*range(msg_id - 9, msg_id + 10)] - ) - return [msg for msg in msgs if msg and msg.grouped_id == msgs[9].grouped_id] - -@ultroid_cmd(pattern="igdl ?(.*)$") -async def instagram(e): - listx = [] - durations = [] - resolutions = [] - inp = e.pattern_match.group(1) - chat = "@TopSaverBot" - load = await e.eor(get_pstring("com_1")) - async with e.client.conversation(chat) as conv: - try: - response = conv.wait_event( - events.NewMessage( - incoming=True, from_users=5210630997, func=lambda e: e.media - ) - ) - await e.client.send_message(chat, f"{inp}") - response = await response - await e.client.send_read_acknowledge(conv.chat_id) - if inp.split("/")[3] == "p": - url = f"[Pᴏsᴛ]({inp})" - captions = get_pstring("instagram_1").format(url) - if inp.split("/")[3] == "reel": - url = f"[Rᴇᴇʟ]({inp})" - captions = get_pstring("instagram_1").format(url) - if inp.split("/")[3] == "stories": - url = f"[Sᴛᴏʀʏ]({inp})" - captions = get_pstring("instagram_1").format(url) - except YouBlockedUserError: - await load.eor("Please Unblock the bot...", time=4) - except Exception: - await load.eor("No media found...", time=4) - - if response.grouped_id: - gallery_msgs = await get_gallery(response.id) - for msg in gallery_msgs: - media = msg.media - listx.append(media) - if media and hasattr(media.document, "attributes"): - for attribute in media.document.attributes: - if isinstance(attribute, DocumentAttributeVideo): - durations.append(int(attribute.duration)) - resolutions.append(f"{attribute.w}x{attribute.h}") - else: - listx.append(response.media) - if response.media and hasattr(response.media.document, "attributes"): - for attribute in response.media.document.attributes: - if isinstance(attribute, DocumentAttributeVideo): - durations.append(int(attribute.duration)) - resolutions.append(f"{attribute.w}x{attribute.h}") - - if durations: - durations_str = ", ".join([f"{d}s" for d in durations]) - captions += f"\n**Dᴜʀᴀᴛɪᴏɴs**: {durations_str}" - if resolutions: - resolutions_str = ", ".join(resolutions) - captions += f"\n**Rᴇsᴏʟᴜᴛɪᴏɴs**: {resolutions_str}" - - try: - await e.client.send_file( - e.chat_id, - file=listx, - caption=captions, - ) - await load.delete() - except Exception as er: - await e.eor(f"Unable to send media: {er}") - - - -@ultroid_cmd(pattern="eod$") -async def diela(e): - m = await e.eor(get_string("com_1")) - li = "https://daysoftheyear.com" - te = "🎊 **Events of the Day**\n\n" - da = dt.now() - month = da.strftime("%b") - li += f"/days/{month}/" + da.strftime("%F").split("-")[2] - ct = await async_searcher(li, re_content=True) - bt = bs(ct, "html.parser", from_encoding="utf-8") - ml = bt.find_all("a", "js-link-target", href=re.compile("daysoftheyear.com/days")) - for eve in ml[:5]: - te += f'• [{eve.text}]({eve["href"]})\n' - await m.edit(te, link_preview=False) - - -@ultroid_cmd( - pattern="pntrst( (.*)|$)", -) -async def pinterest(e): - m = e.pattern_match.group(1).strip() - if not m: - return await e.eor("`Give pinterest link.`", time=3) - soup = await async_searcher( - "https://www.expertstool.com/download-pinterest-video/", - data={"url": m}, - post=True, - ) - try: - _soup = bs(soup, "html.parser").find("table").tbody.find_all("tr") - except BaseException: - return await e.eor("`Wrong link or private pin.`", time=5) - file = _soup[1] if len(_soup) > 1 else _soup[0] - file = file.td.a["href"] - await e.client.send_file(e.chat_id, file, caption=f"Pin:- {m}") - - -@ultroid_cmd(pattern="gadget( (.*)|$)") -async def mobs(e): - mat = e.pattern_match.group(1).strip() - if not mat: - await e.eor("Please Give a Mobile Name to look for.") - query = mat.replace(" ", "%20") - jwala = f"https://gadgets.ndtv.com/search?searchtext={query}" - c = await async_searcher(jwala) - b = bs(c, "html.parser", from_encoding="utf-8") - co = b.find_all("div", "rvw-imgbox") - if not co: - return await e.eor("No Results Found!") - bt = await e.eor(get_string("com_1")) - out = "**📱 Mobile / Gadgets Search**\n\n" - li = co[0].find("a") - imu, title = None, li.find("img")["title"] - cont = await async_searcher(li["href"]) - nu = bs(cont, "html.parser", from_encoding="utf-8") - req = nu.find_all("div", "_pdsd") - imu = nu.find_all( - "img", src=re.compile("https://i.gadgets360cdn.com/products/large/") - ) - if imu: - imu = imu[0]["src"].split("?")[0] + "?downsize=*:420&output-quality=80" - out += f"☑️ **[{title}]({li['href']})**\n\n" - for fp in req: - ty = fp.findNext() - out += f"- **{ty.text}** - `{ty.findNext().text}`\n" - out += "_" - if imu == []: - imu = None - await e.reply(out, file=imu, link_preview=False) - await bt.delete() - - -@ultroid_cmd(pattern="randomuser") -async def _gen_data(event): - x = await event.eor(get_string("com_1")) - msg, pic = await get_random_user_data() - await event.reply(file=pic, message=msg) - await x.delete() - - -@ultroid_cmd( - pattern="ascii( (.*)|$)", -) -async def _(e): - if not Img2HTMLConverter: - return await e.eor("'img2html-converter' not installed!") - if not e.reply_to_msg_id: - return await e.eor(get_string("ascii_1")) - m = await e.eor(get_string("ascii_2")) - img = await (await e.get_reply_message()).download_media() - char = e.pattern_match.group(1).strip() or "■" - converter = Img2HTMLConverter(char=char) - html = converter.convert(img) - shot = WebShot(quality=85) - pic = await shot.create_pic_async(html=html) - await m.delete() - await e.reply(file=pic) - os.remove(pic) - os.remove(img) diff --git a/plugins/mute.py b/plugins/mute.py deleted file mode 100644 index 2939908fa0fb5959ef01ae54d345c1054a38ee4c..0000000000000000000000000000000000000000 --- a/plugins/mute.py +++ /dev/null @@ -1,210 +0,0 @@ -# Ultroid - UserBot -# 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 - - -• `{i}mute ` - Mute user in current chat. - -• `{i}unmute ` - Unmute user in current chat. - -• `{i}dmute ` - Mute user in current chat by deleting msgs. - -• `{i}undmute ` - Unmute dmuted user in current chat. - -• `{i}tmute