Discord bot running, but will not connect to serve

2019-03-02 10:57发布

问题:

I've been trying to swap over my code from the 0.9.6 Discord.NET API to the new 1.0.1 API, and it's basically calling for a complete restructure to my code. But I've been having some trouble actually getting the bot up and running first of all.

I set up the code body according to the guide linked here

And while it runs without error, the bot itself is not appearing online in my server.

And before you ask, I had in fact replaced "Bot token here" with the actual bot token.

namespace DiscordBot{
  public class Program
  {
    private CommandService commands;
    private DiscordSocketClient client;
    private IServiceProvider services;

    static void Main(string[] args) => new Program().Start().GetAwaiter().GetResult();

    public async Task Start()
    {
        client = new DiscordSocketClient();
        commands = new CommandService();

        string token = "<token>";

        services = new ServiceCollection()
                .BuildServiceProvider();

        await InstallCommands();

        await client.LoginAsync(TokenType.Bot, token);
        await client.StartAsync();

        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.AddModulesAsync(Assembly.GetEntryAssembly());
    }

    public async Task HandleCommand(SocketMessage messageParam)
    {
        // Don't process the command if it was a System Message
        var message = messageParam as SocketUserMessage;
        if (message == null) return;
        // Create a number to track where the prefix ends and the command begins
        int argPos = 0;
        // Determine if the message is a command, based on if it starts with '!' or a mention prefix
        if (!(message.HasCharPrefix('!', ref argPos) || message.HasMentionPrefix(client.CurrentUser, ref argPos))) return;
        // Create a Command Context
        var context = new CommandContext(client, message);
        // Execute the command. (result does not indicate a return value, 
        // rather an object stating if the command executed successfully)
        var result = await commands.ExecuteAsync(context, argPos, services);
        if (!result.IsSuccess)
            await context.Channel.SendMessageAsync(result.ErrorReason);
    }
  }
}

And then for the MyBot.cs class

namespace DiscordBot
{
  class MyBot : ModuleBase
  {

    private CommandService _service;

    public MyBot(CommandService service)
    {
        _service = service;
    }
  }
}

回答1:

The first thing you might want to do is add some logging to your bot. As your code might be correct, but discord could be rejecting your connection for any amount of reason.

After await client.StartAsync(); add

client.Log += (msg) => {return Console.WriteLine(${msg.ToString()}");};`

This will output the message your receive from your client to the console.

Now you also need to configure which message should be send to this event. This can be done when creating your DiscordClient(). So instead of client = new DiscordSocketClient(); You could use

client = new DiscordSocketClient(
    new DiscordSocketConfig()
    {
         LogLevel = LogSeverity.Verbose
    }
 );

Verbose should give you all the information you need. However you could also use LogSeverity.Debug instead, which is the highest available logging, and therefore would give you all messages.

Now that you have some feedback in your console, go and see what concrete errors you are having.

Also I would recommend first completing the your first bot part of the linked tutorial, instead of stepping into the commands directly. Once you got this working, you can continue onwards