diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs new file mode 100644 index 000000000..e14743499 --- /dev/null +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -0,0 +1,69 @@ +using System; +using System.Threading.Tasks; +using System.Collections.Generic; + +namespace Discord.Commands +{ + public class CommandBuilder + { + private List aliases; + + internal CommandBuilder(ModuleBuilder module, string prefix) + { + aliases = new List(); + + if (prefix != null) + { + aliases.Add(prefix); + Name = prefix; + } + + Module = module; + } + + + public string Name { get; set; } + public string Summary { get; set; } + public string Remarks { get; set; } + public Func Callback { get; set; } + public ModuleBuilder Module { get; } + + public List Aliases => aliases; + + + public CommandBuilder SetName(string name) + { + Name = name; + return this; + } + + public CommandBuilder SetSummary(string summary) + { + Summary = summary; + return this; + } + + public CommandBuilder SetRemarks(string remarks) + { + Remarks = remarks; + return this; + } + + public CommandBuilder SetCallback(Func callback) + { + Callback = callback; + return this; + } + + public CommandBuilder AddAlias(string alias) + { + aliases.Add(alias); + return this; + } + + public ModuleBuilder Done() + { + return Module; + } + } +} \ No newline at end of file diff --git a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs new file mode 100644 index 000000000..ca4f84633 --- /dev/null +++ b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Discord.Commands +{ + public class ModuleBuilder + { + private List commands; + private List submodules; + private List aliases; + + + public ModuleBuilder() + : this(null, null) + { } + + public ModuleBuilder(string prefix) + : this(null, prefix) + { } + + internal ModuleBuilder(ModuleBuilder parent) + : this(parent, null) + { } + + internal ModuleBuilder(ModuleBuilder parent, string prefix) + { + commands = new List(); + submodules = new List(); + aliases = new List(); + + if (prefix != null) + { + aliases.Add(prefix); + Name = prefix; + } + + ParentModule = parent; + } + + + public string Name { get; set; } + public string Summary { get; set; } + public string Remarks { get; set; } + public ModuleBuilder ParentModule { get; } + + public List Commands => commands; + public List Modules => submodules; + public List Aliases => aliases; + + + public ModuleBuilder SetName(string name) + { + Name = name; + return this; + } + + public ModuleBuilder SetSummary(string summary) + { + Summary = summary; + return this; + } + + public ModuleBuilder SetRemarks(string remarks) + { + Remarks = remarks; + return this; + } + + public ModuleBuilder AddAlias(string alias) + { + aliases.Add(alias); + return this; + } + + public CommandBuilder AddCommand() => AddCommand(null); + public CommandBuilder AddCommand(string name) + { + var builder = new CommandBuilder(this, name); + commands.Add(builder); + + return builder; + } + + public ModuleBuilder AddSubmodule() => AddSubmodule(null); + public ModuleBuilder AddSubmodule(string prefix) + { + var builder = new ModuleBuilder(this, prefix); + submodules.Add(builder); + + return builder; + } + + public ModuleBuilder Done() + { + if (ParentModule == null) + throw new InvalidOperationException("Cannot finish a top-level module!"); + + return ParentModule; + } + } +}