# Ultroid - UserBot # Copyright (C) 2021-2025 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())