From 81e36629da6bd664d35f74f2792bb28d45760acd Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 20:02:00 +1000 Subject: Make team assignment deterministic for event distribution. --- bot/seasons/easter/egg_hunt/cog.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 7c6214d2..7d592bba 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -44,14 +44,18 @@ async def assign_team(user: discord.Member) -> discord.Member: c.execute(f"SELECT team FROM user_scores WHERE user_id = {user.id}") result = c.fetchone() if not result: - new_team = random.choice([Roles.white, Roles.blurple]) - log.debug(f"Assigned role {new_team} to {user}.") + c.execute( + "SELECT team, COUNT(*) AS count FROM user_scores " + "GROUP BY team ORDER BY count ASC LIMIT 1;" + ) + result = c.fetchone()[0] + + if result[0] == "WHITE": + new_team = Roles.white else: - if result[0] == "WHITE": - new_team = Roles.white - else: - new_team = Roles.blurple - log.debug(f"Restored role {new_team} to {user}.") + new_team = Roles.blurple + + log.debug(f"Assigned role {new_team} to {user}.") await user.add_roles(new_team) return GUILD.get_member(user.id) -- cgit v1.2.3 From 079d107c35ef11a3d55ff9a88aa8e5dc34f99dbb Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 20:03:00 +1000 Subject: Ensure super egg drops. --- bot/seasons/easter/egg_hunt/cog.py | 41 +++++++++++++++++++------------- bot/seasons/easter/egg_hunt/constants.py | 2 +- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 7d592bba..56d4e71d 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -295,11 +295,11 @@ class EggHunt(commands.Cog): self.task = asyncio.create_task(self.super_egg()) self.task.add_done_callback(self.task_cleanup) - @staticmethod - def task_cleanup(task): - """Returns a task result. Used as a done callback to show raised exceptions.""" + def task_cleanup(self, task): + """Returns task result and restarts. Used as a done callback to show raised exceptions.""" task.result() + self.task = asyncio.create_task(self.super_egg()) @staticmethod def current_timestamp() -> int: @@ -323,26 +323,33 @@ class EggHunt(commands.Cog): await asyncio.sleep(remaining) log.debug(f"Hunt started.") - current_window = EggHuntSettings.start_time - next_window = 0 - for window in EggHuntSettings.windows: - window = int(window) - if window < now: - current_window = window + + db = sqlite3.connect(DB_PATH) + c = db.cursor() + + current_window = None + next_window = None + windows = EggHuntSettings.windows.copy() + windows.insert(0, EggHuntSettings.start_time) + for i, window in enumerate(windows): + c.execute(f"SELECT COUNT(*) FROM super_eggs WHERE window={window}") + alread_dropped = c.fetchone()[0] + if alread_dropped: continue - if not next_window: - next_window = window else: + current_window = window + next_window = window[i+1] break - log.debug(f"Current Window: {current_window}. Next Window {next_window}") - - db = sqlite3.connect(DB_PATH) - c = db.cursor() - c.execute(f"SELECT COUNT(*) FROM super_eggs WHERE window={current_window}") count = c.fetchone()[0] db.close() + if not current_window: + log.debug(f"Suitable window not found.") + break + + log.debug(f"Current Window: {current_window}. Next Window {next_window}") + if not count: next_drop = random.randrange(now, next_window) log.debug(f"Sleeping until next super egg drop: {next_drop}.") @@ -370,7 +377,7 @@ class EggHunt(commands.Cog): await SuperEggMessage(msg, egg, current_window).start() log.debug("Sleeping until next window.") - next_loop = max(next_window - self.current_timestamp(), 0) + next_loop = max(next_window - self.current_timestamp(), 60*60) await asyncio.sleep(next_loop) @commands.Cog.listener() diff --git a/bot/seasons/easter/egg_hunt/constants.py b/bot/seasons/easter/egg_hunt/constants.py index 3f3c3bbe..c7d9818b 100644 --- a/bot/seasons/easter/egg_hunt/constants.py +++ b/bot/seasons/easter/egg_hunt/constants.py @@ -11,7 +11,7 @@ GUILD = bot.get_guild(Client.guild) class EggHuntSettings: start_time = int(os.environ["HUNT_START"]) end_time = start_time + 172800 # 48 hrs later - windows = os.environ.get("HUNT_WINDOWS").split(',') or [] + windows = [int(w) for w in os.environ.get("HUNT_WINDOWS").split(',')] or [] allowed_channels = [ Channels.seasonalbot_chat, Channels.off_topic_0, -- cgit v1.2.3 From 64d555ddee02481cac6fee07262d8c7d789fa5fd Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 20:03:18 +1000 Subject: Fix rank command. --- bot/seasons/easter/egg_hunt/cog.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 56d4e71d..5120497b 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -482,8 +482,9 @@ class EggHunt(commands.Cog): db = sqlite3.connect(DB_PATH) c = db.cursor() c.execute( - f"SELECT RANK() OVER(ORDER BY score DESC) AS rank FROM user_scores " - f"WHERE user_id={member.id}" + "SELECT rank FROM " + "(SELECT RANK() OVER(ORDER BY score DESC) AS rank, user_id FROM user_scores)" + f"WHERE user_id = {member.id};" ) result = c.fetchone() db.close() -- cgit v1.2.3 From 925930c9010dc59f52bb78eda0640e1a3e21626c Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 20:03:52 +1000 Subject: Close db after role assignment. --- bot/seasons/easter/egg_hunt/cog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 5120497b..30d20f30 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -55,6 +55,8 @@ async def assign_team(user: discord.Member) -> discord.Member: else: new_team = Roles.blurple + db.close() + log.debug(f"Assigned role {new_team} to {user}.") await user.add_roles(new_team) -- cgit v1.2.3 From 674bfac2cf0be2435e1d75ebf6688bd904e75c67 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 20:10:26 +1000 Subject: Account for leaderboard being invoked before scores exist. --- bot/seasons/easter/egg_hunt/cog.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 30d20f30..68cac717 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -458,20 +458,26 @@ class EggHunt(commands.Cog): team_result = c.fetchall() db.close() output = [] - scr_len = max(len(str(r[2])) for r in user_result) - for user_id, team, score, rank in user_result: - user = GUILD.get_member(user_id) or user_id - team = team.capitalize() - score = f"{score}pts" - output.append(f"{rank:>2}. {score:>{scr_len+3}} - {user} ({team})") - user_board = "\n".join(output) - output = [] - for team, score in team_result: - output.append(f"{team:<7}: {score}") - team_board = "\n".join(output) + if user_result: + scr_len = max(len(str(r[2])) for r in user_result) + for user_id, team, score, rank in user_result: + user = GUILD.get_member(user_id) or user_id + team = team.capitalize() + score = f"{score}pts" + output.append(f"{rank:>2}. {score:>{scr_len+3}} - {user} ({team})") + user_board = "\n".join(output) + else: + user_board = "No entries." + if team_result: + output = [] + for team, score in team_result: + output.append(f"{team:<7}: {score}") + team_board = "\n".join(output) + else: + team_board = "No entries." embed = discord.Embed( title="Egg Hunt Leaderboards", - description=f"**Teams**\n```\n{team_board}\n```\n" + description=f"**Team Scores**\n```\n{team_board}\n```\n" f"**Top 10 Members**\n```\n{user_board}\n```" ) await ctx.send(embed=embed) -- cgit v1.2.3 From 9629cd0347cd2cd52fcf42a99dad505d41bde8a8 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 21:49:00 +1000 Subject: Ignore the punished. --- bot/seasons/easter/egg_hunt/cog.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 68cac717..704c3173 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -26,6 +26,8 @@ TEAM_MAP = { GUILD = bot.get_guild(Client.guild) +MUTED = GUILD.get_role(MainRoles.muted) + def get_team_role(user: discord.Member) -> discord.Role: """Helper function to get the team role for a member.""" @@ -160,6 +162,11 @@ class EggMessage: return False if reaction.emoji != self.egg: return False + + # ignore the pushished + if MUTED in user.roles: + return False + return True async def collect_reacts(self, reaction: discord.Reaction, user: discord.Member): -- cgit v1.2.3 From b40064d2eeea96e58d67e260c673e5ea98e77e2d Mon Sep 17 00:00:00 2001 From: Leon Sandøy Date: Sun, 21 Apr 2019 22:07:16 +1000 Subject: Fix typos. Co-Authored-By: scragly <29337040+scragly@users.noreply.github.com> --- bot/seasons/easter/egg_hunt/cog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 704c3173..eb81744c 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -342,8 +342,8 @@ class EggHunt(commands.Cog): windows.insert(0, EggHuntSettings.start_time) for i, window in enumerate(windows): c.execute(f"SELECT COUNT(*) FROM super_eggs WHERE window={window}") - alread_dropped = c.fetchone()[0] - if alread_dropped: + already_dropped = c.fetchone()[0] + if already_dropped: continue else: current_window = window -- cgit v1.2.3 From 903e12b25a839dd259b284f7766728e14cd53be0 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 22:26:43 +1000 Subject: Cleanup alignment code. --- bot/seasons/easter/egg_hunt/cog.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index eb81744c..6ea332e4 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -466,12 +466,18 @@ class EggHunt(commands.Cog): db.close() output = [] if user_result: - scr_len = max(len(str(r[2])) for r in user_result) + # Get the alignment needed for the score + score_lengths = [] + for result in user_result: + length = len(str(result[2])) + score_lengths.append(length) + + score_length = max(score_lengths) for user_id, team, score, rank in user_result: user = GUILD.get_member(user_id) or user_id team = team.capitalize() score = f"{score}pts" - output.append(f"{rank:>2}. {score:>{scr_len+3}} - {user} ({team})") + output.append(f"{rank:>2}. {score:>{score_length+3}} - {user} ({team})") user_board = "\n".join(output) else: user_board = "No entries." -- cgit v1.2.3 From e8f4b0927ec9db5fbf6ec35a3340eeb013c72873 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Sun, 21 Apr 2019 23:20:24 +1000 Subject: Fix super eggs and ctx.invoke usage. --- bot/seasons/easter/egg_hunt/cog.py | 51 ++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 6ea332e4..6ebc016d 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -50,7 +50,8 @@ async def assign_team(user: discord.Member) -> discord.Member: "SELECT team, COUNT(*) AS count FROM user_scores " "GROUP BY team ORDER BY count ASC LIMIT 1;" ) - result = c.fetchone()[0] + result = c.fetchone() + result = result[0] if result else "WHITE" if result[0] == "WHITE": new_team = Roles.white @@ -195,6 +196,15 @@ class EggMessage: with contextlib.suppress(discord.Forbidden): await self.message.add_reaction(self.egg) self.timeout_task = asyncio.create_task(self.start_timeout(300)) + while True: + if not self.timeout_task: + break + if not self.timeout_task.done(): + await self.timeout_task + else: + # make sure any exceptions raise if necessary + self.timeout_task.result() + break class SuperEggMessage(EggMessage): @@ -207,7 +217,7 @@ class SuperEggMessage(EggMessage): async def finalise_score(self): """Sums and actions scoring for this super egg session.""" try: - message = await self.message.channel.get_message(self.message.id) + message = await self.message.channel.fetch_message(self.message.id) except discord.NotFound: return @@ -301,6 +311,7 @@ class EggHunt(commands.Cog): def __init__(self): self.event_channel = GUILD.get_channel(Channels.seasonalbot_chat) + self.super_egg_buffer = 60*60 self.task = asyncio.create_task(self.super_egg()) self.task.add_done_callback(self.task_cleanup) @@ -343,26 +354,40 @@ class EggHunt(commands.Cog): for i, window in enumerate(windows): c.execute(f"SELECT COUNT(*) FROM super_eggs WHERE window={window}") already_dropped = c.fetchone()[0] + if already_dropped: + log.debug(f"Window {window} already dropped, checking next one.") continue - else: - current_window = window - next_window = window[i+1] - break - count = c.fetchone()[0] + if now < window: + log.debug("Drop windows up to date, sleeping until next one.") + await asyncio.sleep(window-now) + now = self.current_timestamp() + + current_window = window + next_window = windows[i+1] + break + + count = c.fetchone() db.close() if not current_window: - log.debug(f"Suitable window not found.") + log.debug("No drop windows left, ending task.") break log.debug(f"Current Window: {current_window}. Next Window {next_window}") if not count: - next_drop = random.randrange(now, next_window) - log.debug(f"Sleeping until next super egg drop: {next_drop}.") - await asyncio.sleep(next_drop) + if next_window < now: + log.debug("An Egg Drop Window was missed, dropping one now.") + next_drop = 0 + else: + next_drop = random.randrange(now, next_window) + + if next_drop: + log.debug(f"Sleeping until next super egg drop: {next_drop}.") + await asyncio.sleep(next_drop) + if random.randrange(10) <= 2: egg = Emoji.egg_diamond egg_type = "Diamond" @@ -386,7 +411,7 @@ class EggHunt(commands.Cog): await SuperEggMessage(msg, egg, current_window).start() log.debug("Sleeping until next window.") - next_loop = max(next_window - self.current_timestamp(), 60*60) + next_loop = max(next_window - self.current_timestamp(), self.super_egg_buffer) await asyncio.sleep(next_loop) @commands.Cog.listener() @@ -432,7 +457,7 @@ class EggHunt(commands.Cog): wins the points. """ - await ctx.invoke(bot.get_command("help"), "hunt") + await ctx.invoke(bot.get_command("help"), command="hunt") @hunt.command() async def countdown(self, ctx): -- cgit v1.2.3 From 29660cd339438ff20a0ef79e09b917ec409e7e98 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Mon, 22 Apr 2019 00:18:05 +1000 Subject: Improve user store efficiency. --- bot/seasons/easter/egg_hunt/cog.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 6ebc016d..20b6f1d9 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -73,7 +73,7 @@ class EggMessage: self.message = message self.egg = egg self.first = None - self.users = [] + self.users = set() self.teams = {Roles.white: "WHITE", Roles.blurple: "BLURPLE"} self.new_team_assignments = {} self.timeout_task = None @@ -186,7 +186,8 @@ class EggMessage: self.first = user await self.start_timeout() else: - self.users.append(user) + if user != self.first: + self.users.add(user) async def start(self): """Starts the egg drop session.""" -- cgit v1.2.3 From 7cfb3f41c997c335ba6dd850fc7ebb90a9d0d6c7 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Mon, 22 Apr 2019 01:05:25 +1000 Subject: Log reactions for later checking of behaviour analysis and anti-cheat checks. --- bot/seasons/easter/egg_hunt/cog.py | 77 +++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 20b6f1d9..85615549 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -313,9 +313,59 @@ class EggHunt(commands.Cog): def __init__(self): self.event_channel = GUILD.get_channel(Channels.seasonalbot_chat) self.super_egg_buffer = 60*60 + self.tables = { + "super_eggs": ( + "CREATE TABLE super_eggs (" + "message_id INTEGER NOT NULL " + " CONSTRAINT super_eggs_pk PRIMARY KEY, " + "egg_type TEXT NOT NULL, " + "team TEXT NOT NULL, " + "window INTEGER);" + ), + "team_scores": ( + "CREATE TABLE team_scores (" + "team_id TEXT, " + "team_score INTEGER DEFAULT 0);" + ), + "user_scores": ( + "CREATE TABLE user_scores(" + "user_id INTEGER NOT NULL " + " CONSTRAINT user_scores_pk PRIMARY KEY, " + "team TEXT NOT NULL, " + "score INTEGER DEFAULT 0 NOT NULL);" + ), + "react_logs": ( + "CREATE TABLE react_logs(" + "member_id INTEGER NOT NULL, " + "message_id INTEGER NOT NULL, " + "reaction_id TEXT NOT NULL, " + "react_timestamp REAL NOT NULL);" + ) + } + self.prepare_db() self.task = asyncio.create_task(self.super_egg()) self.task.add_done_callback(self.task_cleanup) + def prepare_db(self): + db = sqlite3.connect(DB_PATH) + c = db.cursor() + + exists_sql = "SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';" + + missing_tables = [] + for table in self.tables: + c.execute(exists_sql.format(table_name=table)) + result = c.fetchone() + if not result: + missing_tables.append(table) + + for table in missing_tables: + log.info(f"Table {table} is missing, building new one.") + c.execute(self.tables[table]) + + db.commit() + db.close() + def task_cleanup(self, task): """Returns task result and restarts. Used as a done callback to show raised exceptions.""" @@ -323,16 +373,16 @@ class EggHunt(commands.Cog): self.task = asyncio.create_task(self.super_egg()) @staticmethod - def current_timestamp() -> int: + def current_timestamp() -> float: """Returns a timestamp of the current UTC time.""" - return int(datetime.utcnow().replace(tzinfo=timezone.utc).timestamp()) + return datetime.utcnow().replace(tzinfo=timezone.utc).timestamp() async def super_egg(self): """Manages the timing of super egg drops.""" while True: - now = self.current_timestamp() + now = int(self.current_timestamp()) if now > EggHuntSettings.end_time: log.debug("Hunt ended. Ending task.") @@ -363,7 +413,7 @@ class EggHunt(commands.Cog): if now < window: log.debug("Drop windows up to date, sleeping until next one.") await asyncio.sleep(window-now) - now = self.current_timestamp() + now = int(self.current_timestamp()) current_window = window next_window = windows[i+1] @@ -412,9 +462,26 @@ class EggHunt(commands.Cog): await SuperEggMessage(msg, egg, current_window).start() log.debug("Sleeping until next window.") - next_loop = max(next_window - self.current_timestamp(), self.super_egg_buffer) + next_loop = max(next_window - int(self.current_timestamp()), self.super_egg_buffer) await asyncio.sleep(next_loop) + @commands.Cog.listener() + async def on_raw_reaction_add(self, payload): + """Reaction event listener for reaction logging for later anti-cheat analysis.""" + + if payload.channel_id not in EggHuntSettings.allowed_channels: + return + + now = self.current_timestamp() + db = sqlite3.connect(DB_PATH) + c = db.cursor() + c.execute( + "INSERT INTO react_logs(member_id, message_id, reaction_id, react_timestamp) " + f"VALUES({payload.user_id}, {payload.message_id}, '{payload.emoji}', {now})" + ) + db.commit() + db.close() + @commands.Cog.listener() async def on_message(self, message): """Message event listener for random egg drops.""" -- cgit v1.2.3 From 1371511bb78e4ac8de6c0aceed9a977dd80b6306 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Mon, 22 Apr 2019 01:11:15 +1000 Subject: Add prepare_db docstring. --- bot/seasons/easter/egg_hunt/cog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index 85615549..bbbecd7f 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -347,6 +347,8 @@ class EggHunt(commands.Cog): self.task.add_done_callback(self.task_cleanup) def prepare_db(self): + """Ensures database tables all exist and if not, creates them.""" + db = sqlite3.connect(DB_PATH) c = db.cursor() -- cgit v1.2.3 From e2876cccfa051b9c66e9292edeb9251ff99ad147 Mon Sep 17 00:00:00 2001 From: Scragly <29337040+scragly@users.noreply.github.com> Date: Mon, 22 Apr 2019 01:41:17 +1000 Subject: change counter to minute --- bot/seasons/easter/egg_hunt/cog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bot/seasons/easter/egg_hunt/cog.py b/bot/seasons/easter/egg_hunt/cog.py index bbbecd7f..c9e2dc18 100644 --- a/bot/seasons/easter/egg_hunt/cog.py +++ b/bot/seasons/easter/egg_hunt/cog.py @@ -295,7 +295,7 @@ class SuperEggMessage(EggMessage): return count = 4 for _ in range(count): - await asyncio.sleep(1) + await asyncio.sleep(60) embed = self.message.embeds[0] embed.set_footer(text=f"Finishing in {count} minutes.") try: -- cgit v1.2.3