130 lines
4.7 KiB
C#
130 lines
4.7 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using System.Threading.Tasks;
|
|
using Discord;
|
|
using Discord.Commands;
|
|
using Discord.WebSocket;
|
|
|
|
class Program
|
|
{
|
|
private readonly DiscordSocketClient _client;
|
|
|
|
// Keep the CommandService and IDependencyMap around for use with commands.
|
|
private readonly IDependencyMap _map = new DependencyMap();
|
|
private readonly CommandService _commands = new CommandService();
|
|
|
|
// Program entry point
|
|
static void Main(string[] args)
|
|
{
|
|
// Call the Program constructor, followed by the
|
|
// MainAsync method and wait until it finishes (which should be never).
|
|
new Program().MainAsync().GetAwaiter().GetResult();
|
|
}
|
|
|
|
private Program()
|
|
{
|
|
_client = new DiscordSocketClient(new DiscordSocketConfig
|
|
{
|
|
// How much logging do you want to see?
|
|
LogLevel = LogSeverity.Info,
|
|
|
|
// If you or another service needs to do anything with messages
|
|
// (eg. checking Reactions), you should probably
|
|
// set the MessageCacheSize here.
|
|
//MessageCacheSize = 50,
|
|
|
|
// If your platform doesn't have native websockets,
|
|
// add Discord.Net.Providers.WS4Net from NuGet,
|
|
// add the `using` at the top, and uncomment this line:
|
|
//WebSocketProvider = WS4NetProvider.Instance
|
|
});
|
|
}
|
|
|
|
// Create a named logging handler, so it can be re-used by addons
|
|
// that ask for a Func<LogMessage, Task>.
|
|
private static Task Logger(LogMessage message)
|
|
{
|
|
var cc = Console.ForegroundColor;
|
|
switch (message.Severity)
|
|
{
|
|
case LogSeverity.Critical:
|
|
case LogSeverity.Error:
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
break;
|
|
case LogSeverity.Warning:
|
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
break;
|
|
case LogSeverity.Info:
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
break;
|
|
case LogSeverity.Verbose:
|
|
case LogSeverity.Debug:
|
|
Console.ForegroundColor = ConsoleColor.DarkGray;
|
|
break;
|
|
}
|
|
Console.WriteLine($"{DateTime.Now,-19} [{message.Severity,8}] {message.Source}: {message.Message}");
|
|
Console.ForegroundColor = cc;
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
private async Task MainAsync()
|
|
{
|
|
// Subscribe the logging handler.
|
|
_client.Log += Logger;
|
|
|
|
// Centralize the logic for commands into a seperate method.
|
|
await InitCommands();
|
|
|
|
// Login and connect.
|
|
await _client.LoginAsync(TokenType.Bot, /* <DON'T HARDCODE YOUR TOKEN> */);
|
|
// Prior to rc-00608 this was ConnectAsync();
|
|
await _client.StartAsync();
|
|
|
|
// Wait infinitely so your bot actually stays connected.
|
|
await Task.Delay(-1);
|
|
}
|
|
|
|
private async Task InitCommands()
|
|
{
|
|
// Repeat this for all the service classes
|
|
// and other dependencies that your commands might need.
|
|
_map.Add(new SomeServiceClass());
|
|
|
|
// Either search the program and add all Module classes that can be found:
|
|
await _commands.AddModulesAsync(Assembly.GetEntryAssembly());
|
|
// Or add Modules manually if you prefer to be a little more explicit:
|
|
await _commands.AddModuleAsync<SomeModule>();
|
|
|
|
// Subscribe a handler to see if a message invokes a command.
|
|
_client.MessageReceived += CmdHandler;
|
|
}
|
|
|
|
private async Task CmdHandler(SocketMessage arg)
|
|
{
|
|
// Bail out if it's a System Message.
|
|
var msg = arg as SocketUserMessage;
|
|
if (msg == null) return;
|
|
|
|
// Create a number to track where the prefix ends and the command begins
|
|
int pos = 0;
|
|
// Replace the '!' with whatever character
|
|
// you want to prefix your commands with.
|
|
// Uncomment the second half if you also want
|
|
// commands to be invoked by mentioning the bot instead.
|
|
if (msg.HasCharPrefix('!', ref pos) /* || msg.HasMentionPrefix(msg.Discord.CurrentUser, ref pos) */)
|
|
{
|
|
// Create a Command Context
|
|
var context = new SocketCommandContext(msg.Discord, msg);
|
|
|
|
// Execute the command. (result does not indicate a return value,
|
|
// rather an object stating if the command executed succesfully).
|
|
var result = await _commands.ExecuteAsync(context, pos, _map);
|
|
|
|
// Uncomment the following lines if you want the bot
|
|
// to send a message if it failed (not advised for most situations).
|
|
//if (!result.IsSuccess && result.Error != CommandError.UnknownCommand)
|
|
// await msg.Channel.SendMessageAsync(result.ErrorReason);
|
|
}
|
|
}
|
|
}
|