ulduldp commited on
Commit
cc5898f
Β·
verified Β·
1 Parent(s): 583ebf5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -24
app.py CHANGED
@@ -23,7 +23,8 @@ start_flask()
23
  # =========================
24
  # βš™οΈ CONFIG & UTILS
25
  # =========================
26
- BOT_TOKEN = os.getenv("tgtkn")
 
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 bot ko permission nahi hogi
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"✏️ `{folder}` ke liye naya naam bhejo:", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))
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 "document_file"
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 **{name}** ban gaya!", parse_mode="Markdown")
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 **{new_name}** ho gaya.", parse_mode="Markdown")
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 - ALL FIXED")
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()