Spaces:
Sleeping
Sleeping
| import time | |
| import random | |
| import string | |
| import asyncio | |
| from pyrogram import filters, Client | |
| from devgagan import app | |
| from config import API_ID, API_HASH, FREEMIUM_LIMIT, PREMIUM_LIMIT, OWNER_ID | |
| from devgagan.core.get_func import get_msg | |
| from devgagan.core.func import * | |
| from devgagan.core.mongo import db | |
| from pyrogram.errors import FloodWait | |
| async def generate_random_name(length=8): | |
| return ''.join(random.choices(string.ascii_lowercase, k=length)) | |
| users_loop = {} | |
| async def single_link(_, message): | |
| user_id = message.chat.id | |
| # Check if the user is already in the loop | |
| if users_loop.get(user_id, False): | |
| await message.reply( | |
| "You already have an ongoing process. Please wait for it to finish or cancel it with /cancel." | |
| ) | |
| return | |
| freecheck = await chk_user(message, user_id) | |
| if freecheck == 1 and FREEMIUM_LIMIT == 0 and user_id not in OWNER_ID: | |
| await message.reply("Freemium service is currently not available. Upgrade to premium for access.") | |
| return | |
| # Add the user to the loop | |
| users_loop[user_id] = True | |
| link = get_link(message.text) | |
| userbot = None | |
| try: | |
| join = await subscribe(_, message) | |
| if join == 1: | |
| users_loop[user_id] = False | |
| return | |
| msg = await message.reply("Processing...") | |
| if 't.me/' in link and 't.me/+' not in link and 't.me/c/' not in link and 't.me/b/' not in link: | |
| await get_msg(None, user_id, msg.id, link, 0, message) | |
| # await msg.edit_text("Processed successfully without userbot!") | |
| return | |
| data = await db.get_data(user_id) | |
| if data and data.get("session"): | |
| session = data.get("session") | |
| try: | |
| device = 'Vivo Y20' | |
| session_name = await generate_random_name() | |
| userbot = Client(session_name, api_id=API_ID, api_hash=API_HASH, device_model=device, session_string=session) | |
| await userbot.start() | |
| except: | |
| users_loop[user_id] = False | |
| return await msg.edit_text("Login expired /login again...") | |
| else: | |
| users_loop[user_id] = False | |
| await msg.edit_text("Login in bot first ...") | |
| return | |
| try: | |
| if 't.me/+' in link: | |
| q = await userbot_join(userbot, link) | |
| await msg.edit_text(q) | |
| elif 't.me/c/' in link: | |
| await get_msg(userbot, user_id, msg.id, link, 0, message) | |
| else: | |
| await msg.edit_text("Invalid link format.") | |
| except Exception as e: | |
| await msg.edit_text(f"Link: `{link}`\n\n**Error:** {str(e)}") | |
| except FloodWait as fw: | |
| await msg.edit_text(f'Try again after {fw.x} seconds due to floodwait from telegram.') | |
| except Exception as e: | |
| await msg.edit_text(f"Link: `{link}`\n\n**Error:** {str(e)}") | |
| finally: | |
| if userbot and userbot.is_connected: # Ensure userbot was initialized and started | |
| await userbot.stop() | |
| users_loop[user_id] = False # Remove user from the loop after processing | |
| async def stop_batch(_, message): | |
| user_id = message.chat.id | |
| # Check if there is an active batch process for the user | |
| if user_id in users_loop and users_loop[user_id]: | |
| users_loop[user_id] = False # Set the loop status to False | |
| await app.send_message( | |
| message.chat.id, | |
| "Batch processing has been stopped successfully. You can start a new batch now if you want." | |
| ) | |
| elif user_id in users_loop and not users_loop[user_id]: | |
| await app.send_message( | |
| message.chat.id, | |
| "The batch process was already stopped. No active batch to cancel." | |
| ) | |
| else: | |
| await app.send_message( | |
| message.chat.id, | |
| "No active batch processing is running to cancel." | |
| ) | |
| # --------- PUBLIC CHANNEL | |
| async def batch_link(_, message): | |
| user_id = message.chat.id | |
| if users_loop.get(user_id, False): # Check if a batch process is already running | |
| await app.send_message( | |
| message.chat.id, | |
| "You already have a batch process running. Please wait for it to complete before starting a new one." | |
| ) | |
| return | |
| # Determine user's limits based on their subscription | |
| lol = await chk_user(message, user_id) | |
| if lol == 1: | |
| max_batch_size = FREEMIUM_LIMIT # Limit for free users | |
| else: | |
| max_batch_size = PREMIUM_LIMIT | |
| # Ask for start and end links | |
| start = await app.ask(message.chat.id, text="Please send the start link.") | |
| start_id = start.text | |
| s = start_id.split("/")[-1] | |
| cs = int(s) | |
| last = await app.ask(message.chat.id, text="Please send the end link.") | |
| last_id = last.text | |
| l = last_id.split("/")[-1] | |
| cl = int(l) | |
| # Check batch size | |
| if user_id not in OWNER_ID and (cl - cs) > max_batch_size: | |
| await app.send_message( | |
| message.chat.id, | |
| f"Batch size exceeds the limit of {max_batch_size}. Upgrade to premium for larger batch sizes." | |
| ) | |
| return | |
| # Start processing links | |
| users_loop[user_id] = True | |
| try: | |
| # FIRST ITERATION: Process t.me/ links without userbot | |
| for i in range(cs, cl): | |
| if user_id in users_loop and users_loop[user_id]: | |
| try: | |
| # Construct the link | |
| x = start_id.split('/') | |
| y = x[:-1] | |
| result = '/'.join(y) | |
| url = f"{result}/{i}" | |
| link = get_link(url) | |
| # Directly process links like t.me/ (no userbot needed) | |
| if 't.me/' in link and 't.me/b/' not in link and 't.me/c' not in link: | |
| msg = await app.send_message(message.chat.id, f"Processing link {url}...") | |
| await get_msg(None, user_id, msg.id, link, 0, message) | |
| sleep_msg = await app.send_message( | |
| message.chat.id, | |
| "Sleeping for 5 seconds to avoid flood..." | |
| ) | |
| # Add delay to avoid floodwait | |
| await asyncio.sleep(8) | |
| await sleep_msg.delete() | |
| except Exception as e: | |
| print(f"Error processing link {url}: {e}") | |
| continue | |
| if not any(prefix in start_id for prefix in ['t.me/c/', 't.me/b/']): | |
| # await app.send_message(message.chat.id, "Skipping second iteration as the link is not valid.") | |
| await app.send_message(message.chat.id, "Batch completed successfully! ๐") | |
| return | |
| # edit kr lena kuchhu dikkat ho to | |
| data = await db.get_data(user_id) | |
| if data and data.get("session"): | |
| session = data.get("session") | |
| device = 'Vivo Y20' | |
| session_name = await generate_random_name() | |
| userbot = Client( | |
| session_name, | |
| api_id=API_ID, | |
| api_hash=API_HASH, | |
| device_model=device, | |
| session_string=session | |
| ) | |
| await userbot.start() | |
| else: | |
| await app.send_message(message.chat.id, "Login in bot first ...") | |
| return | |
| try: | |
| for i in range(cs, cl): | |
| if user_id in users_loop and users_loop[user_id]: | |
| try: | |
| # Construct the link | |
| x = start_id.split('/') | |
| y = x[:-1] | |
| result = '/'.join(y) | |
| url = f"{result}/{i}" | |
| link = get_link(url) | |
| # Process links requiring userbot | |
| if 't.me/b/' in link or 't.me/c/' in link: | |
| msg = await app.send_message(message.chat.id, f"Processing link {url}...") | |
| await get_msg(userbot, user_id, msg.id, link, 0, message) | |
| # Add delay to avoid floodwait | |
| sleep_msg = await app.send_message( | |
| message.chat.id, | |
| "Sleeping for 20 seconds to avoid flood..." | |
| ) | |
| await asyncio.sleep(18) | |
| await sleep_msg.delete() | |
| await asyncio.sleep(2) | |
| except Exception as e: | |
| print(f"Error processing link {url}: {e}") | |
| continue | |
| finally: | |
| if userbot.is_connected: | |
| await userbot.stop() | |
| await app.send_message(message.chat.id, "Batch completed successfully! ๐") | |
| except FloodWait as fw: | |
| await app.send_message( | |
| message.chat.id, | |
| f"Try again after {fw.x} seconds due to floodwait from Telegram." | |
| ) | |
| except Exception as e: | |
| await app.send_message(message.chat.id, f"Error: {str(e)}") | |
| finally: | |
| users_loop.pop(user_id, None) | |