"""Contains functions for open raid sign-ups.""" import datetime import nextcord from off_cooldown_bot.logger import ocd_logger MAX_TANKS = 2 MAX_HEALERS = 2 MAX_DPS = 25 class OpenRaid(nextcord.ui.View): """Class defines view for buttons on an open raid schedule message.""" def __init__(self) -> None: super().__init__(timeout=None, auto_defer=True) @nextcord.ui.button(label="Tank", style=nextcord.ButtonStyle.blurple, emoji="🛡️", custom_id="open_raid_tank") async def tank(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Signs a user up as a tank. Removes them if they are already signed up. Args: button (nextcord.ui.Button): Un-used. interaction (nextcord.Interaction): Interaction with command. """ if interaction.message is None or interaction.user is None: ocd_logger.warning("Command was called without a message or user.") return embed = interaction.message.embeds[0] user_str = f"<@{interaction.user.id}>" for index, field in enumerate(embed.fields): if field.name == "Tanks": values = [] if field.value is None else field.value.split("\n") if user_str in values: values.remove(user_str) else: if len(values) >= MAX_TANKS: await interaction.response.send_message( "Enough tanks have signed up, please choose another role.", ephemeral=True ) return values.append(user_str) embed.set_field_at(index, name=field.name, value="\n".join(values), inline=False) break await interaction.edit(embed=embed) @nextcord.ui.button(label="Healer", style=nextcord.ButtonStyle.green, emoji="❤️", custom_id="open_raid_healer") async def healer(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Signs a user up as a healer. Removes them if they are already signed up. Args: button (nextcord.ui.Button): Un-used. interaction (nextcord.Interaction): Interaction with command. """ if interaction.message is None or interaction.user is None: ocd_logger.warning("Command was called without a message or user.") return embed = interaction.message.embeds[0] user_str = f"<@{interaction.user.id}>" for index, field in enumerate(embed.fields): if field.name == "Healers": values = [] if field.value is None else field.value.split("\n") if user_str in values: values.remove(user_str) else: if len(values) >= MAX_HEALERS: await interaction.response.send_message( "Enough healers have signed up, please choose another role.", ephemeral=True ) return values.append(user_str) embed.set_field_at(index, name=field.name, value="\n".join(values), inline=False) break await interaction.edit(embed=embed) @nextcord.ui.button(label="DPS", style=nextcord.ButtonStyle.red, emoji="⚔️", custom_id="open_raid_dps") async def dps(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None: # noqa: ARG002 """ Signs a user up as dps. Removes them if they are already signed up. Args: button (nextcord.ui.Button): Un-used. interaction (nextcord.Interaction): Interaction with command. """ if interaction.message is None or interaction.user is None: ocd_logger.warning("Command was called without a message or user.") return embed = interaction.message.embeds[0] user_str = f"<@{interaction.user.id}>" for index, field in enumerate(embed.fields): if field.name == "DPS": values = [] if field.value is None else field.value.split("\n") if user_str in values: values.remove(user_str) else: if len(values) >= MAX_DPS: await interaction.response.send_message( "Enough dps have signed up, please choose another role.", ephemeral=True ) return values.append(user_str) embed.set_field_at(index, name=field.name, value="\n".join(values), inline=False) break await interaction.edit(embed=embed) def build_raid_embed() -> nextcord.Embed: """ Build the open raid embed. Returns: nextcord.Embed: _description_ """ raid_time = datetime.datetime.now(tz=datetime.UTC) # TODO make this to the next saturday at 8pm CST embed = nextcord.Embed(title="Off Cooldown Open Raid", timestamp=raid_time) embed.add_field(name="Tanks", value="", inline=False) embed.add_field(name="Healers", value="", inline=False) embed.add_field(name="DPS", value="", inline=False) return embed