better help command

This commit is contained in:
jellywx 2021-04-10 18:16:42 +01:00
parent 626c21f38d
commit 909e8e351a
3 changed files with 131 additions and 24 deletions

View File

@ -252,7 +252,7 @@ impl Framework for RegexFramework {
async fn check_prefix(ctx: &Context, guild: &Guild, prefix_opt: Option<Match<'_>>) -> bool { async fn check_prefix(ctx: &Context, guild: &Guild, prefix_opt: Option<Match<'_>>) -> bool {
if let Some(prefix) = prefix_opt { if let Some(prefix) = prefix_opt {
match ctx.get_from_id(guild.id).await { match ctx.guild_data(guild.id).await {
Ok(guild_data) => prefix.as_str() == guild_data.read().await.prefix, Ok(guild_data) => prefix.as_str() == guild_data.read().await.prefix,
Err(_) => prefix.as_str() == "?", Err(_) => prefix.as_str() == "?",

View File

@ -14,7 +14,7 @@ pub struct GuildData {
#[async_trait] #[async_trait]
pub trait CtxGuildData { pub trait CtxGuildData {
async fn get_from_id<G: Into<GuildId> + Send + Sync>( async fn guild_data<G: Into<GuildId> + Send + Sync>(
&self, &self,
guild_id: G, guild_id: G,
) -> Result<Arc<RwLock<GuildData>>, sqlx::Error>; ) -> Result<Arc<RwLock<GuildData>>, sqlx::Error>;
@ -22,7 +22,7 @@ pub trait CtxGuildData {
#[async_trait] #[async_trait]
impl CtxGuildData for Context { impl CtxGuildData for Context {
async fn get_from_id<G: Into<GuildId> + Send + Sync>( async fn guild_data<G: Into<GuildId> + Send + Sync>(
&self, &self,
guild_id: G, guild_id: G,
) -> Result<Arc<RwLock<GuildData>>, sqlx::Error> { ) -> Result<Arc<RwLock<GuildData>>, sqlx::Error> {

View File

@ -165,7 +165,7 @@ impl EventHandler for Handler {
.cloned() .cloned()
.expect("Could not get SQLPool from data"); .expect("Could not get SQLPool from data");
let guild_data_opt = ctx.get_from_id(guild.id).await; let guild_data_opt = ctx.guild_data(guild.id).await;
if let Ok(guild_data) = guild_data_opt { if let Ok(guild_data) = guild_data_opt {
let volume; let volume;
@ -402,6 +402,128 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
Ok(()) Ok(())
} }
#[command]
async fn help(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
if args.is_empty() {
let description = {
let guild_data = ctx.guild_data(msg.guild_id.unwrap()).await.unwrap();
let read_lock = guild_data.read().await;
format!(
"Type `{}help category` to view help for a command category below:",
read_lock.prefix
)
};
msg.channel_id
.send_message(&ctx, |m| {
m.embed(|e| {
e.title("Help")
.color(THEME_COLOR)
.description(description)
.field("Info", "`help` `info` `invite` `donate`", false)
.field("Play", "`play` `p` `stop` `loop`", false)
.field("Manage", "`upload` `delete` `list` `public`", false)
.field("Settings", "`prefix` `roles` `volume` `allow_greet`", false)
.field("Search", "`search` `random` `popular`", false)
.field("Other", "`greet` `ambience`", false)
})
})
.await?;
} else {
let body = match args.rest().to_lowercase().as_str() {
"info" => {
"__Info Commands__
`help` - view all commands
`help [category]` - view help for the commands in a category
`info` - view information about the bot
`invite` - get an invite link for the bot
`donate` - view information about the Patreon
"
}
"play" => {
"__Play Commands__
`play [sound]` - play a sound matching the name \"sound\"
`play [id]` - play the sound with numerical ID `id`
`p` - an alias for `play`
`stop` - stop the bot from playing
`loop [sound]` - play a sound matching the name \"sound\" on loop
`loop [id]` - play a sound matching the numerical ID `id` on loop
"
}
"manage" => {
"__Manage Commands__
`upload [name]` - upload a new sound effect to the name \"name\"
`delete [name]` - delete a sound you have uploaded under the name \"name\"
`list` - list sounds uploaded on the server you are on
`list me` - list sounds you have uploaded to any server
`public [name]` - make a sound you have uploaded public or private
"
}
"settings" => {
"__Settings Commands__
`prefix [new prefix]` - change the prefix of the bot
`roles [role list]` - set which roles can use the bot
`roles off` - allow all users to use the bot
`volume [new volume]` - change the volume of the bot
`allow_greet` - toggle whether users in your server can use greet sounds
"
}
"search" => {
"__Search Commands__
`search [term]` - search for sounds matching \"term\"
`random` - find some random sounds on the bot
`popular` - find the most played sounds on the bot
"
}
"other" => {
"__Other Commands__
`greet [name]` - set your greet sound (join sound) to the sound called \"name\"
`greet [id]` - set your greet sound (join sound) to the sound with numerical ID `id`
`ambience` - view a list of ambience sounds
`ambience [name]` - set an ambience sound playing
"
}
_ => {
"__Unrecognised Category__
Please select a category from the following:
`info`
`play`
`manage`
`settings`
`search`
`other`
"
}
};
msg.channel_id
.send_message(&ctx, |m| {
m.embed(|e| e.title("Help").color(THEME_COLOR).description(body))
})
.await?;
}
Ok(())
}
#[command] #[command]
#[permission_level(Managed)] #[permission_level(Managed)]
async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult { async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
@ -459,7 +581,7 @@ async fn play_cmd(ctx: &Context, msg: &Message, args: Args, loop_: bool) -> Comm
let (call_handler, _) = let (call_handler, _) =
join_channel(ctx, guild.clone(), user_channel).await; join_channel(ctx, guild.clone(), user_channel).await;
let guild_data = ctx.get_from_id(guild).await.unwrap(); let guild_data = ctx.guild_data(guild).await.unwrap();
let mut lock = call_handler.lock().await; let mut lock = call_handler.lock().await;
@ -537,7 +659,7 @@ async fn play_ambience(ctx: &Context, msg: &Message, args: Args) -> CommandResul
{ {
let (call_handler, _) = join_channel(ctx, guild.clone(), user_channel).await; let (call_handler, _) = join_channel(ctx, guild.clone(), user_channel).await;
let guild_data = ctx.get_from_id(guild).await.unwrap(); let guild_data = ctx.guild_data(guild).await.unwrap();
let mut lock = call_handler.lock().await; let mut lock = call_handler.lock().await;
@ -610,21 +732,6 @@ async fn stop_playing(ctx: &Context, msg: &Message, _args: Args) -> CommandResul
Ok(()) Ok(())
} }
#[command]
async fn help(ctx: &Context, msg: &Message, _args: Args) -> CommandResult {
msg.channel_id
.send_message(&ctx, |m| {
m.embed(|e| {
e.title("Help").color(THEME_COLOR).description(
"Please visit our website at: **https://soundfx.jellywx.com/help**",
)
})
})
.await?;
Ok(())
}
#[command] #[command]
async fn info(ctx: &Context, msg: &Message, _args: Args) -> CommandResult { async fn info(ctx: &Context, msg: &Message, _args: Args) -> CommandResult {
let current_user = ctx.cache.current_user().await; let current_user = ctx.cache.current_user().await;
@ -669,7 +776,7 @@ async fn change_volume(ctx: &Context, msg: &Message, mut args: Args) -> CommandR
.cloned() .cloned()
.expect("Could not get SQLPool from data"); .expect("Could not get SQLPool from data");
let guild_data_opt = ctx.get_from_id(msg.guild_id.unwrap()).await; let guild_data_opt = ctx.guild_data(msg.guild_id.unwrap()).await;
let guild_data = guild_data_opt.unwrap(); let guild_data = guild_data_opt.unwrap();
if args.len() == 1 { if args.len() == 1 {
@ -717,7 +824,7 @@ async fn change_prefix(ctx: &Context, msg: &Message, mut args: Args) -> CommandR
let guild_data; let guild_data;
{ {
let guild_data_opt = ctx.get_from_id(msg.guild_id.unwrap()).await; let guild_data_opt = ctx.guild_data(msg.guild_id.unwrap()).await;
guild_data = guild_data_opt.unwrap(); guild_data = guild_data_opt.unwrap();
} }
@ -1324,7 +1431,7 @@ async fn allow_greet_sounds(ctx: &Context, msg: &Message, _args: Args) -> Comman
.cloned() .cloned()
.expect("Could not acquire SQL pool from data"); .expect("Could not acquire SQL pool from data");
let guild_data_opt = ctx.get_from_id(msg.guild_id.unwrap()).await; let guild_data_opt = ctx.guild_data(msg.guild_id.unwrap()).await;
if let Ok(guild_data) = guild_data_opt { if let Ok(guild_data) = guild_data_opt {
let current = guild_data.read().await.allow_greets; let current = guild_data.read().await.allow_greets;