Добавлено: ближайшая пара

Исправлено: поломка MySQL после инициализации БД
This commit is contained in:
far-galaxy 2023-02-04 18:07:19 +03:00
parent 1a3f9fb4c4
commit 6158af655c
5 changed files with 134 additions and 14 deletions

24
bot.py
View File

@ -82,7 +82,7 @@ class Bot:
tgId = query.from_user.id
if 'conf' in tag:
self.confirmGroup(query, tag)
self.confirmGroup(query, tag, l9Id)
if update.message:
query = update.message
@ -96,6 +96,16 @@ class Bot:
elif tag == 'add':
self.addGroup(l9Id, query)
elif query.text == 'Главное меню':
near = self.shedule.nearLesson(query.date, l9Id)
if near != None:
# TODO: прописать другие случаи
self.tg.sendMessage(
tgId,
f"{loc['shedule']['near']}:\n{near}",
reply_markup=Keyboard.menu(),
)
elif query.text == 'Отмена':
# TODO: прописать отмену при отсутствующих группах
self.tg_db.changeTag(tgId, 'ready')
@ -177,14 +187,18 @@ class Bot:
reply_markup=Keyboard.cancel(),
)
def confirmGroup(self, query: telegram.CallbackQuery, tag: str):
def confirmGroup(
self, query: telegram.CallbackQuery, tag: str, l9Id: str
):
"""Процесс подтверждения группы и загрузка расписания"""
tgId = query.from_user.id
self.answer(query)
if query.data == 'yes':
self.edit(query, loc['group']['loading'])
self.shedule.loadShedule(
tag[5:], query.message.date, config['first_week']
self.shedule.loadShedule(tag[5:], query.message.date)
self.shedule.db.insert(
'groups_users',
{'l9Id': l9Id, 'groupId': tag[5:]},
)
self.edit(query, loc['group']['loaded'], Keyboard.menu())
self.tg_db.changeTag(tgId, 'ready')
@ -203,7 +217,7 @@ if __name__ == "__main__":
config = loadJSON("config")
l9lk = L9_DB(**config['sql'])
tg_db = TG_DB(l9lk)
shedule = Shedule_DB(l9lk)
shedule = Shedule_DB(l9lk, config['first_week'])
bot = Bot(
config['tg']['token'], l9lk, tg_db, shedule, config['tg']['limit']
)

View File

@ -42,8 +42,8 @@ class Database:
"""
with open(f'database/{filename}.sql', encoding='utf-8') as f:
query = f.read()
return self.execute(query, commit).fetchall()
query = f.read().split('\n\n\n')
return [self.execute(i, commit) for i in query]
def initDatabase(self, name: str):
"""Создать базу данных, если таковая отсутствует,

View File

@ -8,9 +8,10 @@ import datetime
class Shedule_DB:
"""Класс взаимодействия с базой расписания"""
def __init__(self, l9lk: L9_DB):
def __init__(self, l9lk: L9_DB, first_week):
self.l9lk = l9lk
self.db = l9lk.db
self.first_week = first_week
self.db.executeFile('shedule')
def checkGroupExists(self, groupName: str, l9Id: str) -> str:
@ -62,8 +63,9 @@ class Shedule_DB:
else:
return 'Empty'
def loadShedule(self, groupId, date, first_week):
week = date.isocalendar()[1] - first_week
def loadShedule(self, groupId: str, date: datetime.datetime):
"""Загрузка расписания"""
week = date.isocalendar()[1] - self.first_week
self.db.execute(
f'DELETE FROM `lessons` WHERE WEEK(`begin`, 1) = {date.isocalendar()[1]} AND groupId = {groupId};'
@ -81,3 +83,97 @@ class Shedule_DB:
for l in lessons:
self.l9lk.db.insert('lessons', l)
def getGroups(self, l9Id: str):
groups = self.db.execute(
(
f'SELECT g.groupId, groupName FROM '
f'`groups_users` AS gu JOIN `groups` AS g '
'ON gu.groupId=g.groupId WHERE '
f'l9Id = {l9Id}'
)
).fetchall()
return groups if groups != [] else None
def getLesson(self, lessonId):
icons = {'other': '📙', 'lect': '📗', 'lab': '📘', 'pract': '📕'}
lesson = self.db.get('lessons', f'lessonId = {lessonId}')
if lesson != []:
lesson = lesson[0]
teacher = None
if lesson[12] != None:
teacher = self.db.get(
'teachers', f'teacherId = {lesson[12]}'
)
if teacher != None and teacher != []:
info = teacher[0]
teacher = f"{info[1]} {info[2][0]}.{info[3][0]}."
json_lesson = {
'numInDay': lesson[5],
'type': icons[lesson[7]],
'name': lesson[8],
'place': lesson[13],
'teacher': teacher,
'add_info': lesson[14],
'begin': lesson[10],
'end': lesson[11],
}
return json_lesson
else:
return {'empty'}
def strLesson(self, lessonIds):
lesson = [self.getLesson(i) for i in lessonIds]
begin = lesson[0]['begin']
end = lesson[0]['end']
text = "\n📆 %02i:%02i - %02i:%02i" % (
begin.hour,
begin.minute,
end.hour,
end.minute,
)
for l in lesson:
add_info = "" if l['add_info'] == None else "\n" + l['add_info']
teacher = "" if l['teacher'] == None else "\n👤 " + l['teacher']
place = "" if l['place'] == None else f"\n🧭 {l['place']}"
text += f"\n{l['type']} {l['name']}{place}{teacher}{add_info}\n"
return text
def nearLesson(self, date: datetime.datetime, l9Id: str, retry=False):
str_time = date.isoformat(sep=' ')
groupIds = self.getGroups(l9Id)
if groupIds != None:
second_gr = (
f' OR groupId = {groupIds[1][0]}'
if len(groupIds) == 2
else ''
)
lessonId = self.db.get(
'lessons',
f"(groupId = {groupIds[0][0]}{second_gr}) AND `end` > '{str_time}' "
'ORDER BY `begin` LIMIT 2',
['lessonId, begin'],
)
if lessonId != []:
if len(lessonId) == 2 and lessonId[0][1] == lessonId[1][1]:
return self.strLesson([lessonId[0][0], lessonId[1][0]])
else:
return self.strLesson([lessonId[0][0]])
elif not retry:
for groupId in [i for i in groupIds if i[0] > 1000]:
self.loadShedule(
groupId[0], date + datetime.timedelta(days=7)
)
return self.nearLesson(date, l9Id, retry=True)

View File

@ -43,7 +43,8 @@ CREATE TABLE IF NOT EXISTS `groups_users` (
CONSTRAINT `gr_gu` FOREIGN KEY (`groupId`) REFERENCES `groups` (`groupId`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `l9_gu` FOREIGN KEY (`l9Id`) REFERENCES `users` (`l9Id`) ON DELETE CASCADE ON UPDATE CASCADE
);
-- Преподаватели
CREATE TABLE IF NOT EXISTS `teachers` (
`teacherId` bigint NOT NULL,
@ -57,6 +58,7 @@ CREATE TABLE IF NOT EXISTS `teachers` (
PRIMARY KEY (`teacherId`)
);
-- Занятия
CREATE TABLE IF NOT EXISTS `lessons` (
`lessonId` bigint NOT NULL AUTO_INCREMENT,
@ -73,10 +75,15 @@ CREATE TABLE IF NOT EXISTS `lessons` (
-- '0' - занятие НЕ отменено
-- '`l9Id`' - занятие отменено пользователем
`migrated` bigint DEFAULT '0',
-- Отметка, является ли занятие перенесённым
`migratedTo` bigint DEFAULT '0',
-- Отметка, является ли занятие перенесённым КУДА-ТО
-- '0' - занятие НЕ перенесено
-- '`lessonId`' - занятие перенесено на другое время
`migratedFrom` bigint DEFAULT '0',
-- Отметка, является ли занятие перенесённым ОТКУДА-ТО
-- '0' - занятие НЕ перенесено
-- '`lessonId`' - занятие перенесено c другой пары
`numInDay` int DEFAULT '1',
-- Порядковый номер занятия в текущем дне

View File

@ -28,4 +28,7 @@ loading=Загружаю расписание...
loaded=Расписание загружено!
nogroup=Возможно, ты написал не ту группу, попробуй снова
nogroup=Возможно, ты написал не ту группу, попробуй снова
[shedule]
near=Ближайшая пара