Compare commits

..
Author SHA1 Message Date
imcompiling 0b5330f7ca Merge commit '4e64eac17669e5e9b4e4626b3e2f9501b55c7aac'
build_latest / build (push) Successful in 16s
build_release / build (push) Successful in 16s
2024-08-01 22:07:55 -04:00
imcompiling 4e64eac176 Handle case when there are no non-discord members to view points for.
build_develop / build (push) Successful in 1m25s
2024-08-01 22:07:28 -04:00
imcompiling c90ddf42c3 Merge branch 'main' of https://gitea.cheezers.org/imcompiling/dakiny-bot
build_latest / build (push) Successful in 1m25s
build_develop / build (push) Successful in 16s
2024-08-01 21:50:02 -04:00
imcompiling 8eb2457ae9 Merge commit '2bdb7cb17b44a80286d5bbf689b1f2e5a88dcda0'
build_release / build (push) Successful in 16s
2024-08-01 21:49:21 -04:00
imcompiling 2bdb7cb17b Add the record point command.
build_develop / build (push) Successful in 1m28s
2024-08-01 21:48:33 -04:00
imcompiling 07906aaea1 Spell check and ruff fixes. 2024-08-01 21:46:16 -04:00
imcompiling 9109ac53b3 Use KANDY const instead of int.
build_latest / build (push) Successful in 1m44s
2024-07-13 12:54:55 -04:00
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
5 changed files with 103 additions and 9 deletions
+10
View File
@@ -0,0 +1,10 @@
{
"cSpell.words": [
"aiofiles",
"blurple",
"CLANLEADER",
"Dakiny",
"DISCORDMANAGER",
"highcouncil"
]
}
+82 -2
View File
@@ -5,7 +5,7 @@ from discord import TextInputStyle
from nextcord.ext import commands
from config import DakinyConfig
from utils import record_event_points
from utils import GUILDS, MAX_DISCORD_MESSAGE_LENGTH, record_event_points
class RecordCog(commands.Cog, name="Record Commands"):
@@ -16,7 +16,7 @@ class RecordCog(commands.Cog, name="Record Commands"):
super().__init__()
self.bot: commands.Bot = bot
@nextcord.slash_command()
@nextcord.slash_command(guild_ids=GUILDS)
async def record(self, interaction: nextcord.Interaction) -> None:
"""Parent slash command for record. Never called."""
@@ -64,6 +64,86 @@ class RecordCog(commands.Cog, name="Record Commands"):
embed=embed,
)
@record.subcommand(description="Record a miscellaneous point for a clan member.")
async def point( # noqa: PLR0913
self,
interaction: nextcord.Interaction,
activity: str = nextcord.SlashOption(
description="The type of activity to receive points for.",
required=True,
choices=[
"Clan chat activity",
"Teaching or sharing in-game tips",
"Recruiting efforts",
"Successful recruitment",
],
),
justification: str = nextcord.SlashOption(
required=True,
description="Reason to give the recipient a point.",
max_length=int(MAX_DISCORD_MESSAGE_LENGTH / 2),
),
recipient: nextcord.Member = nextcord.SlashOption(
required=False,
description="Discord user to give point to.",
),
non_discord_recipient: str = nextcord.SlashOption(
required=False, description="Non Discord user to give point to.", max_length=32
),
) -> None:
"""
Gives a point to the provided recipient. Sends recording message to event participation channel.
Only one recipient should be given point/provided to the command. Fails if not exactly one recipient
is given.
Args:
interaction (nextcord.Interaction): interaction with this command.
activity (str): Choice list of activities to give point for.
justification (str): Reason to give point.
recipient (nextcord.Member): Discord member to give point to.
non_discord_recipient (str): Non Discord member to give point to.
"""
# role check
if interaction.guild.get_role(self.bot.config.params.clan_member_role_id) not in interaction.user.roles:
await interaction.response.send_message(
f"You must have the <@&{self.bot.config.params.clan_member_role_id}> role to record points.",
ephemeral=True,
)
return
# pylint or whatever seems to think that there are lines of unreachable code. That is false.
if recipient and non_discord_recipient:
await interaction.response.send_message("Please only provide 1 recipient.", ephemeral=True)
return
elif recipient is not None: # noqa: RET505
record_event_points(
self.bot.config,
[str(recipient.id)],
self.bot.config.params.event_participate_points,
is_member=True,
)
recipient_str = f"<@{recipient.id}>"
elif non_discord_recipient is not None:
record_event_points(
self.bot.config,
[non_discord_recipient],
self.bot.config.params.event_participate_points,
is_member=False,
)
recipient_str = f'"{non_discord_recipient}"'
else:
await interaction.response.send_message("You must provide a recipient.", ephemeral=True)
return
event_channel: nextcord.TextChannel = interaction.guild.get_channel(
self.bot.config.params.event_post_channel_id
)
msg = f"<@{interaction.user.id}> has given {recipient_str} points for the {activity} activity. Justification: {justification}." # noqa: E501
await event_channel.send(msg)
await interaction.response.send_message("Point has been added.", ephemeral=True)
class EventView(nextcord.ui.View):
"""
+6 -2
View File
@@ -70,14 +70,18 @@ class ViewCog(commands.Cog, name="View Commands"):
content += f"**{cycle}**\n"
unsorted_all = cycles.get_group(cycle).groupby("DiscordMember")
members = unsorted_all.get_group(name=True)
non_members = unsorted_all.get_group(name=False)
# there can be no non-discord members sometimes.
try:
sorted_non_members = unsorted_all.get_group(name=False).sort_values(by="UserId")
except KeyError:
sorted_non_members = None
sorted_members = members.sort_values(
by="UserId",
key=lambda 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")
sorted_all = pd.concat([sorted_members, sorted_non_members], ignore_index=True, sort=False)
for row in sorted_all.itertuples():
userid = row.UserId
+1 -1
View File
@@ -91,7 +91,7 @@ class DailyLoop(commands.Cog, name="Daily Loop"):
# kandy's 1% chance
if random.randint(0, 99) == 0: # noqa: S311 isn't cryptography related.
birthday_list.append(239547993106284544)
birthday_list.append(KANDY)
today = datetime.now(tz=UTC).date()
birthday = f"{today.month}/{today.day}"
+4 -4
View File
@@ -137,7 +137,7 @@ def build_votes_str(config: DakinyConfig, guild: nextcord.Guild) -> str:
Creates a string that contains all nominees and their votes to be sent as a discord message.
Args:
config (DakinyConfig): Daking config object
config (DakinyConfig): Dakiny config object
guild (nextcord.Guild): The guild object. Used to get display names for sorting.
Returns:
@@ -173,7 +173,7 @@ def build_highcouncil_votes_str(config: DakinyConfig, guild: nextcord.Guild) ->
Creates a string that contains all high council nominees and their votes to be sent as a discord message.
Args:
config (DakinyConfig): Daking config object
config (DakinyConfig): Dakiny config object
guild (nextcord.Guild): The guild object. Used to get display names for sorting.
Returns:
@@ -374,7 +374,7 @@ def get_allowed_points(session: Session, points_limit: int, user: str, points: i
add_points = (
points
if limit.Points + points <= points_limit
else (points_limit - limit.Points if points_limit - limit.Points > 0 else 0)
else (max(0, points_limit - limit.Points))
)
limit.Points += add_points
@@ -512,7 +512,7 @@ async def edit_clan_message(
async def edit_clan_council_info(guild: nextcord.Guild, config: DakinyConfig) -> None:
"""
Gets the winners of the elections and updates the perminant message that states the current council.
Gets the winners of the elections and updates the permanent message that states the current council.
Args:
guild (nextcord.Guild): Guild object that to use to get channel.