有没有办法在不重新启动机器人的情况下更改命令前缀以进行更改? (DSharpPlus)

时间:2021-02-03 18:04:23

标签: c# discord dsharp+

我正在使用此代码为 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 已为该客户端启用。'”

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

<块引用>

CommandsNextConfiguration Config { get; }

没有二传手。

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

1 个答案:

答案 0 :(得分: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 前任: ?会返回 1 例如:香蕉会返回 6