Skip to content

Commit 27e4495

Browse files
author
Ammon Smith
committed
Add tracking for voice event changes.
1 parent 6eeabaf commit 27e4495

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

Diff for: statbot/client.py

+14
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,14 @@ async def on_member_update(self, before, after):
406406
if before.activity != after.activity:
407407
self.sql.activity_change(trans, after)
408408

409+
async def on_voice_state_update(self, member, before, after):
410+
self._log_ignored(f"Member {member.id} updated their voice state in guild {member.guild.id}")
411+
if not await self._accept_guild(member.guild):
412+
return
413+
414+
with self.sql.transaction() as trans:
415+
self.sql.voice_state_change(trans, member, after)
416+
409417
async def on_guild_role_create(self, role):
410418
self._log_ignored(f"Role {role.id} was created in guild {role.guild.id}")
411419
if not await self._accept_guild(role.guild):
@@ -449,3 +457,9 @@ async def on_guild_emojis_update(self, guild, before, after):
449457
self.sql.add_emoji(trans, emoji)
450458
for emoji in before - after:
451459
self.sql.remove_emoji(trans, emoji)
460+
461+
async def on_guild_available(self, guild):
462+
self.logger.info(f"Guild {guild.id} '{guild.name}' is now available.")
463+
464+
async def on_guild_unavailable(self, guild):
465+
self.logger.info(f"Guild {guild.id} '{guild.name}' is unavailable.")

Diff for: statbot/sql.py

+46-1
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,24 @@ def activity_values(member, when):
193193
for attr in ('timestamps', 'assets', 'party'):
194194
try:
195195
values['other'][attr] = getattr(member.activity, attr)
196-
except KeyError:
196+
except AttributeError:
197197
pass
198198

199199
return values
200200

201+
def voice_event_values(member, when, voice_state):
202+
return {
203+
'timestamp': when,
204+
'user_id': member.id,
205+
'guild_id': member.guild.id,
206+
'self_deaf': voice_state.self_deaf,
207+
'self_mute': voice_state.self_mute,
208+
'guild_deaf': voice_state.deaf,
209+
'guild_mute': voice_state.mute,
210+
'afk': voice_state.afk,
211+
'voice_channel_id': getattr(voice_state.channel, 'id', None),
212+
}
213+
201214
class _Transaction:
202215
__slots__ = (
203216
'conn',
@@ -253,6 +266,7 @@ class DiscordSqlHandler:
253266
'tb_typing',
254267
'tb_statuses',
255268
'tb_activities',
269+
'tb_voice_events',
256270
'tb_pins',
257271
'tb_mentions',
258272
'tb_guilds',
@@ -272,6 +286,7 @@ class DiscordSqlHandler:
272286
'typing_cache',
273287
'status_cache',
274288
'activity_cache',
289+
'voice_event_cache',
275290
'guild_cache',
276291
'channel_cache',
277292
'voice_channel_cache',
@@ -338,6 +353,18 @@ def __init__(self, addr, cache_size, logger=null_logger):
338353
Column('twitch_name', String, nullable=True),
339354
Column('other', JSON),
340355
UniqueConstraint('timestamp', 'user_id', name='uq_activities'))
356+
self.tb_voice_events = Table('voice_events', meta,
357+
Column('timestamp', DateTime, primary_key=True),
358+
Column('user_id', BigInteger, ForeignKey('users.user_id'), primary_key=True),
359+
Column('guild_id', BigInteger, ForeignKey('guilds.guild_id'), primary_key=True),
360+
Column('self_deaf', Boolean),
361+
Column('self_mute', Boolean),
362+
Column('guild_deaf', Boolean),
363+
Column('guild_mute', Boolean),
364+
Column('afk', Boolean),
365+
Column('voice_channel_id', BigInteger,
366+
ForeignKey('voice_channels.voice_channel_id'), nullable=True),
367+
UniqueConstraint('timestamp', 'user_id', 'guild_id', name='uq_voice_events'))
341368
self.tb_pins = Table('pins', meta,
342369
Column('pin_id', BigInteger, primary_key=True),
343370
Column('message_id', BigInteger, ForeignKey('messages.message_id'),
@@ -465,6 +492,7 @@ def __init__(self, addr, cache_size, logger=null_logger):
465492
self.typing_cache = LruCache(cache_size['event-size'])
466493
self.status_cache = LruCache(cache_size['event-size'])
467494
self.activity_cache = LruCache(cache_size['event-size'])
495+
self.voice_event_cache = LruCache(cache_size['event-size'])
468496
self.guild_cache = LruCache(cache_size['lookup-size'])
469497
self.channel_cache = LruCache(cache_size['lookup-size'])
470498
self.voice_channel_cache = LruCache(cache_size['lookup-size'])
@@ -670,6 +698,23 @@ def activity_change(self, trans, member):
670698
trans.execute(ins)
671699
self.activity_cache[key] = values
672700

701+
# Voice state
702+
def voice_state_change(self, trans, member, voice_state):
703+
timestamp = datetime.now()
704+
key = (timestamp, member.id, member.guild.id)
705+
706+
if self.voice_event_cache.get(key, None):
707+
self.logger.debug("Voice state change lookup is up-to-date")
708+
return
709+
710+
self.logger.info(f"Inserting voice state change event for user {member.id}")
711+
values = voice_event_values(member, timestamp, voice_state)
712+
ins = self.tb_voice_events \
713+
.insert() \
714+
.values(values)
715+
trans.execute(ins)
716+
self.voice_event_cache[key] = values
717+
673718
# Reactions
674719
def add_reaction(self, trans, reaction, user):
675720
self.logger.info(f"Inserting live reaction for user {user.id} on message {reaction.message.id}")

0 commit comments

Comments
 (0)