feat: better command parsing for pk;config
This commit is contained in:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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.");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user