From b61008518c393f30e0011a677bc2b706545b38c6 Mon Sep 17 00:00:00 2001 From: alwayscompiling Date: Sun, 10 Jul 2022 20:05:20 -0400 Subject: [PATCH] Moved message listener to a cog. Listener is set up on bot run. Listener listens to all messages. Pulls score and image from a message sent in submission channel if a user has an active submission. --- cogs/message_listener/__init__.py | 45 +++++++++++++++++++++++++++++ cogs/score/__init__.py | 1 + cogs/submission/submission_views.py | 20 ++++--------- highscores.py | 3 ++ 4 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 cogs/message_listener/__init__.py diff --git a/cogs/message_listener/__init__.py b/cogs/message_listener/__init__.py new file mode 100644 index 0000000..182e9ea --- /dev/null +++ b/cogs/message_listener/__init__.py @@ -0,0 +1,45 @@ +""" +Bot command to submit a score +""" + +from nextcord.ext import commands +import nextcord + +from highscores import submission_messages # pylint: disable=import-error +from highscores import highscores_data # pylint: disable=import-error + + +class Score(commands.Cog, name="Message Listener"): + """Submits a score.""" + + def __init__(self, bot: commands.Bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, proof_message: nextcord.Message): + """Listener for message creation.""" + for user_id, message_id in submission_messages.items(): + submission_message: nextcord.Message = await self.bot.get_channel( + highscores_data["submission_channel_id"] + ).fetch_message(message_id) + + # need check if correct user and correct channel + if ( + proof_message.channel.id == highscores_data["submission_channel_id"] + and proof_message.author.id == user_id + ): + + embed = submission_message.embeds[0] + embed.add_field(name="Score", value=proof_message.content, inline=False) + await submission_message.edit( + files=[await attch.to_file() for attch in proof_message.attachments], + embed=embed, + ) + await proof_message.delete() + + +# This function will be called when this extension is loaded. +# It is necessary to add these functions to the bot. +def setup(bot: commands.Bot): + """Adds function to bot""" + bot.add_cog(Score(bot)) diff --git a/cogs/score/__init__.py b/cogs/score/__init__.py index 5409956..65bce84 100644 --- a/cogs/score/__init__.py +++ b/cogs/score/__init__.py @@ -3,6 +3,7 @@ Bot command to submit a score """ from nextcord.ext import commands + from highscores import highscores_data # pylint: disable=import-error from utilities.utils import submit_score # pylint: disable=import-error from .verification_view import VerificationView diff --git a/cogs/submission/submission_views.py b/cogs/submission/submission_views.py index e5c6b8d..b6eae7b 100644 --- a/cogs/submission/submission_views.py +++ b/cogs/submission/submission_views.py @@ -7,6 +7,7 @@ from nextcord.ext import commands from utilities.data_storage import open_message_map # pylint: disable=import-error from highscores import highscores_data # pylint: disable=import-error +from highscores import submission_messages # pylint: disable=import-error from .verification_view import VerificationView @@ -36,19 +37,8 @@ class SubmissionButton(nextcord.ui.View): embed=embed, ) - def wait_check(check_message: nextcord.Message): - return ( - interaction.user.id == check_message.author.id - and interaction.channel == check_message.channel - ) - - proof_message = await self._bot.wait_for("message", check=wait_check) - embed = submission_message.embeds[0] - embed.add_field(name="Score", value=proof_message.content, inline=False) - await submission_message.edit( - files=[await attch.to_file() for attch in proof_message.attachments], embed=embed - ) - await proof_message.delete() + # a user should only have 1 submission active at once. + submission_messages[interaction.user.id] = submission_message.id async def _category_select_options(self, boss_name: str) -> "list[nextcord.SelectOption]": options: list[nextcord.SelectOption] = [] # pylint: disable=unsubscriptable-object @@ -76,7 +66,7 @@ class SubmissionDropdown(nextcord.ui.Select): embed = interaction.message.embeds[0] embed.add_field(name="Category", value=self.values[0], inline=False) await interaction.message.edit( - embed=embed, # TODO solve ordering issue. currently have to choose category after score submission. + embed=embed, ) @@ -119,6 +109,7 @@ class SubmissionDropdownView(nextcord.ui.View): embed=interaction.message.embeds[0], ) await interaction.message.edit(content=f"<@{interaction.user.id}> Submitted!", view=None) + submission_messages.pop(interaction.user.id) @nextcord.ui.button( label="Cancel", style=nextcord.ButtonStyle.red, custom_id="cancel-submission" @@ -127,4 +118,5 @@ class SubmissionDropdownView(nextcord.ui.View): self, button: nextcord.ui.Button, interaction: nextcord.Interaction ): # pylint: disable=unused-argument """Deletes message to cancel interaction.""" + submission_messages.pop(interaction.user.id) await interaction.message.delete() diff --git a/highscores.py b/highscores.py index b424c36..842ba16 100644 --- a/highscores.py +++ b/highscores.py @@ -24,6 +24,8 @@ highscores_config = open_highscores_config() highscores_data = open_highscores_data() highscores_message_map = open_message_map() +submission_messages: dict = {} + def main(): """Main function for bot.""" @@ -33,6 +35,7 @@ def main(): # Required in order to read messages (eg. prefix commands) intents.message_content = True # pylint: disable=assigning-non-slot + intents.messages = True # pylint: disable=assigning-non-slot # To enable the guilds priveleged intent: # intents.guilds = True