diff --git a/daemons/fetch.py b/daemons/fetch.py index ecdfa7a..e894697 100644 --- a/daemons/fetch.py +++ b/daemons/fetch.py @@ -9,7 +9,7 @@ from settings import MOSCOW_TIMEZONE def fetch_schedule_for_user(user: User): - today = now() + today = now(user) next_day = today + datetime.timedelta(days=7) schedule = ruz.get_schedule(user, today, next_day) if schedule is None: @@ -67,7 +67,7 @@ def process(): def delete_old(): - mongo.lessons_collection.delete_many({"end": {"$lte": now() - datetime.timedelta(days=1)}}) + mongo.lessons_collection.delete_many({"end": {"$lte": datetime.datetime.now() - datetime.timedelta(days=1)}}) def fetch(): diff --git a/daemons/notify.py b/daemons/notify.py index 927491b..174b435 100644 --- a/daemons/notify.py +++ b/daemons/notify.py @@ -11,9 +11,8 @@ from helpers.ruz import ruz def process(): - time_now = now() - print(time_now) for user in mongo.users_collection.find({"notify_minutes": {"$ne": None}, "hse_id": {"$ne": None}}): + time_now = now(UserSchema().load(user)) for lesson in mongo.lessons_collection.find({ "hse_user_id": user["hse_id"], "begin": {"$lte": time_now + datetime.timedelta(minutes=user["notify_minutes"])}, diff --git a/helpers/__init__.py b/helpers/__init__.py index fbb17e6..5c3c82f 100644 --- a/helpers/__init__.py +++ b/helpers/__init__.py @@ -4,14 +4,21 @@ import zoneinfo from helpers.models import User -def now(): - today = datetime.datetime.now() + datetime.timedelta(hours=3) +campus_timdelta = { + "Москва": 3, + "Санкт-Петербург": 3, + "Нижний Новгород": 3, + "Пермь": 5 +} + +def now(user: User): + today = datetime.datetime.now() + datetime.timedelta(hours=campus_timdelta[user.campus]) return today def get_next_daily_notify_time(user: User, time_now: datetime.datetime | None = None) -> datetime.datetime: if time_now is None: - time_now = now() + time_now = now(user) hours, minutes = map(int, user.daily_notify_time.split(":")) next_time = datetime.datetime( year=time_now.year, diff --git a/helpers/answer.py b/helpers/answer.py index 3504f40..f814e91 100644 --- a/helpers/answer.py +++ b/helpers/answer.py @@ -7,7 +7,7 @@ from daemons.bot import bot from daemons.fetch import fetch_schedule_for_user from helpers import now, get_next_daily_notify_time from helpers.keyboards import main_keyboard, notify_keyboard, yes_no_keyboard, again_keyboard, groups_keyboard, \ - no_daily_notify, student_or_teacher_keyboard + no_daily_notify, student_or_teacher_keyboard, campus_keyboard from helpers.models import UserSchema, User from helpers.mongo import mongo from helpers.ruz import ruz @@ -36,10 +36,28 @@ class Answer(BaseAnswer): def handle_state_new(self, message: Message, user: User): bot.send_message( message.chat.id, - "Привет! Я буду помогать тебе выживать в вышке!\nДля начала сообщи мне, ты преподаватель или студент?", + "Привет! Я буду помогать тебе выживать в вышке!\nИз какого ты кампуса?", + reply_markup=campus_keyboard() + ) + self.set_state(user, "wait_for_campus") + + def handle_state_wait_for_campus(self, message: Message, user: User): + if message.text not in ["Москва", "Санкт-Петербург", "Нижний Новгород", "Пермь"]: + bot.send_message( + user.chat_id, + "Ты прислал мне что-то непонятное, используй кнопки. Из какого ты кампуса?", + reply_markup=campus_keyboard() + ) + return + bot.send_message( + user.chat_id, + "Принято! Ты преподаватель или студент?", reply_markup=student_or_teacher_keyboard() ) - self.set_state(user, "wait_for_student_or_teacher") + mongo.users_collection.update_one( + {"chat_id": user.chat_id}, + {"$set": {"campus": message.text, "state": "wait_for_student_or_teacher"}} + ) def handle_state_wait_for_student_or_teacher(self, message: Message, user: User): if message.text == "Студент": @@ -56,6 +74,14 @@ class Answer(BaseAnswer): {"$set": {"is_teacher": True, "state": "wait_for_name"}} ) self.set_state(user, "wait_for_name") + elif message.text == "Начать заново": + bot.send_message( + message.chat.id, + "Привет! Я буду помогать тебе выживать в вышке!\nИз какого ты кампуса?", + reply_markup=campus_keyboard() + ) + self.set_state(user, "wait_for_campus") + return else: bot.send_message(user.chat_id, "Ты отправил мне что-то неправильное, используй кнопки. Ты преподаватель или студент?", reply_markup=student_or_teacher_keyboard()) @@ -63,10 +89,10 @@ class Answer(BaseAnswer): if message.text == "Начать заново": bot.send_message( message.chat.id, - "Привет! Я буду помогать тебе выживать в вышке!\nДля начала сообщи мне, ты преподаватель или студент?", - reply_markup=student_or_teacher_keyboard() + "Привет! Я буду помогать тебе выживать в вышке!\nИз какого ты кампуса?", + reply_markup=campus_keyboard() ) - self.set_state(user, "wait_for_student_or_teacher") + self.set_state(user, "wait_for_campus") return user.name = message.text data = ruz.find_person(user) @@ -100,10 +126,10 @@ class Answer(BaseAnswer): if message.text == "Начать заново": bot.send_message( message.chat.id, - "Привет! Я буду помогать тебе выживать в вышке!\nДля начала сообщи мне, ты преподаватель или студент?", - reply_markup=student_or_teacher_keyboard() + "Привет! Я буду помогать тебе выживать в вышке!\nИз какого ты кампуса?", + reply_markup=campus_keyboard() ) - self.set_state(user, "wait_for_student_or_teacher") + self.set_state(user, "wait_for_campus") return group = message.text data = ruz.find_person(user) @@ -120,8 +146,8 @@ class Answer(BaseAnswer): user.name = element['label'] break if user.group is None: - bot.send_message(user.chat_id, "Ты ввел что-то неправильно, попробуй еще раз сначала. Ты студент или преподаватель?", reply_markup=student_or_teacher_keyboard()) - self.set_state(user, "wait_for_student_or_teacher") + bot.send_message(user.chat_id, "Ты ввел что-то неправильно, попробуй еще раз сначала. Из какого ты кампуса?", reply_markup=campus_keyboard()) + self.set_state(user, "wait_for_campus") return mongo.users_collection.update_one({"chat_id": user.chat_id}, {"$set": { "hse_id": user.hse_id, @@ -144,7 +170,7 @@ class Answer(BaseAnswer): else: bot.send_message( user.chat_id, - ruz.schedule_builder(lessons), + "Твои пары сегодня:\n" + ruz.schedule_builder(lessons), reply_markup=main_keyboard() ) self.set_state(user, "ready") diff --git a/helpers/keyboards.py b/helpers/keyboards.py index 4a047c7..caf1926 100644 --- a/helpers/keyboards.py +++ b/helpers/keyboards.py @@ -10,10 +10,20 @@ def main_keyboard(): return kb +def campus_keyboard(): + kb = telebot.types.ReplyKeyboardMarkup(True, False) + kb.row("Москва") + kb.row("Нижний Новгород") + kb.row("Пермь") + kb.row("Санкт-Петербург") + return kb + + def student_or_teacher_keyboard(): kb = telebot.types.ReplyKeyboardMarkup(True, False) kb.row("Преподаватель") kb.row("Студент") + kb.row("Начать заново") return kb diff --git a/helpers/models.py b/helpers/models.py index 3e1927e..1793a9d 100644 --- a/helpers/models.py +++ b/helpers/models.py @@ -17,6 +17,7 @@ class User: daily_notify_time: Optional[str] = None next_daily_notify_time: Optional[datetime.datetime] = None is_teacher: bool = False + campus: str = "Москва" class Meta: unknown = EXCLUDE diff --git a/helpers/mongo.py b/helpers/mongo.py index 819bba7..808555d 100644 --- a/helpers/mongo.py +++ b/helpers/mongo.py @@ -54,7 +54,7 @@ class Mongo: return self["lessons"] def get_today_lessons(self, user: User): - today = now() + today = now(user) tomorrow = today + datetime.timedelta(days=1) tomorrow = datetime.datetime(year=tomorrow.year, month=tomorrow.month, day=tomorrow.day) lessons = []