From d29ad86d4490a69c6a5d6047923fca504b93ac97 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Tue, 9 Oct 2018 00:02:06 +0200 Subject: [PATCH 1/4] Add caching to /deaths users --- cogs/tibia.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cogs/tibia.py b/cogs/tibia.py index dcb5256..61a4d26 100644 --- a/cogs/tibia.py +++ b/cogs/tibia.py @@ -132,6 +132,7 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): now = time.time() show_links = not ctx.long per_page = 20 if ctx.long else 5 + users = dict() try: if name is None: title = "Latest deaths" @@ -143,9 +144,19 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): row = c.fetchone() if row is None: break - user = self.bot.get_member(row["user_id"], user_guilds) + + user = users.get(row["user_id"]) + if user is False: + continue if user is None: + user = self.bot.get_member(row["user_id"], user_guilds) + + if user is None: + users[row["user_id"]] = False continue + else: + users[row["user_id"]] = user + if row["world"] not in user_worlds: continue count += 1 From 348010b6f145a0af63e358065cf240173cfcd9c5 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Tue, 9 Oct 2018 19:40:12 +0200 Subject: [PATCH 2/4] Enhance caching of users on /deaths --- cogs/tibia.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/cogs/tibia.py b/cogs/tibia.py index 61a4d26..d68a72b 100644 --- a/cogs/tibia.py +++ b/cogs/tibia.py @@ -132,7 +132,8 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): now = time.time() show_links = not ctx.long per_page = 20 if ctx.long else 5 - users = dict() + users_cache = dict() + user_unknown = "unknown" try: if name is None: title = "Latest deaths" @@ -144,21 +145,13 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): row = c.fetchone() if row is None: break - - user = users.get(row["user_id"]) - if user is False: + if row["world"] not in user_worlds: continue - if user is None: - user = self.bot.get_member(row["user_id"], user_guilds) - if user is None: - users[row["user_id"]] = False + user = self._get_cached_user_(self, row["user_id"], user_unknown, users_cache, user_guilds) + if user == user_unknown: continue - else: - users[row["user_id"]] = user - if row["world"] not in user_worlds: - continue count += 1 row["time"] = get_time_diff(dt.timedelta(seconds=now - row["date"])) row["user"] = user.display_name @@ -232,6 +225,15 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): except CannotPaginate as e: await ctx.send(e) + @staticmethod + def _get_cached_user_(self, user_id, user_unknown, users_cache, user_guilds): + cached_user = users_cache.get(user_id) + if cached_user is None: + member_user = self.bot.get_member(user_id, user_guilds) + cached_user = user_unknown if member_user is None else member_user + users_cache[user_id] = cached_user + return cached_user + @deaths.command(name="monster", aliases=["mob", "killer"]) @checks.is_in_tracking_world() async def deaths_monsters(self, ctx: NabCtx, *, name: str): From a946b2b91cd634356dac52cfb405c53750f9dfc8 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Tue, 9 Oct 2018 20:41:26 +0200 Subject: [PATCH 3/4] Add the same caching to both /timeline and /levels --- cogs/tibia.py | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/cogs/tibia.py b/cogs/tibia.py index d68a72b..6e77b49 100644 --- a/cogs/tibia.py +++ b/cogs/tibia.py @@ -115,10 +115,10 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): return if ctx.is_private: - user_guilds = self.bot.get_user_guilds(ctx.author.id) + user_servers = self.bot.get_user_guilds(ctx.author.id) user_worlds = self.bot.get_user_worlds(ctx.author.id) else: - user_guilds = [ctx.guild] + user_servers = [ctx.guild] user_worlds = [self.bot.tracked_worlds.get(ctx.guild.id)] if user_worlds[0] is None and name is None: await ctx.send("This server is not tracking any tibia worlds.") @@ -148,7 +148,7 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): if row["world"] not in user_worlds: continue - user = self._get_cached_user_(self, row["user_id"], user_unknown, users_cache, user_guilds) + user = self._get_cached_user_(self, row["user_id"], user_unknown, users_cache, user_servers) if user == user_unknown: continue @@ -226,10 +226,10 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): await ctx.send(e) @staticmethod - def _get_cached_user_(self, user_id, user_unknown, users_cache, user_guilds): + def _get_cached_user_(self, user_id, user_unknown, users_cache, user_servers): cached_user = users_cache.get(user_id) if cached_user is None: - member_user = self.bot.get_member(user_id, user_guilds) + member_user = self.bot.get_member(user_id, user_servers) cached_user = user_unknown if member_user is None else member_user users_cache[user_id] = cached_user return cached_user @@ -737,10 +737,10 @@ async def levels(self, ctx: NabCtx, *, name: str=None): return if ctx.is_private: - user_guilds = self.bot.get_user_guilds(ctx.author.id) + user_servers = self.bot.get_user_guilds(ctx.author.id) user_worlds = self.bot.get_user_worlds(ctx.author.id) else: - user_guilds = [ctx.guild] + user_servers = [ctx.guild] user_worlds = [self.bot.tracked_worlds.get(ctx.guild.id)] if user_worlds[0] is None: await ctx.send("This server is not tracking any tibia worlds.") @@ -754,6 +754,8 @@ async def levels(self, ctx: NabCtx, *, name: str=None): now = time.time() per_page = 20 if ctx.long else 5 await ctx.channel.trigger_typing() + user_cache = dict() + user_unknown = "unknown" try: if name is None: title = "Latest level ups" @@ -765,11 +767,13 @@ async def levels(self, ctx: NabCtx, *, name: str=None): row = c.fetchone() if row is None: break - user = self.bot.get_member(row["user_id"], user_guilds) - if user is None: - continue if row["world"] not in user_worlds: continue + + user = self._get_cached_user_(self, row["user_id"], user_unknown, user_cache, user_servers) + if user == user_unknown: + continue + count += 1 row["time"] = get_time_diff(dt.timedelta(seconds=now - row["date"])) row["user"] = user.display_name @@ -784,7 +788,7 @@ async def levels(self, ctx: NabCtx, *, name: str=None): await ctx.send("I don't have a character with that name registered.") return # If user doesn't share a server with the owner, don't display it - owner = self.bot.get_member(result["user_id"], user_guilds) + owner = self.bot.get_member(result["user_id"], user_servers) if owner is None: await ctx.send("I don't have a character with that name registered.") return @@ -1301,6 +1305,8 @@ async def timeline(self, ctx: NabCtx, *, name: str = None): now = time.time() per_page = 20 if ctx.long else 5 await ctx.channel.trigger_typing() + user_cache = dict() + user_unknown = "unknown" try: if name is None: title = "Timeline" @@ -1316,11 +1322,13 @@ async def timeline(self, ctx: NabCtx, *, name: str = None): row = c.fetchone() if row is None: break - user = self.bot.get_member(row["user_id"], user_servers) - if user is None: - continue if row["world"] not in user_worlds: continue + + user = self._get_cached_user_(self, row["user_id"], user_unknown, user_cache, user_servers) + if user == user_unknown: + continue + count += 1 row["time"] = get_time_diff(dt.timedelta(seconds=now - row["date"])) row["user"] = user.display_name From ebfc19da391005fc4691c7fcffaf16c397023a74 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Wed, 10 Oct 2018 09:12:46 +0200 Subject: [PATCH 4/4] Implement PR suggestions --- cogs/tibia.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/cogs/tibia.py b/cogs/tibia.py index 6e77b49..354a9ab 100644 --- a/cogs/tibia.py +++ b/cogs/tibia.py @@ -133,7 +133,6 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): show_links = not ctx.long per_page = 20 if ctx.long else 5 users_cache = dict() - user_unknown = "unknown" try: if name is None: title = "Latest deaths" @@ -148,8 +147,8 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): if row["world"] not in user_worlds: continue - user = self._get_cached_user_(self, row["user_id"], user_unknown, users_cache, user_servers) - if user == user_unknown: + user = self._get_cached_user_(self, row["user_id"], users_cache, user_servers) + if user is None: continue count += 1 @@ -225,15 +224,6 @@ async def deaths(self, ctx: NabCtx, *, name: str = None): except CannotPaginate as e: await ctx.send(e) - @staticmethod - def _get_cached_user_(self, user_id, user_unknown, users_cache, user_servers): - cached_user = users_cache.get(user_id) - if cached_user is None: - member_user = self.bot.get_member(user_id, user_servers) - cached_user = user_unknown if member_user is None else member_user - users_cache[user_id] = cached_user - return cached_user - @deaths.command(name="monster", aliases=["mob", "killer"]) @checks.is_in_tracking_world() async def deaths_monsters(self, ctx: NabCtx, *, name: str): @@ -755,7 +745,6 @@ async def levels(self, ctx: NabCtx, *, name: str=None): per_page = 20 if ctx.long else 5 await ctx.channel.trigger_typing() user_cache = dict() - user_unknown = "unknown" try: if name is None: title = "Latest level ups" @@ -770,8 +759,8 @@ async def levels(self, ctx: NabCtx, *, name: str=None): if row["world"] not in user_worlds: continue - user = self._get_cached_user_(self, row["user_id"], user_unknown, user_cache, user_servers) - if user == user_unknown: + user = self._get_cached_user_(self, row["user_id"], user_cache, user_servers) + if user is None: continue count += 1 @@ -1306,7 +1295,6 @@ async def timeline(self, ctx: NabCtx, *, name: str = None): per_page = 20 if ctx.long else 5 await ctx.channel.trigger_typing() user_cache = dict() - user_unknown = "unknown" try: if name is None: title = "Timeline" @@ -1325,8 +1313,8 @@ async def timeline(self, ctx: NabCtx, *, name: str = None): if row["world"] not in user_worlds: continue - user = self._get_cached_user_(self, row["user_id"], user_unknown, user_cache, user_servers) - if user == user_unknown: + user = self._get_cached_user_(self, row["user_id"], user_cache, user_servers) + if user is None: continue count += 1 @@ -2076,6 +2064,15 @@ async def scan_news(self): except Exception: log.exception("Task: scan_news") + @staticmethod + def _get_cached_user_(self, user_id, users_cache, user_servers): + if user_id in users_cache: + return users_cache.get(user_id) + else: + member_user = self.bot.get_member(user_id, user_servers) + users_cache[user_id] = member_user + return member_user + def __unload(self): print("cogs.tibia: Cancelling pending tasks...") self.news_announcements_task.cancel()