from datetime import time, timedelta, timezone, datetime, date import os from peewee import fn class RandomMemoryJob(): def __init__(self, models, bot, job_queue): self.models = models self.bot = bot # set the message sending time; include UTC shift +2 sending_time = time(hour=12, minute=00, second=0, tzinfo=timezone(timedelta(hours=2))) # context.job_queue.run_daily(self.callback_memory, sending_time, chat_id=chat_id) # job_queue.run_repeating(self.callback_memory, interval=10, first=sending_time) job_queue.run_once(self.callback_memory, timedelta(seconds=2)) async def callback_memory(self, context): # last_seen of memory must be older than 10 days in past or None possible_entries = self.models.JournalEntry.select().where( (datetime.today().date().year - self.models.JournalEntry.last_shown.year >= 0) | (self.models.JournalEntry.last_shown == None)).where( (datetime.today().date().month - self.models.JournalEntry.last_shown.month >= 0) | (self.models.JournalEntry.last_shown == None)).where( (datetime.today().date().day - self.models.JournalEntry.last_shown.day >= 0) | (self.models.JournalEntry.last_shown == None)).order_by(fn.Random()) # returns if all entries have been seen recently if len(possible_entries) == 0: print("Come back later for another memory.") return # update the last_shown of the chosen entry chosen_entry = possible_entries.get() # chosen_entry = self.models.JournalEntry.select().get() # chosen_entry.last_shown = date(year=2023, month=5, day=3) chosen_entry.last_shown = datetime.today().date() chosen_entry.save() chat_id = os.getenv("CHAT_ID") if chosen_entry.media_path: await self.bot.send_photo( chat_id = chat_id, photo = chosen_entry.media_path, caption = f"On {chosen_entry.date_pretty}, " f"{chosen_entry.author} wrote: \n" f"{chosen_entry.text}" ) else: await self.bot.send_message( chat_id = chat_id, text = f"On {chosen_entry.date_pretty}, " f"{chosen_entry.author} wrote: \n" f"{chosen_entry.text}" )