diff --git a/src/core/lion_guild.py b/src/core/lion_guild.py index 1912c24f..47172437 100644 --- a/src/core/lion_guild.py +++ b/src/core/lion_guild.py @@ -57,6 +57,11 @@ event_fields = { "{coin} {{value}}".format(coin=conf.emojis.coin), True, ), + 'refund' : ( + _p('eventlog|field:refund|name', "Coins Refunded"), + "{coin} {{value}}".format(coin=conf.emojis.coin), + True, + ), 'memberid': ( _p('eventlog|field:memberid|name', "Member"), "<@{value}>", diff --git a/src/modules/rolemenus/cog.py b/src/modules/rolemenus/cog.py index 051cfb32..fd9defd8 100644 --- a/src/modules/rolemenus/cog.py +++ b/src/modules/rolemenus/cog.py @@ -15,10 +15,11 @@ from meta.logger import log_wrap from meta.errors import ResponseTimedOut, UserInputError, UserCancelled, SafeCancellation from meta.sharding import THIS_SHARD 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.transformers import DurationTransformer from utils.monitor import TaskMonitor +from babel.translator import ctx_locale from constants import MAX_COINS from data import NULL @@ -315,6 +316,11 @@ class RoleMenuCog(LionCog): menu = await self.data.RoleMenu.fetch(equip_row.menuid) guild = self.bot.get_guild(menu.guildid) 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) if role is not None: 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 role in member.roles: 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: logger.info(f"Expired {equipid}, and successfully removed the role from the member!") else: @@ -329,9 +339,56 @@ class RoleMenuCog(LionCog): f"Expired {equipid} for non-existent member {equip_row.userid}. " "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: 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() + 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) else: logger.info(f"Could not expire {equipid} because the guild was not found.") diff --git a/src/modules/rolemenus/rolemenu.py b/src/modules/rolemenus/rolemenu.py index bc4437af..1f3a7bb3 100644 --- a/src/modules/rolemenus/rolemenu.py +++ b/src/modules/rolemenus/rolemenu.py @@ -609,7 +609,24 @@ class RoleMenu: if remove_line: 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 async def _handle_negative(self, lion, member: discord.Member, mrole: RoleMenuRole) -> discord.Embed: @@ -690,12 +707,29 @@ class RoleMenu: 'rolemenu|deselect|success:norefund|desc', "You have unequipped **{role}**." )).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 async def _handle_selection(self, lion, member: discord.Member, menuroleid: int): lock_key = ('rmenu', member.id, member.guild.id) async with self.bot.idlock(lock_key): - # TODO: Selection locking mrole = self.rolemap.get(menuroleid, None) if mrole is None: raise ValueError(