From 4a67736adc76107bd3000e852565964480411a6d Mon Sep 17 00:00:00 2001 From: Conatum Date: Thu, 20 Jan 2022 12:12:17 +0200 Subject: [PATCH] (core): Add member name caching. --- bot/LionModule.py | 4 +- bot/core/data.py | 6 ++- bot/core/lion.py | 46 ++++++++++++++++++- bot/modules/study/tracking/session_tracker.py | 2 +- data/migration/v8-v9/migration.sql | 11 +++++ data/schema.sql | 7 ++- 6 files changed, 68 insertions(+), 8 deletions(-) diff --git a/bot/LionModule.py b/bot/LionModule.py index c22a2ab6..99618f60 100644 --- a/bot/LionModule.py +++ b/bot/LionModule.py @@ -105,8 +105,8 @@ class LionModule(Module): await ctx.reply("I need permission to send embeds in this channel before I can run any commands!") raise SafeCancellation(details='I cannot send embeds in this channel.') - # Ensure Lion exists - ctx.alion + # Ensure Lion exists and cached data is up to date + ctx.alion.update_saved_data(ctx.author) # Start typing await ctx.ch.trigger_typing() diff --git a/bot/core/data.py b/bot/core/data.py index 3087c8ee..b6b0e7b3 100644 --- a/bot/core/data.py +++ b/bot/core/data.py @@ -14,7 +14,7 @@ meta = RowTable( user_config = RowTable( 'user_config', - ('userid', 'timezone', 'topgg_vote_reminder'), + ('userid', 'timezone', 'topgg_vote_reminder', 'avatar_hash'), 'userid', cache=TTLCache(5000, ttl=60*5) ) @@ -33,7 +33,8 @@ guild_config = RowTable( 'video_studyban', 'video_grace_period', 'greeting_channel', 'greeting_message', 'returning_message', 'starting_funds', 'persist_roles', - 'pomodoro_channel'), + 'pomodoro_channel', + 'name'), 'guildid', cache=TTLCache(2500, ttl=60*5) ) @@ -51,6 +52,7 @@ lions = RowTable( 'revision_mute_count', 'last_study_badgeid', 'video_warned', + 'display_name', '_timestamp' ), ('guildid', 'userid'), diff --git a/bot/core/lion.py b/bot/core/lion.py index 098ec179..969c3e4f 100644 --- a/bot/core/lion.py +++ b/bot/core/lion.py @@ -1,4 +1,5 @@ import pytz +import discord from functools import reduce from datetime import datetime, timedelta @@ -48,6 +49,8 @@ class Lion: # TODO: Debug log lion = tb.lions.fetch(key) if not lion: + tb.user_config.fetch_or_create(userid) + tb.guild_config.fetch_or_create(guildid) tb.lions.create_row( guildid=guildid, userid=userid, @@ -75,10 +78,24 @@ class Lion: @property def data(self): """ - The Row corresponding to this user. + The Row corresponding to this member. """ return tb.lions.fetch(self.key) + @property + def user_data(self): + """ + The Row corresponding to this user. + """ + return tb.user_config.fetch_or_create(self.userid) + + @property + def guild_data(self): + """ + The Row corresponding to this guild. + """ + return tb.guild_config.fetch_or_create(self.guildid) + @property def settings(self): """ @@ -229,6 +246,33 @@ class Lion: return remaining + @property + def name(self): + """ + Returns the best local name possible. + """ + if self.member: + name = self.member.display_name + elif self.data.display_name: + name = self.data.display_name + else: + name = str(self.userid) + + return name + + + def update_saved_data(self, member: discord.Member): + """ + Update the stored discord data from the givem member. + Intended to be used when we get member data from events that may not be available in cache. + """ + if self.guild_data.name != member.guild.name: + self.guild_data.name = member.guild.name + if self.user_data.avatar_hash != member.avatar: + self.user_data.avatar_hash = member.avatar + if self.data.display_name != member.display_name: + self.data.display_name = member.display_name + def localize(self, naive_utc_dt): """ Localise the provided naive UTC datetime into the user's timezone. diff --git a/bot/modules/study/tracking/session_tracker.py b/bot/modules/study/tracking/session_tracker.py index add30e6a..a1392fb2 100644 --- a/bot/modules/study/tracking/session_tracker.py +++ b/bot/modules/study/tracking/session_tracker.py @@ -254,7 +254,7 @@ async def session_voice_tracker(client, member, before, after): return guild = member.guild - Lion.fetch(guild.id, member.id) + Lion.fetch(guild.id, member.id).update_saved_data(member) session = Session.get(guild.id, member.id) if before.channel == after.channel: diff --git a/data/migration/v8-v9/migration.sql b/data/migration/v8-v9/migration.sql index feefd5e5..b977df75 100644 --- a/data/migration/v8-v9/migration.sql +++ b/data/migration/v8-v9/migration.sql @@ -73,4 +73,15 @@ AS $$ $$ LANGUAGE PLPGSQL; -- }}} + +ALTER TABLE user_config + ADD COLUMN avatar_hash TEXT; + +ALTER TABLE guild_config + ADD COLUMN name TEXT; + +ALTER TABLE members + ADD COLUMN display_name TEXT; + + INSERT INTO VersionHistory (version, author) VALUES (9, 'v8-v9 migration'); diff --git a/data/schema.sql b/data/schema.sql index 2ba429d7..bfe51e28 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -42,7 +42,8 @@ CREATE TABLE global_guild_blacklist( CREATE TABLE user_config( userid BIGINT PRIMARY KEY, timezone TEXT, - topgg_vote_reminder + topgg_vote_reminder, + avatar_hash TEXT ); -- }}} @@ -80,7 +81,8 @@ CREATE TABLE guild_config( starting_funds INTEGER, persist_roles BOOLEAN, daily_study_cap INTEGER, - pomodoro_channel BIGINT + pomodoro_channel BIGINT, + name TEXT ); CREATE TABLE ignored_members( @@ -405,6 +407,7 @@ CREATE TABLE members( last_workout_start TIMESTAMP, last_study_badgeid INTEGER REFERENCES study_badges ON DELETE SET NULL, video_warned BOOLEAN DEFAULT FALSE, + display_name TEXT, _timestamp TIMESTAMP DEFAULT (now() at time zone 'utc'), PRIMARY KEY(guildid, userid) );