Update app.py
Browse files
app.py
CHANGED
|
@@ -338,7 +338,6 @@ async def do_download_job(chat_id, enc_path, orig_name, job_id, cancel_event, st
|
|
| 338 |
|
| 339 |
# --------------- DELETE FUNCTIONS ---------------
|
| 340 |
async def delete_user_file(chat_id, user_id, enc_path, token, query):
|
| 341 |
-
"""Delete a single file from HF and DB, then refresh the list."""
|
| 342 |
try:
|
| 343 |
hf.delete_file(
|
| 344 |
path_in_repo=enc_path,
|
|
@@ -353,13 +352,11 @@ async def delete_user_file(chat_id, user_id, enc_path, token, query):
|
|
| 353 |
await query.answer(f"Error: {e}", show_alert=True)
|
| 354 |
|
| 355 |
async def delete_all_user_files(chat_id, user_id, query):
|
| 356 |
-
"""Delete all files of a user from HF and DB, then refresh."""
|
| 357 |
user_files = db_get_user_files(user_id)
|
| 358 |
if not user_files:
|
| 359 |
await query.answer("No files to delete.", show_alert=True)
|
| 360 |
return
|
| 361 |
|
| 362 |
-
# Delete from HF
|
| 363 |
for enc_path, _, _ in user_files:
|
| 364 |
try:
|
| 365 |
hf.delete_file(
|
|
@@ -368,12 +365,10 @@ async def delete_all_user_files(chat_id, user_id, query):
|
|
| 368 |
repo_type="dataset",
|
| 369 |
)
|
| 370 |
except Exception:
|
| 371 |
-
pass
|
| 372 |
|
| 373 |
-
# Clear DB
|
| 374 |
db_remove_all_user_files(user_id)
|
| 375 |
|
| 376 |
-
# Clear callback tokens for this user
|
| 377 |
tokens_to_delete = [tok for tok, path in file_callback_map.items() if path.startswith(get_encrypted_folder(user_id))]
|
| 378 |
for tok in tokens_to_delete:
|
| 379 |
file_callback_map.pop(tok, None)
|
|
@@ -382,7 +377,6 @@ async def delete_all_user_files(chat_id, user_id, query):
|
|
| 382 |
await refresh_file_list(chat_id, user_id, query.message)
|
| 383 |
|
| 384 |
async def refresh_file_list(chat_id, user_id, message):
|
| 385 |
-
"""Reβfetch user files and edit the message with updated buttons."""
|
| 386 |
user_files = db_get_user_files(user_id)
|
| 387 |
if not user_files:
|
| 388 |
return await message.edit_text("You have no uploaded files.", reply_markup=None)
|
|
@@ -396,7 +390,6 @@ async def refresh_file_list(chat_id, user_id, message):
|
|
| 396 |
InlineKeyboardButton("π Delete", callback_data=f"delete:{token}")
|
| 397 |
])
|
| 398 |
|
| 399 |
-
# Add "Delete All" button as a separate row
|
| 400 |
buttons.append([InlineKeyboardButton("β οΈ Delete All Files", callback_data=f"delete_all:{user_id}")])
|
| 401 |
|
| 402 |
await message.edit_text(
|
|
@@ -415,7 +408,6 @@ async def process_album_group(media_group_id: str):
|
|
| 415 |
messages = group_data['messages'] # list of (message_id, filename)
|
| 416 |
|
| 417 |
if len(messages) == 1:
|
| 418 |
-
# single file β normal prompt
|
| 419 |
msg_id, filename = messages[0]
|
| 420 |
token = make_token()
|
| 421 |
upload_prompt_map[token] = [(user_id, msg_id, filename)]
|
|
@@ -425,7 +417,6 @@ async def process_album_group(media_group_id: str):
|
|
| 425 |
])
|
| 426 |
await app.send_message(chat_id, f"Do you want to upload `{filename}`?", reply_markup=kb)
|
| 427 |
else:
|
| 428 |
-
# multiple files β combined prompt
|
| 429 |
files_list = "\n".join(f"β’ {fname}" for _, fname in messages)
|
| 430 |
token = make_token()
|
| 431 |
upload_prompt_map[token] = [(user_id, msg_id, fname) for msg_id, fname in messages]
|
|
@@ -473,7 +464,7 @@ async def upload_worker():
|
|
| 473 |
@app.on_message(filters.command("start"))
|
| 474 |
async def start_cmd(_, message):
|
| 475 |
await message.reply_text(
|
| 476 |
-
"Send me
|
| 477 |
"/files β list your uploaded files"
|
| 478 |
)
|
| 479 |
|
|
@@ -482,7 +473,6 @@ async def list_files_cmd(_, message):
|
|
| 482 |
user_id = message.from_user.id
|
| 483 |
user_files = db_get_user_files(user_id)
|
| 484 |
|
| 485 |
-
# Fallback scan if DB empty
|
| 486 |
if not user_files:
|
| 487 |
enc_folder = get_encrypted_folder(user_id)
|
| 488 |
try:
|
|
@@ -517,7 +507,6 @@ async def list_files_cmd(_, message):
|
|
| 517 |
InlineKeyboardButton("π Delete", callback_data=f"delete:{token}")
|
| 518 |
])
|
| 519 |
|
| 520 |
-
# Add "Delete All" button
|
| 521 |
buttons.append([InlineKeyboardButton("β οΈ Delete All Files", callback_data=f"delete_all:{user_id}")])
|
| 522 |
|
| 523 |
await message.reply_text(
|
|
@@ -641,19 +630,40 @@ async def upload_all_callback(_, query):
|
|
| 641 |
async def cancel_upload_prompt(_, query):
|
| 642 |
await query.message.delete()
|
| 643 |
|
| 644 |
-
# ----------- RECEIVING
|
| 645 |
-
@app.on_message(
|
|
|
|
|
|
|
|
|
|
| 646 |
async def on_file(_, message):
|
|
|
|
| 647 |
if message.document:
|
| 648 |
filename = message.document.file_name
|
| 649 |
elif message.video:
|
| 650 |
filename = message.video.file_name or f"{message.video.file_unique_id}.mp4"
|
| 651 |
elif message.audio:
|
| 652 |
filename = message.audio.file_name or f"{message.audio.file_unique_id}.mp3"
|
| 653 |
-
|
| 654 |
filename = f"{message.photo.file_unique_id}.jpg"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 655 |
|
| 656 |
-
|
|
|
|
| 657 |
group_id = str(message.media_group_id)
|
| 658 |
chat_id = message.chat.id
|
| 659 |
user_id = message.from_user.id
|
|
|
|
| 338 |
|
| 339 |
# --------------- DELETE FUNCTIONS ---------------
|
| 340 |
async def delete_user_file(chat_id, user_id, enc_path, token, query):
|
|
|
|
| 341 |
try:
|
| 342 |
hf.delete_file(
|
| 343 |
path_in_repo=enc_path,
|
|
|
|
| 352 |
await query.answer(f"Error: {e}", show_alert=True)
|
| 353 |
|
| 354 |
async def delete_all_user_files(chat_id, user_id, query):
|
|
|
|
| 355 |
user_files = db_get_user_files(user_id)
|
| 356 |
if not user_files:
|
| 357 |
await query.answer("No files to delete.", show_alert=True)
|
| 358 |
return
|
| 359 |
|
|
|
|
| 360 |
for enc_path, _, _ in user_files:
|
| 361 |
try:
|
| 362 |
hf.delete_file(
|
|
|
|
| 365 |
repo_type="dataset",
|
| 366 |
)
|
| 367 |
except Exception:
|
| 368 |
+
pass
|
| 369 |
|
|
|
|
| 370 |
db_remove_all_user_files(user_id)
|
| 371 |
|
|
|
|
| 372 |
tokens_to_delete = [tok for tok, path in file_callback_map.items() if path.startswith(get_encrypted_folder(user_id))]
|
| 373 |
for tok in tokens_to_delete:
|
| 374 |
file_callback_map.pop(tok, None)
|
|
|
|
| 377 |
await refresh_file_list(chat_id, user_id, query.message)
|
| 378 |
|
| 379 |
async def refresh_file_list(chat_id, user_id, message):
|
|
|
|
| 380 |
user_files = db_get_user_files(user_id)
|
| 381 |
if not user_files:
|
| 382 |
return await message.edit_text("You have no uploaded files.", reply_markup=None)
|
|
|
|
| 390 |
InlineKeyboardButton("π Delete", callback_data=f"delete:{token}")
|
| 391 |
])
|
| 392 |
|
|
|
|
| 393 |
buttons.append([InlineKeyboardButton("β οΈ Delete All Files", callback_data=f"delete_all:{user_id}")])
|
| 394 |
|
| 395 |
await message.edit_text(
|
|
|
|
| 408 |
messages = group_data['messages'] # list of (message_id, filename)
|
| 409 |
|
| 410 |
if len(messages) == 1:
|
|
|
|
| 411 |
msg_id, filename = messages[0]
|
| 412 |
token = make_token()
|
| 413 |
upload_prompt_map[token] = [(user_id, msg_id, filename)]
|
|
|
|
| 417 |
])
|
| 418 |
await app.send_message(chat_id, f"Do you want to upload `{filename}`?", reply_markup=kb)
|
| 419 |
else:
|
|
|
|
| 420 |
files_list = "\n".join(f"β’ {fname}" for _, fname in messages)
|
| 421 |
token = make_token()
|
| 422 |
upload_prompt_map[token] = [(user_id, msg_id, fname) for msg_id, fname in messages]
|
|
|
|
| 464 |
@app.on_message(filters.command("start"))
|
| 465 |
async def start_cmd(_, message):
|
| 466 |
await message.reply_text(
|
| 467 |
+
"Send me any file (document, video, audio, photo, animation, sticker, video note, voice) to upload.\n"
|
| 468 |
"/files β list your uploaded files"
|
| 469 |
)
|
| 470 |
|
|
|
|
| 473 |
user_id = message.from_user.id
|
| 474 |
user_files = db_get_user_files(user_id)
|
| 475 |
|
|
|
|
| 476 |
if not user_files:
|
| 477 |
enc_folder = get_encrypted_folder(user_id)
|
| 478 |
try:
|
|
|
|
| 507 |
InlineKeyboardButton("π Delete", callback_data=f"delete:{token}")
|
| 508 |
])
|
| 509 |
|
|
|
|
| 510 |
buttons.append([InlineKeyboardButton("β οΈ Delete All Files", callback_data=f"delete_all:{user_id}")])
|
| 511 |
|
| 512 |
await message.reply_text(
|
|
|
|
| 630 |
async def cancel_upload_prompt(_, query):
|
| 631 |
await query.message.delete()
|
| 632 |
|
| 633 |
+
# ----------- RECEIVING ALL FILE TYPES (including animations, stickers, video notes, voice) -----------
|
| 634 |
+
@app.on_message(
|
| 635 |
+
filters.document | filters.video | filters.audio | filters.photo |
|
| 636 |
+
filters.animation | filters.sticker | filters.video_note | filters.voice
|
| 637 |
+
)
|
| 638 |
async def on_file(_, message):
|
| 639 |
+
# Determine filename for every possible type
|
| 640 |
if message.document:
|
| 641 |
filename = message.document.file_name
|
| 642 |
elif message.video:
|
| 643 |
filename = message.video.file_name or f"{message.video.file_unique_id}.mp4"
|
| 644 |
elif message.audio:
|
| 645 |
filename = message.audio.file_name or f"{message.audio.file_unique_id}.mp3"
|
| 646 |
+
elif message.photo:
|
| 647 |
filename = f"{message.photo.file_unique_id}.jpg"
|
| 648 |
+
elif message.animation:
|
| 649 |
+
filename = message.animation.file_name or f"{message.animation.file_unique_id}.mp4"
|
| 650 |
+
elif message.sticker:
|
| 651 |
+
# Stickers can be .webp, .tgs, .webm
|
| 652 |
+
if message.sticker.is_animated:
|
| 653 |
+
filename = f"{message.sticker.file_unique_id}.tgs"
|
| 654 |
+
elif message.sticker.is_video:
|
| 655 |
+
filename = f"{message.sticker.file_unique_id}.webm"
|
| 656 |
+
else:
|
| 657 |
+
filename = f"{message.sticker.file_unique_id}.webp"
|
| 658 |
+
elif message.video_note:
|
| 659 |
+
filename = f"{message.video_note.file_unique_id}.mp4"
|
| 660 |
+
elif message.voice:
|
| 661 |
+
filename = f"{message.voice.file_unique_id}.ogg"
|
| 662 |
+
else:
|
| 663 |
+
return # should never happen
|
| 664 |
|
| 665 |
+
# Album grouping (for photos, videos, documents that belong to an album)
|
| 666 |
+
if message.media_group_id and (message.photo or message.video or message.document):
|
| 667 |
group_id = str(message.media_group_id)
|
| 668 |
chat_id = message.chat.id
|
| 669 |
user_id = message.from_user.id
|