async def _reminder(message, command, silent=False): """Print information about reminder Example: !reminder 1""" if not await Util.check_args_count( message, command, silent, min=2, max=2): return index = await Util.parse_int( message, command[1], f"Second parameter for '{command[0]}' should be an index of reminder", silent) if index is None: return if index not in bc.config.reminders.keys(): return null(await Msg.response(message, "Invalid index of reminder!", silent)) reminder = bc.config.reminders[index] e = DiscordEmbed() e.title("Reminder info") e.description(reminder.message) e.footer( f"{reminder.author} • {datetime.datetime.strptime(reminder.time, const.REMINDER_DATETIME_FORMAT)}" ) e.add_field("Index", str(index), True) e.add_field("Channel", f"<#{reminder.channel_id}>", True) if reminder.repeat_after: e.add_field( "Repeats every", f"{reminder.repeat_after} {reminder.repeat_interval_measure}", True) e.add_field("Created", reminder.time_created, True) if reminder.prereminders_list: e.add_field( "Pre reminders (in minutes)", ', '.join([str(x) for x in reminder.prereminders_list]), True) if reminder.notes: e.add_field("Notes", reminder.notes, True) await Msg.response(message, None, silent, embed=e.get())
async def _process_reminders_iteration(self) -> None: log.debug3("Reminder processing iteration has started") now = datetime.datetime.now().replace(second=0).strftime( const.REMINDER_DATETIME_FORMAT) to_remove = [] to_append = [] reminder_do_not_update_flag = False for key, rem in self.config.reminders.items(): for i in range(len(rem.prereminders_list)): prereminder = rem.prereminders_list[i] used_prereminder = rem.used_prereminders_list[i] if prereminder == 0 or used_prereminder: continue prereminder_time = (datetime.datetime.now().replace(second=0) + datetime.timedelta(minutes=prereminder)) if rem == prereminder_time.strftime( const.REMINDER_DATETIME_FORMAT): channel = self.get_channel(rem.channel_id) e = DiscordEmbed() clock_emoji = get_clock_emoji( datetime.datetime.now().strftime("%H:%M")) e.title(f"{prereminder} minutes left until reminder") e.description(rem.message + "\n" + rem.notes) e.color(random.randint(0x000000, 0xffffff)) e.timestamp( datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=prereminder)) e.footer(text=rem.author) await channel.send("", embed=e.get()) rem.used_prereminders_list[i] = True if rem == now: channel = self.get_channel(rem.channel_id) clock_emoji = get_clock_emoji( datetime.datetime.now().strftime("%H:%M")) e = DiscordEmbed() e.title(f"{clock_emoji} You asked to remind") e.description(rem.message + "\n" + rem.notes) e.color(random.randint(0x000000, 0xffffff)) e.timestamp(datetime.datetime.now(datetime.timezone.utc)) e.footer(text=rem.author) await channel.send( ' '.join(rem.ping_users if rem.ping_users else ""), embed=e.get()) for user_id in rem.whisper_users: await Msg.send_direct_message( self.get_user(user_id), f"You asked to remind at {now} -> {rem.message}", False) if rem.email_users: mail = Mail(self.secret_config) mail.send( rem.email_users, f"Reminder: {rem.message}", f"You asked to remind at {now} -> {rem.message}") if rem.repeat_after > 0: new_time = datetime.datetime.now().replace( second=0, microsecond=0) + rem.get_next_event_delta() new_time = new_time.strftime( const.REMINDER_DATETIME_FORMAT) to_append.append( Reminder(str(new_time), rem.message, rem.channel_id, rem.author, rem.time_created)) to_append[-1].repeat_after = rem.repeat_after to_append[ -1].repeat_interval_measure = rem.repeat_interval_measure to_append[-1].prereminders_list = rem.prereminders_list to_append[-1].used_prereminders_list = [False] * len( rem.prereminders_list) to_append[-1].notes = rem.notes log.debug2( f"Scheduled renew of recurring reminder - old id: {key}" ) to_remove.append(key) elif rem < now: log.debug2(f"Scheduled reminder with id {key} removal") to_remove.append(key) else: prereminders_delay = 0 if rem.prereminders_list: prereminders_delay = max(rem.prereminders_list) if ((datetime.datetime.strptime( rem.time, const.REMINDER_DATETIME_FORMAT) - datetime.datetime.now()) < datetime.timedelta( minutes=(5 + prereminders_delay / 60))): reminder_do_not_update_flag = True bc.do_not_update[ DoNotUpdateFlag.REMINDER] = reminder_do_not_update_flag for key in to_remove: self.config.reminders.pop(key) for item in to_append: key = self.config.ids["reminder"] self.config.reminders[key] = item self.config.ids["reminder"] += 1 log.debug3("Reminder processing iteration has finished")