diff --git a/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs b/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs index d5429312..0e58d031 100644 --- a/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs +++ b/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs @@ -99,6 +99,16 @@ public static class ContextArgumentsExt public static bool MatchRaw(this Context ctx) => ctx.Match("r", "raw") || ctx.MatchFlag("r", "raw"); + public static bool MatchToggle(this Context ctx) + { + if (ctx.Match("yes", "on", "enable")) + return true; + else if (ctx.Match("no", "off", "disable")) + return false; + else + throw new PKError("You must pass either \"on\" or \"off\" to this command."); + } + public static (ulong? messageId, ulong? channelId) MatchMessage(this Context ctx, bool parseRawMessageId) { if (ctx.Message.Type == Message.MessageType.Reply && ctx.Message.MessageReference?.MessageId != null) diff --git a/PluralKit.Bot/Commands/Config.cs b/PluralKit.Bot/Commands/Config.cs index ae62f931..9061cf80 100644 --- a/PluralKit.Bot/Commands/Config.cs +++ b/PluralKit.Bot/Commands/Config.cs @@ -122,27 +122,18 @@ public class Config } ); } + private string EnabledDisabled(bool value) => value ? "enabled" : "disabled"; public async Task AutoproxyAccount(Context ctx) { - // todo: this might be useful elsewhere, consider moving it to ctx.MatchToggle - if (ctx.Match("enable", "on")) - await AutoproxyEnableDisable(ctx, true); - else if (ctx.Match("disable", "off")) - await AutoproxyEnableDisable(ctx, false); - else if (ctx.HasNext()) - throw new PKSyntaxError("You must pass either \"on\" or \"off\"."); - else + if (!ctx.HasNext()) { - var statusString = ctx.MessageContext.AllowAutoproxy ? "enabled" : "disabled"; - await ctx.Reply($"Autoproxy is currently **{statusString}** for account <@{ctx.Author.Id}>."); + await ctx.Reply($"Autoproxy is currently **{EnabledDisabled(ctx.MessageContext.AllowAutoproxy)}** for account <@{ctx.Author.Id}>."); + return; } - } - private string EnabledDisabled(bool value) => value ? "enabled" : "disabled"; + var allow = ctx.MatchToggle(); - private async Task AutoproxyEnableDisable(Context ctx, bool allow) - { var statusString = EnabledDisabled(allow); if (ctx.MessageContext.AllowAutoproxy == allow) { @@ -202,32 +193,6 @@ public class Config await ctx.Reply($"{Emojis.Success} Latch timeout set to {newTimeout.Value!.ToTimeSpan().Humanize(4)}."); } - public async Task SystemPing(Context ctx) - { - ctx.CheckSystem(); - - if (!ctx.HasNext()) - { - if (ctx.Config.PingsEnabled) { await ctx.Reply("Reaction pings are currently **enabled** for your system. To disable reaction pings, type `pk;config ping disable`."); } - else { await ctx.Reply("Reaction pings are currently **disabled** for your system. To enable reaction pings, type `pk;config ping enable`."); } - } - else - { - if (ctx.Match("on", "enable")) - { - await _repo.UpdateSystemConfig(ctx.System.Id, new() { PingsEnabled = true }); - - await ctx.Reply("Reaction pings have now been enabled."); - } - if (ctx.Match("off", "disable")) - { - await _repo.UpdateSystemConfig(ctx.System.Id, new() { PingsEnabled = false }); - - await ctx.Reply("Reaction pings have now been disabled."); - } - } - } - public async Task SystemTimezone(Context ctx) { if (ctx.System == null) throw Errors.NoSystemError; @@ -320,7 +285,33 @@ public class Config }); } - // todo: this command parsing is really messy + public async Task SystemPing(Context ctx) + { + // note: this is here because this is also used in `pk;system ping`, which does not CheckSystem + ctx.CheckSystem(); + + // todo: move all the other config settings to this format + + String Response(bool isError, bool val) + => $"Reaction pings are {(isError ? "already" : "currently")} **{EnabledDisabled(val)}** for your system. " + + $"To {EnabledDisabled(!val)[..^1]} reaction pings, type `pk;config ping {EnabledDisabled(!val)[..^1]}`."; + + if (!ctx.HasNext()) + { + await ctx.Reply(Response(false, ctx.Config.PingsEnabled)); + return; + } + + var value = ctx.MatchToggle(); + + if (ctx.Config.PingsEnabled == value) + await ctx.Reply(Response(true, ctx.Config.PingsEnabled)); + else + { + await _repo.UpdateSystemConfig(ctx.System.Id, new() { PingsEnabled = value }); + await ctx.Reply($"Reaction pings have now been {EnabledDisabled(value)}."); + } + } public async Task MemberDefaultPrivacy(Context ctx) { @@ -331,13 +322,13 @@ public class Config } else { - if (ctx.Match("on", "enable")) + if (ctx.MatchToggle()) { await _repo.UpdateSystemConfig(ctx.System.Id, new() { MemberDefaultPrivate = true }); await ctx.Reply("Newly created members will now have their privacy settings set to private."); } - if (ctx.Match("off", "disable")) + else { await _repo.UpdateSystemConfig(ctx.System.Id, new() { MemberDefaultPrivate = false }); @@ -355,13 +346,13 @@ public class Config } else { - if (ctx.Match("on", "enable")) + if (ctx.MatchToggle()) { await _repo.UpdateSystemConfig(ctx.System.Id, new() { GroupDefaultPrivate = true }); await ctx.Reply("Newly created groups will now have their privacy settings set to private."); } - if (ctx.Match("off", "disable")) + else { await _repo.UpdateSystemConfig(ctx.System.Id, new() { GroupDefaultPrivate = false }); @@ -379,18 +370,17 @@ public class Config return; } - if (ctx.Match("true")) + if (ctx.MatchToggle()) { await _repo.UpdateSystemConfig(ctx.System.Id, new() { ShowPrivateInfo = true }); await ctx.Reply("Private information will now be **shown** when looking up your own info. Use the `-public` flag to hide it."); } - else if (ctx.Match("false")) + else { await _repo.UpdateSystemConfig(ctx.System.Id, new() { ShowPrivateInfo = false }); await ctx.Reply("Private information will now be **hidden** when looking up your own info. Use the `-private` flag to show it."); } - else throw new PKError("You must pass 'true' or 'false' to this command."); } } \ No newline at end of file