Example #1
0
    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)
Example #2
0
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
Example #3
0
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
Example #4
0
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}')
Example #5
0
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
Example #6
0
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)
Example #7
0
    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)
Example #8
0
    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='Меню настроек')
Example #9
0
    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:])}')