3

我正在使用此代码为 CommandsNextExtension 变量设置配置和注册命令:

commandsConfig = new CommandsNextConfiguration
        {
            StringPrefixes = new string[] {prefix},
            EnableDms = false,
            EnableMentionPrefix = true
        };

        Commands = Client.UseCommandsNext(commandsConfig);
        Commands.RegisterCommands<CommandsList>();
        Commands.RegisterCommands<LavalinkCommands>();

然后我有这个写一个新的前缀到 json 文件,并在重新启动一个机器人后,前缀改变,因为它应该:

[Command("prefix")]
    [Description("Changes the prefix for commands.")]
    public async Task Prefix(CommandContext ctx, [RemainingText] string prefix)
    {
        gPrefix[0] = prefix;
        string jsonString = File.ReadAllText("config.json");
        JObject jObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString) as JObject;
        JToken jToken = jObject.SelectToken("prefix");
        jToken.Replace(prefix);
        string updatedJsonString = jObject.ToString();
        File.WriteAllText("config.json", updatedJsonString);
        Bot.prefix = prefix;
        await ctx.Channel.SendMessageAsync($"Prefix successfully changed to {prefix}");
    }

在这一点上,我尝试使用带有新配置的 UseCommandsNext 方法,但出现错误:“System.InvalidOperationException:'CommandsNext 已为该客户端启用。'”

我认为没有办法直接更改配置,因为

命令NextConfiguration Config { get; }

没有二传手。

我也尝试过取消注册命令并将它们注册回来,但显然它与前缀没有任何关系。

4

1 回答 1

2

尝试使用前缀解析器委托。

编辑 - 示例:当您接下来注册命令时

var CommandsNext = client.UseCommandsNext(new CommandsNextConfiguration()
{
    Services = Services,
    PrefixResolver = HandlePrefixAsync,
});

现在我们的 HandlePrefixAsync 方法

private static async Task<int> HandlePrefixAsync(DiscordMessage msg)
{
    if(msg.Channel.Guild != null) return;
    string prefix = Database.GetPrefix(msg.Channel.GuildId);
    
    return msg.GetStringPrefixLength(prefix);
}

在 HandlePrefixAsync 方法中,如果前缀不存在则返回 -1 否则返回前缀的长度

前任: !将返回 1 ex: ? 将返回 1 ex:banana 将返回 6

于 2021-02-26T18:23:51.587 回答