Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
@@ -141,7 +141,7 @@ MESSAGES = {
|
|
141 |
'error_video_conversion': "❌ Error converting video: ",
|
142 |
'invalid_file_type_video': "Please send a video file or a video message.",
|
143 |
'membership_required': "To continue using the bot and access unlimited features, please join the following channels first:",
|
144 |
-
'btn_join_channel': "Join Channel
|
145 |
'btn_check_membership': "Check Membership ✅",
|
146 |
'membership_success': "✅ Your membership has been verified! You can now use the bot unlimitedly.",
|
147 |
'membership_failed': "❌ Sorry, you are not yet a member of all required channels. Please join first and then press 'Check Membership' again.",
|
@@ -743,79 +743,89 @@ async def admin_handle_remove_channel(update: Update, context):
|
|
743 |
return await admin_link_command(update, context)
|
744 |
|
745 |
app = Flask(__name__)
|
746 |
-
# application = None # این خط را حذف یا کامنت کنید
|
747 |
-
|
748 |
-
# مقداردهی اولیه Application در سطح سراسری (Global Scope)
|
749 |
-
# این اطمینان می دهد که Application یک بار در زمان شروع برنامه مقداردهی می شود.
|
750 |
-
application = Application.builder().token(TOKEN).build()
|
751 |
-
|
752 |
-
# اضافه کردن هندلرها به Application در زمان مقداردهی اولیه
|
753 |
-
conv_handler = ConversationHandler(
|
754 |
-
entry_points=[
|
755 |
-
CommandHandler("start", start),
|
756 |
-
CommandHandler("link", admin_link_command)
|
757 |
-
],
|
758 |
-
states={
|
759 |
-
LANGUAGE_SELECTION: [
|
760 |
-
CallbackQueryHandler(set_language, pattern='^set_lang_')
|
761 |
-
],
|
762 |
-
MAIN_MENU: [
|
763 |
-
CallbackQueryHandler(change_format_selected, pattern='^select_convert_format$'),
|
764 |
-
CallbackQueryHandler(cut_audio_selected, pattern='^select_cut_audio$'),
|
765 |
-
CallbackQueryHandler(video_conversion_selected, pattern='^select_video_conversion$')
|
766 |
-
],
|
767 |
-
CONVERT_AUDIO: [
|
768 |
-
MessageHandler(filters.AUDIO & ~filters.COMMAND, handle_audio),
|
769 |
-
MessageHandler(filters.VOICE & ~filters.COMMAND, handle_voice),
|
770 |
-
CommandHandler("start", start),
|
771 |
-
CommandHandler("cancel", cancel)
|
772 |
-
],
|
773 |
-
CUT_AUDIO_FILE: [
|
774 |
-
MessageHandler(filters.AUDIO & ~filters.COMMAND, handle_cut_audio_file),
|
775 |
-
MessageHandler(filters.VOICE & ~filters.COMMAND, handle_cut_audio_file),
|
776 |
-
CommandHandler("start", start),
|
777 |
-
CommandHandler("cancel", cancel)
|
778 |
-
],
|
779 |
-
CUT_AUDIO_RANGE: [
|
780 |
-
MessageHandler(filters.TEXT & ~filters.COMMAND, handle_cut_audio_range),
|
781 |
-
CommandHandler("start", start),
|
782 |
-
CommandHandler("cancel", cancel)
|
783 |
-
],
|
784 |
-
VIDEO_CONVERSION_MODE: [
|
785 |
-
MessageHandler(filters.VIDEO & ~filters.COMMAND, handle_video_conversion),
|
786 |
-
MessageHandler(filters.VIDEO_NOTE & ~filters.COMMAND, handle_video_conversion),
|
787 |
-
CommandHandler("start", start),
|
788 |
-
CommandHandler("cancel", cancel)
|
789 |
-
],
|
790 |
-
WAITING_FOR_MEMBERSHIP: [
|
791 |
-
CallbackQueryHandler(check_membership_callback, pattern='^check_membership$'),
|
792 |
-
CommandHandler("start", start),
|
793 |
-
CommandHandler("cancel", cancel)
|
794 |
-
],
|
795 |
-
ADMIN_MENU: [
|
796 |
-
CallbackQueryHandler(admin_add_channel_prompt, pattern='^admin_add_channel$'),
|
797 |
-
CallbackQueryHandler(admin_list_channels, pattern='^admin_list_channels$'),
|
798 |
-
CommandHandler("start", start),
|
799 |
-
CommandHandler("cancel", cancel)
|
800 |
-
],
|
801 |
-
ADD_CHANNEL: [
|
802 |
-
MessageHandler(filters.TEXT & ~filters.COMMAND, admin_handle_add_channel),
|
803 |
-
CommandHandler("start", start),
|
804 |
-
CommandHandler("cancel", cancel)
|
805 |
-
],
|
806 |
-
LIST_REMOVE_CHANNELS: [
|
807 |
-
CallbackQueryHandler(admin_handle_remove_channel, pattern='^remove_channel_'),
|
808 |
-
CommandHandler("start", start),
|
809 |
-
CommandHandler("cancel", cancel)
|
810 |
-
]
|
811 |
-
},
|
812 |
-
fallbacks=[CommandHandler("cancel", cancel), CommandHandler("start", start)],
|
813 |
-
allow_reentry=True
|
814 |
-
)
|
815 |
|
816 |
-
|
817 |
-
|
818 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
819 |
|
820 |
|
821 |
@app.route("/")
|
@@ -824,14 +834,14 @@ async def index():
|
|
824 |
|
825 |
@app.route("/webhook", methods=["POST"])
|
826 |
async def webhook():
|
827 |
-
#
|
828 |
update = Update.de_json(request.get_json(force=True), application.bot)
|
829 |
await application.process_update(update)
|
830 |
return "ok"
|
831 |
|
832 |
@app.route("/set_webhook", methods=["GET"])
|
833 |
async def set_webhook_route():
|
834 |
-
#
|
835 |
webhook_url = os.getenv("WEBHOOK_URL")
|
836 |
if not webhook_url:
|
837 |
return jsonify({"status": "error", "message": "WEBHOOK_URL environment variable not set."}), 500
|
@@ -847,4 +857,6 @@ async def set_webhook_route():
|
|
847 |
|
848 |
if __name__ == "__main__":
|
849 |
print("Starting Flask app...")
|
|
|
|
|
850 |
app.run(host='0.0.0.0', port=int(os.environ.get("PORT", 7860)))
|
|
|
141 |
'error_video_conversion': "❌ Error converting video: ",
|
142 |
'invalid_file_type_video': "Please send a video file or a video message.",
|
143 |
'membership_required': "To continue using the bot and access unlimited features, please join the following channels first:",
|
144 |
+
'btn_join_channel': "Join Channel 🤝",
|
145 |
'btn_check_membership': "Check Membership ✅",
|
146 |
'membership_success': "✅ Your membership has been verified! You can now use the bot unlimitedly.",
|
147 |
'membership_failed': "❌ Sorry, you are not yet a member of all required channels. Please join first and then press 'Check Membership' again.",
|
|
|
743 |
return await admin_link_command(update, context)
|
744 |
|
745 |
app = Flask(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
746 |
|
747 |
+
# Application باید قبل از اینکه Flask شروع به گوش دادن کند، آماده باشد.
|
748 |
+
# این کار را با یک تابع که در زمان شروع gunicorn فراخوانی می شود، انجام می دهیم.
|
749 |
+
def initialize_bot_application():
|
750 |
+
global application
|
751 |
+
if application is None: # فقط اگر هنوز مقداردهی اولیه نشده باشد
|
752 |
+
application = Application.builder().token(TOKEN).build()
|
753 |
+
|
754 |
+
conv_handler = ConversationHandler(
|
755 |
+
entry_points=[
|
756 |
+
CommandHandler("start", start),
|
757 |
+
CommandHandler("link", admin_link_command)
|
758 |
+
],
|
759 |
+
states={
|
760 |
+
LANGUAGE_SELECTION: [
|
761 |
+
CallbackQueryHandler(set_language, pattern='^set_lang_')
|
762 |
+
],
|
763 |
+
MAIN_MENU: [
|
764 |
+
CallbackQueryHandler(change_format_selected, pattern='^select_convert_format$'),
|
765 |
+
CallbackQueryHandler(cut_audio_selected, pattern='^select_cut_audio$'),
|
766 |
+
CallbackQueryHandler(video_conversion_selected, pattern='^select_video_conversion$')
|
767 |
+
],
|
768 |
+
CONVERT_AUDIO: [
|
769 |
+
MessageHandler(filters.AUDIO & ~filters.COMMAND, handle_audio),
|
770 |
+
MessageHandler(filters.VOICE & ~filters.COMMAND, handle_voice),
|
771 |
+
CommandHandler("start", start),
|
772 |
+
CommandHandler("cancel", cancel)
|
773 |
+
],
|
774 |
+
CUT_AUDIO_FILE: [
|
775 |
+
MessageHandler(filters.AUDIO & ~filters.COMMAND, handle_cut_audio_file),
|
776 |
+
MessageHandler(filters.VOICE & ~filters.COMMAND, handle_cut_audio_file),
|
777 |
+
CommandHandler("start", start),
|
778 |
+
CommandHandler("cancel", cancel)
|
779 |
+
],
|
780 |
+
CUT_AUDIO_RANGE: [
|
781 |
+
MessageHandler(filters.TEXT & ~filters.COMMAND, handle_cut_audio_range),
|
782 |
+
CommandHandler("start", start),
|
783 |
+
CommandHandler("cancel", cancel)
|
784 |
+
],
|
785 |
+
VIDEO_CONVERSION_MODE: [
|
786 |
+
MessageHandler(filters.VIDEO & ~filters.COMMAND, handle_video_conversion),
|
787 |
+
MessageHandler(filters.VIDEO_NOTE & ~filters.COMMAND, handle_video_conversion),
|
788 |
+
CommandHandler("start", start),
|
789 |
+
CommandHandler("cancel", cancel)
|
790 |
+
],
|
791 |
+
WAITING_FOR_MEMBERSHIP: [
|
792 |
+
CallbackQueryHandler(check_membership_callback, pattern='^check_membership$'),
|
793 |
+
CommandHandler("start", start),
|
794 |
+
CommandHandler("cancel", cancel)
|
795 |
+
],
|
796 |
+
ADMIN_MENU: [
|
797 |
+
CallbackQueryHandler(admin_add_channel_prompt, pattern='^admin_add_channel$'),
|
798 |
+
CallbackQueryHandler(admin_list_channels, pattern='^admin_list_channels$'),
|
799 |
+
CommandHandler("start", start),
|
800 |
+
CommandHandler("cancel", cancel)
|
801 |
+
],
|
802 |
+
ADD_CHANNEL: [
|
803 |
+
MessageHandler(filters.TEXT & ~filters.COMMAND, admin_handle_add_channel),
|
804 |
+
CommandHandler("start", start),
|
805 |
+
CommandHandler("cancel", cancel)
|
806 |
+
],
|
807 |
+
LIST_REMOVE_CHANNELS: [
|
808 |
+
CallbackQueryHandler(admin_handle_remove_channel, pattern='^remove_channel_'),
|
809 |
+
CommandHandler("start", start),
|
810 |
+
CommandHandler("cancel", cancel)
|
811 |
+
]
|
812 |
+
},
|
813 |
+
fallbacks=[CommandHandler("cancel", cancel), CommandHandler("start", start)],
|
814 |
+
allow_reentry=True
|
815 |
+
)
|
816 |
+
|
817 |
+
application.add_handler(conv_handler)
|
818 |
+
application.add_error_handler(error_handler)
|
819 |
+
# این خط برای اطمینان از مقداردهی اولیه Application است
|
820 |
+
application.post_init()
|
821 |
+
print("Telegram bot Application initialized and post_init called.")
|
822 |
+
|
823 |
+
|
824 |
+
@app.before_request
|
825 |
+
def before_request_func():
|
826 |
+
# این تابع قبل از هر درخواست Flask اجرا می شود
|
827 |
+
# و اطمینان می دهد که application مقداردهی اولیه شده است.
|
828 |
+
initialize_bot_application()
|
829 |
|
830 |
|
831 |
@app.route("/")
|
|
|
834 |
|
835 |
@app.route("/webhook", methods=["POST"])
|
836 |
async def webhook():
|
837 |
+
# Application قبلاً توسط before_request مقداردهی اولیه شده است
|
838 |
update = Update.de_json(request.get_json(force=True), application.bot)
|
839 |
await application.process_update(update)
|
840 |
return "ok"
|
841 |
|
842 |
@app.route("/set_webhook", methods=["GET"])
|
843 |
async def set_webhook_route():
|
844 |
+
# Application قبلاً توسط before_request مقداردهی اولیه شده است
|
845 |
webhook_url = os.getenv("WEBHOOK_URL")
|
846 |
if not webhook_url:
|
847 |
return jsonify({"status": "error", "message": "WEBHOOK_URL environment variable not set."}), 500
|
|
|
857 |
|
858 |
if __name__ == "__main__":
|
859 |
print("Starting Flask app...")
|
860 |
+
# در محیط توسعه محلی، می توانیم application را مستقیماً مقداردهی اولیه کنیم
|
861 |
+
initialize_bot_application()
|
862 |
app.run(host='0.0.0.0', port=int(os.environ.get("PORT", 7860)))
|