Archived
generated from imcompiling/discord-bot-template
Add function to open raid buttons. Load the view in app so that views function after bot restart.
build_develop / build (push) Successful in 22s
build_develop / build (push) Successful in 22s
This commit is contained in:
@@ -1,7 +1,15 @@
|
||||
"""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."""
|
||||
@@ -9,8 +17,8 @@ class OpenRaid(nextcord.ui.View):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(timeout=None, auto_defer=True)
|
||||
|
||||
@nextcord.ui.button(label="Tank", style=nextcord.ButtonStyle.blurple, emoji="🛡️")
|
||||
async def tank(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None:
|
||||
@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.
|
||||
|
||||
@@ -21,9 +29,32 @@ class OpenRaid(nextcord.ui.View):
|
||||
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
|
||||
|
||||
@nextcord.ui.button(label="Healer", style=nextcord.ButtonStyle.green, emoji="❤️")
|
||||
async def healer(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None:
|
||||
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.
|
||||
|
||||
@@ -34,9 +65,32 @@ class OpenRaid(nextcord.ui.View):
|
||||
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
|
||||
|
||||
@nextcord.ui.button(label="DPS", style=nextcord.ButtonStyle.red, emoji="⚔️")
|
||||
async def dps(self, button: nextcord.ui.Button, interaction: nextcord.Interaction) -> None:
|
||||
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.
|
||||
|
||||
@@ -47,3 +101,43 @@ class OpenRaid(nextcord.ui.View):
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user