✨ Added periodic reminders and included alembic migration in container
This commit is contained in:
parent
86a5dd19b5
commit
1f1ae5077e
7 changed files with 61 additions and 11 deletions
|
@ -30,6 +30,13 @@ Session = sessionmaker(bind=engine)
|
|||
session = Session()
|
||||
|
||||
|
||||
@bot.listener.on_reaction_event
|
||||
def initial_schedule() -> None:
|
||||
users = session.query(User).filter(User.location != "").all()
|
||||
for user in users:
|
||||
schedule_reminder(user.username)
|
||||
|
||||
|
||||
|
||||
@bot.listener.on_message_event
|
||||
async def echo(room, message) -> None:
|
||||
|
@ -134,20 +141,26 @@ def get_praying_times(date: datetime.date, username) -> Dict[str, str]:
|
|||
def schedule_reminder(username) -> None:
|
||||
now = datetime.datetime.now(datetime.UTC)
|
||||
user = session.query(User).filter_by(username=username).one_or_none()
|
||||
# as a workaround until it's finished schedule the next 7 days
|
||||
for i in range(7):
|
||||
times = get_praying_times(datetime.date.today() + datetime.timedelta(days=i), username)
|
||||
for prayer, time in times.items():
|
||||
praying_time = datetime.datetime.fromisoformat(time)
|
||||
if praying_time > now:
|
||||
seconds = int((praying_time - now).total_seconds())
|
||||
message = "{} is at {}".format(prayer, praying_time.strftime("%H:%M"))
|
||||
asyncio.ensure_future(remind(username, message, seconds - user.reminder_time_in_minues * 60))
|
||||
user.current_reminder_date = datetime.date.today()
|
||||
session.add(user)
|
||||
session.commit()
|
||||
times = get_praying_times(datetime.date.today(), username)
|
||||
for prayer, time in times.items():
|
||||
praying_time = datetime.datetime.fromisoformat(time)
|
||||
if praying_time > now:
|
||||
# schedule praying times but skip the ones which already have been passed today
|
||||
seconds = int((praying_time - now).total_seconds())
|
||||
message = "{} is at {}".format(prayer, praying_time.strftime("%H:%M"))
|
||||
asyncio.ensure_future(remind(username, message, seconds - user.reminder_time_in_minues * 60))
|
||||
# save date of last schedule for user
|
||||
|
||||
|
||||
async def remind(username, message, seconds) -> None:
|
||||
await asyncio.sleep(seconds)
|
||||
user = session.query(User).filter_by(username=username).one_or_none()
|
||||
# check if a new reminder has to be scheduled
|
||||
if user.current_reminder_date < datetime.date.today():
|
||||
schedule_reminder(user.username)
|
||||
await bot.api.send_markdown_message(user.room_id, message)
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from sqlalchemy import Column, String, Integer
|
||||
from sqlalchemy import Column, String, Integer, Date
|
||||
|
||||
from ..db import Base
|
||||
|
||||
|
@ -11,3 +11,4 @@ class User(Base):
|
|||
location = Column(String)
|
||||
room_id = Column(String)
|
||||
reminder_time_in_minutes = Column(Integer)
|
||||
current_reminder_date = Column(Date)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue