feat(menus): Implement event logging.
This commit is contained in:
@@ -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}>",
|
||||||
|
|||||||
@@ -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.")
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user