from datetime import datetime from typing import Any, Dict from zoneinfo import ZoneInfo from bson import ObjectId from discord import ( ApplicationContext, ) from modules.database import col_events async def validate_event_validity( ctx: ApplicationContext, name: str, start_date: datetime | None, finish_date: datetime | None, guild_timezone: ZoneInfo, event_id: ObjectId | None = None, ) -> None: if start_date > finish_date: # TODO Make a nice message await ctx.respond("Start date must be before finish date") return if start_date < datetime.now(tz=guild_timezone): # TODO Make a nice message await ctx.respond("Start date must not be in the past") return # TODO Add validation for concurrent events. # Only one event can take place at the same time. query: Dict[str, Any] = { "name": name, "ended": None, "ends": {"$gt": datetime.now(tz=ZoneInfo("UTC"))}, "is_cancelled": {"$ne": True}, } if event_id is not None: query["_id"] = {"$ne": event_id} if (await col_events.find_one(query)) is not None: # TODO Make a nice message await ctx.respond("There can only be one active event with the same name") return