Closes #11
This commit is contained in:
@@ -1,8 +1,17 @@
|
||||
from datetime import datetime
|
||||
from logging import Logger
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from discord import Activity, ActivityType, Cog, Member
|
||||
from bson import ObjectId
|
||||
from bson.errors import InvalidId
|
||||
from discord import Activity, ActivityType, Cog, Member, TextChannel, File
|
||||
|
||||
from classes import PycordEvent, PycordGuild, PycordUser
|
||||
from classes.errors import GuildNotFoundError
|
||||
from classes.pycord_bot import PycordBot
|
||||
from modules.database import col_users
|
||||
from modules.utils import get_logger
|
||||
|
||||
logger: Logger = get_logger(__name__)
|
||||
@@ -53,10 +62,78 @@ class CogUtility(Cog):
|
||||
|
||||
logger.info("Set activity type to %s with message %s", activity_type, activity_message)
|
||||
|
||||
# TODO Implement #11
|
||||
@Cog.listener()
|
||||
@Cog.listener("on_member_join")
|
||||
async def on_member_join(self, member: Member) -> None:
|
||||
pass
|
||||
try:
|
||||
guild: PycordGuild = await self.bot.find_guild(member.guild.id)
|
||||
except (InvalidId, GuildNotFoundError) as exc:
|
||||
logger.error(
|
||||
"Could not process member join event for %s in %s due to: %s",
|
||||
member.id,
|
||||
member.guild.id,
|
||||
exc,
|
||||
)
|
||||
return
|
||||
|
||||
user: PycordUser = await self.bot.find_user(member.id, member.guild.id)
|
||||
events: List[PycordEvent] = []
|
||||
|
||||
pipeline: List[Dict[str, Any]] = [
|
||||
{"$match": {"id": 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": {"$lt": datetime.now(tz=ZoneInfo("UTC"))},
|
||||
"registered_events.is_cancelled": False,
|
||||
}
|
||||
},
|
||||
]
|
||||
|
||||
async for result in col_users.aggregate(pipeline):
|
||||
for registered_event in result["registered_events"]:
|
||||
events.append(PycordEvent(**registered_event))
|
||||
|
||||
for event in events:
|
||||
if user.current_event_id is not None and user.current_event_id != event._id:
|
||||
continue
|
||||
|
||||
if user.current_event_id is None:
|
||||
await user.set_event(event._id, cache=self.bot.cache)
|
||||
|
||||
channel: TextChannel | None = await user.fix_event_channel(
|
||||
self.bot, member.guild, guild, event, cache=self.bot.cache
|
||||
)
|
||||
|
||||
if channel is None:
|
||||
continue
|
||||
|
||||
thumbnail: File | None = (
|
||||
None
|
||||
if event.thumbnail is None
|
||||
else File(Path(f"data/{event.thumbnail['id']}"), event.thumbnail["filename"])
|
||||
)
|
||||
|
||||
await channel.send(
|
||||
self.bot._("register_already_started", "messages").format(event_name=event.name),
|
||||
file=thumbnail,
|
||||
)
|
||||
|
||||
stage_id: ObjectId = (
|
||||
event.stage_ids[0] if user.current_stage_id is None else user.current_stage_id
|
||||
)
|
||||
|
||||
await user.set_event_stage(stage_id, cache=self.bot.cache)
|
||||
|
||||
await self.bot.send_stage_question(channel, event, await self.bot.find_event_stage(stage_id))
|
||||
|
||||
|
||||
def setup(bot: PycordBot) -> None:
|
||||
|
Reference in New Issue
Block a user