from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove from telegram.ext import ( Application, CommandHandler, MessageHandler, filters, ConversationHandler, ) import os import logging # Настройка логирования logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # Токен бота TOKEN = "7693731498:AAG1HUwrk_vSpnaS5ivsqREOBsEP_wC6RV4" # Состояния для диалога WELCOME, NAME, TITLE, PHONE, EMAIL, WORK, SUBMITTED = range(7) # Путь к папке на рабочем столе DESKTOP_PATH = os.path.join(os.path.expanduser("~"), "Desktop") FOLDER_NAME = "Ульяновск.Искусство" FOLDER_PATH = os.path.join(DESKTOP_PATH, FOLDER_NAME) # Создание папки на рабочем столе, если она не существует if not os.path.exists(FOLDER_PATH): os.makedirs(FOLDER_PATH) # Обработчик команды /start async def start(update: Update, context): logger.info(f"Пользователь {update.effective_user.id} начал диалог.") await update.message.reply_text( "Привет! 👋\n" "Мы рады приветствовать вас в нашем боте, посвящённом городу Ульяновск!\n\n" "Ульяновск — это город с богатой историей, красивыми памятниками и уютными улочками. " "Мы проводим конкурс на лучшую фотографию нашего города. Присоединяйтесь!\n\n" "Чтобы принять участие, нажмите кнопку ниже:", reply_markup=ReplyKeyboardMarkup([["Добавить работу"]], one_time_keyboard=True, resize_keyboard=True), ) return WELCOME # Обработчик нажатия на кнопку "Добавить работу" async def add_work(update: Update, context): logger.info(f"Пользователь {update.effective_user.id} нажал на кнопку 'Добавить работу'.") await update.message.reply_text( "Отлично! 🎉\n" "Для начала введите ваше имя и фамилию:", reply_markup=ReplyKeyboardRemove(), ) return NAME # Обработчик ввода имени и фамилии async def get_name(update: Update, context): name = update.message.text context.user_data["name"] = name logger.info(f"Пользователь {update.effective_user.id} ввел имя: {name}") await update.message.reply_text("Теперь введите название вашей работы:") return TITLE # Обработчик ввода названия работы async def get_title(update: Update, context): title = update.message.text context.user_data["title"] = title logger.info(f"Пользователь {update.effective_user.id} ввел название работы: {title}") await update.message.reply_text("Введите ваш номер телефона:") return PHONE # Обработчик ввода номера телефона async def get_phone(update: Update, context): phone = update.message.text context.user_data["phone"] = phone logger.info(f"Пользователь {update.effective_user.id} ввел номер телефона: {phone}") await update.message.reply_text("Введите вашу электронную почту:") return EMAIL # Обработчик ввода электронной почты async def get_email(update: Update, context): email = update.message.text context.user_data["email"] = email logger.info(f"Пользователь {update.effective_user.id} ввел email: {email}") await update.message.reply_text("Отправьте вашу работу (файл в формате JPEG или PNG):") return WORK # Обработчик отправки файла async def get_work(update: Update, context): try: if update.message.photo: photo = update.message.photo[-1] name = context.user_data["name"] title = context.user_data["title"] phone = context.user_data["phone"] email = context.user_data["email"] # Создаем папку участника participant_folder = os.path.join(FOLDER_PATH, name) if not os.path.exists(participant_folder): os.makedirs(participant_folder) # Сохраняем файл в папку участника file_path = os.path.join(participant_folder, f"{title}.jpg") file = await photo.get_file() await file.download_to_drive(file_path) # Сохраняем контактные данные в текстовый файл contact_info = f"Имя: {name}\nНомер телефона: {phone}\nЭлектронная почта: {email}" contact_file_path = os.path.join(participant_folder, "contact_info.txt") with open(contact_file_path, "w", encoding="utf-8") as file: file.write(contact_info) await update.message.reply_text( f"Спасибо, {name}! Ваша работа '{title}' сохранена.\n\n" "Удачи в конкурсе! 🍀" ) return SUBMITTED elif update.message.document: document = update.message.document if document.mime_type in ["image/jpeg", "image/png"] and document.file_name.lower().endswith((".jpg", ".jpeg", ".png")): name = context.user_data["name"] title = context.user_data["title"] phone = context.user_data["phone"] email = context.user_data["email"] # Создаем папку участника participant_folder = os.path.join(FOLDER_PATH, name) if not os.path.exists(participant_folder): os.makedirs(participant_folder) # Сохраняем файл в папку участника file_path = os.path.join(participant_folder, f"{title}.{document.file_name.split('.')[-1]}") file = await document.get_file() await file.download_to_drive(file_path) # Сохраняем контактные данные в текстовый файл contact_info = f"Имя: {name}\nНомер телефона: {phone}\nЭлектронная почта: {email}" contact_file_path = os.path.join(participant_folder, "contact_info.txt") with open(contact_file_path, "w", encoding="utf-8") as file: file.write(contact_info) await update.message.reply_text( f"Спасибо, {name}! Ваша работа '{title}' сохранена.\n\n" "Удачи в конкурсе! 🍀" ) return SUBMITTED else: await update.message.reply_text("Пожалуйста, отправьте файл в формате JPEG или PNG.") return WORK else: await update.message.reply_text("Пожалуйста, отправьте только файл в формате JPEG или PNG.") return WORK except Exception as e: logger.error(f"Ошибка при загрузке файла: {e}") await update.message.reply_text("Произошла ошибка при загрузке файла. Пожалуйста, попробуйте снова.") return WORK # Обработчик состояния SUBMITTED async def submitted(update: Update, context): reply_keyboard = [["Посмотреть свою работу", "Изменить свою работу"], ["Удалить работу", "Отказаться от участия"]] await update.message.reply_text( "Вы уже отправили свою работу. Выберите действие:", reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True), ) return SUBMITTED # Обработчик команды /cancel async def cancel(update: Update, context): await update.message.reply_text("Отправка работы отменена. Вы можете начать снова, отправив команду /start.") return ConversationHandler.END # Основная функция def main(): application = Application.builder().token(TOKEN).build() # Определяем ConversationHandler conv_handler = ConversationHandler( entry_points=[CommandHandler("start", start)], states={ WELCOME: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_work)], NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_name)], TITLE: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_title)], PHONE: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_phone)], EMAIL: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_email)], WORK: [ MessageHandler(filters.PHOTO | filters.Document.ALL, get_work), MessageHandler(filters.TEXT & ~filters.COMMAND, lambda update, context: update.message.reply_text("Пожалуйста, отправьте файл.") or WORK), ], SUBMITTED: [MessageHandler(filters.TEXT & ~filters.COMMAND, submitted)], }, fallbacks=[CommandHandler("cancel", cancel)], ) # Добавляем обработчик application.add_handler(conv_handler) # Запуск бота application.run_polling() if __name__ == "__main__": main()