Compare commits

..
41 Commits
Author SHA1 Message Date
imcompiling 48a91dca3d Merge branch '41-editting-commands'
build_develop / build (push) Successful in 35s
build_release / build (push) Successful in 22s
2025-03-14 17:22:03 -04:00
imcompiling 5eb637a3a8 Indent so that a command can properly use session.
Remove commented out code. Also add work to an issue.
2025-03-14 17:20:50 -04:00
imcompiling f722eb1a83 Add to get's return messages. 2025-03-14 17:05:39 -04:00
imcompiling 7759bbc648 Add to set's return messages. 2025-03-14 17:04:20 -04:00
imcompiling 65de7baeda Added some log statements to provide helpful information. 2025-03-14 16:57:38 -04:00
imcompiling e243404480 Forgot to specify that is a description. 2025-03-14 16:53:15 -04:00
imcompiling f735e6d846 Merge branch '70-sqlmodel'
build_develop / build (push) Successful in 34s
build_release / build (push) Successful in 22s
2025-03-14 16:43:28 -04:00
imcompiling 9fbaf7bcf6 Merge branch 'main' of https://gitea.cheezers.org/imcompiling/agon
build_develop / build (push) Has been cancelled
2025-03-14 16:42:48 -04:00
imcompiling 1959e11e5c Merge branch '70-sqlmodel' into 41-editting-commands 2025-03-14 16:42:33 -04:00
imcompiling c25d354fc0 Correct some parameter usage, handle errors if searches return nothing. 2025-03-14 16:09:52 -04:00
imcompiling e5d90a71d9 Correct parameter usage. 2025-03-14 16:02:18 -04:00
imcompiling 785a4eff46 Was saving the message id to the wrong spot. 2025-03-13 09:21:10 -04:00
imcompiling 627112b114 Use correct message id reference. 2025-03-13 09:21:09 -04:00
imcompiling 9b3bd9d02c Use correct variable for guild name. 2025-03-13 09:21:09 -04:00
imcompiling 2c56c614f3 Typo on col usage. 2025-03-13 09:21:09 -04:00
imcompiling 3ccaa7004e Had col around the wrong variables. 2025-03-13 09:21:08 -04:00
imcompiling 289113661f Use walrus operator when assigning and checking for None. 2025-03-13 09:21:08 -04:00
imcompiling 74ce22dd26 Was saving the message id to the wrong spot. 2025-03-13 00:39:47 -04:00
imcompiling 170ce1cbfb Use correct message id reference. 2025-03-12 21:30:56 -04:00
imcompiling e1b761e848 Use correct variable for guild name. 2025-03-12 21:29:01 -04:00
imcompiling 68592a7df8 Typo on col usage. 2025-03-12 21:27:29 -04:00
imcompiling b28938f66a Had col around the wrong variables. 2025-03-12 21:27:12 -04:00
imcompiling adab97f505 Add another TODO 2025-03-12 10:18:16 -04:00
imcompiling edf51aac2d Add a todo regarding possible bug. 2025-03-12 10:12:54 -04:00
imcompiling dbc6474fc3 send highscore message doesn't need to return the message, its never used. 2025-03-12 10:02:32 -04:00
imcompiling ed68c4174f Update send highscore message to be more robust. 2025-03-12 09:57:17 -04:00
imcompiling 3abbff13d5 Use walrus operator when assigning and checking for None. 2025-03-12 09:50:58 -04:00
imcompiling 304b089113 Use the walrus operator when assigning and checking for None. 2025-03-12 09:35:44 -04:00
imcompiling 29a163ec46 correct some sql statement usages. Wasn't matching things properly. 2025-03-11 09:37:27 -04:00
imcompiling 76fbba739f Add command to view a group's username length. 2025-03-11 09:12:54 -04:00
imcompiling 7204e882f1 Forgot to do group autocomplete. 2025-03-11 09:10:17 -04:00
imcompiling a8d775ca09 Correct some doc strings. 2025-03-11 09:05:36 -04:00
imcompiling 983b9b6f34 Add command for getting group's pad length. 2025-03-11 09:03:54 -04:00
imcompiling 84c910b19c Add get is_validated command. 2025-03-10 16:06:28 -04:00
imcompiling 1fcb25193d Add get is_ascending command and autocomplete functions. 2025-03-10 14:27:24 -04:00
imcompiling f52b2fe49f Merge pull request 'Update ghcr.io/astral-sh/uv Docker tag to v0.6.5' (#81) from renovate/ghcr.io-astral-sh-uv-0.x into main
build_develop / build (push) Successful in 48s
Reviewed-on: #81
Reviewed-by: imcompiling <[email protected]>
2025-03-10 08:40:41 -04:00
renovate-bot 24a9fa998a Update ghcr.io/astral-sh/uv Docker tag to v0.6.5 2025-03-09 05:01:04 +00:00
imcompiling 4785271ebb Add command to get a category's size. 2025-03-07 16:10:42 -05:00
imcompiling f9d765ad92 Forgot to convert some ids to int. 2025-03-07 16:09:33 -05:00
imcompiling 63db4c1dd2 Merge pull request 'Update ghcr.io/astral-sh/uv Docker tag to v0.6.3' (#79) from renovate/ghcr.io-astral-sh-uv-0.x into main
build_develop / build (push) Successful in 51s
Reviewed-on: #79
Reviewed-by: imcompiling <[email protected]>
2025-03-03 23:03:42 -05:00
renovate-bot 8604ba2547 Update ghcr.io/astral-sh/uv Docker tag to v0.6.3 2025-03-02 05:01:27 +00:00
10 changed files with 282 additions and 93 deletions
+2 -2
View File
@@ -10,8 +10,8 @@
"ondelete" "ondelete"
], ],
"python.analysis.diagnosticSeverityOverrides": { "python.analysis.diagnosticSeverityOverrides": {
"reportOptionalMemberAccess": false, "reportOptionalMemberAccess": "warning",
"reportArgumentType": "information", "reportArgumentType": "information",
"reportAttributeAccessIssue": "warning" "reportAttributeAccessIssue": "warning"
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
FROM python:3.12.3-slim FROM python:3.12.3-slim
# install uv # install uv
COPY --from=ghcr.io/astral-sh/uv:0.6.2 /uv /uvx /bin/ COPY --from=ghcr.io/astral-sh/uv:0.6.5 /uv /uvx /bin/
RUN apt-get update && apt-get -y upgrade && apt-get -y install sqlite3 RUN apt-get update && apt-get -y upgrade && apt-get -y install sqlite3
+185 -1
View File
@@ -2,6 +2,11 @@
import nextcord import nextcord
from nextcord.ext import commands from nextcord.ext import commands
from sqlmodel import Session, col, select
from database.db import engine
from database.models import Category, CategoryGroup
from utilities.utils import autofill_categories, autofill_groups
class GetCog(commands.Cog, name="Get command."): class GetCog(commands.Cog, name="Get command."):
@@ -12,4 +17,183 @@ class GetCog(commands.Cog, name="Get command."):
@nextcord.slash_command(default_member_permissions=nextcord.Permissions(administrator=True)) @nextcord.slash_command(default_member_permissions=nextcord.Permissions(administrator=True))
async def get(self, interaction: nextcord.Interaction) -> None: async def get(self, interaction: nextcord.Interaction) -> None:
"""Parent slash command for setting settings. Never called.""" """Parent slash command for getting. Never called."""
@get.subcommand(description="Commands for getting category information.")
async def category(self, interaction: nextcord.Interaction) -> None:
"""Parent slash subcommand for getting category information. Never called."""
@category.subcommand(description="Get whether a category is sorted in ascending or descending order.")
async def is_ascending(
self,
interaction: nextcord.Interaction,
group_id: str = nextcord.SlashOption(name="group", description="Group that Category is in.", required=True),
category_id: str = nextcord.SlashOption(
name="category", description="Category to information from.", required=True
),
) -> None:
"""
Command to view how a category is sorted.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
group_id (str): String representation of Group id get information from. Is SlashOption.
category_id (str): String representation of Category id to get information from. Is SlashOption.
"""
stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session:
if (category := session.scalar(stmt)) is None:
await interaction.response.send_message("Group or Category was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"**{category.name}** is sorted in **{'ascending' if category.is_ascending else 'descending'}** order.",
ephemeral=True,
)
@category.subcommand(description="Get whether a category required validation.")
async def is_validated(
self,
interaction: nextcord.Interaction,
group_id: str = nextcord.SlashOption(name="group", description="Group that Category is in.", required=True),
category_id: str = nextcord.SlashOption(
name="category", description="Category to information from.", required=True
),
) -> None:
"""
Command to view if a category required photo validation.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
group_id (str): String representation of Group id get information from. Is SlashOption.
category_id (str): String representation of Category id to get information from. Is SlashOption.
"""
stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session:
if (category := session.scalar(stmt)) is None:
await interaction.response.send_message("Group or Category was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"{category.name} does {'not ' if not category.is_validated else ''} require validation.",
ephemeral=True,
)
@category.subcommand(description="Get the size for a category.")
async def size(
self,
interaction: nextcord.Interaction,
group_id: str = nextcord.SlashOption(name="group", description="Group that Category is in.", required=True),
category_id: str = nextcord.SlashOption(name="category", description="Category to get size of.", required=True),
) -> None:
"""
Command to view a category's size.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
group_id (str): String representation of Group id get information from. Is SlashOption.
category_id (str): String representation of Category id to get information from. Is SlashOption.
"""
stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session:
if (category := session.scalar(stmt)) is None:
await interaction.response.send_message("Group or Category was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"**{category.name}** has a size of **{category.size}**.", ephemeral=True
)
@get.subcommand(description="Commands for getting group information.")
async def group(self, interaction: nextcord.Interaction) -> None:
"""Parent slash subcommand for getting group information. Never called."""
@group.subcommand(description="Get the pad length of a group.")
async def pad_length(
self,
interaction: nextcord.Interaction,
group_id: str = nextcord.SlashOption(name="group", description="Group to get pad length of.", required=True),
) -> None:
"""
Command to view a group's pad length.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
group_id (str): String representation of Group id get information from. Is SlashOption.
"""
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == int(group_id))
with Session(engine) as session:
if (group := session.scalar(stmt)) is None:
await interaction.response.send_message("Group was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"**{group.name}** has a pad length of **{group.pad_length}**.", ephemeral=True
)
@group.subcommand(description="Get the username length of a group.")
async def username_length(
self,
interaction: nextcord.Interaction,
group_id: str = nextcord.SlashOption(
name="group", description="Group to get username length of.", required=True
),
) -> None:
"""
Command to view a group's username length.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
group_id (str): String representation of Group id get information from. Is SlashOption.
"""
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == int(group_id))
with Session(engine) as session:
if (group := session.scalar(stmt)) is None:
await interaction.response.send_message("Group was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"**{group.name}** has a username length of **{group.username_length}**.", ephemeral=True
)
@is_ascending.on_autocomplete("category_id")
@is_validated.on_autocomplete("category_id")
@size.on_autocomplete("category_id")
async def category_autocomplete(self, interaction: nextcord.Interaction, category_id: str, group_id: str) -> None:
"""
Autocomplete function for category names.
Args:
interaction (nextcord.Interaction): Interaction that invoked the command.
category_id (str): String to be autocompleted with Category name.
group_id (str): Group to find Category from.
"""
await interaction.response.send_autocomplete(
autofill_categories(interaction.guild_id, int(group_id), category_id)
)
@is_ascending.on_autocomplete("group_id")
@is_validated.on_autocomplete("group_id")
@pad_length.on_autocomplete("group_id")
@size.on_autocomplete("group_id")
@username_length.on_autocomplete("group_id")
async def group_autocomplete(self, interaction: nextcord.Interaction, group_id: str) -> None:
"""
Sends results from autofill_groups back to group_output_channel for autocompletion of group_id.
Args:
interaction (nextcord.Interaction): Interaction with command.
group_id (str): String to run autocompletion against.
"""
await interaction.response.send_autocomplete(autofill_groups(interaction.guild_id, group_id))
+62 -62
View File
@@ -22,7 +22,7 @@ class SetCog(commands.Cog, name="Set command."):
async def set(self, interaction: nextcord.Interaction) -> None: async def set(self, interaction: nextcord.Interaction) -> None:
"""Parent slash command for setting settings. Never called.""" """Parent slash command for setting settings. Never called."""
@set.subcommand("Commands for editing a category.") @set.subcommand(description="Commands for editing a category.")
async def category(self, interaction: nextcord.Interaction) -> None: async def category(self, interaction: nextcord.Interaction) -> None:
"""Parent slash subcommand for setting category settings. Never called.""" """Parent slash subcommand for setting category settings. Never called."""
@@ -45,30 +45,30 @@ class SetCog(commands.Cog, name="Set command."):
category_id (str): String representation of Category id to register channel to. Is SlashOption. category_id (str): String representation of Category id to register channel to. Is SlashOption.
size (int): Size to set. Is SlashOption. size (int): Size to set. Is SlashOption.
""" """
stmt = select(Category).where(col(CategoryGroup.id) == group_id).where(col(Category.id) == int(category_id)) stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session: with Session(engine) as session:
category = session.scalar(stmt) if (category := session.scalar(stmt)) is None:
if category is None:
await interaction.response.send_message("Category or Group was not found.", ephemeral=True) await interaction.response.send_message("Category or Group was not found.", ephemeral=True)
return return
category.size = size category.size = size
# session.add(category) test if this is needed. SQLAlchemy can do the update without adding.
session.commit() session.commit()
# Use the relationship to get group category is in. # Use the relationship to get group category is in.
group = category.category_group if (group := category.category_group) is None:
if group is None:
agon_logger.warning(f"{category.name}:{category.id} group relationship was None.") agon_logger.warning(f"{category.name}:{category.id} group relationship was None.")
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id) stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id)
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True) await interaction.response.send_message("Group was not found.", ephemeral=True)
return return
await send_highscore_message(session, interaction.guild, group) await send_highscore_message(session, interaction.guild, group)
await interaction.response.send_message(f"{category.name} size has been updated to {size}.", ephemeral=True) await interaction.response.send_message(
f"**{category.name}** size has been updated to **{size}**.", ephemeral=True
)
@category.subcommand(description="Update the is_ascending value for a category.") @category.subcommand(description="Update the is_ascending value for a category.")
async def is_ascending( async def is_ascending(
@@ -91,31 +91,29 @@ class SetCog(commands.Cog, name="Set command."):
category_id (str): String representation of Category id to register channel to. Is SlashOption. category_id (str): String representation of Category id to register channel to. Is SlashOption.
ascending (bool): Boolean to set. Determines whether scores are sorted ascending or not. Is SlashOption. ascending (bool): Boolean to set. Determines whether scores are sorted ascending or not. Is SlashOption.
""" """
stmt = select(Category).where(col(CategoryGroup.id) == group_id).where(col(Category.id) == int(category_id)) stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session: with Session(engine) as session:
category = session.scalar(stmt) if (category := session.scalar(stmt)) is None:
if category is None:
await interaction.response.send_message("Category or Group was not found.", ephemeral=True) await interaction.response.send_message("Category or Group was not found.", ephemeral=True)
return return
category.is_ascending = ascending category.is_ascending = ascending
# session.add(category) test if this is needed. SQLAlchemy can do the update without adding.
session.commit() session.commit()
# Use the relationship to get group category is in. # Use the relationship to get group category is in.
group = category.category_group if (group := category.category_group) is None:
if group is None:
agon_logger.warning(f"{category.name}:{category.id} group relationship was None.") agon_logger.warning(f"{category.name}:{category.id} group relationship was None.")
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id) stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id)
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True) await interaction.response.send_message("Group was not found.", ephemeral=True)
return return
await send_highscore_message(session, interaction.guild, group) await send_highscore_message(session, interaction.guild, group)
await interaction.response.send_message( await interaction.response.send_message(
f"{category.name} is_ascending has been updated to {ascending}.", ephemeral=True f"**{category.name}** is_ascending has been updated to **{ascending}**.", ephemeral=True
) )
@category.subcommand(description="Update the is_validated value for a category.") @category.subcommand(description="Update the is_validated value for a category.")
@@ -139,31 +137,20 @@ class SetCog(commands.Cog, name="Set command."):
category_id (str): String representation of Category id to register channel to. Is SlashOption. category_id (str): String representation of Category id to register channel to. Is SlashOption.
validated (bool): Boolean to set. Determines whether scores are validated or not. Is SlashOption. validated (bool): Boolean to set. Determines whether scores are validated or not. Is SlashOption.
""" """
stmt = select(Category).where(col(CategoryGroup.id) == group_id).where(col(Category.id) == int(category_id)) stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session: with Session(engine) as session:
category = session.scalar(stmt) if (category := session.scalar(stmt)) is None:
if category is None:
await interaction.response.send_message("Category or Group was not found.", ephemeral=True) await interaction.response.send_message("Category or Group was not found.", ephemeral=True)
return return
category.is_validated = validated category.is_validated = validated
# session.add(category) test if this is needed. SQLAlchemy can do the update without adding.
session.commit() session.commit()
# Use the relationship to get group category is in. await interaction.response.send_message(
group = category.category_group f"**{category.name}** is_validated has been updated to **{validated}**.", ephemeral=True
if group is None: )
agon_logger.warning(f"{category.name}:{category.id} group relationship was None.")
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id)
group = session.scalar(stmt)
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True)
return
await interaction.response.send_message(
f"{category.name} is_validated has been updated to {validated}.", ephemeral=True
)
@category.subcommand(name="name", description="Change the name of a category.") @category.subcommand(name="name", description="Change the name of a category.")
async def category_name( async def category_name(
@@ -184,31 +171,31 @@ class SetCog(commands.Cog, name="Set command."):
category_id (str): String representation of Category id to register channel to. Is SlashOption. category_id (str): String representation of Category id to register channel to. Is SlashOption.
name (str): The name to update the category's name to. Is SlashOption. name (str): The name to update the category's name to. Is SlashOption.
""" """
stmt = select(Category).where(col(CategoryGroup.id) == group_id).where(col(Category.id) == int(category_id)) stmt = (
select(Category).where(col(Category.group_id) == int(group_id)).where(col(Category.id) == int(category_id))
)
with Session(engine) as session: with Session(engine) as session:
category = session.scalar(stmt) if (category := session.scalar(stmt)) is None:
if category is None:
await interaction.response.send_message("Category or Group was not found.", ephemeral=True) await interaction.response.send_message("Category or Group was not found.", ephemeral=True)
return return
old_name = category.name old_name = category.name
category.name = name category.name = name
# session.add(category) test if this is needed. SQLAlchemy can do the update without adding.
session.commit() session.commit()
# Use the relationship to get group category is in. # Use the relationship to get group category is in.
group = category.category_group if (group := category.category_group) is None:
if group is None:
agon_logger.warning(f"{category.name}:{category.id} group relationship was None.") agon_logger.warning(f"{category.name}:{category.id} group relationship was None.")
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id) stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id)
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True) await interaction.response.send_message("Group was not found.", ephemeral=True)
return return
await send_highscore_message(session, interaction.guild, group) await send_highscore_message(session, interaction.guild, group)
await interaction.response.send_message(f"{old_name} has been updated to {category.name}.", ephemeral=True) await interaction.response.send_message(
f"**{old_name}** has been updated to **{category.name}**.", ephemeral=True
)
@set.subcommand(description="Commands for editing a group.") @set.subcommand(description="Commands for editing a group.")
async def group(self, interaction: nextcord.Interaction) -> None: async def group(self, interaction: nextcord.Interaction) -> None:
@@ -229,11 +216,10 @@ class SetCog(commands.Cog, name="Set command."):
group_id (str): String representation of Group id to register channel to. Is SlashOption. group_id (str): String representation of Group id to register channel to. Is SlashOption.
name (str): The name to update the group's name to. Is SlashOption. name (str): The name to update the group's name to. Is SlashOption.
""" """
stmt = select(CategoryGroup).where(col(CategoryGroup.id) == group_id) stmt = select(CategoryGroup).where(col(CategoryGroup.id) == int(group_id))
with Session(engine) as session: with Session(engine) as session:
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True) await interaction.response.send_message("Group was not found.", ephemeral=True)
return return
old_name = group.name old_name = group.name
@@ -242,7 +228,7 @@ class SetCog(commands.Cog, name="Set command."):
session.commit() session.commit()
await send_highscore_message(session, interaction.guild, group) await send_highscore_message(session, interaction.guild, group)
await interaction.response.send_message(f"{old_name} has been updated to {group.name}.", ephemeral=True) await interaction.response.send_message(f"**{old_name}** has been updated to **{group.name}**.", ephemeral=True)
@group.subcommand(description="Registers the channel for a Group's messages.") @group.subcommand(description="Registers the channel for a Group's messages.")
async def output_channel( async def output_channel(
@@ -273,9 +259,14 @@ class SetCog(commands.Cog, name="Set command."):
.where(col(CategoryGroup.guild_id) == interaction.guild_id) .where(col(CategoryGroup.guild_id) == interaction.guild_id)
.where(col(CategoryGroup.id) == int(group_id)) .where(col(CategoryGroup.id) == int(group_id))
) )
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
group.ChannelId = channel_id await interaction.response.send_message("Group or Category was not found.", ephemeral=True)
return
group.channel_id = channel_id
session.commit() session.commit()
# TODO(imcompiling): delete the message and call send_highscore_message to send a new one. Bug needs fixed
# first.
# 082
await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True) await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True)
@group.subcommand( @group.subcommand(
@@ -307,14 +298,14 @@ class SetCog(commands.Cog, name="Set command."):
.where(col(CategoryGroup.guild_id) == interaction.guild_id) .where(col(CategoryGroup.guild_id) == interaction.guild_id)
.where(col(CategoryGroup.id) == int(group_id)) .where(col(CategoryGroup.id) == int(group_id))
) )
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
if group is None:
await interaction.response.send_message("Group was not found.", ephemeral=True) await interaction.response.send_message("Group was not found.", ephemeral=True)
return return
group.PadLength = length
group.pad_length = length
session.commit() session.commit()
await interaction.response.send_message( await interaction.response.send_message(
f"Category pad length set to {length} for {group.name}", ephemeral=True f"Category pad length set to **{length}** for **{group.name}**.", ephemeral=True
) )
await send_highscore_message(session, interaction.guild, group) await send_highscore_message(session, interaction.guild, group)
@@ -343,7 +334,9 @@ class SetCog(commands.Cog, name="Set command."):
with Session(engine) as session: with Session(engine) as session:
stmt = select(Guild).where(col(Guild.id) == interaction.guild_id) stmt = select(Guild).where(col(Guild.id) == interaction.guild_id)
guild = session.scalar(stmt) if (guild := session.scalar(stmt)) is None:
await interaction.response.send_message("Guild was not found.", ephemeral=True)
return
guild.submission_channel = channel_id guild.submission_channel = channel_id
session.commit() session.commit()
await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True) await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True)
@@ -373,10 +366,15 @@ class SetCog(commands.Cog, name="Set command."):
.where(col(CategoryGroup.guild_id) == interaction.guild_id) .where(col(CategoryGroup.guild_id) == interaction.guild_id)
.where(col(CategoryGroup.id) == int(group_id)) .where(col(CategoryGroup.id) == int(group_id))
) )
group = session.scalar(stmt) if (group := session.scalar(stmt)) is None:
group.UsernameLength = length await interaction.response.send_message("Group or Category was not found.", ephemeral=True)
return
group.username_length = length
session.commit() session.commit()
await interaction.response.send_message(f"Username length set to {length}.", ephemeral=True) await interaction.response.send_message(
f"Username length for **{group.name}** set to **{length}**.", ephemeral=True
)
@set.subcommand(description="Registers the channel for verification messages.") @set.subcommand(description="Registers the channel for verification messages.")
async def verify_channel( async def verify_channel(
@@ -401,8 +399,10 @@ class SetCog(commands.Cog, name="Set command."):
with Session(engine) as session: with Session(engine) as session:
stmt = select(Guild).where(col(Guild.id) == interaction.guild_id) stmt = select(Guild).where(col(Guild.id) == interaction.guild_id)
guild = session.scalar(stmt) if (guild := session.scalar(stmt)) is None:
guild.VerificationChannel = channel_id await interaction.response.send_message("Guild was not found.", ephemeral=True)
return
guild.verification_channel = channel_id
session.commit() session.commit()
await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True) await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True)
+9 -12
View File
@@ -64,10 +64,7 @@ class SubmissionCog(commands.Cog):
.where(col(Category.group_id) == int(group_id)) .where(col(Category.group_id) == int(group_id))
.where(col(Category.id) == int(category_id)) .where(col(Category.id) == int(category_id))
) )
if (category := session.scalar(stmt)) is None:
category: Category | None = session.scalar(stmt)
if category is None:
await interaction.response.send_message("Category not found.", ephemeral=True) await interaction.response.send_message("Category not found.", ephemeral=True)
return return
@@ -79,10 +76,13 @@ class SubmissionCog(commands.Cog):
return return
# check with regex if score is in correct format # check with regex if score is in correct format
verified_score = await self.verify_score(interaction, score, is_time_record=category.is_time_record)
# check if verify_score was successful. It replies with corrections required itself. # check if verify_score was successful. It replies with corrections required itself.
if verified_score is None: if (
verified_score := await self.verify_score(interaction, score, is_time_record=category.is_time_record)
) is None:
# This response message will be filled out better once command is split up to
# know which type it expects...
await interaction.response.send_message("Format was incorrect.", ephemeral=True)
return return
# Create submission verification request or submit score if verification not needed. # Create submission verification request or submit score if verification not needed.
@@ -92,16 +92,13 @@ class SubmissionCog(commands.Cog):
return return
stmt = select(col(Guild.verification_channel)).where(col(Guild.id) == interaction.guild_id) stmt = select(col(Guild.verification_channel)).where(col(Guild.id) == interaction.guild_id)
verification_channel_id: int | None = session.scalar(stmt)
if verification_channel_id is None: if (verification_channel_id := session.scalar(stmt)) is None:
error_response = "No verification channel was registered. Contact server admins." error_response = "No verification channel was registered. Contact server admins."
await interaction.response.send_message(error_response, ephemeral=True) await interaction.response.send_message(error_response, ephemeral=True)
return return
channel = interaction.guild.get_channel(verification_channel_id) if (channel := interaction.guild.get_channel(verification_channel_id)) is None:
if channel is None:
error_response = "Registered Verification channel does not exist. Contact server admins." error_response = "Registered Verification channel does not exist. Contact server admins."
await interaction.response.send_message(error_response, ephemeral=True) await interaction.response.send_message(error_response, ephemeral=True)
return return
+1 -2
View File
@@ -26,10 +26,9 @@ class GuildListener(commands.Cog, name="Guild Listener"):
""" """
with Session(engine) as session: with Session(engine) as session:
stmt = select(Guild).where(col(Guild.id == guild.id)) stmt = select(Guild).where(col(Guild.id == guild.id))
guild_data = session.scalar(stmt)
# just in case check if the guild already exists # just in case check if the guild already exists
if guild_data is None: if (guild_data := session.scalar(stmt)) is None:
new_guild = Guild(id=guild.id, name=guild.name) new_guild = Guild(id=guild.id, name=guild.name)
session.add(new_guild) session.add(new_guild)
else: else:
+2 -2
View File
@@ -31,7 +31,7 @@ class GuildData(commands.Cog, name="Guild Data"):
with Session(engine) as session: with Session(engine) as session:
for guild in self.bot.guilds: for guild in self.bot.guilds:
# update given guild name for guild id # update given guild name for guild id
stmt = select(Guild).where(col(Guild.id == guild.id)) stmt = select(Guild).where(col(Guild.id) == guild.id)
guild_data = session.scalar(stmt) guild_data = session.scalar(stmt)
# just in case checking if the guild doesn't exist. # just in case checking if the guild doesn't exist.
@@ -39,6 +39,6 @@ class GuildData(commands.Cog, name="Guild Data"):
new_guild = Guild(id=guild.id, name=guild.name) new_guild = Guild(id=guild.id, name=guild.name)
session.add(new_guild) session.add(new_guild)
else: else:
guild_data.GuildName = guild.name guild_data.name = guild.name
session.commit() session.commit()
+1 -3
View File
@@ -39,9 +39,7 @@ class VerificationView(nextcord.ui.View):
.where(col(Submission.message_id) == interaction.message.id) .where(col(Submission.message_id) == interaction.message.id)
) )
submission = session.scalar(stmt) if (submission := session.scalar(stmt)) is None:
if submission is None:
await interaction.response.send_message("Could not find submission data in database.", ephemeral=True) await interaction.response.send_message("Could not find submission data in database.", ephemeral=True)
await interaction.message.delete() await interaction.message.delete()
return return
+3
View File
@@ -2,13 +2,16 @@
from sqlmodel import SQLModel, create_engine from sqlmodel import SQLModel, create_engine
from utilities import config from utilities import config
from utilities.logger import agon_logger
from . import models # noqa: F401 - Need this import for creating the models. from . import models # noqa: F401 - Need this import for creating the models.
if config.ENVIRONMENT == "prod": if config.ENVIRONMENT == "prod":
url = f"mysql+pymysql://{config.SQL_USER}:{config.SQL_PASS}@{config.SQL_HOST}/{config.SQL_DB}" url = f"mysql+pymysql://{config.SQL_USER}:{config.SQL_PASS}@{config.SQL_HOST}/{config.SQL_DB}"
agon_logger.info("Connected to prod database.")
else: else:
url = "sqlite:///database.db" url = "sqlite:///database.db"
agon_logger.info("Connected to local dev database.")
engine = create_engine(url) engine = create_engine(url)
# Don't need to create all when connected to prod. # Don't need to create all when connected to prod.
+16 -8
View File
@@ -10,6 +10,7 @@ from sqlmodel import col
from database.db import engine from database.db import engine
from database.models import Category, CategoryGroup, Guild, Score from database.models import Category, CategoryGroup, Guild, Score
from main import agon_logger
MAX_LINE_LENGTH = 142 MAX_LINE_LENGTH = 142
@@ -64,7 +65,7 @@ def autofill_groups(guild_id: int, group_begin: str) -> "dict[str, str]":
""" """
with Session(engine) as session: with Session(engine) as session:
# Select all groups in guild. # Select all groups in guild.
stmt = select(CategoryGroup).wherecol((CategoryGroup.guild_id) == guild_id) stmt = select(CategoryGroup).where(col(CategoryGroup.guild_id) == guild_id)
# dict has to have key values of same type for discord. # dict has to have key values of same type for discord.
group_dict: dict[str, str] = {group.name: str(group.id) for group in session.scalars(stmt)} group_dict: dict[str, str] = {group.name: str(group.id) for group in session.scalars(stmt)}
@@ -275,6 +276,8 @@ def format_highscore_message(session: Session, group: CategoryGroup) -> str:
return ret_string + "```" return ret_string + "```"
# TODO(imcompiling): rework into two functions to remove the boolean and reduce function arguments.
# 084
def format_score_string( def format_score_string(
username: str, username: str,
score: float, score: float,
@@ -327,7 +330,7 @@ def get_time_str(time_in: float) -> str:
return time.strftime(f"%-M:%S.{milliseconds}", time.gmtime(time_in)) return time.strftime(f"%-M:%S.{milliseconds}", time.gmtime(time_in))
async def send_highscore_message(session: Session, guild: nextcord.Guild, group: CategoryGroup) -> nextcord.Message: async def send_highscore_message(session: Session, guild: nextcord.Guild, group: CategoryGroup) -> None:
""" """
Function takes care of checking if a message exists for a group. Function takes care of checking if a message exists for a group.
@@ -337,23 +340,28 @@ async def send_highscore_message(session: Session, guild: nextcord.Guild, group:
session (Session): The sqlalchemy session being used for this function call. session (Session): The sqlalchemy session being used for this function call.
guild (nextcord.Guild): the nextcord.Guild object requesting this message. guild (nextcord.Guild): the nextcord.Guild object requesting this message.
group (CategoryGroup): group to post to the message. group (CategoryGroup): group to post to the message.
Returns:
nextcord.Message: Message object that was posted with group contents.
""" """
highscore_string = format_highscore_message(session, group) highscore_string = format_highscore_message(session, group)
channel = guild.get_channel(group.channel_id) channel = guild.get_channel(group.channel_id)
if not isinstance(channel, nextcord.TextChannel):
agon_logger.error(
"Channel id %s in guild %s is does not correspond to a TextChannel.", channel.id, channel.guild.id
)
return
if group.message_id is None: if group.message_id is None:
# message doesn't exist. # message doesn't exist.
message: nextcord.Message = await channel.send(highscore_string) message: nextcord.Message = await channel.send(highscore_string)
group.MessageId = message.id group.message_id = message.id
session.commit() session.commit()
else: else:
# TODO(imcompiling): check what happens when message is deleted.
# https://gitea.cheezers.org/imcompiling/agon/issues/83
message: nextcord.Message = await channel.fetch_message(group.message_id) message: nextcord.Message = await channel.fetch_message(group.message_id)
await message.edit(content=highscore_string) await message.edit(content=highscore_string)
return message return
async def submit_score( async def submit_score(
@@ -390,7 +398,7 @@ async def submit_score(
existing_score = session.scalar(stmt) existing_score = session.scalar(stmt)
if existing_score: if existing_score:
existing_score.Score = score_f existing_score.score = score_f
else: else:
score_obj = Score(username=username, score=score_f, category_id=category_id) score_obj = Score(username=username, score=score_f, category_id=category_id)
session.add(score_obj) session.add(score_obj)