Add docs for the Command Service

This commit is contained in:
Christopher F
2016-07-22 01:48:24 -04:00
parent ea6f8b457f
commit c5d63485c1
7 changed files with 202 additions and 2 deletions

View File

@@ -0,0 +1,52 @@
using System.Threading.Tasks;
using System.Reflection;
using Discord;
using Discord.Commands;
public class Program
{
private CommandService commands;
private DiscordSocketClient client;
static void Main(string[] args) => new Program().Start().GetAwaiter().GetResult();
public async Task Start()
{
client = new DiscordSocketClient();
commands = new CommandService();
string token = "bot token here";
await InstallCommands();
await client.LoginAsync(TokenType.Bot, token);
await client.ConnectAsync();
await Task.Delay(-1);
}
public async Task InstallCommands()
{
// Hook the MessageReceived Event into our Command Handler
client.MessageReceived += HandleCommand;
// Discover all of the commands in this assembly and load them.
await commands.LoadAssembly(Assembly.GetEntryAssembly());
}
public async Task HandleCommand(IMessage msg)
{
// Internal integer, marks where the command begins
int argPos = 0;
// Get the current user (used for Mention parsing)
var currentUser = await client.GetCurrentUserAsync();
// Determine if the message is a command, based on if it starts with '!' or a mention prefix
if (msg.HasCharPrefix('!', ref argPos) || msg.HasMentionPrefix(currentUser, ref argPos))
{
// Execute the command. (result does not indicate a return value,
// rather an object stating if the command executed succesfully)
var result = await _commands.Execute(msg, argPos);
if (!result.IsSuccess)
await msg.Channel.SendMessageAsync(result.ErrorReason);
}
}
}

View File

@@ -0,0 +1,16 @@
using Discord;
using Discord.Commands;
public class Commands
{
public async Task Install(DiscordSocketClient client)
{
var commands = new CommandService();
var map = new DependencyMap();
map.Add<IDiscordClient>(client);
var self = await client.GetCurrentUserAsync();
map.Add<ISelfUser>(self);
await commands.LoadAssembly(Assembly.GetCurrentAssembly(), map);
}
// ...
}

View File

@@ -0,0 +1,28 @@
using Discord;
using Discord.Commands;
[Module]
public class ModuleA
{
private DiscordSocketClient client;
private ISelfUser self;
public ModuleA(IDiscordClient c, ISelfUser s)
{
if (!(c is DiscordSocketClient)) throw new InvalidOperationException("This module requires a DiscordSocketClient");
client = c as DiscordSocketClient;
self = s;
}
}
public class ModuleB
{
private IDiscordClient client;
private CommandService commands;
public ModuleB(CommandService c, IDependencyMap m)
{
commands = c;
client = m.Get<IDiscordClient>();
}
}

View File

@@ -0,0 +1,40 @@
using Discord.Commands;
// Create a module with no prefix
[Module]
public class Info
{
// ~say hello -> hello
[Command("say"), Description("Echos a message.")]
public async Task Say(IMessage msg,
[Unparsed, Description("The text to echo")] string echo)
{
await msg.Channel.SendMessageAsync(echo);
}
}
// Create a module with the 'sample' prefix
[Module("sample")]
public class Sample
{
// ~sample square 20 ->
[Command("square"), Description("Squares a number.")]
public async Task Square(IMessage msg,
[Description("The number to square.")] int num)
{
await msg.Channel.SendMessageAsync($"{num}^2 = {Math.Pow(num, 2)}");
}
// ~sample userinfo --> foxbot#0282
// ~sample userinfo @Khionu --> Khionu#8708
// ~sample userinfo Khionu#8708 --> Khionu#8708
// ~sample userinfo Khionu --> Khionu#8708
// ~sample userinfo 96642168176807936 --> Khionu#8708
[Command("userinfo"), Description("Returns info about the current user, or the user parameter, if one passed.")]
public async Task UserInfo(IMessage msg,
[Description("The (optional) user to get info for")] IUser user = null)
{
var userInfo = user ?? await Program.Client.GetCurrentUserAsync();
await msg.Channel.SendMessageAsync($"{userInfo.Username}#{userInfo.Discriminator}");
}
}