我正在使用此代码为 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; }
没有二传手。
我也试过取消注册命令并重新注册它们,但显然它与前缀没有任何关系。
答案 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