Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b5330f7ca | ||
|
|
4e64eac176 | ||
|
|
c90ddf42c3 | ||
|
|
8eb2457ae9 | ||
|
|
2bdb7cb17b | ||
|
|
07906aaea1 | ||
|
|
9109ac53b3 | ||
|
|
47a33128be |
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"cSpell.words": [
|
||||
"aiofiles",
|
||||
"blurple",
|
||||
"CLANLEADER",
|
||||
"Dakiny",
|
||||
"DISCORDMANAGER",
|
||||
"highcouncil"
|
||||
]
|
||||
}
|
||||
+82
-2
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user