Skip to content

Commit

Permalink
feat(stats): add invite tracker success rate
Browse files Browse the repository at this point in the history
  • Loading branch information
ZRunner committed Nov 30, 2024
1 parent 0687a26 commit 742cb50
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
13 changes: 13 additions & 0 deletions modules/bot_stats/bot_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ def __init__(self, bot: Axobot):
self.open_files: dict[str, int] = defaultdict(int)
self.role_reactions = {"added": 0, "removed": 0}
self.serverlogs_audit_search: tuple[int, int] | None = None
self.invite_tracker_search: tuple[int, int] | None = None
self.snooze_events: dict[tuple[int, int], int] = defaultdict(int)
self.stream_events: dict[str, int] = defaultdict(int)
self.voice_transcript_events: dict[tuple[float, float], int] = defaultdict(int)
Expand Down Expand Up @@ -273,6 +274,13 @@ async def on_serverlogs_audit_search(self, success: bool):
else:
self.serverlogs_audit_search = (1, success)

async def on_invite_tracker_search(self, success: bool):
"Called when an invite tracker search is done"
if prev := self.invite_tracker_search:
self.invite_tracker_search = (prev[0]+1, prev[1]+success)
else:
self.invite_tracker_search = (1, success)

async def db_get_disabled_rss(self) -> int:
"Count the number of disabled RSS feeds in any guild"
table = "rss_feed_beta" if self.bot.beta else "rss_feed"
Expand Down Expand Up @@ -539,6 +547,11 @@ async def sql_loop(self):
audit_search_percent = round(self.serverlogs_audit_search[1] / self.serverlogs_audit_search[0] * 100, 1)
cursor.execute(query, (now, "logs.audit_search", audit_search_percent, 1, '%', False, self.bot.entity_id))
self.serverlogs_audit_search = None
# Invites tracker
if self.invite_tracker_search is not None:
invite_search_percent = round(self.invite_tracker_search[1] / self.invite_tracker_search[0] * 100, 1)
cursor.execute(query, (now, "logs.invite_search", invite_search_percent, 1, '%', False, self.bot.entity_id))
self.invite_tracker_search = None
# Last backup save
if self.last_backup_size:
cursor.execute(query, (now, "backup.size", self.last_backup_size, 1, "Gb", False, self.bot.entity_id))
Expand Down
10 changes: 5 additions & 5 deletions modules/invites_tracker/invites_tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ async def db_get_invites(self, guild_id: int) -> list[TrackedInvite]:
async with self.bot.db_main.read(query, (guild_id, self.bot.beta)) as query_result:
return query_result

async def db_add_invite(self, guild_id: int, invite_id: str, user_id: int | None, creation_date: datetime | None,
async def db_upsert_invite(self, guild_id: int, invite_id: str, user_id: int | None, creation_date: datetime | None,
usage_count: int):
"Insert a tracked invite in the database, or update it if it already exists"
query = (
Expand Down Expand Up @@ -81,7 +81,7 @@ async def sync_guild_invites(self, guild: discord.Guild):
# add/update existing invitations
for invite in guild_invites:
user_id = invite.inviter.id if invite.inviter else None
await self.db_add_invite(guild.id, invite.code, user_id, invite.created_at, invite.uses)
await self.db_upsert_invite(guild.id, invite.code, user_id, invite.created_at, invite.uses)
count += 1
# delete removed invitations
for tracked_invite in await self.db_get_invites(guild.id):
Expand Down Expand Up @@ -150,7 +150,7 @@ async def on_invite_create(self, invite: discord.Invite):
if invite.guild is None or not await self.is_tracker_enabled(invite.guild.id):
return
inviter_id = invite.inviter.id if invite.inviter else None
await self.db_add_invite(invite.guild.id, invite.code, inviter_id, invite.created_at, invite.uses or 0)
await self.db_upsert_invite(invite.guild.id, invite.code, inviter_id, invite.created_at, invite.uses or 0)

@commands.Cog.listener()
async def on_invite_delete(self, invite: discord.Invite):
Expand All @@ -165,8 +165,7 @@ async def on_member_join(self, member: discord.Member):
if not member.guild.me.guild_permissions.manage_guild or not await self.is_tracker_enabled(member.guild.id):
return
await asyncio.sleep(1) # Wait for the invite to be updated
used_invite = await self.check_invites_usage(member.guild)
if used_invite:
if used_invite := await self.check_invites_usage(member.guild):
discord_invite, tracked_invite = used_invite
tracked_invite["last_count"] = discord_invite.uses
tracked_invite["max_uses"] = discord_invite.max_uses
Expand All @@ -175,6 +174,7 @@ async def on_member_join(self, member: discord.Member):
await self.db_update_invite_count(member.guild.id, discord_invite.code, discord_invite.uses)
else:
self.bot.log.warning(f"Could not detect the invite used in guild {member.guild.id}")
self.bot.dispatch("invite_tracker_search", used_invite is not None)


invites_main = app_commands.Group(
Expand Down

0 comments on commit 742cb50

Please sign in to comment.