Spaces:
Sleeping
Sleeping
File size: 9,470 Bytes
6b1e8b6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | 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 = {}
@app.on_message(filters.regex(r'https?://[^\s]+'))
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
@app.on_message(filters.command("cancel"))
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
@app.on_message(filters.command("batch"))
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)
|