feat(rooms): Implement event logging.
This commit is contained in:
@@ -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
|
||||||
channel = await guild.create_voice_channel(
|
try:
|
||||||
name=name,
|
channel = await guild.create_voice_channel(
|
||||||
reason=f"Creating Private Room for {owner.id}",
|
name=name,
|
||||||
category=lguild.config.get(RoomSettings.Category.setting_id).value,
|
reason=t(_p(
|
||||||
overwrites=overwrites
|
'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:
|
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"),
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user