From 4148dc1ae838236eacca7bbd9a879bbda8eeb40a Mon Sep 17 00:00:00 2001 From: Conatum Date: Sat, 14 Oct 2023 23:13:36 +0300 Subject: [PATCH] feat(rooms): Implement event logging. --- src/modules/rooms/cog.py | 61 ++++++++++++++++++++---- src/modules/rooms/room.py | 97 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 9 deletions(-) diff --git a/src/modules/rooms/cog.py b/src/modules/rooms/cog.py index 4b2a6d70..3490848a 100644 --- a/src/modules/rooms/cog.py +++ b/src/modules/rooms/cog.py @@ -168,6 +168,20 @@ class RoomCog(LionCog): async def _destroy_channel_room(self, channel: discord.abc.GuildChannel): room = self._room_cache[channel.guild.id].get(channel.id, None) if room is not None: + t = self.bot.translator.t + room.lguild.log_event( + title=t(_p( + 'room|eventlog|event:room_deleted|title', + "Private Room Deleted" + )), + description=t(_p( + 'room|eventlog|event:room_deleted|desc', + "{owner}'s private room was deleted." + )).format( + owner="<@{mid}>".format(mid=room.data.ownerid), + ), + fields=room.eventlog_fields() + ) await room.destroy(reason="Underlying Channel Deleted") # Setting event handlers @@ -228,6 +242,7 @@ class RoomCog(LionCog): """ Create a new private room. """ + t = self.bot.translator.t lguild = await self.bot.core.lions.fetch_guild(guild.id) # TODO: Consider extending invites to members rather than giving them immediate access @@ -247,12 +262,31 @@ class RoomCog(LionCog): overwrites[member] = member_overwrite # Create channel - channel = await guild.create_voice_channel( - name=name, - reason=f"Creating Private Room for {owner.id}", - category=lguild.config.get(RoomSettings.Category.setting_id).value, - overwrites=overwrites - ) + try: + channel = await guild.create_voice_channel( + name=name, + reason=t(_p( + 'create_room|create_channel|audit_reason', + "Creating Private Room for {ownerid}" + )).format(ownerid=owner.id), + category=lguild.config.get(RoomSettings.Category.setting_id).value, + overwrites=overwrites + ) + except discord.HTTPException as e: + lguild.log_event( + t(_p( + 'eventlog|event:private_room_create_error|name', + "Private Room Creation Failed" + )), + t(_p( + 'eventlog|event:private_room_create_error|desc', + "{owner} attempted to rent a new private room, but I could not create it!\n" + "They were not charged." + )).format(owner=owner.mention), + errors=[f"`{repr(e)}`"] + ) + raise + try: # Create Room now = utc_now() @@ -289,6 +323,17 @@ class RoomCog(LionCog): logger.info( f"New private room created: {room.data!r}" ) + lguild.log_event( + t(_p( + 'eventlog|event:private_room_create|name', + "Private Room Rented" + )), + t(_p( + 'eventlog|event:private_room_create|desc', + "{owner} has rented a new private room {channel}!" + )).format(owner=owner.mention, channel=channel.mention), + fields=room.eventlog_fields(), + ) return room @@ -490,7 +535,7 @@ class RoomCog(LionCog): await ui.send(room.channel) @log_wrap(action='create_room') - async def _do_create_room(self, ctx, required, days, rent, name, provided) -> Room: + async def _do_create_room(self, ctx, required, days, rent, name, provided) -> Optional[Room]: t = self.bot.translator.t # TODO: Rollback the channel create if this fails async with self.bot.db.connection() as conn: @@ -545,7 +590,6 @@ class RoomCog(LionCog): ) ) await ctx.alion.data.update(coins=CoreData.Member.coins + required) - return except discord.HTTPException as e: await ctx.reply( embed=error_embed( @@ -558,7 +602,6 @@ class RoomCog(LionCog): ) ) await ctx.alion.data.update(coins=CoreData.Member.coins + required) - return @room_group.command( name=_p('cmd:room_status', "status"), diff --git a/src/modules/rooms/room.py b/src/modules/rooms/room.py index 9e34b874..22c841a6 100644 --- a/src/modules/rooms/room.py +++ b/src/modules/rooms/room.py @@ -71,6 +71,48 @@ class Room: def deleted(self): return bool(self.data.deleted_at) + def eventlog_fields(self) -> dict[str, tuple[str, bool]]: + t = self.bot.translator.t + fields = { + t(_p( + 'room|eventlog|field:owner', "Owner" + )): ( + f"<@{self.data.ownerid}>", + True + ), + t(_p( + 'room|eventlog|field:channel', "Channel" + )): ( + f"<#{self.data.channelid}>", + True + ), + t(_p( + 'room|eventlog|field:balance', "Room Balance" + )): ( + f"{self.bot.config.emojis.coin} **{self.data.coin_balance}**", + True + ), + t(_p( + 'room|eventlog|field:created', "Created At" + )): ( + discord.utils.format_dt(self.data.created_at, 'F'), + True + ), + t(_p( + 'room|eventlog|field:tick', "Next Rent Due" + )): ( + discord.utils.format_dt(self.next_tick, 'R'), + True + ), + t(_p( + 'room|eventlog|field:members', "Private Room Members" + )): ( + ','.join(f"<@{member}>" for member in self.members), + False + ), + } + return fields + async def notify_deposit(self, member: discord.Member, amount: int): # Assumes locale is set correctly t = self.bot.translator.t @@ -108,6 +150,20 @@ class Room: "Welcome {members}" )).format(members=', '.join(f"<@{mid}>" for mid in memberids)) ) + self.lguild.log_event( + title=t(_p( + 'room|eventlog|event:new_members|title', + "Members invited to private room" + )), + description=t(_p( + 'room|eventlog|event:new_members|desc', + "{owner} added members to their private room: {members}" + )).format( + members=', '.join(f"<@{mid}>" for mid in memberids), + owner="<@{mid}>".format(mid=self.data.ownerid), + ), + fields=self.eventlog_fields() + ) if self.channel: try: await self.channel.send(embed=notification) @@ -128,6 +184,21 @@ class Room: await member_data.table.delete_where(channelid=self.data.channelid, userid=list(memberids)) self.members = list(set(self.members).difference(memberids)) # No need to notify for removal + t = self.bot.translator.t + self.lguild.log_event( + title=t(_p( + 'room|eventlog|event:rm_members|title', + "Members removed from private room" + )), + description=t(_p( + 'room|eventlog|event:rm_members|desc', + "{owner} removed members from their private room: {members}" + )).format( + members=', '.join(f"<@{mid}>" for mid in memberids), + owner="<@{mid}>".format(mid=self.data.ownerid), + ), + fields=self.eventlog_fields() + ) if self.channel: guild = self.channel.guild members = [guild.get_member(memberid) for memberid in memberids] @@ -255,6 +326,19 @@ class Room: await owner.send(embed=embed) except discord.HTTPException: pass + self.lguild.log_event( + title=t(_p( + 'room|eventlog|event:expired|title', + "Private Room Expired" + )), + description=t(_p( + 'room|eventlog|event:expired|desc', + "{owner}'s private room has expired." + )).format( + owner="<@{mid}>".format(mid=self.data.ownerid), + ), + fields=self.eventlog_fields() + ) await self.destroy(reason='Room Expired') elif self.channel: # Notify channel @@ -274,6 +358,19 @@ class Room: else: # No channel means room was deleted # Just cleanup quietly + self.lguild.log_event( + title=t(_p( + 'room|eventlog|event:room_deleted|title', + "Private Room Deleted" + )), + description=t(_p( + 'room|eventlog|event:room_deleted|desc', + "{owner}'s private room was deleted." + )).format( + owner="<@{mid}>".format(mid=self.data.ownerid), + ), + fields=self.eventlog_fields() + ) await self.destroy(reason='Channel Missing') @log_wrap(action="Destroy Room")