This commit is contained in:
2025-05-04 22:30:54 +02:00
parent 6b5a276f00
commit 9d562e2e9d
5 changed files with 121 additions and 34 deletions

View File

@@ -189,6 +189,12 @@ class PycordBot(LibPycordBot):
self._("admin_event_started", "messages").format(event_name=event.name),
)
await self.notify_users(
guild,
pycord_guild,
self._("event_started", "messages").format(event_name=event.name),
)
async def _process_events_end(self) -> None:
# Get events to end
events: List[PycordEvent] = await self._get_events(
@@ -228,6 +234,17 @@ class PycordBot(LibPycordBot):
# Get list of participants
users: List[PycordUser] = await self._get_event_participants(event._id)
event_ended_string: str = self._("event_ended", "messages").format(
event_name=event.name, stages=stages_string
)
chunk_size: int = 2000
event_info_chunks: List[str] = [
event_ended_string[i : i + chunk_size]
for i in range(0, len(event_ended_string), chunk_size)
]
for user in users:
if str(event._id) not in user.event_channels:
logger.warning(
@@ -240,30 +257,58 @@ class PycordBot(LibPycordBot):
# Send a notification about event start
user_channel: TextChannel = guild.get_channel(user.event_channels[str(event._id)])
event_ended_string: str = self._("event_ended", "messages").format(
event_name=event.name, stages=stages_string
)
chunk_size: int = 2000
event_info_chunks: List[str] = [
event_ended_string[i : i + chunk_size]
for i in range(0, len(event_ended_string), chunk_size)
]
for chunk in event_info_chunks:
await user_channel.send(chunk)
# Lock each participant out
await user.lock_event_channel(guild, event._id, channel=user_channel)
await event.end(cache=self.cache)
await self.notify_admins(
guild,
pycord_guild,
self._("admin_event_ended", "messages").format(event_name=event.name),
)
await event.end(cache=self.cache)
await self._notify_general_channel_event_end(guild, pycord_guild, event, stages)
async def _notify_general_channel_event_end(
self, guild: Guild, pycord_guild: PycordGuild, event: PycordEvent, stages: List[PycordEventStage]
) -> None:
event_ended_string: str = self._("event_ended_short", "messages").format(event_name=event.name)
await self.notify_users(
guild,
pycord_guild,
event_ended_string,
)
chunk_size: int = 2000
for stage in stages:
header_full: str = self._("stage_entry_header", "messages").format(
sequence=stage.sequence + 1, question=stage.question
)
header_chunks: List[str] = [
header_full[i : i + chunk_size] for i in range(0, len(header_full), chunk_size)
]
header_chunks_length: int = len(header_chunks)
files: List[File] | None = stage.get_media_files()
for index, chunk in enumerate(header_chunks):
await self.notify_users(
guild,
pycord_guild,
chunk,
files=None if index != header_chunks_length - 1 else files,
)
await self.notify_users(
guild, pycord_guild, self._("stage_entry_footer", "messages").format(answer=stage.answer)
)
@staticmethod
async def _get_events(query: Dict[str, Any]) -> List[PycordEvent]:
@@ -290,18 +335,35 @@ class PycordBot(LibPycordBot):
# TODO Add documentation
@staticmethod
async def notify_admins(guild: Guild, pycord_guild: PycordGuild, message: str) -> None:
management_channel: TextChannel | None = guild.get_channel(pycord_guild.channel_id)
management_channel: TextChannel | None = guild.get_channel(pycord_guild.management_channel_id)
if management_channel is None:
logger.error(
"Discord channel with ID %s in guild with ID %s could not be found!",
pycord_guild.channel_id,
pycord_guild.management_channel_id,
guild.id,
)
return
await management_channel.send(message)
# TODO Add documentation
@staticmethod
async def notify_users(
guild: Guild, pycord_guild: PycordGuild, message: str, files: Optional[List[File]] = None
) -> None:
general_channel: TextChannel | None = guild.get_channel(pycord_guild.general_channel_id)
if general_channel is None:
logger.error(
"Discord channel with ID %s in guild with ID %s could not be found!",
pycord_guild.general_channel_id,
guild.id,
)
return
await general_channel.send(message, files=files)
async def find_user(self, user: int | User, guild: int | Guild) -> PycordUser:
"""Find User by its ID or User object.

View File

@@ -17,13 +17,22 @@ logger: Logger = get_logger(__name__)
class PycordGuild:
"""Dataclass of DB entry of a guild"""
__slots__ = ("_id", "id", "channel_id", "category_id", "timezone", "prefer_emojis")
__slots__ = (
"_id",
"id",
"general_channel_id",
"management_channel_id",
"category_id",
"timezone",
"prefer_emojis",
)
__short_name__ = "guild"
__collection__ = col_guilds
_id: ObjectId
id: int
channel_id: int | None
general_channel_id: int | None
management_channel_id: int | None
category_id: int | None
timezone: str
prefer_emojis: bool
@@ -131,7 +140,8 @@ class PycordGuild:
return {
"_id": self._id if not json_compatible else str(self._id),
"id": self.id,
"channel_id": self.channel_id,
"general_channel_id": self.general_channel_id,
"management_channel_id": self.management_channel_id,
"category_id": self.category_id,
"timezone": self.timezone,
"prefer_emojis": self.prefer_emojis,
@@ -146,7 +156,8 @@ class PycordGuild:
"""
return {
"id": guild_id,
"channel_id": None,
"general_channel_id": None,
"management_channel_id": None,
"category_id": None,
"timezone": "UTC",
"prefer_emojis": False,
@@ -222,7 +233,8 @@ class PycordGuild:
"""
return (
(self.id is not None)
and (self.channel_id is not None)
and (self.general_channel_id is not None)
and (self.management_channel_id is not None)
and (self.category_id is not None)
and (self.timezone is not None)
and (self.prefer_emojis is not None)

View File

@@ -60,11 +60,6 @@ class PycordUser:
registered_event_ids: List[ObjectId]
completed_event_ids: List[ObjectId]
# TODO Review the redesign
# event_channel_ids: {
# "%event_id%": %channel_id%
# }
@classmethod
async def from_id(
cls, user_id: int, guild_id: int, allow_creation: bool = True, cache: Optional[Cache] = None
@@ -288,7 +283,7 @@ class PycordUser:
raise DiscordGuildMemberNotFoundError(self.id, guild.id)
if discord_category is None:
raise DiscordCategoryNotFoundError(pycord_guild.channel_id, guild.id)
raise DiscordCategoryNotFoundError(pycord_guild.category_id, guild.id)
permission_overwrites: Dict[Role | Member, PermissionOverwrite] = {
guild.default_role: PermissionOverwrite(