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')
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))
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))
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)
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
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
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
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
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")