Improve help with sub commands
This commit is contained in:
parent
07effa2257
commit
f2f8f8f394
1 changed files with 111 additions and 10 deletions
121
src/main.rs
121
src/main.rs
|
@ -10,6 +10,7 @@ mod config_handler;
|
||||||
mod player;
|
mod player;
|
||||||
|
|
||||||
use serenity::{
|
use serenity::{
|
||||||
|
builder::CreateEmbed,
|
||||||
framework::standard::{
|
framework::standard::{
|
||||||
macros::{group, help},
|
macros::{group, help},
|
||||||
Args, CommandGroup, CommandResult, HelpOptions, StandardFramework,
|
Args, CommandGroup, CommandResult, HelpOptions, StandardFramework,
|
||||||
|
@ -41,6 +42,94 @@ create_settings_section!(
|
||||||
#[commands(ip, list, pause, play, remove, skip, stop, tag)]
|
#[commands(ip, list, pause, play, remove, skip, stop, tag)]
|
||||||
struct General;
|
struct General;
|
||||||
|
|
||||||
|
struct HelpGroup {
|
||||||
|
name: String,
|
||||||
|
infos: Vec<HelpInfo>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HelpGroup {
|
||||||
|
fn new(name: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
name: name.to_string(),
|
||||||
|
infos: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_info(mut self, info: HelpInfo) -> Self {
|
||||||
|
self.infos.push(info);
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HelpInfo {
|
||||||
|
command: String,
|
||||||
|
sub_commands: Vec<HelpSubInfo>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HelpInfo {
|
||||||
|
fn new(command: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
command: command.to_string(),
|
||||||
|
sub_commands: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_sub(mut self, sub_command: impl Into<HelpSubInfo>) -> Self {
|
||||||
|
self.sub_commands.push(sub_command.into());
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum HelpSubInfo {
|
||||||
|
Empty,
|
||||||
|
SubCommand(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a str> for HelpSubInfo {
|
||||||
|
fn from(s: &'a str) -> Self {
|
||||||
|
Self::SubCommand(s.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for HelpSubInfo {
|
||||||
|
fn from(s: String) -> Self {
|
||||||
|
Self::SubCommand(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Option<String>> for HelpSubInfo {
|
||||||
|
fn from(o: Option<String>) -> Self {
|
||||||
|
match o {
|
||||||
|
Some(s) => Self::SubCommand(s.to_string()),
|
||||||
|
None => Self::Empty,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_help(embed: &mut CreateEmbed, groups: Vec<HelpGroup>) {
|
||||||
|
for group in groups {
|
||||||
|
let mut s = String::new();
|
||||||
|
|
||||||
|
for info in group.infos {
|
||||||
|
s += &format!("`{}`\n", info.command);
|
||||||
|
|
||||||
|
for sub in info.sub_commands {
|
||||||
|
s += &format!(
|
||||||
|
"> {}\n",
|
||||||
|
match sub {
|
||||||
|
HelpSubInfo::Empty => "<empty>".to_string(),
|
||||||
|
HelpSubInfo::SubCommand(sub_command) => sub_command,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
embed.field(group.name, s, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[help]
|
#[help]
|
||||||
fn my_help(
|
fn my_help(
|
||||||
context: &mut Context,
|
context: &mut Context,
|
||||||
|
@ -54,17 +143,29 @@ fn my_help(
|
||||||
m.embed(|embed| {
|
m.embed(|embed| {
|
||||||
embed.colour(help_options.embed_success_colour);
|
embed.colour(help_options.embed_success_colour);
|
||||||
|
|
||||||
embed.field("General", "ip", true);
|
let groups = vec![
|
||||||
embed.field("General", "help", true);
|
HelpGroup::new("General")
|
||||||
|
.add_info(HelpInfo::new("ip"))
|
||||||
|
.add_info(HelpInfo::new("help")),
|
||||||
|
HelpGroup::new("Audio Control")
|
||||||
|
.add_info(
|
||||||
|
HelpInfo::new("play")
|
||||||
|
.add_sub(None)
|
||||||
|
.add_sub("--local")
|
||||||
|
.add_sub("--tag <tag name>")
|
||||||
|
.add_sub("<link>")
|
||||||
|
.add_sub("<name>"),
|
||||||
|
)
|
||||||
|
.add_info(HelpInfo::new("pause"))
|
||||||
|
.add_info(HelpInfo::new("stop"))
|
||||||
|
.add_info(HelpInfo::new("skip")),
|
||||||
|
HelpGroup::new("Data Manipulation")
|
||||||
|
.add_info(HelpInfo::new("list").add_sub(None).add_sub("--tags"))
|
||||||
|
.add_info(HelpInfo::new("remove"))
|
||||||
|
.add_info(HelpInfo::new("tag").add_sub("<tag name>")),
|
||||||
|
];
|
||||||
|
|
||||||
embed.field("Audio Control", "play", true);
|
create_help(embed, groups);
|
||||||
embed.field("Audio Control", "pause", true);
|
|
||||||
embed.field("Audio Control", "stop", true);
|
|
||||||
embed.field("Audio Control", "skip", true);
|
|
||||||
|
|
||||||
embed.field("Data Manipulation", "list", true);
|
|
||||||
embed.field("Data Manipulation", "remove", true);
|
|
||||||
embed.field("Data Manipulation", "tag", true);
|
|
||||||
|
|
||||||
embed
|
embed
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue