c# - 有没有一种方法可以更改命令前缀而无需重新启动机器人以使更改生效? (DSharpPlus)

标签 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; }

没有二传手。

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

最佳答案

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

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

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 例如:banana 会返回 6

关于c# - 有没有一种方法可以更改命令前缀而无需重新启动机器人以使更改生效? (DSharpPlus),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66033183/

相关文章:

javascript - 如何从 discord.js 中的 JSON 文件中选择随机对象

c# - 找不到 BaseCommandModule 类,这与正在使用的正确命名空间相反

C# Entity Framework - 初学者

c# - SQL Server - 我想根据使用的标识符选择数据库

c# - 检测 UIPickerView 何时开始滚动/仍在滚动?

c# - 使用 Select 和索引器的 Linq

javascript - 如何在 Discord 中创建一个接受用户输入的弹出窗口?

javascript - 如何获取不和谐 channel 的创建者?