Start work on command builders

Right now commands require a module before they can be created;
I'm looking to remove this in the future.
This commit is contained in:
FiniteReality
2016-11-14 19:26:32 +00:00
parent b2948deaf7
commit f95154af23
2 changed files with 171 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace Discord.Commands
{
public class CommandBuilder
{
private List<string> aliases;
internal CommandBuilder(ModuleBuilder module, string prefix)
{
aliases = new List<string>();
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<object[], Task> Callback { get; set; }
public ModuleBuilder Module { get; }
public List<string> 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<object[], Task> callback)
{
Callback = callback;
return this;
}
public CommandBuilder AddAlias(string alias)
{
aliases.Add(alias);
return this;
}
public ModuleBuilder Done()
{
return Module;
}
}
}

View File

@@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
namespace Discord.Commands
{
public class ModuleBuilder
{
private List<CommandBuilder> commands;
private List<ModuleBuilder> submodules;
private List<string> 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<CommandBuilder>();
submodules = new List<ModuleBuilder>();
aliases = new List<string>();
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<CommandBuilder> Commands => commands;
public List<ModuleBuilder> Modules => submodules;
public List<string> 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;
}
}
}