Browse Source

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.
tags/1.0-rc
FiniteReality 8 years ago
parent
commit
f95154af23
2 changed files with 171 additions and 0 deletions
  1. +69
    -0
      src/Discord.Net.Commands/Builders/CommandBuilder.cs
  2. +102
    -0
      src/Discord.Net.Commands/Builders/ModuleBuilder.cs

+ 69
- 0
src/Discord.Net.Commands/Builders/CommandBuilder.cs 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;
}
}
}

+ 102
- 0
src/Discord.Net.Commands/Builders/ModuleBuilder.cs 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;
}
}
}

Loading…
Cancel
Save