This commit is contained in:
Administrator
2022-10-25 15:03:23 +03:00
parent 05f556a7ca
commit 2e0f66c5af
6 changed files with 67 additions and 27 deletions

View File

@@ -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
no_daily_notify, student_or_teacher_keyboard
from helpers.models import UserSchema, User
from helpers.mongo import mongo
from helpers.ruz import ruz
@@ -36,9 +36,24 @@ class Answer(BaseAnswer):
def handle_state_new(self, message: Message, user: User):
bot.send_message(
message.chat.id,
"Привет! Я буду помогать тебе выживать в вышке!\nДля начала пришли мне свое ФИО.",
"Привет! Я буду помогать тебе выживать в вышке!\nДля начала сообщи мне, ты преподаватель или студент?",
reply_markup=student_or_teacher_keyboard()
)
self.set_state(user, "wait_for_name")
self.set_state(user, "wait_for_student_or_teacher")
def handle_state_wait_for_student_or_teacher(self, message: Message, user: User):
if message.text == "Студент":
bot.send_message(user.chat_id, "Принято! Теперь отправь мне свое ФИО.")
self.set_state(user, "wait_for_name")
elif message.text == "Преподаватель":
bot.send_message(user.chat_id, "Принято! Теперь отправь мне свое ФИО.")
mongo.users_collection.update_one(
{"chat_id": user.chat_id},
{"$set": {"is_teacher": True, "state": "wait_for_name"}}
)
self.set_state(user, "wait_for_name")
else:
bot.send_message(user.chat_id, "Ты отправил мне что-то неправильное, используй кнопки. Ты преподаватель или студент?", reply_markup=student_or_teacher_keyboard())
def handle_state_wait_for_name(self, message: Message, user: User):
if message.text == "Начать заново":
@@ -47,7 +62,8 @@ class Answer(BaseAnswer):
"Привет! Я буду помогать тебе выживать в вышке!\nДля начала пришли мне свое ФИО.",
)
return
data = ruz.find_person(message.text)
user.name = message.text
data = ruz.find_person(user)
if data is None:
bot.send_message(
user.chat_id,
@@ -55,22 +71,28 @@ class Answer(BaseAnswer):
)
return
if len(data) == 0:
bot.send_message(user.chat_id, "К сожалению, в РУЗе не нашлось такого студента, попробуй еще раз.")
bot.send_message(user.chat_id, "К сожалению, в РУЗе не нашлось такого человека, попробуй еще раз.")
return
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=groups_keyboard(data)
)
if user.is_teacher:
bot.send_message(
user.chat_id,
"Отлично! Теперь выбери из списка свой департамент.",
reply_markup=groups_keyboard(data)
)
else:
bot.send_message(
user.chat_id,
"Отлично! Теперь выбери из списка свою группу.",
reply_markup=groups_keyboard(data)
)
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)
data = ruz.find_person(user)
if data is None:
bot.send_message(
user.chat_id,
@@ -84,8 +106,8 @@ class Answer(BaseAnswer):
user.name = element['label']
break
if user.group is None:
bot.send_message(user.chat_id, "Ты ввел что-то неправильно, попробуй еще раз сначала. Введи свое ФИО.")
self.set_state(user, "wait_for_name")
bot.send_message(user.chat_id, "Ты ввел что-то неправильно, попробуй еще раз сначала. Ты студент или преподаватель?", reply_markup=student_or_teacher_keyboard())
self.set_state(user, "wait_for_student_or_teacher")
return
mongo.users_collection.update_one({"chat_id": user.chat_id}, {"$set": {
"hse_id": user.hse_id,
@@ -96,7 +118,7 @@ class Answer(BaseAnswer):
user.chat_id,
"Я нашел тебя в базе РУЗ. Я буду подсказывать тебе расписание, а также уведомлять о предстоящих парах.",
)
success = fetch_schedule_for_user(user.hse_id)
success = fetch_schedule_for_user(user)
if success:
lessons = mongo.get_today_lessons(user)
if len(lessons) == 0:

View File

@@ -10,6 +10,13 @@ def main_keyboard():
return kb
def student_or_teacher_keyboard():
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Преподаватель")
kb.row("Студент")
return kb
def notify_keyboard():
kb = telebot.types.ReplyKeyboardMarkup(True, False)
kb.row("Не уведомлять")

View File

@@ -16,6 +16,7 @@ class User:
notify_minutes: Optional[int] = 10
daily_notify_time: Optional[str] = None
next_daily_notify_time: Optional[datetime.datetime] = None
is_teacher: bool = False
class Meta:
unknown = EXCLUDE

View File

@@ -3,7 +3,7 @@ import datetime
from requests import get
import settings
from helpers import User
fields = [
'discipline',
@@ -18,8 +18,12 @@ fields = [
class RUZ:
def find_person(self, name: str) -> dict | None:
search_str = settings.RUZ_API + f"search?term={name}&type=student"
def find_person(self, user: User) -> dict | None:
if user.is_teacher:
person_type = "person"
else:
person_type = "student"
search_str = settings.RUZ_API + f"search?term={user.name}&type={person_type}"
try:
data = get(search_str)
except:
@@ -28,10 +32,14 @@ class RUZ:
return data.json()
return None
def get_schedule(self, hse_id: int, begin_date: datetime.datetime, end_date: datetime.datetime):
def get_schedule(self, user: User, begin_date: datetime.datetime, end_date: datetime.datetime):
start_date_str = begin_date.strftime("%Y.%m.%d")
end_date_str = end_date.strftime("%Y.%m.%d")
search_str = settings.RUZ_API + f"schedule/student/{hse_id}?start={start_date_str}&finish={end_date_str}&lng=1"
if user.is_teacher:
person_type = "person"
else:
person_type = "student"
search_str = settings.RUZ_API + f"schedule/{person_type}/{user.hse_id}?start={start_date_str}&finish={end_date_str}&lng=1"
try:
data = get(search_str)
except: