From d8b2fcb3a28d2f5fd72c1218f96c81ccbac7e13b Mon Sep 17 00:00:00 2001 From: phxntxm Date: Wed, 31 Aug 2016 19:07:38 -0500 Subject: [PATCH] Added the ability to get server/member count across all shards --- cogs/core.py | 17 ++++++++++------- cogs/statsupdate.py | 15 +++++++++++++++ cogs/utils/config.py | 8 +------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/cogs/core.py b/cogs/core.py index 6de14bd..861fc77 100644 --- a/cogs/core.py +++ b/cogs/core.py @@ -63,19 +63,22 @@ class Core: # The only real use of doing it this way is easier editing if the info in this command is changed fmt = {} - all_members = list(self.bot.get_all_members()) + bot_data = config.get_content('bot_data') + total_data = {} + for shard, values in bot_data.items(): + for key, value in values.items(): + if key in total_data: + total_data[key] += value + else: + total_data[key] = value # We can pretty safely assume that the author is going to be in at least one channel with the bot # So find the author based on that list - authors = [] - for author_id in config.owner_ids: - authors.append(discord.utils.get(all_members, id=author_id).name) fmt['Official Bot Server'] = config.dev_server - fmt['Author'] = ", ".join(authors) fmt['Uptime'] = (pendulum.utcnow() - self.bot.uptime).in_words() - fmt['Total Servers'] = len(self.bot.servers) - fmt['Total Members'] = len(all_members) + fmt['Total Servers'] = total_data.get('server_count') + fmt['Total Members'] = total_data.get('member_count') fmt['Description'] = self.bot.description servers_playing_music = len([server_id for server_id, state in self.bot.get_cog('Music').voice_states.items() if diff --git a/cogs/statsupdate.py b/cogs/statsupdate.py index 701459f..995720f 100644 --- a/cogs/statsupdate.py +++ b/cogs/statsupdate.py @@ -44,12 +44,27 @@ class StatsUpdate: async def on_server_join(self, server): await self.update() + data = await config.get_content('bot_data') + shard_data = data.get('shard_{}'.format(config.shard_id)) + shard_data['server_count'] = len(self.bot.servers) + shard_data['member_count'] = len(list(self.bot.get_all_members())) + await config.save_content('bot_data') async def on_server_leave(self, server): await self.update() + data = await config.get_content('bot_data') + shard_data = data.get('shard_{}'.format(config.shard_id)) + shard_data['server_count'] = len(self.bot.servers) + shard_data['member_count'] = len(list(self.bot.get_all_members())) + await config.save_content('bot_data') async def on_ready(self): await self.update() + data = await config.get_content('bot_data') + shard_data = data.get('shard_{}'.format(config.shard_id)) + shard_data['server_count'] = len(self.bot.servers) + shard_data['member_count'] = len(list(self.bot.get_all_members())) + await config.save_content('bot_data') def setup(bot): diff --git a/cogs/utils/config.py b/cogs/utils/config.py index 5205759..f213dd9 100644 --- a/cogs/utils/config.py +++ b/cogs/utils/config.py @@ -93,12 +93,6 @@ sharded_data = {} # cache[k] = Cache(k) -def get_bot_data(key): - # This method will handle data that we'd like to get across all shards - # First get the bot's data from cache or the database - bot_data = get_content('bot_data') - - def command_prefix(bot, message): # We do not want to make a query for every message that is sent # So assume it's in cache, or it doesn't exist @@ -138,7 +132,7 @@ async def save_content(table: str, content): async def disabled_get_content(key: str): cached = cache.get('key') - if cached is None: + if cached is None or len(cached) == 0: value = await _get_content(key) # If we found this object not cached, cache it cache['key'] = value