feat(rooms): Implement event logging.

This commit is contained in:
2023-10-14 23:13:36 +03:00
parent 2ae4379cd2
commit 4148dc1ae8
2 changed files with 149 additions and 9 deletions

View File

@@ -168,6 +168,20 @@ class RoomCog(LionCog):
async def _destroy_channel_room(self, channel: discord.abc.GuildChannel): async def _destroy_channel_room(self, channel: discord.abc.GuildChannel):
room = self._room_cache[channel.guild.id].get(channel.id, None) room = self._room_cache[channel.guild.id].get(channel.id, None)
if room is not 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") await room.destroy(reason="Underlying Channel Deleted")
# Setting event handlers # Setting event handlers
@@ -228,6 +242,7 @@ class RoomCog(LionCog):
""" """
Create a new private room. Create a new private room.
""" """
t = self.bot.translator.t
lguild = await self.bot.core.lions.fetch_guild(guild.id) lguild = await self.bot.core.lions.fetch_guild(guild.id)
# TODO: Consider extending invites to members rather than giving them immediate access # TODO: Consider extending invites to members rather than giving them immediate access
@@ -247,12 +262,31 @@ class RoomCog(LionCog):
overwrites[member] = member_overwrite overwrites[member] = member_overwrite
# Create channel # Create channel
try:
channel = await guild.create_voice_channel( channel = await guild.create_voice_channel(
name=name, name=name,
reason=f"Creating Private Room for {owner.id}", 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, category=lguild.config.get(RoomSettings.Category.setting_id).value,
overwrites=overwrites 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: try:
# Create Room # Create Room
now = utc_now() now = utc_now()
@@ -289,6 +323,17 @@ class RoomCog(LionCog):
logger.info( logger.info(
f"New private room created: {room.data!r}" 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 return room
@@ -490,7 +535,7 @@ class RoomCog(LionCog):
await ui.send(room.channel) await ui.send(room.channel)
@log_wrap(action='create_room') @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 t = self.bot.translator.t
# TODO: Rollback the channel create if this fails # TODO: Rollback the channel create if this fails
async with self.bot.db.connection() as conn: 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) await ctx.alion.data.update(coins=CoreData.Member.coins + required)
return
except discord.HTTPException as e: except discord.HTTPException as e:
await ctx.reply( await ctx.reply(
embed=error_embed( embed=error_embed(
@@ -558,7 +602,6 @@ class RoomCog(LionCog):
) )
) )
await ctx.alion.data.update(coins=CoreData.Member.coins + required) await ctx.alion.data.update(coins=CoreData.Member.coins + required)
return
@room_group.command( @room_group.command(
name=_p('cmd:room_status', "status"), name=_p('cmd:room_status', "status"),

View File

@@ -71,6 +71,48 @@ class Room:
def deleted(self): def deleted(self):
return bool(self.data.deleted_at) 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): async def notify_deposit(self, member: discord.Member, amount: int):
# Assumes locale is set correctly # Assumes locale is set correctly
t = self.bot.translator.t t = self.bot.translator.t
@@ -108,6 +150,20 @@ class Room:
"Welcome {members}" "Welcome {members}"
)).format(members=', '.join(f"<@{mid}>" for mid in memberids)) )).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: if self.channel:
try: try:
await self.channel.send(embed=notification) 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)) await member_data.table.delete_where(channelid=self.data.channelid, userid=list(memberids))
self.members = list(set(self.members).difference(memberids)) self.members = list(set(self.members).difference(memberids))
# No need to notify for removal # 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: if self.channel:
guild = self.channel.guild guild = self.channel.guild
members = [guild.get_member(memberid) for memberid in memberids] members = [guild.get_member(memberid) for memberid in memberids]
@@ -255,6 +326,19 @@ class Room:
await owner.send(embed=embed) await owner.send(embed=embed)
except discord.HTTPException: except discord.HTTPException:
pass 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') await self.destroy(reason='Room Expired')
elif self.channel: elif self.channel:
# Notify channel # Notify channel
@@ -274,6 +358,19 @@ class Room:
else: else:
# No channel means room was deleted # No channel means room was deleted
# Just cleanup quietly # 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') await self.destroy(reason='Channel Missing')
@log_wrap(action="Destroy Room") @log_wrap(action="Destroy Room")