feat(menus): Implement event logging.

This commit is contained in:
2023-10-15 13:26:10 +03:00
parent 4148dc1ae8
commit dde88c464b
3 changed files with 99 additions and 3 deletions

View File

@@ -57,6 +57,11 @@ event_fields = {
"{coin} {{value}}".format(coin=conf.emojis.coin), "{coin} {{value}}".format(coin=conf.emojis.coin),
True, True,
), ),
'refund' : (
_p('eventlog|field:refund|name', "Coins Refunded"),
"{coin} {{value}}".format(coin=conf.emojis.coin),
True,
),
'memberid': ( 'memberid': (
_p('eventlog|field:memberid|name', "Member"), _p('eventlog|field:memberid|name', "Member"),
"<@{value}>", "<@{value}>",

View File

@@ -15,10 +15,11 @@ from meta.logger import log_wrap
from meta.errors import ResponseTimedOut, UserInputError, UserCancelled, SafeCancellation from meta.errors import ResponseTimedOut, UserInputError, UserCancelled, SafeCancellation
from meta.sharding import THIS_SHARD from meta.sharding import THIS_SHARD
from meta.monitor import ComponentMonitor, ComponentStatus, StatusLevel from meta.monitor import ComponentMonitor, ComponentStatus, StatusLevel
from utils.lib import utc_now, error_embed from utils.lib import utc_now, error_embed, jumpto
from utils.ui import Confirm, ChoicedEnum, Transformed, AButton, AsComponents from utils.ui import Confirm, ChoicedEnum, Transformed, AButton, AsComponents
from utils.transformers import DurationTransformer from utils.transformers import DurationTransformer
from utils.monitor import TaskMonitor from utils.monitor import TaskMonitor
from babel.translator import ctx_locale
from constants import MAX_COINS from constants import MAX_COINS
from data import NULL from data import NULL
@@ -315,6 +316,11 @@ class RoleMenuCog(LionCog):
menu = await self.data.RoleMenu.fetch(equip_row.menuid) menu = await self.data.RoleMenu.fetch(equip_row.menuid)
guild = self.bot.get_guild(menu.guildid) guild = self.bot.get_guild(menu.guildid)
if guild is not None: if guild is not None:
log_errors = []
lguild = await self.bot.core.lions.fetch_guild(menu.guildid)
t = self.bot.translator.t
ctx_locale.set(lguild.locale)
role = guild.get_role(equip_row.roleid) role = guild.get_role(equip_row.roleid)
if role is not None: if role is not None:
lion = await self.bot.core.lions.fetch_member(guild.id, equip_row.userid) lion = await self.bot.core.lions.fetch_member(guild.id, equip_row.userid)
@@ -322,6 +328,10 @@ class RoleMenuCog(LionCog):
if (member := lion.member): if (member := lion.member):
if role in member.roles: if role in member.roles:
logger.error(f"Expired {equipid}, but the member still has the role!") logger.error(f"Expired {equipid}, but the member still has the role!")
log_errors.append(t(_p(
'eventlog|event:rolemenu_role_expire|error:remove_failed',
"Removed the role, but the member still has the role!!"
)))
else: else:
logger.info(f"Expired {equipid}, and successfully removed the role from the member!") logger.info(f"Expired {equipid}, and successfully removed the role from the member!")
else: else:
@@ -329,9 +339,56 @@ class RoleMenuCog(LionCog):
f"Expired {equipid} for non-existent member {equip_row.userid}. " f"Expired {equipid} for non-existent member {equip_row.userid}. "
"Removed from persistent roles." "Removed from persistent roles."
) )
log_errors.append(t(_p(
'eventlog|event:rolemenu_role_expire|error:member_gone',
"Member could not be found.. role has been removed from saved roles."
)))
else: else:
logger.info(f"Could not expire {equipid} because the role was not found.") logger.info(f"Could not expire {equipid} because the role was not found.")
log_errors.append(t(_p(
'eventlog|event:rolemenu_role_expire|error:no_role',
"Role {role} no longer exists."
)).format(role=f"`{equip_row.roleid}`"))
now = utc_now() now = utc_now()
lguild.log_event(
title=t(_p(
'eventlog|event:rolemenu_role_expire|title',
"Equipped role has expired"
)),
description=t(_p(
'eventlog|event:rolemenu_role_expire|desc',
"{member}'s role {role} has now expired."
)).format(
member=f"<@{equip_row.userid}>",
role=f"<@&{equip_row.roleid}>",
),
fields={
t(_p(
'eventlog|event:rolemenu_role_expire|field:menu',
"Obtained From"
)): (
jumpto(
menu.guildid, menu.channelid, menu.messageid
) if menu and menu.messageid else f"**{menu.name}**",
True
),
t(_p(
'eventlog|event:rolemenu_role_expire|field:menu',
"Obtained At"
)): (
discord.utils.format_dt(equip_row.obtained_at),
True
),
t(_p(
'eventlog|event:rolemenu_role_expire|field:expiry',
"Expiry"
)): (
discord.utils.format_dt(equip_row.expires_at),
True
),
},
errors=log_errors
)
await equip_row.update(removed_at=now) await equip_row.update(removed_at=now)
else: else:
logger.info(f"Could not expire {equipid} because the guild was not found.") logger.info(f"Could not expire {equipid} because the guild was not found.")

View File

@@ -609,7 +609,24 @@ class RoleMenu:
if remove_line: if remove_line:
embed.description = '\n'.join((remove_line, embed.description)) embed.description = '\n'.join((remove_line, embed.description))
# TODO Event logging lguild = await self.bot.core.lions.fetch_guild(self.data.guildid)
lguild.log_event(
title=t(_p(
'rolemenu|eventlog|event:role_equipped|title',
"Member equipped role from role menu"
)),
description=t(_p(
'rolemenu|eventlog|event:role_equipped|desc',
"{member} equipped {role} from {menu}"
)).format(
member=member.mention,
role=role.mention,
menu=self.jump_link
),
roles_given=role.mention,
price=price,
expiry=discord.utils.format_dt(expiry) if expiry is not None else None,
)
return embed return embed
async def _handle_negative(self, lion, member: discord.Member, mrole: RoleMenuRole) -> discord.Embed: async def _handle_negative(self, lion, member: discord.Member, mrole: RoleMenuRole) -> discord.Embed:
@@ -690,12 +707,29 @@ class RoleMenu:
'rolemenu|deselect|success:norefund|desc', 'rolemenu|deselect|success:norefund|desc',
"You have unequipped **{role}**." "You have unequipped **{role}**."
)).format(role=role.name) )).format(role=role.name)
lguild = await self.bot.core.lions.fetch_guild(self.data.guildid)
lguild.log_event(
title=t(_p(
'rolemenu|eventlog|event:role_unequipped|title',
"Member unequipped role from role menu"
)),
description=t(_p(
'rolemenu|eventlog|event:role_unequipped|desc',
"{member} unequipped {role} from {menu}"
)).format(
member=member.mention,
role=role.mention,
menu=self.jump_link,
),
roles_given=role.mention,
refund=total_refund,
)
return embed return embed
async def _handle_selection(self, lion, member: discord.Member, menuroleid: int): async def _handle_selection(self, lion, member: discord.Member, menuroleid: int):
lock_key = ('rmenu', member.id, member.guild.id) lock_key = ('rmenu', member.id, member.guild.id)
async with self.bot.idlock(lock_key): async with self.bot.idlock(lock_key):
# TODO: Selection locking
mrole = self.rolemap.get(menuroleid, None) mrole = self.rolemap.get(menuroleid, None)
if mrole is None: if mrole is None:
raise ValueError( raise ValueError(