Example #1
0
 def send_announcements(self, context):
     anns = announcements.get_announcements()
     if not anns:
         return
     settingsrepo = UserSettingsRepo()
     chats = settingsrepo.get_all()
     logging.info('Sending announcements to %d chats', len(chats))
     for ann in anns:
         for chat in chats:
             try:
                 context.bot.send_message(chat_id=chat.chat_id,
                                          parse_mode=ParseMode.HTML,
                                          text=ann['msg'])
                 os_time.sleep(0.1)
             except telegram.error.Unauthorized as e:
                 logging.warning(e)
                 settingsrepo.delete(chat)
             except telegram.error.ChatMigrated as e:
                 old = chat.chat_id
                 chat.chat_id = e.new_chat_id
                 settingsrepo.update(chat)
                 logging.info("Updated chat_id %d to %d", old, chat.chat_id)
             except Exception as e:
                 logging.exception(e)
         announcements.set_sent(ann)
     announcements.save_sent()
     settingsrepo.close()
     logging.info('Done sending announcements')
Example #2
0
 def send_schedule(self, update, context, schedule_type):
     settingsrepo = UserSettingsRepo()
     try:
         settings = settingsrepo.get(update.effective_chat.id)
         settingsrepo.close()
     except ChatNotFoundError:
         self.send(update, context, messages.NEED_SETUP)
         settingsrepo.close()
         return
     log_request(schedule_type, update.effective_chat.id,
                 settings.course_id, settings.year, settings.curricula)
     try:
         schedule = get_schedule(settings.course_id, settings.year,
                                 settings.curricula)
     except NotSupportedError as ex:
         self.send(update, context,
                   messages.COURSE_NOT_SUPPORTED.format(ex.reason))
         return
     except Exception as ex:
         logging.exception(ex)
         self.send(update, context, messages.SCHEDULE_FETCH_ERROR)
         return
     schedule = getattr(schedule, schedule_type)()
     if not schedule.has_events():
         self.send(update, context, messages.NO_LESSONS)
         return
     self.send(update, context, schedule.tostring(with_date=True))
Example #3
0
 def cmd_exams(self, update, context):
     settingsrepo = UserSettingsRepo()
     try:
         setting = settingsrepo.get(update.effective_chat.id)
         settingsrepo.close()
     except ChatNotFoundError:
         self.send(update, context, messages.NEED_SETUP)
         settingsrepo.close()
         return
     log_request('exams', update.effective_chat.id, setting.course_id,
                 setting.year, setting.curricula)
     try:
         subjects = get_schedule(setting.course_id, setting.year,
                                 setting.curricula).subjects()
         exams = get_exams(setting.course_id).of_subjects(
             subjects, exclude_finished=True)
     except NotSupportedError as ex:
         self.send(update, context,
                   messages.COURSE_NOT_SUPPORTED.format(ex.reason))
         return
     except Exception as ex:
         logging.exception(ex)
         self.send(update, context, messages.FETCH_ERROR)
         return
     if not exams.has_exams():
         logging.warning(
             f'No exam found for course_id={setting.course_id} year={setting.year} curricula={setting.curricula}'
         )
         self.send(update, context, messages.NO_EXAMS)
         return
     self.send(update, context, exams.tostring(limit_per_subject=3))
Example #4
0
 def cmd_lastminute(self, update, context):
     settingsrepo = UserSettingsRepo()
     try:
         setting = settingsrepo.get(update.effective_chat.id)
         settingsrepo.close()
     except ChatNotFoundError:
         self.send(update, context, messages.NEED_SETUP)
         settingsrepo.close()
         return
     log_request('lastminute', update.effective_chat.id, setting.course_id,
                 setting.year, setting.curricula)
     course = get_courses().get(setting.course_id)
     if not course.has_lastminute():
         self.send(update, context, messages.NOT_SUPPORTED_LASTMINUTE)
         return
     try:
         news = lastminute.get_news(course.url_lastminute)
     except Exception as ex:
         logging.exception(ex)
         self.send(update, context, messages.FETCH_ERROR)
         return
     if not news:
         self.send(update, context, messages.NO_NEWS)
         return
     msg = '\n\n'.join(str(n) for n in news)
     self.send(update, context, msg)
Example #5
0
def step_start(update, context):
    settingsrepo = UserSettingsRepo()
    if not settingsrepo.has(update.effective_chat.id):
        send(update, context, messages.NEED_SETUP)
        settingsrepo.close()
        return ConversationHandler.END
    send(update, context, messages.REMINDME_START)
    settingsrepo.close()
    return STEP_TIME_SELECT
Example #6
0
def step_day_select(update, context):
    match = REGEX_DAY.search(update.message.text)
    if not match:
        send(update, context, messages.NOREMINDME_INVALID_DAY)
        return STEP_DAY_SELECT
    day, = match.groups()
    day = day.lower()

    settingsrepo = UserSettingsRepo()
    settings = settingsrepo.get(update.effective_chat.id)
    if day == 'oggi':
        settings.do_remind_today = False
    if day == 'domani':
        settings.do_remind_tomorrow = False

    settingsrepo.update(settings)
    settingsrepo.close()

    send(update, context, messages.NOREMINDME_OFF_DAY.format(day))
    return ConversationHandler.END
Example #7
0
def step_time_select(update, context):
    match = REGEX_TIME.search(update.message.text)
    if not match:
        send(update, context, messages.REMINDME_TIME_INVALID)
        return STEP_TIME_SELECT
    remind_type_str, hour, minute = match.groups()
    remind_type_str = remind_type_str.lower()

    if remind_type_str == '':
        remind_type = RemindType.TODAY
    else:
        if remind_type_str not in REMIND_TYPE_DICT:
            send(update, context, messages.REMINDME_TIME_INVALID)
            return STEP_TIME_SELECT
        remind_type = REMIND_TYPE_DICT[remind_type_str]

    time = time_from_string(hour, minute)
    if time is None:
        send(update, context, messages.REMINDME_TIME_INVALID)
        return STEP_TIME_SELECT

    settingsrepo = UserSettingsRepo()
    setting = settingsrepo.get(update.effective_chat.id)
    if remind_type == RemindType.TODAY:
        setting.do_remind_today = True
        setting.remind_time_today = time
        term_day = messages.TERM_TODAY
    elif remind_type == RemindType.TOMORROW:
        setting.do_remind_tomorrow = True
        setting.remind_time_tomorrow = time
        term_day = messages.TERM_TOMORROW
    settingsrepo.update(setting)
    settingsrepo.close()
    send(update, context,
         messages.REMINDME_END.format(term_day, time.strftime(TIME_FORMAT)))
    return ConversationHandler.END
Example #8
0
def step_start(update, context):
    settingsrepo = UserSettingsRepo()
    if not settingsrepo.has(update.effective_chat.id):
        send(update, context, messages.NEED_SETUP)
        settingsrepo.close()
        return ConversationHandler.END
    settings = settingsrepo.get(update.effective_chat.id)

    if settings.do_remind_today and settings.do_remind_tomorrow:
        send(update, context, messages.NOREMINDME_BOTH_ACTIVE)
        settingsrepo.close()
        return STEP_DAY_SELECT

    day = 'oggi' if settings.do_remind_today else 'domani'
    settings.do_remind_today = False
    settings.do_remind_tomorrow = False
    settingsrepo.update(settings)
    settingsrepo.close()

    send(update, context, messages.NOREMINDME_OFF_DAY.format(day))
    return ConversationHandler.END
Example #9
0
    def daily_schedule_tomorrow(self, context):
        now = datetime.now()
        if now.weekday() == 5:
            # don't send reminders on the weekend
            self.daily_schedule_tomorrow_last_run = now
            return
        settingsrepo = UserSettingsRepo()
        users = settingsrepo.get_to_remind_tomorrow()
        users = [u for u in users if isinstance(u.remind_time_tomorrow, time)]
        users = [
            u for u in users if self.daily_schedule_tomorrow_last_run <
            u.next_remind_time_tomorrow() <= now
        ]
        if not users:
            settingsrepo.close()
            return

        logging.info('Sending tomorrows schedule to %d users', len(users))
        for user in users:
            try:
                schedule = get_schedule(user.course_id, user.year,
                                        user.curricula)
                if now.weekday() == 6 and not schedule.next_week_has_lessons():
                    msg = "{}\n\n{}".format(messages.NO_LESSONS_WEEK,
                                            messages.NO_REMIND_THIS_WEEK)
                    context.bot.send_message(chat_id=user.chat_id,
                                             parse_mode=ParseMode.HTML,
                                             text=msg)
                    continue
                if now.weekday() != 6 and not schedule.week_has_lessons():
                    continue
                schedule = schedule.tomorrow()
                msg = "<b>{}</b>\n\n{{}}".format(
                    messages.YOUR_LESSONS_TOMORROW)
                if not schedule.has_events():
                    msg = msg.format(messages.NO_LESSONS)
                    context.bot.send_message(chat_id=user.chat_id,
                                             parse_mode=ParseMode.HTML,
                                             text=msg)
                    continue
                msg = msg.format(schedule.tostring(with_date=True))
                context.bot.send_message(chat_id=user.chat_id,
                                         parse_mode=ParseMode.HTML,
                                         text=msg)
                os_time.sleep(0.1)
            except NotSupportedError as ex:
                context.bot.send_message(
                    chat_id=user.chat_id,
                    parse_mode=ParseMode.HTML,
                    text=messages.COURSE_NOT_SUPPORTED.format(ex.reason))
            except telegram.error.Unauthorized as e:
                logging.warning(e)
                settingsrepo.delete(user)
            except telegram.error.ChatMigrated as e:
                old = user.chat_id
                user.chat_id = e.new_chat_id
                settingsrepo.update(user)
                logging.info("Updated chat_id %d to %d", old, user.chat_id)
            except Exception as e:
                logging.exception(e)

        self.daily_schedule_tomorrow_last_run = now
        settingsrepo.close()
        logging.info("Done sending tomorrow's schedule")