ruz-bot/helpers/answer.py
Administrator 2eadeaaabc fixes
2022-10-21 15:12:36 +03:00

208 lines
8.8 KiB
Python
Raw 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.

import telebot
from telebot.types import Message
from daemons.bot import bot
from daemons.fetch import fetch_schedule_for_user
from helpers.models import UserSchema, User
from helpers.mongo import mongo
from helpers.ruz import ruz
class BaseAnswer:
def process(self, message: Message):
user = mongo.users_collection.find_one({"chat_id": message.chat.id})
if user is None:
user = User(chat_id=message.chat.id)
mongo.users_collection.insert_one(UserSchema().dump(user))
else:
user = UserSchema().load(user)
attr = getattr(self, "handle_state_" + user.state, None)
if attr is None:
raise NotImplementedError(f"handled state {user.state} but not implemented!")
attr(message, user)
def set_state(self, user: User, state: str):
user.state = state
mongo.users_collection.update_one({"chat_id": user.chat_id}, {"$set": {"state": state}})
class Answer(BaseAnswer):
def handle_state_new(self, message: Message, user: User):
bot.send_message(
message.chat.id,
"Привет! Я буду помогать тебе выживать в вышке!\nДля начала пришли мне свое ФИО.",
)
self.set_state(user, "wait_for_name")
def handle_state_wait_for_name(self, message: Message, user: User):
kb = telebot.types.ReplyKeyboardMarkup(True, False)
data = ruz.find_person(message.text)
if data is None:
bot.send_message(
user.chat_id,
"В РУЗе какая-то поломка, попробуй еще раз позже."
)
return
if len(data) == 0:
bot.send_message(user.chat_id, "К сожалению, в РУЗе не нашлось такого студента, попробуй еще раз.")
return
for entity in data:
kb.row(entity['description'])
user.name = message.text
mongo.users_collection.update_one(
{"chat_id": user.chat_id},
{"$set": {"name": user.name}})
bot.send_message(
user.chat_id,
"Отлично! Теперь выбери из списка свою группу.",
reply_markup=kb
)
self.set_state(user, "wait_for_group")
def handle_state_wait_for_group(self, message: Message, user: User):
group = message.text
data = ruz.find_person(user.name)
if data is None:
bot.send_message(
user.chat_id,
"В РУЗе какая-то поломка, попробуй еще раз позже."
)
return
for element in data:
if element['description'] == group:
user.hse_id = int(element['id'])
user.group = group
user.name = element['label']
break
if user.group is None:
bot.send_message(user.chat_id, "Ты ввел что-то неправильно, попробуй еще раз сначала. Введи свое ФИО.")
self.set_state(user, "wait_for_name")
return
mongo.users_collection.update_one({"chat_id": user.chat_id}, {"$set": {
"hse_id": user.hse_id,
"group": group,
"name": user.name
}})
bot.send_message(
user.chat_id,
"Я нашел тебя в базе РУЗ. Я буду подсказывать тебе расписание, а также уведомлять о предстоящих парах.",
)
success = fetch_schedule_for_user(user.hse_id)
if success:
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Пары сегодня")
kb.row("Уведомления")
kb.row("Сброс настроек")
lessons = mongo.get_today_lessons(user)
if len(lessons) == 0:
bot.send_message(
user.chat_id,
"Сегодня у тебя нет пар.",
reply_markup=kb
)
else:
bot.send_message(
user.chat_id,
ruz.schedule_builder(lessons),
reply_markup=kb
)
self.set_state(user, "ready")
def handle_state_ready(self, message: Message, user: User):
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Пары сегодня")
kb.row("Уведомления")
kb.row("Сброс настроек")
if message.text == "Пары сегодня":
lessons = mongo.get_today_lessons(user)
if len(lessons) == 0:
text = "Сегодня у тебя нет пар."
else:
text = ruz.schedule_builder(lessons)
elif message.text == "Уведомления":
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Не уведомлять")
kb.row("5 минут")
kb.row("10 минут")
kb.row("15 минут")
kb.row("20 минут")
bot.send_message(
user.chat_id,
"Выбери когда мне нужно тебе написать о предстоящей паре",
reply_markup=kb
)
self.set_state(user, "wait_for_notify")
return
elif message.text == "Сброс настроек":
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Да")
kb.row("Нет")
bot.send_message(user.chat_id, "Ты уверен что хочешь сбросить все настройки и больше не получать уведомления?", reply_markup=kb)
self.set_state(user, "reset")
return
else:
text = "Я не понимаю такой команды, используй кнопки."
bot.send_message(
user.chat_id,
text,
reply_markup=kb
)
def handle_state_wait_for_notify(self, message: Message, user: User):
text = message.text
if text == "Не уведомлять":
user.notify_minutes = None
elif text == "5 минут":
user.notify_minutes = 5
elif text == "10 минут":
user.notify_minutes = 10
elif text == "15 минут":
user.notify_minutes = 15
elif text == "20 минут":
user.notify_minutes = 20
else:
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Не уведомлять")
kb.row("5 минут")
kb.row("10 минут")
kb.row("15 минут")
kb.row("20 минут")
bot.send_message(user.chat_id, "Я не понимаю такой команды, используй кнопки.", reply_markup=kb)
return
mongo.users_collection.update_one({"chat_id": user.chat_id}, {"$set": {"notify_minutes": user.notify_minutes}})
if user.notify_minutes is not None:
text = f"Принято! Буду уведомлять тебя за {text}."
else:
text = f"Принято! Я не уведомлять тебя."
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Пары сегодня")
kb.row("Уведомления")
kb.row("Сброс настроек")
bot.send_message(user.chat_id, text, reply_markup=kb)
self.set_state(user, "ready")
def handle_state_reset(self, message: Message, user: User):
if message.text == "Да":
mongo.users_collection.delete_one({"hse_id": user.hse_id})
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Начать заново")
bot.send_message(user.chat_id, "Настройки сброшены, ждем твоего возвращения", reply_markup=kb)
elif message.text == "Нет":
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Пары сегодня")
kb.row("Уведомления")
kb.row("Сброс настроек")
bot.send_message(user.chat_id, "Возращаюсь к прежнему режиму", reply_markup=kb)
self.set_state(user, "ready")
else:
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Да")
kb.row("Нет")
bot.send_message(user.chat_id,
"Я не понимаю, используй кнопки",
reply_markup=kb)
answer = Answer()