ULMuseum/bot.py

198 lines
9.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()