Compare commits

..
13 Commits
Author SHA1 Message Date
imcompiling 47a33128be Merge commit 'fdb04149aabea373e1f9b9570da0e5e66f6ac9da'
build_latest / build (push) Successful in 22s
build_release / build (push) Successful in 16s
build_develop / build (push) Successful in 1m57s
2024-05-31 15:21:06 -04:00
imcompiling fdb04149aa Define the /time at command.
build_develop / build (push) Successful in 1m32s
2024-05-31 15:20:59 -04:00
imcompiling 4805f6cd5d Add a constant for guild ids. By setting guild ids in commands, commands are added immediately.
Added the /time gametime command.
2024-05-31 14:28:22 -04:00
imcompiling ff85c8d485 Bugfix in record command. Missed moving a positional argument.
build_latest / build (push) Successful in 1m36s
build_release / build (push) Successful in 17s
build_develop / build (push) Successful in 24s
2024-05-26 20:06:43 -04:00
imcompiling ca0d27a929 Update dockerfile image. Need python3.12
build_latest / build (push) Successful in 1m47s
build_release / build (push) Successful in 23s
2024-05-24 14:19:17 -04:00
imcompiling 8ebb689ee7 Merge branch '63-bad-sorting'
build_latest / build (push) Failing after 31s
build_release / build (push) Failing after 29s
2024-05-24 14:11:44 -04:00
imcompiling ecc81c5f35 Sort the council member info.
build_develop / build (push) Failing after 31s
2024-05-24 14:03:23 -04:00
imcompiling 96c1fcb17c Sort all members by lowercase display name. 2024-05-24 13:58:25 -04:00
imcompiling 840e17e03a Adjust the presence because I can. Easier to understand.
build_develop / build (push) Failing after 29s
2024-05-24 13:56:39 -04:00
imcompiling f744d0d387 Merge branch '52-update-packages'
build_latest / build (push) Failing after 30s
build_release / build (push) Failing after 28s
2024-05-24 13:39:56 -04:00
imcompiling 9c71d24fe3 Unneeded file.
build_develop / build (push) Failing after 36s
2024-05-24 13:36:56 -04:00
imcompiling cdc335936c update dependencies
build_develop / build (push) Failing after 30s
2024-05-22 23:35:40 -04:00
imcompiling 303f0aa804 Update python, sqlalchemy, pandas, and nextcord. 2024-05-22 23:16:22 -04:00
12 changed files with 144 additions and 30 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
FROM python:3.11.9-slim
FROM python:3.12.3-slim
# install dependencies
RUN apt-get update && apt-get -y upgrade && apt-get -y install git sqlite3
+2 -2
View File
@@ -141,7 +141,7 @@ class VoteHighcouncilView(nextcord.ui.View):
)
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: self.guild.get_member(nominee).display_name,
key=lambda nominee: self.guild.get_member(nominee).display_name.lower(),
)
]
options.append(
@@ -213,7 +213,7 @@ class VoteHighcouncilView(nextcord.ui.View):
)
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: self.guild.get_member(nominee).display_name,
key=lambda nominee: self.guild.get_member(nominee).display_name.lower(),
)
]
options.append(
+1 -1
View File
@@ -130,7 +130,7 @@ class VoteView(nextcord.ui.View):
)
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: self.guild.get_member(nominee).display_name,
key=lambda nominee: self.guild.get_member(nominee).display_name.lower(),
)
]
options.append(
+4 -2
View File
@@ -8,6 +8,7 @@ from cogs.commands.remove import RemoveCog
from cogs.commands.request import RequestCog
from cogs.commands.set import SetCog
from cogs.commands.test import TestCog
from cogs.commands.time import TimeCog
from cogs.commands.view import ViewCog
@@ -19,6 +20,7 @@ def setup(bot: commands.Bot) -> None:
bot.add_cog(RefreshCog(bot))
bot.add_cog(RemoveCog())
bot.add_cog(RequestCog(bot))
bot.add_cog(TestCog(bot))
bot.add_cog(ViewCog())
bot.add_cog(SetCog())
bot.add_cog(TestCog(bot))
bot.add_cog(TimeCog())
bot.add_cog(ViewCog())
+1 -1
View File
@@ -109,8 +109,8 @@ class EventView(nextcord.ui.View):
record_event_points(
self.config,
discord_users_list,
True, # noqa: FBT003
self.config.params.event_participate_points,
is_member=True,
)
non_discord_users = interaction.message.embeds[0].fields[1].value
+1 -2
View File
@@ -6,14 +6,13 @@ import nextcord
from nextcord.ext import application_checks, commands
from classes.election_cycle import ElectionCycle
from utils import get_current_election_cycle
from utils import GUILDS, get_current_election_cycle
if TYPE_CHECKING:
from config import DakinyConfig
ME = 206602713511886849
GUILDS = [1000247361639030804]
def is_me(): # noqa: ANN201
+109
View File
@@ -0,0 +1,109 @@
"""Contains commands for time commands."""
from datetime import MAXYEAR, MINYEAR, UTC, datetime
import nextcord
from nextcord.ext import commands
from utils import GUILDS
class TimeCog(commands.Cog, name="Time Commands"):
"""Class holds time commands."""
@nextcord.slash_command(guild_ids=GUILDS)
async def time(self, interaction: nextcord.Interaction) -> None:
"""Parent slash command. Never called."""
@time.subcommand(
description="Get a discord timestamp of the given game time. If date information is left blank, uses current day." # noqa: E501
)
async def at( # noqa: PLR0913
self,
interaction: nextcord.Interaction,
hour: int = nextcord.SlashOption(
description="The hour you want a timestamp of. Given in gametime/UTC.",
min_value=0,
max_value=23,
required=True,
),
minute: int = nextcord.SlashOption(
description="The minute you want a timestamp of. Given in gametime/UTC.",
min_value=0,
max_value=59,
required=True,
),
year: int = nextcord.SlashOption(
description="Year to make timestamp of.", required=False, min_value=MINYEAR, max_value=MAXYEAR
),
month: int = nextcord.SlashOption(
description="Month to make timestamp of.", required=False, min_value=1, max_value=12
),
day: int = nextcord.SlashOption(
description="Day to make timestamp of.", required=False, min_value=1, max_value=31
),
ephemeral: bool = nextcord.SlashOption( # noqa: FBT001
description="Whether the replying message will be public or not.", required=False, default=True
),
) -> None:
"""
Replies with a discord timestamp of given UTC time.
Args:
interaction (nextcord.Interaction): Interaction with the command.
hour (int): The hour in UTC to make the timestamp of..
minute (int): The minute in UTC to make the timestamp of..
year (int): The year to make the timestamp of.
month (int): The month to make the timestamp of.
day (int): The day to make the timestamp of.
ephemeral (bool): Whether the response is ephemeral or not.
"""
gametime_today: datetime = datetime.now(tz=UTC).replace(hour=hour, minute=minute)
if year is not None:
gametime_today = gametime_today.replace(year=year)
if month is not None and day is not None:
try:
gametime_today = gametime_today.replace(month=month, day=day)
except ValueError:
await interaction.response.send_message(f"Day {day} is out of range for month {month}.", ephemeral=True)
return
else:
if month is not None:
try:
gametime_today = gametime_today.replace(month=month)
except ValueError:
await interaction.response.send_message(
f"Today ({gametime_today.day}) is out of range for month {month}.", ephemeral=True
)
return
if day is not None:
try:
gametime_today = gametime_today.replace(day=day)
except ValueError:
await interaction.response.send_message(
f"Day {day} is out of range for this month {gametime_today.month}.", ephemeral=True
)
return
await interaction.response.send_message(content=f"<t:{int(gametime_today.timestamp())}:t>", ephemeral=ephemeral)
@time.subcommand(description="Get the current time in game.")
async def gametime(
self,
interaction: nextcord.Interaction,
ephemeral: bool = nextcord.SlashOption( # noqa: FBT001
description="Whether the replying message will be public or not.", required=False, default=True
),
) -> None:
"""
Replies with the current time in game.
Args:
interaction (nextcord.Interaction): Interaction with the command.
ephemeral: (bool): Whether the response is ephemeral or not.
"""
gametime = datetime.now(tz=UTC)
await interaction.response.send_message(content=f"{gametime.hour}:{gametime.minute}", ephemeral=ephemeral)
+1 -1
View File
@@ -74,7 +74,7 @@ class ViewCog(commands.Cog, name="View Commands"):
sorted_members = members.sort_values(
by="UserId",
key=lambda user_ids: (
[interaction.guild.get_member(int(user_id)).display_name for user_id in user_ids]
[interaction.guild.get_member(int(user_id)).display_name.lower() for user_id in user_ids]
),
)
sorted_non_members = non_members.sort_values(by="UserId")
+1 -1
View File
@@ -35,4 +35,4 @@ class BotPresence(commands.Cog, name="Bot Presence"):
with Session(engine) as session:
presence = session.scalar(select(Presences.Presence).order_by(func.random()))
await self.bot.change_presence(activity=nextcord.CustomActivity(name="Custom Status", state=presence))
await self.bot.change_presence(activity=nextcord.CustomActivity(presence))
+11 -10
View File
@@ -7,16 +7,17 @@ readme = "README.md"
package-mode = false
[tool.poetry.dependencies]
python = "^3.11"
gitpython = "3.1.43"
fastapi = "0.111.0"
hydra-core = "1.3.2"
nextcord = "2.4.2"
pandas = "1.5.2"
python-dotenv = "1.0.0"
pytz = "2022.7.1"
sqlalchemy = "1.4.46"
python = "^3.12"
gitpython = "^3.1.43"
fastapi = "^0.111.0"
hydra-core = "^1.3.2"
nextcord = "^2.6.0"
pandas = "^2.2.2"
python-dotenv = "^1.0.1"
pytz = "^2024.1"
sqlalchemy = "^2.0.30"
aiofiles = "^23.2.1"
setuptools = "^70.0.0"
[tool.poetry.group.dev.dependencies]
@@ -63,7 +64,7 @@ line-length = 120
indent-width = 4
# Assume Python 3.8
target-version = "py311"
target-version = "py312"
[tool.ruff.lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
-1
View File
@@ -1 +0,0 @@
python-3.10.4
+12 -8
View File
@@ -1,5 +1,6 @@
"""File contains util functions."""
import calendar
import os
from collections.abc import Sequence
from datetime import UTC, datetime
@@ -26,6 +27,7 @@ REPO_DIR = "./dakiny-messages"
MESSAGES_DIR = f"{REPO_DIR}/messages"
TEMPLATES_DIR = f"{REPO_DIR}/message_templates"
MAX_DISCORD_MESSAGE_LENGTH = 2000
GUILDS = [1000247361639030804, 239758371358638080]
VoteType = StrEnum("VoteType", ["COUNCIL", "DISCORDMANAGER", "CLANLEADER"])
@@ -46,12 +48,10 @@ def get_datetime(day: str) -> datetime:
day = int(day.split("/")[1])
# ensure that year rolls over if current month is December and the next month is less than 12.
# TODO(imcompiling): replace with Calendar.DECEMBER when updating to python 3.12
# https://gitea.cheezers.org/imcompiling/dakiny-bot/issues/52
if today.month == 12 and month < 12:
if today.month == calendar.DECEMBER and month < calendar.DECEMBER:
year += 1
if today.month == 1 and month > 1:
if today.month == calendar.JANUARY and month > calendar.JANUARY:
year -= 1
return datetime(year, month, day, tzinfo=UTC)
@@ -152,7 +152,7 @@ def build_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> str:
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: guild.get_member(nominee.MemberId).display_name,
key=lambda nominee: guild.get_member(nominee.MemberId).display_name.lower(),
):
votes[nominee.MemberId] = 0
@@ -193,7 +193,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) ->
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: guild.get_member(nominee.MemberId).display_name,
key=lambda nominee: guild.get_member(nominee.MemberId).display_name.lower(),
):
cl_votes[nominee.MemberId] = 0
@@ -211,7 +211,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) ->
for nominee in sorted(
session.scalars(stmt),
key=lambda nominee: guild.get_member(nominee.MemberId).display_name,
key=lambda nominee: guild.get_member(nominee.MemberId).display_name.lower(),
):
dm_votes[nominee.MemberId] = 0
@@ -540,8 +540,12 @@ async def edit_clan_council_info(guild: nextcord.Guild, config: DakinyConfig) ->
.where(CouncilMembers.Elected == true())
)
council_member_ids = sorted(
session.scalars(stmt), key=lambda user_id: guild.get_member(user_id).display_name.lower()
)
council_members_strs = [
f"<@{user_id}>" for user_id in session.scalars(stmt) if user_id not in (discord_manager, clan_leader)
f"<@{user_id}>" for user_id in council_member_ids if user_id not in (discord_manager, clan_leader)
]
quarter = get_quarter_name(config)