我正在使用此代码为 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/