def __init__(self, event): self.req, self.rec, self.hwc, self.hwa = False, False, False, False self.Vk = Vk() self.Users = UserBase() self.Settings = SettingsBase() self.Schedules = ScheduleBase() self.UserLogger = GetCustomLogger( 'UserLogger', f'userlogs/{event.obj.message["peer_id"]}') self.UserLogger.info( f'info:\n' f'now - {pendulum.now()}\n' f'today - {GetTodayDate()}\n' f'tomorrow_schedule - {GetScheduleTomorrow(pendulum.tomorrow(TZ))}\n' f'schedule_date - {GetScheduleDate()}') if not SettingsBase().GetSettings()['offline']: if event.obj.message['text']: self.Message(event) else: self.NoText(event) else: self.Vk.MessageSend(event.obj.message['peer_id'], Answers.OFFLINE) self.Users.IncreaseParameters(event.obj.message['peer_id'], requests=self.req, received=self.rec, hw_check=self.hwc, hw_add=self.hwa)
def GetSchedule(schedule_date, cls='main', static=False): SB = ScheduleBase() if Config.STATIC and static: if datetime.strptime(schedule_date, '%d.%m.%Y').weekday() != 6: return SB.GetAttachment( Utilities.STATIC[datetime.strptime(schedule_date, '%d.%m.%Y').weekday()], cls) return None if SettingsBase().GetSettings(schedule_date)['main_replace'] == 1: cls = 'main' if CheckSchedule(schedule_date, cls): if SB.GetAttachment(schedule_date, cls): return SB.GetAttachment(schedule_date, cls) else: if cls == 'main': if not path.exists(Config.PATH + f'work/source/{schedule_date}.png'): DownloadScheduleFromSite(schedule_date) UploadSchedule( Config.PATH + f'work/source/{schedule_date}.png', schedule_date, cls) else: counter = 0 while not path.exists( Config.PATH + f'work/schedules/{schedule_date}/{cls}.png' ) and counter < 10: sleep(1) counter += 1 UploadSchedule( Config.PATH + f'work/schedules/{schedule_date}/{cls}.png', schedule_date, cls) return SB.GetAttachment(schedule_date, cls) SB.DeleteSchedule(schedule_date) return None
def DownloadScheduleFromSite(schedule_date, upd=True): if CheckAvailabilityOnSite(schedule_date): name = schedule_date + ".png" url = Config.SCHEDULE_LINK + name p = requests.get(url) out = open(Config.PATH + f'work/source/{name}', "wb") out.write(p.content) out.close() if upd: UpdateTimeMainWatermark(schedule_date) ScheduleBase().MainUpdate(schedule_date, pendulum.now(TZ)) return True return False
def CropAllClasses(date): ScheduleBase().ClassesUpdate(date, pendulum.now(TZ)) if not path.exists(Config.PATH + f'work/schedules/{date}'): mkdir(Config.PATH + f'work/schedules/{date}') try: img = Image.open(Config.PATH + f'work/source/{date}.png').convert('RGB') marking = FindClasses(img) for cls in Utilities.CLASSES: Watermarks(CropClass(img, cls, marking), date).save(Config.PATH + f'work/schedules/{date}/{cls}.png') except FileNotFoundError: remove(Config.PATH + f'work/schedules/{date}')
def CheckSchedule(schedule_date, cls='main'): if (cls != 'main' and path.exists(Config.PATH + f'work/schedules/{schedule_date}/{cls}.png') ) or ScheduleBase().GetAttachment(schedule_date, cls): return True else: if UpdateSchedule(schedule_date).UpdateAll(): return True if cls == 'main' and path.exists(Config.PATH + f'work/source/{schedule_date}.png'): return True else: if CheckAvailabilityOnSite(schedule_date): return True return False
def UploadSchedule(path_to_schedule, date, cls): SB = ScheduleBase() SB.NewSchedule(date) VK = Vk() attachment = VK.UploadAttachmentPhoto(path_to_schedule) SB.UploadedClass(date, cls, attachment)
def MainMenu(self, event): user_id = event.obj.message['peer_id'] message = event.obj.message['text'] user_info = self.Users.GetUserInfo(user_id) if message.lower() == 'онлайн на сегодня': self.req = True self.UserLogger.info(f'Запрошено онлайн распсиание на сегодня') cls = user_info['cls'] date = GetTodayDate() if ScheduleBase().GetReplace(date): cls = 'main' schedule = GetSchedule(date, cls) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') self.Vk.MessageSend(user_id, Answers.GIVE_TODAY_ONLINE, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TODAY_NONE) elif message.lower() == 'онлайн на завтра': self.req = True self.UserLogger.info(f'Запрошено онлайн распсиание на завтра') cls = user_info['cls'] date = GetScheduleTomorrow(pendulum.tomorrow(TZ)) if ScheduleBase().GetReplace(date): cls = 'main' schedule = GetSchedule(date, cls) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') if pendulum.today(tz=Utilities.TZ).weekday() == 5: self.Vk.MessageSend(user_id, Answers.GIVE_MONDAY, attachment=schedule) else: self.Vk.MessageSend(user_id, Answers.GIVE_TOMORROW_ONLINE, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TOMORROW_NONE) elif message.lower() == 'на сегодня': self.req = True self.UserLogger.info(f'Запрошено распсиание на сегодня') cls = user_info['cls'] date = GetTodayDate() if ScheduleBase().GetReplace(date): cls = 'main' schedule = GetSchedule(date, cls, static=True) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') self.Vk.MessageSend(user_id, Answers.GIVE_TODAY, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TODAY_NONE) elif message.lower() == 'на завтра': self.req = True self.UserLogger.info(f'Запрошено распсиание на завтра') cls = user_info['cls'] date = GetScheduleTomorrow(pendulum.tomorrow(TZ)) if ScheduleBase().GetReplace(date): cls = 'main' schedule = GetSchedule(date, cls, static=True) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') if pendulum.today(tz=Utilities.TZ).weekday() == 5: self.Vk.MessageSend(user_id, Answers.GIVE_MONDAY, attachment=schedule) else: self.Vk.MessageSend(user_id, Answers.GIVE_TOMORROW, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TOMORROW_NONE) elif message.lower() == 'общее на сегодня': self.req = True self.UserLogger.info(f'Запрошено общее распсиание на сегодня') cls = 'main' date = GetTodayDate() schedule = GetSchedule(date, cls) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') self.Vk.MessageSend(user_id, Answers.GIVE_TODAY, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TODAY_NONE) elif message.lower() == 'общее на завтра': self.req = True self.UserLogger.info(f'Запрошено общее распсиание на завтра') cls = 'main' date = GetScheduleTomorrow(pendulum.tomorrow(TZ)) schedule = GetSchedule(date, cls) if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') if pendulum.today(tz=Utilities.TZ).weekday() == 5: self.Vk.MessageSend(user_id, Answers.GIVE_MONDAY, attachment=schedule) else: self.Vk.MessageSend(user_id, Answers.GIVE_TOMORROW, attachment=schedule) else: self.UserLogger.info(f'Расписание не отправлено') self.Vk.MessageSend(user_id, Answers.TOMORROW_NONE) elif message.lower( ) == 'гд': # ToDo: Сделать DialogFlow, либо изменить вид, выглядит так себе self.Vk.MessageSend( user_id, f'Гугл-Диск {self.Users.GetUserInfo(user_id)["cls"]} класса:\n' + Utilities.GD[self.Users.GetUserInfo(user_id)['cls']] + f'\n\nОбщий Гугл-диск:\n' + Utilities.GD['main']) elif message.lower() == 'звонки': self.req = True self.rec = True self.UserLogger.info(f'Запрос звонков') self.Vk.MessageSend( user_id, message=f'Держи расписание звонков на {GetScheduleDate()}', attachment=GetRings(GetScheduleDate())) elif message.lower() == 'дз': self.UserLogger.info(f'Вход в дневник') if self.Settings.GetSettings()['diary']: self.Users.SetUserParameters(user_id, state=4) self.Vk.MessageSend(user_id, 'Дневник (?)', keyboard=Keyboard.HomeworkKeyboard()) else: self.Vk.MessageSend(user_id, 'Прости, но дневник сейчас не работает 😥') elif message.lower() == 'настройки': self.UserLogger.info(f'Вход в настройки') self.Users.SetUserParameters(user_id, state=3) self.Vk.MessageSend(user_id, 'Меню настроек', keyboard=Keyboard.SettingsKeyboard( self.Users.GetUserInfo(user_id))) elif message.lower()[:4] == 'инфо': info, date, cls = DialogFlow().SendRequest(message).split() date = Utilities.GetFormat(date) self.UserLogger.info( f'Запрошена информация о расписании на {date}') self.Vk.MessageSend(user_id, ScheduleInfo(date, cls)) else: answer = DialogFlow().SendRequest(message) if 'system' in answer: self.req = True answer = answer.replace('today', GetTodayDate()) cls, date = answer.upper().split()[1:] date = Utilities.GetFormat(date) if ScheduleBase().GetReplace(date): cls = 'main' schedule = GetSchedule( date, cls.replace('ОБЩЕЕ', 'main').replace('USER_CLASS', user_info['cls'])) self.UserLogger.info(f'Запрошено распсиание на {date}') if schedule: self.rec = True self.UserLogger.info(f'Расписание отправлено') self.Vk.MessageSend(user_id, f'Держи расписание на {date}', attachment=schedule) else: self.UserLogger.info(f'Распсиание не найдено') self.Vk.MessageSend( user_id, f'Прости, но расписания на {date} нигде нет\nИспользуй команду "Инфо <дата>" для подробностей' ) elif 'homework' in answer and False: date = Utilities.GetFormat( answer.replace('today', GetTodayDate()).replace('homework ', '')) self.UserLogger.info(f'Запрошено ДЗ на {date}') self.Vk.MessageSend( user_id, f'Домашнее задание {user_info["cls"]} класса на {date}:\n' + HomeworkBase().GetHomework(date, user_info["cls"])) elif answer == 'мат': # TODO: Поработать над обработкой intents pass elif answer in 'Рад быть полезным 😉 Всегда к вашим услугам 🙂 Пожалуйста! Обращайся еще 🤗 С любовью, ScheduleFlow 🥰 Стараюсь для вас! 😀 Всегда пожалуйста 😉': self.Vk.MessageSend(user_id, answer)
def SettingsHandler(self, message: str): if message == Config.PREFIX + 'выход': self.Vk.MessageSend(Config.CONSOLE, keyboard=MainMenu(), message='Основное меню') self.ConsoleBase.ChangeState(0) return None elif message == Config.PREFIX + 'онлайн' and not self.SettingsBase.GetSettings( )['offline']: self.SettingsBase.ChangeSettings(parameters={'offline': 1}) Logger.info('Включен онлайн бота') elif message == Config.PREFIX + 'оффлайн' and self.SettingsBase.GetSettings( )['offline']: self.SettingsBase.ChangeSettings(parameters={'offline': 0}) Logger.info('Выключен онлайн бота') elif message == Config.PREFIX + 'рассылка вкл' and self.SettingsBase.GetSettings( )['auto_distribution']: self.SettingsBase.ChangeSettings( parameters={'auto_distribution': 0}) Logger.info('Авто-рассылка включена') elif message == Config.PREFIX + 'рассылка выкл' and not self.SettingsBase.GetSettings( )['auto_distribution']: self.SettingsBase.ChangeSettings( parameters={'auto_distribution': 1}) Logger.info('Авто-рассылка выключена') elif message == Config.PREFIX + 'обновление вкл' and self.SettingsBase.GetSettings( )['auto_update']: self.SettingsBase.ChangeSettings(parameters={'auto_update': 0}) Logger.info('Авто-обновление включено') elif message == Config.PREFIX + 'обновление выкл' and not self.SettingsBase.GetSettings( )['auto_update']: self.SettingsBase.ChangeSettings(parameters={'auto_update': 1}) Logger.info('Авто-обновление выключено') elif message == Config.PREFIX + 'замена общим вкл' and self.SettingsBase.GetSettings( )['main_replace']: self.SettingsBase.ChangeSettings(parameters={'main_replace': 0}) ScheduleBase().Replace(GetScheduleDate()) Logger.info('Замена общим включена') elif message == Config.PREFIX + 'замена общим выкл' and not self.SettingsBase.GetSettings( )['main_replace']: self.SettingsBase.ChangeSettings(parameters={'main_replace': 1}) ScheduleBase().UnReplace(GetScheduleDate()) Logger.info('Замена общим выключена') elif message == Config.PREFIX + 'дневник вкл' and self.SettingsBase.GetSettings( )['diary']: self.SettingsBase.ChangeSettings(parameters={'diary': 0}) Logger.info('Дневник включен') elif message == Config.PREFIX + 'дневник выкл' and not self.SettingsBase.GetSettings( )['diary']: self.SettingsBase.ChangeSettings(parameters={'diary': 1}) Logger.info('Дневник выключен') elif message == Config.PREFIX + 'сброс': self.SettingsBase.ChangeSettings( parameters={ 'auto_update': 1, 'main_replace': 0, 'offline': 0, 'diary': 0, 'auto_distribution': 0 }) self.Vk.MessageSend(Config.CONSOLE, keyboard=Settings(), message='Меню настроек')
def CommandHandler(self, message: str): if message.replace('@', '') == Config.PREFIX + 'настройки': self.Vk.MessageSend(Config.CONSOLE, keyboard=Settings(), message='Меню настроек') self.ConsoleBase.ChangeState(1) elif 'статистика' in message.lower(): self.Vk.ConsoleMessage(ScheduleFlowInfo()) elif 'обновить на сегодня' in message.lower(): date = GetTodayDate() self.ScheduleUpdate(date) elif 'обновить на завтра' in message.lower(): date = GetScheduleTomorrow(pendulum.tomorrow(TZ)) self.ScheduleUpdate(date) elif message.replace('@', '') == Config.PREFIX + 'проверить наличие': self.Vk.ConsoleMessage(ParseFast()) elif message[:11] == 'обновить на': date_arg = DialogFlow().SendRequest(message).lstrip('update') year, month, day = list(map(int, date_arg.split('-'))) date = pendulum.date(year, month, day).__format__(Utilities.FORMAT) self.ScheduleUpdate(date) elif message[:14] == 'общая рассылка': ConsoleTemp.Distribute = 'all' ConsoleTemp.Text = message[15:] self.Vk.ConsoleMessage(Distribution()) self.ConsoleBase.ChangeState(2) elif message[:18] == 'рассылка по классу': ConsoleTemp.Distribute = message[19:].split(' ')[0] ConsoleTemp.Text = ' '.join( message[19:].split(' ')[1:]).capitalize() self.Vk.ConsoleMessage(Distribution()) self.ConsoleBase.ChangeState(2) elif message[:21] == 'рассылка по параллели': ConsoleTemp.Distribute = message[22:].split(' ')[0] ConsoleTemp.Text = ' '.join( message[12:].split(' ')[1:]).capitalize() self.Vk.ConsoleMessage(Distribution()) self.ConsoleBase.ChangeState(2) elif message[:19] == 'рассылка расписания': if '_' not in message: date = GetScheduleTomorrow(pendulum.tomorrow(TZ)) else: date = message.lstrip('рассылка расписания_') if GetSchedule(date, '11А'): ConsoleTemp.Date = date self.ConsoleBase.ChangeState(3) self.Vk.ConsoleMessage( f'Введите "Да, выполнить" для подтверждения рассылки расписания на {date}' ) self.Vk.MessageSend(Config.CONSOLE, 'Расписание:', attachment=GetSchedule(date, '11А')) else: self.Vk.ConsoleMessage(f'Расписания на {date} нет!') elif message[:4] == 'инфо': if message[5:].replace(' ', '').isdigit(): uid = int(message[5:].replace(' ', '')) info = self.UserBase.GetUserInfo(uid) self.Vk.ConsoleMessage(UserInfo(info)) else: name, last = self.originalText[5:].split(' ') info = self.UserBase.GetUserInfoByName(name, last) self.Vk.ConsoleMessage(UserInfo(info)) elif message[:6] == 'замена': replace_date = message[7:].replace('общим на ', '') ScheduleBase().Replace(replace_date) self.Vk.ConsoleMessage( f'Замена общим на {replace_date} активирована!') elif message[:13] == 'отмена замены': replace_date = message[14:].lstrip('общим на ') ScheduleBase().UnReplace(replace_date) ScheduleBase().DeleteSchedule(replace_date) self.Vk.ConsoleMessage(f'Замена общим на {replace_date} отменена!') elif 'не отслеживать' in message.lower(): date = message.lower().lstrip('не отслеживать') ParseBase().DeleteFromParse(date) self.Vk.ConsoleMessage(f'Расписание на {date} не отслеживается') elif 'отслеживать' in message.lower(): date = message.lower().lstrip('отслеживать ') ParseBase().AddToParse(date) self.Vk.ConsoleMessage(f'Отслеживается расписание на {date}') elif 'список отслеживания' in message.lower(): self.Vk.ConsoleMessage( 'Список отслеживаемых расписаний:\n' + '\n'.join(sorted(ParseBase().GetParseSchedules()))) elif 'удалить дз' in message.lower(): cls, date = message.lower().lstrip('удалить дз').upper().replace( ',', '').split(' ') HomeworkBase().DeleteHomework(date, cls) self.Vk.ConsoleMessage('ДЗ удалено!') elif 'редирект' in message.lower(): date = message.lstrip('редирект на') if date != 'сброс': Config.REDIRECT_DATE = date else: Config.REDIRECT_DATE = 0 elif 'sql' in message: self.Vk.ConsoleMessage(f'{self.UserBase.SQL(message[4:])}')