Compare commits

...
7 Commits
9 changed files with 137 additions and 91 deletions
+43
View File
@@ -0,0 +1,43 @@
"""
Defines cog for on message listener.
"""
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 SubmissionListener(commands.Cog, name="Message Listener"):
"""Sets up message listener."""
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. Adds score and attachments to submission."""
if proof_message.author.id in submission_messages:
message_id = submission_messages[proof_message.author.id]
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"]:
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(SubmissionListener(bot))
+1 -1
View File
@@ -38,7 +38,7 @@ class PostHighscores(commands.Cog, name="Post Highscores"):
for boss in highscores_config["bosses"]:
message: nextcord.Message = await send_highscore_message(channel, boss["boss"])
await message.edit(view=SubmissionButton())
await message.edit(view=SubmissionButton(self.bot))
save_highscores_data(highscores_data)
+67
View File
@@ -0,0 +1,67 @@
"""
Bot command for registering various channels to the bot.
"""
from nextcord import Embed
from nextcord.ext import commands
from highscores import highscores_data # pylint: disable=import-error
from utilities.data_storage import save_highscores_data # pylint: disable=import-error
class RegisterVerificationChannel(commands.Cog, name="Register"):
"""Bot command for registering various channels to the bot."""
def __init__(self, bot: commands.Bot):
self.bot = bot
@commands.command(name="register")
@commands.has_permissions(administrator=True)
async def register_highscores(self, ctx: commands.Context, registration_type: str):
"""A command which registers current channel as for various uses.
Usage:
```
?register verify (Use in channel you want to verify submissions in.)
?register highscore (Use in channel you want to show highscore messages in.)
?register submission (Use in channel you want submission messages to be send it.)
?register help (Shows help message.)
```
"""
# respond to the message
channel_id = ctx.channel.id
if registration_type == "verify":
await ctx.send(f"Registered <#{channel_id}> as channel to post verifications in.")
highscores_data["verification_channel_id"] = channel_id
elif registration_type == "highscore":
await ctx.send(f"Registered <#{channel_id}> as channel to post highscores in.")
highscores_data["highscore_channel_id"] = channel_id
elif registration_type == "submission":
await ctx.send(f"Registered <#{channel_id}> as channel to post submissions in.")
highscores_data["submission_channel_id"] = channel_id
else:
embed = Embed(
title="Register command help", description="How to use the register command."
)
embed.add_field(
name="?register verify", value="Use in channel you want to verify submissions in."
)
embed.add_field(
name="?register highscore",
value="Use in channel you want to show highscore messages in.",
)
embed.add_field(
name="?register submission",
value="Use in channel you want submission messages to be send it.",
)
embed.add_field(name="?register help", value="Use to show this message.")
await ctx.reply(embed=embed)
save_highscores_data(highscores_data)
# 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(RegisterVerificationChannel(bot))
@@ -1,35 +0,0 @@
"""
Bot command to register the highscores channel
"""
from nextcord.ext import commands
from highscores import highscores_data # pylint: disable=import-error
from utilities.data_storage import save_highscores_data # pylint: disable=import-error
class RegisterHighscoreChannel(commands.Cog, name="Register HighScore Channel"):
"""Registers Highscore channel"""
def __init__(self, bot: commands.Bot):
self.bot = bot
@commands.command(name="register-highscore")
async def register_highscores(self, ctx: commands.Context):
"""A command which registers current channel as channel to post highscores in.
Usage:
```
?register-highscore (in channel to post highscores in)
```
"""
print(f"Registering {ctx.channel.id} for highscores.")
# respond to the message
await ctx.send(f"Registered <#{ctx.channel.id}> as channel to post highscores in.")
highscores_data["highscore_channel_id"] = ctx.channel.id
save_highscores_data(highscores_data)
# 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(RegisterHighscoreChannel(bot))
@@ -1,35 +0,0 @@
"""
Bot command to register the verification channel
"""
from nextcord.ext import commands
from highscores import highscores_data # pylint: disable=import-error
from utilities.data_storage import save_highscores_data # pylint: disable=import-error
class RegisterVerificationChannel(commands.Cog, name="Register Verify Channel"):
"""Registers Verification channel"""
def __init__(self, bot: commands.Bot):
self.bot = bot
@commands.command(name="register-verify")
async def register_highscores(self, ctx: commands.Context):
"""A command which registers current channel as channel to post verifications in.
Usage:
```
?register-verify (in channel to post highscores in)
```
"""
print(f"Registering {ctx.channel.id} for verification.")
# respond to the message
await ctx.send(f"Registered <#{ctx.channel.id}> as channel to post verifications in.")
highscores_data["verification_channel_id"] = ctx.channel.id
save_highscores_data(highscores_data)
# 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(RegisterVerificationChannel(bot))
+1
View File
@@ -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
+8 -15
View File
@@ -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
@@ -27,7 +28,8 @@ class SubmissionButton(nextcord.ui.View):
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
channel = self._bot.get_channel(highscores_data["submission_channel_id"])
submission_message = await channel.send(
f"<@{interaction.user.id}>",
view=SubmissionDropdownView(
self._bot, interaction, await self._category_select_options(boss_name)
@@ -35,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
@@ -75,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,
)
@@ -118,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"
@@ -126,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()
+3
View File
@@ -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
+14 -5
View File
@@ -76,12 +76,21 @@ async def submit_score(
"""
# TODO update user submission to not have dupe users
# hardmode category, must have different category variable for config access.
if category.find("Hardmode ") != -1:
config_category = category.replace("Hardmode ", "")
else:
config_category = category
# create score tuple for either time or int
# define sort index
if highscores_config["categories"][category]["is_time_record"]:
minutes = score.split(":")[0]
seconds = score.split(":")[1]
score_seconds = int(minutes) * 60 + int(seconds)
if highscores_config["categories"][config_category]["is_time_record"]:
if score.find(":") == -1:
score_seconds = float(score)
else:
minutes = score.split(":")[0]
seconds = score.split(":")[1]
score_seconds = int(minutes) * 60 + float(seconds)
score_tuple = (user, score, score_seconds)
sort_index = 2
@@ -95,7 +104,7 @@ async def submit_score(
# sort scores.
scores.sort(
key=lambda x: x[sort_index],
reverse=not highscores_config["categories"][category]["ascending"],
reverse=not highscores_config["categories"][config_category]["ascending"],
)
# enforce highscore size