Добавлено: ближайшая пара
Исправлено: поломка MySQL после инициализации БД
This commit is contained in:
parent
1a3f9fb4c4
commit
6158af655c
24
bot.py
24
bot.py
|
@ -82,7 +82,7 @@ class Bot:
|
||||||
tgId = query.from_user.id
|
tgId = query.from_user.id
|
||||||
|
|
||||||
if 'conf' in tag:
|
if 'conf' in tag:
|
||||||
self.confirmGroup(query, tag)
|
self.confirmGroup(query, tag, l9Id)
|
||||||
|
|
||||||
if update.message:
|
if update.message:
|
||||||
query = update.message
|
query = update.message
|
||||||
|
@ -96,6 +96,16 @@ class Bot:
|
||||||
elif tag == 'add':
|
elif tag == 'add':
|
||||||
self.addGroup(l9Id, query)
|
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 == 'Отмена':
|
elif query.text == 'Отмена':
|
||||||
# TODO: прописать отмену при отсутствующих группах
|
# TODO: прописать отмену при отсутствующих группах
|
||||||
self.tg_db.changeTag(tgId, 'ready')
|
self.tg_db.changeTag(tgId, 'ready')
|
||||||
|
@ -177,14 +187,18 @@ class Bot:
|
||||||
reply_markup=Keyboard.cancel(),
|
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
|
tgId = query.from_user.id
|
||||||
self.answer(query)
|
self.answer(query)
|
||||||
if query.data == 'yes':
|
if query.data == 'yes':
|
||||||
self.edit(query, loc['group']['loading'])
|
self.edit(query, loc['group']['loading'])
|
||||||
self.shedule.loadShedule(
|
self.shedule.loadShedule(tag[5:], query.message.date)
|
||||||
tag[5:], query.message.date, config['first_week']
|
self.shedule.db.insert(
|
||||||
|
'groups_users',
|
||||||
|
{'l9Id': l9Id, 'groupId': tag[5:]},
|
||||||
)
|
)
|
||||||
self.edit(query, loc['group']['loaded'], Keyboard.menu())
|
self.edit(query, loc['group']['loaded'], Keyboard.menu())
|
||||||
self.tg_db.changeTag(tgId, 'ready')
|
self.tg_db.changeTag(tgId, 'ready')
|
||||||
|
@ -203,7 +217,7 @@ if __name__ == "__main__":
|
||||||
config = loadJSON("config")
|
config = loadJSON("config")
|
||||||
l9lk = L9_DB(**config['sql'])
|
l9lk = L9_DB(**config['sql'])
|
||||||
tg_db = TG_DB(l9lk)
|
tg_db = TG_DB(l9lk)
|
||||||
shedule = Shedule_DB(l9lk)
|
shedule = Shedule_DB(l9lk, config['first_week'])
|
||||||
bot = Bot(
|
bot = Bot(
|
||||||
config['tg']['token'], l9lk, tg_db, shedule, config['tg']['limit']
|
config['tg']['token'], l9lk, tg_db, shedule, config['tg']['limit']
|
||||||
)
|
)
|
||||||
|
|
|
@ -42,8 +42,8 @@ class Database:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
with open(f'database/{filename}.sql', encoding='utf-8') as f:
|
with open(f'database/{filename}.sql', encoding='utf-8') as f:
|
||||||
query = f.read()
|
query = f.read().split('\n\n\n')
|
||||||
return self.execute(query, commit).fetchall()
|
return [self.execute(i, commit) for i in query]
|
||||||
|
|
||||||
def initDatabase(self, name: str):
|
def initDatabase(self, name: str):
|
||||||
"""Создать базу данных, если таковая отсутствует,
|
"""Создать базу данных, если таковая отсутствует,
|
||||||
|
|
|
@ -8,9 +8,10 @@ import datetime
|
||||||
class Shedule_DB:
|
class Shedule_DB:
|
||||||
"""Класс взаимодействия с базой расписания"""
|
"""Класс взаимодействия с базой расписания"""
|
||||||
|
|
||||||
def __init__(self, l9lk: L9_DB):
|
def __init__(self, l9lk: L9_DB, first_week):
|
||||||
self.l9lk = l9lk
|
self.l9lk = l9lk
|
||||||
self.db = l9lk.db
|
self.db = l9lk.db
|
||||||
|
self.first_week = first_week
|
||||||
self.db.executeFile('shedule')
|
self.db.executeFile('shedule')
|
||||||
|
|
||||||
def checkGroupExists(self, groupName: str, l9Id: str) -> str:
|
def checkGroupExists(self, groupName: str, l9Id: str) -> str:
|
||||||
|
@ -62,8 +63,9 @@ class Shedule_DB:
|
||||||
else:
|
else:
|
||||||
return 'Empty'
|
return 'Empty'
|
||||||
|
|
||||||
def loadShedule(self, groupId, date, first_week):
|
def loadShedule(self, groupId: str, date: datetime.datetime):
|
||||||
week = date.isocalendar()[1] - first_week
|
"""Загрузка расписания"""
|
||||||
|
week = date.isocalendar()[1] - self.first_week
|
||||||
|
|
||||||
self.db.execute(
|
self.db.execute(
|
||||||
f'DELETE FROM `lessons` WHERE WEEK(`begin`, 1) = {date.isocalendar()[1]} AND groupId = {groupId};'
|
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:
|
for l in lessons:
|
||||||
self.l9lk.db.insert('lessons', l)
|
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)
|
||||||
|
|
|
@ -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 `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
|
CONSTRAINT `l9_gu` FOREIGN KEY (`l9Id`) REFERENCES `users` (`l9Id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
-- Преподаватели
|
-- Преподаватели
|
||||||
CREATE TABLE IF NOT EXISTS `teachers` (
|
CREATE TABLE IF NOT EXISTS `teachers` (
|
||||||
`teacherId` bigint NOT NULL,
|
`teacherId` bigint NOT NULL,
|
||||||
|
@ -57,6 +58,7 @@ CREATE TABLE IF NOT EXISTS `teachers` (
|
||||||
PRIMARY KEY (`teacherId`)
|
PRIMARY KEY (`teacherId`)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
-- Занятия
|
-- Занятия
|
||||||
CREATE TABLE IF NOT EXISTS `lessons` (
|
CREATE TABLE IF NOT EXISTS `lessons` (
|
||||||
`lessonId` bigint NOT NULL AUTO_INCREMENT,
|
`lessonId` bigint NOT NULL AUTO_INCREMENT,
|
||||||
|
@ -73,10 +75,15 @@ CREATE TABLE IF NOT EXISTS `lessons` (
|
||||||
-- '0' - занятие НЕ отменено
|
-- '0' - занятие НЕ отменено
|
||||||
-- '`l9Id`' - занятие отменено пользователем
|
-- '`l9Id`' - занятие отменено пользователем
|
||||||
|
|
||||||
`migrated` bigint DEFAULT '0',
|
`migratedTo` bigint DEFAULT '0',
|
||||||
-- Отметка, является ли занятие перенесённым
|
-- Отметка, является ли занятие перенесённым КУДА-ТО
|
||||||
-- '0' - занятие НЕ перенесено
|
-- '0' - занятие НЕ перенесено
|
||||||
-- '`lessonId`' - занятие перенесено на другое время
|
-- '`lessonId`' - занятие перенесено на другое время
|
||||||
|
|
||||||
|
`migratedFrom` bigint DEFAULT '0',
|
||||||
|
-- Отметка, является ли занятие перенесённым ОТКУДА-ТО
|
||||||
|
-- '0' - занятие НЕ перенесено
|
||||||
|
-- '`lessonId`' - занятие перенесено c другой пары
|
||||||
|
|
||||||
`numInDay` int DEFAULT '1',
|
`numInDay` int DEFAULT '1',
|
||||||
-- Порядковый номер занятия в текущем дне
|
-- Порядковый номер занятия в текущем дне
|
||||||
|
|
|
@ -28,4 +28,7 @@ loading=Загружаю расписание...
|
||||||
|
|
||||||
loaded=Расписание загружено!
|
loaded=Расписание загружено!
|
||||||
|
|
||||||
nogroup=Возможно, ты написал не ту группу, попробуй снова
|
nogroup=Возможно, ты написал не ту группу, попробуй снова
|
||||||
|
|
||||||
|
[shedule]
|
||||||
|
near=Ближайшая пара
|
Reference in New Issue