from datetime import datetime from typing import Any, Dict, List from zoneinfo import ZoneInfo, available_timezones from bson import ObjectId from discord import AutocompleteContext, OptionChoice from pymongo import ASCENDING from typing_extensions import deprecated from modules.database import col_events, col_stages, col_users async def autocomplete_timezones(ctx: AutocompleteContext) -> List[str]: """Return available timezones""" return sorted(list(available_timezones())) @deprecated("Messages will not be displayed on per-user basis") async def autocomplete_languages(ctx: AutocompleteContext) -> List[str]: """Return locales supported by the bot""" return ctx.bot.locales.keys() async def autocomplete_active_events(ctx: AutocompleteContext) -> List[OptionChoice]: """Return list of active events""" query: Dict[str, Any] = { "ended": None, "ends": {"$gt": datetime.now(tz=ZoneInfo("UTC"))}, "is_cancelled": False, } event_names: List[OptionChoice] = [] async for result in col_events.find(query): event_names.append(OptionChoice(result["name"], str(result["_id"]))) return event_names async def autocomplete_user_available_events(ctx: AutocompleteContext) -> List[OptionChoice]: """Return list of active events user can register in""" return await autocomplete_active_events(ctx) async def autocomplete_user_registered_events(ctx: AutocompleteContext) -> List[OptionChoice]: """Return list of active events user is registered in""" pipeline: List[Dict[str, Any]] = [ {"$match": {"id": ctx.interaction.user.id}}, { "$lookup": { "from": "events", "localField": "registered_event_ids", "foreignField": "_id", "as": "registered_events", } }, { "$match": { "registered_events.ended": None, "registered_events.ends": {"$gt": datetime.now(tz=ZoneInfo("UTC"))}, "registered_events.starts": {"$gt": datetime.now(tz=ZoneInfo("UTC"))}, "registered_events.is_cancelled": False, } }, ] event_names: List[OptionChoice] = [] async for result in col_users.aggregate(pipeline): for registered_event in result["registered_events"]: event_names.append(OptionChoice(registered_event["name"], str(registered_event["_id"]))) return event_names async def autocomplete_event_stages(ctx: AutocompleteContext) -> List[OptionChoice]: """Return list of stages of the event""" event_id: str | None = ctx.options["event"] if event_id is None: return [] query: Dict[str, Any] = { "event_id": ObjectId(event_id), } event_stages: List[OptionChoice] = [] async for result in col_stages.find(query).sort([("sequence", ASCENDING)]): event_stages.append( OptionChoice( f"{result['sequence']+1} ({result['question'] if len(result['question']) < 50 else result['question'][:47] + '...'})", str(result["_id"]), ) ) return event_stages