From 7854be890f055d825cf8d7ebd0464c11b9405ec3 Mon Sep 17 00:00:00 2001 From: alwayscompiling Date: Sat, 9 Jul 2022 11:24:29 -0400 Subject: [PATCH] Entire submission process works somehow. --- cogs/help/__init__.py | 2 +- cogs/post_highscores/__init__.py | 7 +- cogs/register_highscore_channel/__init__.py | 2 +- .../register_verification_channel/__init__.py | 2 +- cogs/score/__init__.py | 2 +- cogs/submission/__init__.py | 8 +- cogs/submission/submission_views.py | 78 ++++++++++++++++--- 7 files changed, 78 insertions(+), 23 deletions(-) diff --git a/cogs/help/__init__.py b/cogs/help/__init__.py index ee7099b..5a89f97 100644 --- a/cogs/help/__init__.py +++ b/cogs/help/__init__.py @@ -22,5 +22,5 @@ class HelpCog(commands.Cog): # setup functions for bot def setup(bot: commands.Bot): - """Adds functon to bot""" + """Adds function to bot""" bot.add_cog(HelpCog(bot)) diff --git a/cogs/post_highscores/__init__.py b/cogs/post_highscores/__init__.py index 91a87b5..f8a3043 100644 --- a/cogs/post_highscores/__init__.py +++ b/cogs/post_highscores/__init__.py @@ -18,11 +18,6 @@ class PostHighscores(commands.Cog, name="Post Highscores"): def __init__(self, bot: commands.Bot): self.bot = bot - @commands.Cog.listener() - async def on_ready(self): - """Called when cog is loaded""" - self.bot.add_view(SubmissionButton()) - @commands.command(name="post-scores") async def post_highscores(self, ctx: commands.Context): """ @@ -51,5 +46,5 @@ class PostHighscores(commands.Cog, name="Post Highscores"): # 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 functon to bot""" + """Adds function to bot""" bot.add_cog(PostHighscores(bot)) diff --git a/cogs/register_highscore_channel/__init__.py b/cogs/register_highscore_channel/__init__.py index 4059dad..c5270e8 100644 --- a/cogs/register_highscore_channel/__init__.py +++ b/cogs/register_highscore_channel/__init__.py @@ -31,5 +31,5 @@ class RegisterHighscoreChannel(commands.Cog, name="Register HighScore Channel"): # 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 functon to bot""" + """Adds function to bot""" bot.add_cog(RegisterHighscoreChannel(bot)) diff --git a/cogs/register_verification_channel/__init__.py b/cogs/register_verification_channel/__init__.py index 3c73fed..a6c71b9 100644 --- a/cogs/register_verification_channel/__init__.py +++ b/cogs/register_verification_channel/__init__.py @@ -31,5 +31,5 @@ class RegisterVerificationChannel(commands.Cog, name="Register Verify Channel"): # 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 functon to bot""" + """Adds function to bot""" bot.add_cog(RegisterVerificationChannel(bot)) diff --git a/cogs/score/__init__.py b/cogs/score/__init__.py index 48750e2..5409956 100644 --- a/cogs/score/__init__.py +++ b/cogs/score/__init__.py @@ -47,5 +47,5 @@ class Score(commands.Cog, name="Score"): # 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 functon to bot""" + """Adds function to bot""" bot.add_cog(Score(bot)) diff --git a/cogs/submission/__init__.py b/cogs/submission/__init__.py index 65adb93..891246f 100644 --- a/cogs/submission/__init__.py +++ b/cogs/submission/__init__.py @@ -1,5 +1,5 @@ """ -Bot command to post the highscores +Cog for creating submission process. """ from nextcord.ext import commands @@ -8,7 +8,7 @@ from .submission_views import SubmissionButton class SubmissionCog(commands.Cog, name="Submission Cog"): - """Posts Highscores.""" + """Constructs submission method.""" def __init__(self, bot: commands.Bot): self.bot = bot @@ -16,11 +16,11 @@ class SubmissionCog(commands.Cog, name="Submission Cog"): @commands.Cog.listener() async def on_ready(self): """Called when cog is loaded""" - self.bot.add_view(SubmissionButton()) + self.bot.add_view(SubmissionButton(self.bot)) # 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 functon to bot""" + """Adds function to bot""" bot.add_cog(SubmissionCog(bot)) diff --git a/cogs/submission/submission_views.py b/cogs/submission/submission_views.py index a159666..fc35d6a 100644 --- a/cogs/submission/submission_views.py +++ b/cogs/submission/submission_views.py @@ -3,31 +3,52 @@ from typing import Optional import nextcord +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 .verification_view import VerificationView class SubmissionButton(nextcord.ui.View): """Defines view for score submission button.""" - def __init__(self): + def __init__(self, bot: commands.Bot): super().__init__(timeout=None) + self._bot = bot - @nextcord.ui.button(label="Submit", style=nextcord.ButtonStyle.green, custom_id="submit") + @nextcord.ui.button(label="Submit", style=nextcord.ButtonStyle.primary, custom_id="submit") async def submit_button( self, button: nextcord.ui.Button, interaction: nextcord.Interaction ): # pylint: disable=unused-argument """Button for score submission.""" highscores_message_map = open_message_map() boss_name = highscores_message_map[str(interaction.message.id)] - await interaction.channel.send( - f"<@{interaction.user.id}> Submitting score for {boss_name}", + embed = nextcord.Embed(title="Highscores Submission") + embed.add_field(name="Boss", value=boss_name, inline=False) + embed.add_field(name="User", value=interaction.user.display_name, inline=False) + submission_message = await interaction.channel.send( # TODO change channel + f"<@{interaction.user.id}>", view=SubmissionDropdownView( - interaction, await self._category_select_options(boss_name) + self._bot, interaction, await self._category_select_options(boss_name) ), + embed=embed, ) + def wait_check(check_message: nextcord.Message): + return ( + interaction.user.id == check_message.author.id + and interaction.channel == check_message.channel + ) # unsure if comparison is correct + + 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() + async def _category_select_options(self, boss_name: str) -> "list[nextcord.SelectOption]": options: list[nextcord.SelectOption] = [] # pylint: disable=unsubscriptable-object boss_dict = highscores_data[boss_name] @@ -40,15 +61,22 @@ class SubmissionButton(nextcord.ui.View): class SubmissionDropdown(nextcord.ui.Select): """Defines dropdown menu for submission""" - def __init__(self, options: "list[nextcord.SelectOption]"): + def __init__( + self, + bot: commands.Bot, + options: "list[nextcord.SelectOption]", + ): super().__init__( placeholder="Choose submission category.", min_values=1, max_values=1, options=options ) + self._bot = bot async def callback(self, interaction: nextcord.Interaction): + embed = interaction.message.embeds[0] + embed.add_field(name="Category", value=self.values[0], inline=False) await interaction.message.edit( - content=f"submitting for {self.values[0]}", - ) # TODO create embed and then wait for response message. + embed=embed, + ) class SubmissionDropdownView(nextcord.ui.View): @@ -56,14 +84,46 @@ class SubmissionDropdownView(nextcord.ui.View): def __init__( self, + bot: commands.Bot, prev_interaction: nextcord.Interaction, options: "list[nextcord.SelectOption]", *, timeout: Optional[float] = 180, ): super().__init__(timeout=timeout) - self.add_item(SubmissionDropdown(options)) + self.add_item(SubmissionDropdown(bot, options)) self._prev_interaction = prev_interaction + self.bot = bot async def interaction_check(self, interaction: nextcord.Interaction) -> bool: return self._prev_interaction.user == interaction.user + + @nextcord.ui.button( + label="Submit Score", style=nextcord.ButtonStyle.green, custom_id="submit-score" + ) + async def submit_button( + self, button: nextcord.ui.Button, interaction: nextcord.Interaction + ): # pylint: disable=unused-argument + """Defines button to submit a user's score.""" + verification_channel_id = highscores_data["verification_channel_id"] + channel = self.bot.get_channel(verification_channel_id) + + error_response = "Registered Verification channel does not exist or was never registered. \ + Contact server admins." + assert channel is not None, await channel.send(error_response) + + await channel.send( + files=[await attch.to_file() for attch in interaction.message.attachments], + view=VerificationView(), + embed=interaction.message.embeds[0], + ) + await interaction.message.edit(content=f"<@{interaction.user.id}> Submitted!", view=None) + + @nextcord.ui.button( + label="Cancel", style=nextcord.ButtonStyle.red, custom_id="cancel-submission" + ) + async def cancel_button( + self, button: nextcord.ui.Button, interaction: nextcord.Interaction + ): # pylint: disable=unused-argument + """Deletes message to cancel interaction.""" + await interaction.message.delete()