Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,14 +214,12 @@ async def queue_handler(self, interaction: discord.Interaction, question, is_pas
@bot.tree.command(name="queue")
async def queue_panel(interaction: discord.Interaction):
await interaction.response.send_message(
"Queue Panel",
view=QueueView()
)

@bot.tree.command(name="ta")
async def ta_panel(interaction: discord.Interaction):
await interaction.response.send_message(
"TA Panel",
view=TAView()
)

Expand Down
24 changes: 18 additions & 6 deletions ui/views/queue_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@
from ui.helpers.constants import DEFAULT_TIMEOUT, SHORT_TIMEOUT
from ui.helpers.discord_helpers import update_queue_messages


class QueueView(discord.ui.View):
def __init__(self):
super().__init__(timeout=None)

class QueueRequests(discord.ui.ActionRow[discord.ui.LayoutView]):
@discord.ui.button(label="Need Help", style=discord.ButtonStyle.primary, custom_id="need_help", emoji="🙏")
async def help_btn(self, interaction: discord.Interaction, button):
ok = await require_queue_open_and_not_in_queue(interaction)
Expand Down Expand Up @@ -52,7 +48,23 @@ async def position_btn(self, interaction: discord.Interaction, button):
ephemeral=True,
delete_after=DEFAULT_TIMEOUT,
)

class EsotericCommands(discord.ui.ActionRow[discord.ui.LayoutView]):
@discord.ui.button(label="Report Bot Problem", style=discord.ButtonStyle.secondary, custom_id="report_bot_problem", emoji="☢️")
async def report_bot_problem_btn(self, interaction: discord.Interaction, button):
await interaction.response.send_modal(BotIssueModal())

class QueueView(discord.ui.LayoutView):
def __init__(self):
super().__init__(timeout=None)


container = discord.ui.Container[discord.ui.LayoutView](
discord.ui.TextDisplay("## Queue Requests"),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
QueueRequests(),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
EsotericCommands(),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
)

self.add_item(container)
160 changes: 92 additions & 68 deletions ui/views/ta_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,59 +8,9 @@
from ui.helpers.utils import fixed_width
from ui.helpers.discord_helpers import get_channel, get_role, move_to_breakout, safe_dm_user, notify_next_if_changed, update_queue_messages



class TAView(discord.ui.View):

def __init__(self):
super().__init__(timeout=None)


@discord.ui.button(label="Open Queue", style=discord.ButtonStyle.green, custom_id="open_queue", emoji="🔓")
async def open(self, interaction: discord.Interaction, button: discord.Button):
if not interaction.client.queue.is_open:
interaction.client.queue.is_open = True
await interaction.response.send_message(QUEUE_OPENED, ephemeral=True, delete_after=DEFAULT_TIMEOUT)
await update_queue_messages(interaction.client)
return
else:
await interaction.response.send_message(QUEUE_ALREADY_OPEN, ephemeral=True, delete_after=SHORT_TIMEOUT)

@discord.ui.button(label="Close Queue", style=discord.ButtonStyle.red, custom_id="close_queue", emoji="🔏")
async def close(self, interaction: discord.Interaction, button):
if interaction.client.queue.is_open:
interaction.client.queue.is_open = False
await interaction.response.send_message(QUEUE_CLOSED, ephemeral=True, delete_after=DEFAULT_TIMEOUT)
await update_queue_messages(interaction.client)
return
else:
await interaction.response.send_message(QUEUE_ALREADY_CLOSED, ephemeral=True, delete_after=SHORT_TIMEOUT)

@discord.ui.button(label="Days Since Last Incident", style=discord.ButtonStyle.secondary, custom_id="days_since_incident", emoji="⚠️")
async def days_since_incident_btn(self, interaction: discord.Interaction, button):
days, issue_text = get_last_incident_info()
if days is None:
message = "No incidents have been reported yet."
elif days == 1:
message = f"1 day since last incident. Description: {issue_text or 'No description provided.'}"
else:
message = f"{days} days since last incident. Description: {issue_text or 'No description provided.'}"

await interaction.response.send_message(message, ephemeral=True, delete_after=DEFAULT_TIMEOUT)

@discord.ui.button(label="Student Info", style=discord.ButtonStyle.secondary, custom_id="student_info", emoji="📝")
async def student_info(self, interaction: discord.Interaction, button):
headers, rows = get_student_info()
width = STUDENT_INFO_WIDTH
def row_to_line(items):
return "| ".join(fixed_width(str(x), width) for x in items)

divider = "-" * (width * len(headers) + 3 * (len(headers)-1))
body = "\n".join(row_to_line(r) for r in rows)
builder = f"```Student Info:\n{row_to_line(headers)}\n{divider}\n{body}```"
await interaction.response.send_message(builder, ephemeral=True, delete_after=LONG_TIMEOUT)

@discord.ui.button(label="Next", style=discord.ButtonStyle.blurple, custom_id="next", emoji="➡️")
class TAQueueControls1(discord.ui.ActionRow[discord.ui.LayoutView]):
view: "TAView"
@discord.ui.button(label="Next Student", style=discord.ButtonStyle.blurple, custom_id="next", emoji="➡️")
async def next(self, interaction: discord.Interaction, button):
entry: Optional[QueueEntry] = await interaction.client.queue.next()

Expand All @@ -83,7 +33,7 @@ async def next(self, interaction: discord.Interaction, button):
if not interaction.response.is_done():
await interaction.response.send_message(NOW_HELPING_TEMPLATE.format(ta=interaction.user.display_name, student=entry.username), delete_after=DEFAULT_TIMEOUT)

@discord.ui.button(label="Next Online", style=discord.ButtonStyle.blurple, custom_id="next_online", emoji="💻")
@discord.ui.button(label="Next Student (Online)", style=discord.ButtonStyle.blurple, custom_id="next_online", emoji="💻")
async def next_online(self, interaction: discord.Interaction, button: discord.ui.Button):
# Get who was at front before removal
front_before = await interaction.client.queue.get_front()
Expand All @@ -108,7 +58,9 @@ async def next_online(self, interaction: discord.Interaction, button: discord.ui
delete_after=DEFAULT_TIMEOUT
)




class TAQueueControls2(discord.ui.ActionRow[discord.ui.LayoutView]):
@discord.ui.button(label="Next Passoff", style=discord.ButtonStyle.blurple, custom_id="next_passoff", emoji="✅")
async def next_passoff(self, interaction: discord.Interaction, button: discord.ui.Button):
# Get who was at front before removal
Expand All @@ -131,8 +83,7 @@ async def next_passoff(self, interaction: discord.Interaction, button: discord.u
delete_after=DEFAULT_TIMEOUT
)


@discord.ui.button(label="Next Online Passoff", style=discord.ButtonStyle.blurple, custom_id="next_online_passoff", emoji="☑️")
@discord.ui.button(label="Next Passoff (Online)", style=discord.ButtonStyle.blurple, custom_id="next_online_passoff", emoji="☑️")
async def next_online_passoff(self, interaction: discord.Interaction, button: discord.ui.Button):
# Get who was at front before removal
front_before = await interaction.client.queue.get_front()
Expand All @@ -153,17 +104,8 @@ async def next_online_passoff(self, interaction: discord.Interaction, button: di
delete_after=DEFAULT_TIMEOUT
)



@discord.ui.button(label="Clear Queue", style=discord.ButtonStyle.danger, custom_id="clear_queue", emoji="💥")
async def clear_queue(self, interaction: discord.Interaction, button):
await interaction.response.send_modal(ClearConfirmModal())

@discord.ui.button(label="Remove Student", style=discord.ButtonStyle.danger, custom_id="remove_from_queue", emoji="🗑️")
async def remove_from_queue(self, interaction: discord.Interaction, button):
await interaction.response.send_modal(RemoveConfirmModal())

@discord.ui.button(label="Finish", style=discord.ButtonStyle.green, custom_id="finish", emoji="🔚")
class TAQueueControls3(discord.ui.ActionRow[discord.ui.LayoutView]):
@discord.ui.button(label="Finish Helping Student", style=discord.ButtonStyle.green, custom_id="finish", emoji="🔚")
async def finish_button(self, interaction: discord.Interaction, button):
online_ta_vc: discord.VoiceChannel = get_channel(interaction, TA_VOICE_CHANNEL_NAME)

Expand All @@ -188,8 +130,90 @@ async def finish_button(self, interaction: discord.Interaction, button):
await interaction.user.move_to(online_ta_vc)
await interaction.response.defer(thinking=False)

class TAQueueManagement(discord.ui.ActionRow[discord.ui.LayoutView]):
view: "TAView"
@discord.ui.button(label="Open Queue", style=discord.ButtonStyle.green, custom_id="open_queue", emoji="🔓")
async def open(self, interaction: discord.Interaction, button: discord.Button):
if not interaction.client.queue.is_open:
interaction.client.queue.is_open = True
await interaction.response.send_message(QUEUE_OPENED, ephemeral=True, delete_after=DEFAULT_TIMEOUT)
await update_queue_messages(interaction.client)
return
else:
await interaction.response.send_message(QUEUE_ALREADY_OPEN, ephemeral=True, delete_after=SHORT_TIMEOUT)

@discord.ui.button(label="Close Queue", style=discord.ButtonStyle.red, custom_id="close_queue", emoji="🔏")
async def close(self, interaction: discord.Interaction, button):
if interaction.client.queue.is_open:
interaction.client.queue.is_open = False
await interaction.response.send_message(QUEUE_CLOSED, ephemeral=True, delete_after=DEFAULT_TIMEOUT)
await update_queue_messages(interaction.client)
return
else:
await interaction.response.send_message(QUEUE_ALREADY_CLOSED, ephemeral=True, delete_after=SHORT_TIMEOUT)

@discord.ui.button(label="Clear Queue", style=discord.ButtonStyle.danger, custom_id="clear_queue", emoji="💥")
async def clear_queue(self, interaction: discord.Interaction, button):
await interaction.response.send_modal(ClearConfirmModal())

@discord.ui.button(label="Remove Student", style=discord.ButtonStyle.danger, custom_id="remove_from_queue", emoji="🗑️")
async def remove_from_queue(self, interaction: discord.Interaction, button):
await interaction.response.send_modal(RemoveConfirmModal())

class TAQueueInformation(discord.ui.ActionRow[discord.ui.LayoutView]):
view: "TAView"
@discord.ui.button(label="Days Since Last Incident", style=discord.ButtonStyle.secondary, custom_id="days_since_incident", emoji="⚠️")
async def days_since_incident_btn(self, interaction: discord.Interaction, button):
days, issue_text = get_last_incident_info()
if days is None:
message = "No incidents have been reported yet."
elif days == 1:
message = f"1 day since last incident. Description: {issue_text or 'No description provided.'}"
else:
message = f"{days} days since last incident. Description: {issue_text or 'No description provided.'}"

await interaction.response.send_message(message, ephemeral=True, delete_after=DEFAULT_TIMEOUT)

@discord.ui.button(label="Student Info", style=discord.ButtonStyle.secondary, custom_id="student_info", emoji="📝")
async def student_info(self, interaction: discord.Interaction, button):
headers, rows = get_student_info()
width = STUDENT_INFO_WIDTH
def row_to_line(items):
return "| ".join(fixed_width(str(x), width) for x in items)

divider = "-" * (width * len(headers) + 3 * (len(headers)-1))
body = "\n".join(row_to_line(r) for r in rows)
builder = f"```Student Info:\n{row_to_line(headers)}\n{divider}\n{body}```"
await interaction.response.send_message(builder, ephemeral=True, delete_after=LONG_TIMEOUT)

@discord.ui.button(label="Edit Hours", style=discord.ButtonStyle.secondary, custom_id="edit_hours", emoji="🕐")
async def edit_queue_hours(self, interaction: discord.Interaction, button: discord.ui.Button):
from ui.modals import EditQueueHoursModal
await interaction.response.send_modal(EditQueueHoursModal())

class TAView(discord.ui.LayoutView):

def __init__(self):
super().__init__(timeout=None)
container = discord.ui.Container[discord.ui.LayoutView](
discord.ui.TextDisplay("## Queue Controls"),
# discord.ui.Section(
# "## Queue Controls",
# accessory=discord.ui.Thumbnail["TAView"]("https://images.seeklogo.com/logo-png/30/1/byu-brigham-young-university-logo-png_seeklogo-306722.png")
# ),
discord.ui.Separator(visible=False, spacing=discord.SeparatorSpacing.large),
discord.ui.TextDisplay("### Basic Controls"),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
TAQueueControls1(),
TAQueueControls2(),
TAQueueControls3(),
discord.ui.Separator(visible=False, spacing=discord.SeparatorSpacing.large),
discord.ui.TextDisplay("### Queue Management"),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
TAQueueManagement(),
discord.ui.Separator(visible=False, spacing=discord.SeparatorSpacing.large),
discord.ui.TextDisplay("### Information/Upkeep"),
discord.ui.Separator(visible=True, spacing=discord.SeparatorSpacing.small),
TAQueueInformation()
)
self.add_item(container)