Update app.py
Browse files
app.py
CHANGED
|
@@ -23,7 +23,8 @@ start_flask()
|
|
| 23 |
# =========================
|
| 24 |
# βοΈ CONFIG & UTILS
|
| 25 |
# =========================
|
| 26 |
-
|
|
|
|
| 27 |
GROUP_ID = -1003799294466
|
| 28 |
ADMIN_ID = 83939584939485
|
| 29 |
MAX_STORAGE = 15360 * 1024 * 1024 # 15 GB max storage
|
|
@@ -39,9 +40,9 @@ def breadcrumb(path_list):
|
|
| 39 |
|
| 40 |
def get_icon(filename):
|
| 41 |
ext = filename.split('.')[-1].lower() if '.' in filename else ''
|
| 42 |
-
if ext in ['jpg', 'jpeg', 'png', 'gif']: return 'πΌ'
|
| 43 |
if ext in ['mp4', 'mkv', 'avi']: return 'π₯'
|
| 44 |
-
if ext in ['mp3', 'wav', 'ogg']: return 'π΅'
|
| 45 |
if ext in ['zip', 'rar', '7z']: return 'π'
|
| 46 |
if ext in ['pdf']: return 'π'
|
| 47 |
if ext in ['txt', 'doc', 'docx']: return 'π'
|
|
@@ -108,7 +109,7 @@ async def send_main_menu(context: ContextTypes.DEFAULT_TYPE, uid: int):
|
|
| 108 |
try:
|
| 109 |
await context.bot.delete_message(chat_id=uid, message_id=last_menu_msg[uid])
|
| 110 |
except Exception:
|
| 111 |
-
pass # Message pehle hi delete ho chuka hoga ya
|
| 112 |
|
| 113 |
msg = await context.bot.send_message(chat_id=uid, text=menu_text(uid), reply_markup=menu_kb())
|
| 114 |
last_menu_msg[uid] = msg.message_id
|
|
@@ -130,7 +131,7 @@ def build_folder(uid, data, folder):
|
|
| 130 |
cur = data["folders"][cur]["parent"]
|
| 131 |
path.reverse()
|
| 132 |
|
| 133 |
-
text = f"π {breadcrumb(path)}\n\n"
|
| 134 |
kb = []
|
| 135 |
|
| 136 |
# Folders list
|
|
@@ -193,7 +194,7 @@ async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 193 |
if q.data.startswith("open_"):
|
| 194 |
folder = q.data.split("_", 1)[1]
|
| 195 |
text, kb = build_folder(uid, data, folder)
|
| 196 |
-
return await q.message.edit_text(text, reply_markup=kb)
|
| 197 |
|
| 198 |
# Search Setup
|
| 199 |
if q.data == "search":
|
|
@@ -206,7 +207,7 @@ async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 206 |
folder = q.data.split("_", 1)[1]
|
| 207 |
user_state[uid] = {"mode": "upload", "folder": folder}
|
| 208 |
kb = [[InlineKeyboardButton("β Cancel", callback_data="cancel")]]
|
| 209 |
-
return await q.message.edit_text(f"π€ Apni image, video ya document yaha send karo (Folder: {folder})", reply_markup=InlineKeyboardMarkup(kb))
|
| 210 |
|
| 211 |
# View File
|
| 212 |
if q.data.startswith("file_"):
|
|
@@ -228,12 +229,14 @@ async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 228 |
f = data["index"][fid]
|
| 229 |
ext = f["original_name"].lower().split('.')[-1]
|
| 230 |
|
| 231 |
-
if ext in ["jpg", "png", "jpeg", "webp"]:
|
| 232 |
await context.bot.send_photo(uid, f["file_id"])
|
| 233 |
elif ext in ["mp4", "mkv", "avi"]:
|
| 234 |
await context.bot.send_video(uid, f["file_id"])
|
| 235 |
elif ext in ["mp3", "wav", "ogg"]:
|
| 236 |
await context.bot.send_audio(uid, f["file_id"])
|
|
|
|
|
|
|
| 237 |
else:
|
| 238 |
await context.bot.send_document(uid, f["file_id"])
|
| 239 |
return
|
|
@@ -243,9 +246,7 @@ async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 243 |
fid = q.data.split("_", 1)[1]
|
| 244 |
if fid in data["index"]:
|
| 245 |
del data["index"][fid]
|
| 246 |
-
# Remove from files list
|
| 247 |
data["files"] = [f for f in data["files"] if f["file_name"] != fid]
|
| 248 |
-
# Remove from folders
|
| 249 |
for f_name, f_data in data["folders"].items():
|
| 250 |
if fid in f_data["files"]:
|
| 251 |
f_data["files"].remove(fid)
|
|
@@ -272,14 +273,14 @@ async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 272 |
save_data(uid, data)
|
| 273 |
|
| 274 |
text, kb = build_folder(uid, data, parent)
|
| 275 |
-
return await q.message.edit_text(text, reply_markup=kb)
|
| 276 |
|
| 277 |
# Rename Folder Setup
|
| 278 |
if q.data.startswith("renamefolder_"):
|
| 279 |
folder = q.data.split("_", 1)[1]
|
| 280 |
user_state[uid] = {"mode": "rename_folder", "folder": folder}
|
| 281 |
kb = [[InlineKeyboardButton("β Cancel", callback_data="cancel")]]
|
| 282 |
-
return await q.message.edit_text(f"βοΈ
|
| 283 |
|
| 284 |
except Exception as e:
|
| 285 |
print("BTN ERROR:", e)
|
|
@@ -291,7 +292,7 @@ async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 291 |
try:
|
| 292 |
uid = update.effective_user.id
|
| 293 |
if uid not in user_state or user_state[uid].get("mode") != "upload":
|
| 294 |
-
await update.message.reply_text("β Upload karne ke liye pehle folder me jake 'Upload' pe click karo.")
|
| 295 |
return
|
| 296 |
|
| 297 |
state = user_state[uid]
|
|
@@ -302,7 +303,7 @@ async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 302 |
# Safely extract file properties
|
| 303 |
if getattr(msg, 'document', None):
|
| 304 |
doc = msg.document
|
| 305 |
-
original_name = doc.file_name or "
|
| 306 |
elif getattr(msg, 'photo', None):
|
| 307 |
doc = msg.photo[-1] # Highest resolution
|
| 308 |
original_name = f"photo_{int(time.time())}.jpg"
|
|
@@ -341,9 +342,15 @@ async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 341 |
data["folders"][folder]["files"].append(name)
|
| 342 |
|
| 343 |
save_data(uid, data)
|
| 344 |
-
user_state.pop(uid)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 345 |
|
| 346 |
-
success_msg = await update.message.reply_text(f"β
File **{original_name}** successfully upload ho gayi!", parse_mode="Markdown")
|
| 347 |
time.sleep(1) # Chhota pause better user experience ke liye
|
| 348 |
await send_main_menu(context, uid)
|
| 349 |
|
|
@@ -378,9 +385,9 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 378 |
for r in results[:10]: # Top 10 results dikhayega
|
| 379 |
kb.append([InlineKeyboardButton(f"{get_icon(r['original_name'])} {r['original_name']}", callback_data=f"file_{r['file_name']}")])
|
| 380 |
kb.append([InlineKeyboardButton("β Clear Search", callback_data="cancel")])
|
| 381 |
-
await update.message.reply_text(f"π Top results for '{text_input}':", reply_markup=InlineKeyboardMarkup(kb))
|
| 382 |
|
| 383 |
-
user_state.pop(uid)
|
| 384 |
return
|
| 385 |
|
| 386 |
# π Create Folder Logic
|
|
@@ -394,9 +401,9 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 394 |
data["folders"][name] = {"files": [], "folders": [], "parent": parent}
|
| 395 |
data["folders"][parent]["folders"].append(name)
|
| 396 |
save_data(uid, data)
|
| 397 |
-
await update.message.reply_text(f"β
Folder
|
| 398 |
|
| 399 |
-
user_state.pop(uid)
|
| 400 |
return await send_main_menu(context, uid)
|
| 401 |
|
| 402 |
# βοΈ Rename Folder Logic
|
|
@@ -416,24 +423,35 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|
| 416 |
data["folders"][sub]["parent"] = new_name
|
| 417 |
|
| 418 |
save_data(uid, data)
|
| 419 |
-
await update.message.reply_text(f"β
Folder ka naam
|
| 420 |
|
| 421 |
-
user_state.pop(uid)
|
| 422 |
return await send_main_menu(context, uid)
|
| 423 |
|
| 424 |
except Exception as e:
|
| 425 |
print("TEXT ERROR:", e)
|
| 426 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 427 |
# =========================
|
| 428 |
# π RUN
|
| 429 |
# =========================
|
|
|
|
|
|
|
|
|
|
|
|
|
| 430 |
app = ApplicationBuilder().token(BOT_TOKEN).build()
|
| 431 |
|
| 432 |
app.add_handler(CommandHandler("start", start))
|
| 433 |
app.add_handler(CallbackQueryHandler(buttons))
|
| 434 |
-
# β
Naya Filter jo Photos, Videos, Documents aur Audio sab catch karega
|
| 435 |
app.add_handler(MessageHandler(filters.ALL & ~filters.TEXT & ~filters.COMMAND, handle_file))
|
| 436 |
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text))
|
|
|
|
| 437 |
|
| 438 |
-
print("π₯ FINAL BOT RUNNING -
|
| 439 |
app.run_polling()
|
|
|
|
| 23 |
# =========================
|
| 24 |
# βοΈ CONFIG & UTILS
|
| 25 |
# =========================
|
| 26 |
+
# Agar env variable nahi milta to yaha apna token daal sakte ho testing ke liye
|
| 27 |
+
BOT_TOKEN = os.getenv("tgtkn")
|
| 28 |
GROUP_ID = -1003799294466
|
| 29 |
ADMIN_ID = 83939584939485
|
| 30 |
MAX_STORAGE = 15360 * 1024 * 1024 # 15 GB max storage
|
|
|
|
| 40 |
|
| 41 |
def get_icon(filename):
|
| 42 |
ext = filename.split('.')[-1].lower() if '.' in filename else ''
|
| 43 |
+
if ext in ['jpg', 'jpeg', 'png', 'gif', 'webp']: return 'πΌ'
|
| 44 |
if ext in ['mp4', 'mkv', 'avi']: return 'π₯'
|
| 45 |
+
if ext in ['mp3', 'wav', 'ogg', 'm4a']: return 'π΅'
|
| 46 |
if ext in ['zip', 'rar', '7z']: return 'π'
|
| 47 |
if ext in ['pdf']: return 'π'
|
| 48 |
if ext in ['txt', 'doc', 'docx']: return 'π'
|
|
|
|
| 109 |
try:
|
| 110 |
await context.bot.delete_message(chat_id=uid, message_id=last_menu_msg[uid])
|
| 111 |
except Exception:
|
| 112 |
+
pass # Message pehle hi delete ho chuka hoga ya permission nahi hogi
|
| 113 |
|
| 114 |
msg = await context.bot.send_message(chat_id=uid, text=menu_text(uid), reply_markup=menu_kb())
|
| 115 |
last_menu_msg[uid] = msg.message_id
|
|
|
|
| 131 |
cur = data["folders"][cur]["parent"]
|
| 132 |
path.reverse()
|
| 133 |
|
| 134 |
+
text = f"π <b>{breadcrumb(path)}</b>\n\n"
|
| 135 |
kb = []
|
| 136 |
|
| 137 |
# Folders list
|
|
|
|
| 194 |
if q.data.startswith("open_"):
|
| 195 |
folder = q.data.split("_", 1)[1]
|
| 196 |
text, kb = build_folder(uid, data, folder)
|
| 197 |
+
return await q.message.edit_text(text, parse_mode="HTML", reply_markup=kb)
|
| 198 |
|
| 199 |
# Search Setup
|
| 200 |
if q.data == "search":
|
|
|
|
| 207 |
folder = q.data.split("_", 1)[1]
|
| 208 |
user_state[uid] = {"mode": "upload", "folder": folder}
|
| 209 |
kb = [[InlineKeyboardButton("β Cancel", callback_data="cancel")]]
|
| 210 |
+
return await q.message.edit_text(f"π€ Apni image, video ya document yaha send karo (Folder: <b>{folder}</b>)", parse_mode="HTML", reply_markup=InlineKeyboardMarkup(kb))
|
| 211 |
|
| 212 |
# View File
|
| 213 |
if q.data.startswith("file_"):
|
|
|
|
| 229 |
f = data["index"][fid]
|
| 230 |
ext = f["original_name"].lower().split('.')[-1]
|
| 231 |
|
| 232 |
+
if ext in ["jpg", "png", "jpeg", "webp", "gif"]:
|
| 233 |
await context.bot.send_photo(uid, f["file_id"])
|
| 234 |
elif ext in ["mp4", "mkv", "avi"]:
|
| 235 |
await context.bot.send_video(uid, f["file_id"])
|
| 236 |
elif ext in ["mp3", "wav", "ogg"]:
|
| 237 |
await context.bot.send_audio(uid, f["file_id"])
|
| 238 |
+
elif ext in ["voice", "oga"]:
|
| 239 |
+
await context.bot.send_voice(uid, f["file_id"])
|
| 240 |
else:
|
| 241 |
await context.bot.send_document(uid, f["file_id"])
|
| 242 |
return
|
|
|
|
| 246 |
fid = q.data.split("_", 1)[1]
|
| 247 |
if fid in data["index"]:
|
| 248 |
del data["index"][fid]
|
|
|
|
| 249 |
data["files"] = [f for f in data["files"] if f["file_name"] != fid]
|
|
|
|
| 250 |
for f_name, f_data in data["folders"].items():
|
| 251 |
if fid in f_data["files"]:
|
| 252 |
f_data["files"].remove(fid)
|
|
|
|
| 273 |
save_data(uid, data)
|
| 274 |
|
| 275 |
text, kb = build_folder(uid, data, parent)
|
| 276 |
+
return await q.message.edit_text(text, parse_mode="HTML", reply_markup=kb)
|
| 277 |
|
| 278 |
# Rename Folder Setup
|
| 279 |
if q.data.startswith("renamefolder_"):
|
| 280 |
folder = q.data.split("_", 1)[1]
|
| 281 |
user_state[uid] = {"mode": "rename_folder", "folder": folder}
|
| 282 |
kb = [[InlineKeyboardButton("β Cancel", callback_data="cancel")]]
|
| 283 |
+
return await q.message.edit_text(f"βοΈ <b>{folder}</b> ke liye naya naam bhejo:", parse_mode="HTML", reply_markup=InlineKeyboardMarkup(kb))
|
| 284 |
|
| 285 |
except Exception as e:
|
| 286 |
print("BTN ERROR:", e)
|
|
|
|
| 292 |
try:
|
| 293 |
uid = update.effective_user.id
|
| 294 |
if uid not in user_state or user_state[uid].get("mode") != "upload":
|
| 295 |
+
await update.message.reply_text("β Upload karne ke liye pehle folder me jake 'Upload Here' pe click karo.")
|
| 296 |
return
|
| 297 |
|
| 298 |
state = user_state[uid]
|
|
|
|
| 303 |
# Safely extract file properties
|
| 304 |
if getattr(msg, 'document', None):
|
| 305 |
doc = msg.document
|
| 306 |
+
original_name = doc.file_name or f"document_{int(time.time())}"
|
| 307 |
elif getattr(msg, 'photo', None):
|
| 308 |
doc = msg.photo[-1] # Highest resolution
|
| 309 |
original_name = f"photo_{int(time.time())}.jpg"
|
|
|
|
| 342 |
data["folders"][folder]["files"].append(name)
|
| 343 |
|
| 344 |
save_data(uid, data)
|
| 345 |
+
user_state.pop(uid, None) # Safe pop
|
| 346 |
+
|
| 347 |
+
# β
HTML use kar rahe hain taaki _ (underscore) ki wajah se markdown error na aaye
|
| 348 |
+
try:
|
| 349 |
+
await update.message.reply_text(f"β
<b>{original_name}</b> successfully upload ho gayi!", parse_mode="HTML")
|
| 350 |
+
except Exception as e:
|
| 351 |
+
print(f"MSG ERROR: {e}")
|
| 352 |
+
await update.message.reply_text("β
File successfully upload ho gayi!")
|
| 353 |
|
|
|
|
| 354 |
time.sleep(1) # Chhota pause better user experience ke liye
|
| 355 |
await send_main_menu(context, uid)
|
| 356 |
|
|
|
|
| 385 |
for r in results[:10]: # Top 10 results dikhayega
|
| 386 |
kb.append([InlineKeyboardButton(f"{get_icon(r['original_name'])} {r['original_name']}", callback_data=f"file_{r['file_name']}")])
|
| 387 |
kb.append([InlineKeyboardButton("β Clear Search", callback_data="cancel")])
|
| 388 |
+
await update.message.reply_text(f"π Top results for '<b>{text_input}</b>':", parse_mode="HTML", reply_markup=InlineKeyboardMarkup(kb))
|
| 389 |
|
| 390 |
+
user_state.pop(uid, None)
|
| 391 |
return
|
| 392 |
|
| 393 |
# π Create Folder Logic
|
|
|
|
| 401 |
data["folders"][name] = {"files": [], "folders": [], "parent": parent}
|
| 402 |
data["folders"][parent]["folders"].append(name)
|
| 403 |
save_data(uid, data)
|
| 404 |
+
await update.message.reply_text(f"β
Folder <b>{name}</b> ban gaya!", parse_mode="HTML")
|
| 405 |
|
| 406 |
+
user_state.pop(uid, None)
|
| 407 |
return await send_main_menu(context, uid)
|
| 408 |
|
| 409 |
# βοΈ Rename Folder Logic
|
|
|
|
| 423 |
data["folders"][sub]["parent"] = new_name
|
| 424 |
|
| 425 |
save_data(uid, data)
|
| 426 |
+
await update.message.reply_text(f"β
Folder ka naam <b>{new_name}</b> ho gaya.", parse_mode="HTML")
|
| 427 |
|
| 428 |
+
user_state.pop(uid, None)
|
| 429 |
return await send_main_menu(context, uid)
|
| 430 |
|
| 431 |
except Exception as e:
|
| 432 |
print("TEXT ERROR:", e)
|
| 433 |
|
| 434 |
+
# =========================
|
| 435 |
+
# β οΈ ERROR HANDLER
|
| 436 |
+
# =========================
|
| 437 |
+
async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
|
| 438 |
+
print(f"β οΈ EXCEPTION AAYA HAI: {context.error}")
|
| 439 |
+
|
| 440 |
# =========================
|
| 441 |
# π RUN
|
| 442 |
# =========================
|
| 443 |
+
if not BOT_TOKEN:
|
| 444 |
+
print("β ERROR: Bot token nahi mila! Apna token set karo.")
|
| 445 |
+
exit(1)
|
| 446 |
+
|
| 447 |
app = ApplicationBuilder().token(BOT_TOKEN).build()
|
| 448 |
|
| 449 |
app.add_handler(CommandHandler("start", start))
|
| 450 |
app.add_handler(CallbackQueryHandler(buttons))
|
| 451 |
+
# β
Naya Filter jo Photos, Videos, Documents aur Audio sab catch karega bina kisi issue ke
|
| 452 |
app.add_handler(MessageHandler(filters.ALL & ~filters.TEXT & ~filters.COMMAND, handle_file))
|
| 453 |
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text))
|
| 454 |
+
app.add_error_handler(error_handler)
|
| 455 |
|
| 456 |
+
print("π₯ FINAL BOT RUNNING - FULLY UPDATED & FIXED")
|
| 457 |
app.run_polling()
|