diff --git a/extensions/appointments.py b/extensions/appointments.py index c3d582474827c4023f4765090af2f14f6ec4629a..1b6bcae49f8abdb161de7f98855d377e1d5c1f4a 100644 --- a/extensions/appointments.py +++ b/extensions/appointments.py @@ -31,11 +31,8 @@ class Appointments(commands.GroupCog, name="appointments", description="Handle A async def timer(self): for appointment in Appointment.select().order_by(Appointment.channel): now = datetime.now() - date_time = appointment.date_time - remind_at = date_time - timedelta( - minutes=appointment.reminder) if not appointment.reminder_sent else date_time - if now >= remind_at: + if now >= appointment.remind_at(): try: channel = await self.bot.fetch_channel(appointment.channel) message = await channel.fetch_message(appointment.message) @@ -71,14 +68,29 @@ class Appointments(commands.GroupCog, name="appointments", description="Handle A description="Detailliertere Beschreibung, was gemacht werden soll.", recurring="In welchem Intervall (in Tagen) soll der Termin wiederholt werden?") async def cmd_add_appointment(self, interaction: Interaction, date: str, time: str, reminder: int, title: str, - description: str = "", recurring: int = 0): + description: str = "", recurring: int = 0) -> None: """ Add an appointment to a channel """ channel = interaction.channel author_id = interaction.user.id try: date_time = datetime.strptime(f"{date} {time}", self.bot.dt_format()) + if date_time <= datetime.now(): + await interaction.response.send_message("Fehler! Der Termin muss in der Zukunft liegen.", + ephemeral=True) + return + elif reminder < 0: + await interaction.response.send_message("Fehler! Du kannst keinen negativen Wert für die Benachrichtigung angeben.", + ephemeral=True) + return + elif recurring < 0: + await interaction.response.send_message("Fehler! Du kannst keinen negativen Wert für die Wiederholung deines Termins angeben.", + ephemeral=True) + return + except ValueError: - await interaction.response.send_message("Fehler! Ungültiges Datum und/oder Zeit.\nBitte gib ein gültiges Datum im Format TT.MM.JJJJ und eine gültige Uhrzeit im Format HH:MM an.", ephemeral=True) + await interaction.response.send_message( + "Fehler! Ungültiges Datum und/oder Zeit.\nBitte gib ein gültiges Datum im Format TT.MM.JJJJ und eine gültige Uhrzeit im Format HH:MM an.", + ephemeral=True) return appointment = Appointment.create(channel=channel.id, message=0, date_time=date_time, reminder=reminder, diff --git a/models.py b/models.py index 13649db5b2430b6229ee380db3610f8adbd02592..7e4ec0517ac6a0d8f97cf89628fe14bf81465689 100644 --- a/models.py +++ b/models.py @@ -1,6 +1,6 @@ -import datetime import io import uuid +from datetime import timedelta, datetime import discord from discord import Colour @@ -131,11 +131,10 @@ class Appointment(BaseModel): def get_embed(self, state: int) -> discord.Embed: attendees = self.attendees - description = (f"Wenn du eine Benachrichtigung zum Beginn des Termins" - f"{f', sowie {self.reminder} Minuten vorher, ' if self.reminder > 0 else f' '}" - f"erhalten möchtest, verwende den \"Zusagen\" Button unter dieser Nachricht. " - f"Hast du bereits zugesagt und möchtest aber doch keine Benachrichtigung erhalten, " - f"kannst du den \"Absagen\" Button benutzen.") if state != 2 else "" + description = (f"- Durch Klicken auf Anmelden erhältst du eine Benachrichtigung zum Beginn des Termins" + f"{f', sowie {self.reminder} Minuten vorher' if self.reminder > 0 else f''}.\n" + f"- Durch Klicken auf Abmelden nimmst du deine vorherige Abmeldung wieder zurück und wirst " + f"nicht benachrichtigt.") if state != 2 else "" emoji = "📅" if state == 0 else ("📣" if state == 1 else "✅") embed = discord.Embed(title=f"{emoji} {self.title} {'findet jetzt statt.' if state == 2 else ''}", description=description) @@ -156,6 +155,16 @@ class Appointment(BaseModel): return embed + def remind_at(self) -> datetime: + if self.reminder_sent: + return self.date_time + elif datetime.now() >= self.date_time: + Appointment.update(reminder_sent=True).where(Appointment.id == self.id).execute() + self.reminder_sent = True + return self.date_time + else: + return self.date_time - timedelta(minutes=self.reminder) + def get_start_time(self, state) -> str: if state == 0: return f"<t:{int(self.date_time.timestamp())}:F>" diff --git a/views/appointment_view.py b/views/appointment_view.py index f571359f061a4af28d95212ec66b1f748214979e..e1a1a0f47bd90d724bf509286f51dba8ac239718 100644 --- a/views/appointment_view.py +++ b/views/appointment_view.py @@ -8,7 +8,7 @@ class AppointmentView(discord.ui.View): def __init__(self): super().__init__(timeout=None) - @discord.ui.button(label='Zusagen', style=discord.ButtonStyle.green, custom_id='appointment_view:accept', emoji="👍") + @discord.ui.button(label='Anmelden', style=discord.ButtonStyle.green, custom_id='appointment_view:accept', emoji="👍") async def accept(self, interaction: discord.Interaction, button: discord.ui.Button): if appointment := Appointment.get_or_none(Appointment.message == interaction.message.id): attendee = appointment.attendees.filter(member_id=interaction.user.id) @@ -22,7 +22,7 @@ class AppointmentView(discord.ui.View): await interaction.response.defer(thinking=False) - @discord.ui.button(label='Absagen', style=discord.ButtonStyle.red, custom_id='appointment_view:decline', emoji="👎") + @discord.ui.button(label='Abmelden', style=discord.ButtonStyle.red, custom_id='appointment_view:decline', emoji="👎") async def decline(self, interaction: discord.Interaction, button: discord.ui.Button): if appointment := Appointment.get_or_none(Appointment.message == interaction.message.id): attendee = appointment.attendees.filter(member_id=interaction.user.id)