有没有一种方法可以更改命令前缀而无需重新启动机器人以使更改生效? (DSharpPlus)
Is there a way to change command prefix without restarting a bot for changes to take action? (DSharpPlus)
我正在使用此代码为 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 is already enabled for that client.'”
我认为没有办法直接更改配置,因为
CommandsNextConfiguration Config { get; }
没有setter。
我也试过取消注册命令并重新注册它们,但显然它与前缀没有任何关系。
尝试使用前缀解析器委托。
编辑 - 示例:
当你接下来注册命令时做
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 方法中,Return -1 如果前缀不存在,否则 return 前缀的长度
例如:!会 return 1
前任: ?会 return 1
例如:香蕉会 return 6
我正在使用此代码为 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 is already enabled for that client.'”
我认为没有办法直接更改配置,因为
CommandsNextConfiguration Config { get; }
没有setter。
我也试过取消注册命令并重新注册它们,但显然它与前缀没有任何关系。
尝试使用前缀解析器委托。
编辑 - 示例: 当你接下来注册命令时做
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 方法中,Return -1 如果前缀不存在,否则 return 前缀的长度
例如:!会 return 1 前任: ?会 return 1 例如:香蕉会 return 6