Files
Discord.Net/src/Discord.Net.Commands/Builders/ModuleBuilder.cs
2016-11-18 08:18:00 -04:00

110 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Discord.Commands.Builders
{
public class ModuleBuilder
{
private readonly List<CommandBuilder> _commands;
private readonly List<ModuleBuilder> _submodules;
private readonly List<PreconditionAttribute> _preconditions;
private readonly List<string> _aliases;
public CommandService Service { get; }
public ModuleBuilder Parent { get; }
public string Name { get; set; }
public string Summary { get; set; }
public string Remarks { get; set; }
public IReadOnlyList<CommandBuilder> Commands => _commands;
public IReadOnlyList<ModuleBuilder> Modules => _submodules;
public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions;
public IReadOnlyList<string> Aliases => _aliases;
//Automatic
internal ModuleBuilder(CommandService service, ModuleBuilder parent)
{
Service = service;
Parent = parent;
_commands = new List<CommandBuilder>();
_submodules = new List<ModuleBuilder>();
_preconditions = new List<PreconditionAttribute>();
_aliases = new List<string>();
}
//User-defined
internal ModuleBuilder(CommandService service, ModuleBuilder parent, string primaryAlias)
: this(service, parent)
{
Discord.Preconditions.NotNull(primaryAlias, nameof(primaryAlias));
_aliases = new List<string> { primaryAlias };
}
public ModuleBuilder WithName(string name)
{
Name = name;
return this;
}
public ModuleBuilder WithSummary(string summary)
{
Summary = summary;
return this;
}
public ModuleBuilder WithRemarks(string remarks)
{
Remarks = remarks;
return this;
}
public ModuleBuilder AddAlias(params string[] newAliases)
{
_aliases.AddRange(newAliases);
return this;
}
public ModuleBuilder AddPrecondition(PreconditionAttribute precondition)
{
_preconditions.Add(precondition);
return this;
}
public ModuleBuilder AddCommand(string primaryAlias, Func<CommandContext, object[], IDependencyMap, Task> callback, Action<CommandBuilder> createFunc)
{
var builder = new CommandBuilder(this, primaryAlias, callback);
createFunc(builder);
_commands.Add(builder);
return this;
}
internal ModuleBuilder AddCommand(Action<CommandBuilder> createFunc)
{
var builder = new CommandBuilder(this);
createFunc(builder);
_commands.Add(builder);
return this;
}
public ModuleBuilder AddModule(string primaryAlias, Action<ModuleBuilder> createFunc)
{
var builder = new ModuleBuilder(Service, this, primaryAlias);
createFunc(builder);
_submodules.Add(builder);
return this;
}
internal ModuleBuilder AddModule(Action<ModuleBuilder> createFunc)
{
var builder = new ModuleBuilder(Service, this);
createFunc(builder);
_submodules.Add(builder);
return this;
}
public ModuleInfo Build(CommandService service)
{
//Default name to first alias
if (Name == null)
Name = _aliases[0];
return new ModuleInfo(this, service);
}
}
}