guava/code/cogs/help.py
Parker 06034d0b37
Some checks failed
Create and publish a Docker image / build-and-push-image (push) Has been cancelled
Support OpenAI AND Groq
2025-02-17 21:24:31 -06:00

281 lines
8.7 KiB
Python

import discord
from discord.ext import commands
from discord import app_commands
from utils.config import BOT_COLOR, BOT_INVITE_LINK
commands_and_descriptions = {
"play": {
"description": "Plays the requested song",
"arguments": {"query": "Name or link of the song you want to play"},
"usage": "/play <query>",
},
"skip": {
"description": "Skips the song that is currently playing",
"optional_arguments": {
"number": (
"The number of songs to skip - leave blank to skip just the"
" current song"
)
},
"usage": "/skip (number)",
},
"queue": {
"description": "Sends the songs currently added to the queue",
"optional_arguments": {
"page": (
"Page number of the queue to view - leave blank to see only"
" the first page"
)
},
"usage": "/queue (page)",
},
"stop": {
"description": (
"Stops all music, clears the queue, and leave the voice channel"
),
"usage": "/stop",
},
"np": {
"description": "Sends the song that is currently playing",
"usage": "/np",
},
"clear": {
"description": "Removes all songs from the queue",
"usage": "/clear",
},
"remove": {
"description": "Removes the specified song from the queue",
"arguments": {
"number": (
"The queue number of the song that should be removed from the"
" queue"
)
},
"usage": "/remove <number>",
},
"autoplay": {
"description": (
"Keep the music playing forever with automatic song"
" recommendations"
),
"arguments": {
"on": "Turn autoplay feature on",
"off": "Turn autoplay feature off",
},
"usage": "/autoplay <on/off>",
},
"repeat": {
"description": "Changes the looping state of the bot",
"arguments": {
"song": "Repeats the song that is currently playing until changed",
"queue": (
"Continuously repeat the songs in the queue until turned off"
),
"off": "Stop all song or queue repetition",
},
"usage": "/repeat <song/queue/off>",
},
"shuffle": {
"description": "Turn song shuffling on or off",
"arguments": {
"on": "Turns randomized song shuffling on",
"off": "Turns shuffling off",
},
"usage": "/shuffle <on/off>",
},
"pause": {
"description": "Pause the song that is currently playing",
"usage": "/pause",
},
"resume": {
"description": "Resume the song that is currently paused",
"usage": "/resume",
},
"lyrics": {
"description": "Get the lyrics of the song that is currently playing",
"usage": "/lyrics",
},
"news": {
"description": "Get recent news and updates about the bot",
"usage": "/news",
},
"bug": {
"description": (
"Fill out a bug report form to alert the developer of issues"
),
"usage": "/bug",
},
"feedback": {
"description": (
"Fill out a form to give the developer feedback on the bot"
),
"usage": "/feedback",
},
}
class HelpView(discord.ui.View):
def __init__(self, timeout=180.0):
super().__init__(timeout=timeout)
if BOT_INVITE_LINK:
self.add_item(
discord.ui.Button(
label="Invite Me", url=BOT_INVITE_LINK, row=1
)
)
@discord.ui.button(
label="View All Commands", style=discord.ButtonStyle.green, row=1
)
async def view_all_commands(
self, interaction: discord.Interaction, button: discord.ui.Button
):
embed = discord.Embed(
title=":musical_note: All Commands :musical_note:",
description=(
"**Check out recent news and updates about the bot with the"
" </news:1260842465666007040> command!\n\u200b**"
),
color=BOT_COLOR,
)
embed.add_field(
name="All Commands",
value=", ".join(
[
f"`{command}`"
for command in commands_and_descriptions.keys()
]
),
)
await interaction.response.edit_message(embed=embed, view=None)
class Help(commands.Cog):
def __init__(self, bot):
self.bot = bot
@app_commands.command()
@app_commands.describe(
command="Name of the command you want more information on"
)
async def help(
self, interaction: discord.Interaction, command: str = None
):
"Sends the bots commands"
if command == None:
embed = discord.Embed(
title=f":musical_note: Help :musical_note:",
description=(
"**Check out recent updates with the"
" </news:1260842465666007040> command!\n\u200b**"
),
color=BOT_COLOR,
)
embed.add_field(
name="**Get Started**",
value=(
"> Start playing music with the"
" </play:1224840890368000172> command. Enter the name or"
" link of the song you want to play."
),
inline=False,
)
embed.add_field(
name="**Full Command List**",
value=(
"> To view of a list of all available commands, click the"
' "View All Commands" button below.'
),
inline=False,
)
embed.add_field(
name="**Help for Specific Commands**",
value=(
"> To get information on a specific command, use"
" </help:1224854217597124610> and include the command"
" name."
),
inline=False,
)
embed.set_thumbnail(url=self.bot.user.avatar.url)
view = HelpView()
await interaction.response.send_message(
embed=embed, view=view, ephemeral=True
)
elif command in commands_and_descriptions.keys():
command = command.lower().strip()
embed = discord.Embed(
title=f"**{command}**",
description=(
f"{commands_and_descriptions[command]['description']}"
),
color=BOT_COLOR,
)
try:
if commands_and_descriptions[command]["arguments"]:
arguments_value = ""
for argument, explanation in commands_and_descriptions[
command
]["arguments"].items():
arguments_value += f"{argument}\n> {explanation}\n\n"
embed.add_field(
name="Arguments", value=arguments_value, inline=False
)
except KeyError:
pass
try:
if commands_and_descriptions[command]["optional_arguments"]:
arguments_value = ""
for argument, explanation in commands_and_descriptions[
command
]["optional_arguments"].items():
arguments_value += f"{argument}\n> {explanation}\n\n"
embed.add_field(
name="Optional Arguments",
value=arguments_value,
inline=False,
)
except KeyError:
pass
embed.add_field(
name="Usage",
value=f"` {commands_and_descriptions[command]['usage']} `",
)
embed.set_thumbnail(url=self.bot.user.avatar.url)
await interaction.response.send_message(
embed=embed, ephemeral=True
)
else:
embed = discord.Embed(
title="Command Doesn't Exist",
description=(
f"The command you entered (` {command} `) does not exist,"
" please try again with a different command name."
),
color=BOT_COLOR,
)
view = HelpView()
await interaction.response.send_message(
embed=embed, view=view, ephemeral=True
)
async def setup(bot):
await bot.add_cog(Help(bot))