From fc18847ee127314466757ca589560965112a5148 Mon Sep 17 00:00:00 2001 From: rladenson Date: Tue, 3 Sep 2024 00:21:51 -0600 Subject: [PATCH] refactor: switch edit flags are abstracted out --- PluralKit.Bot/Commands/Switch.cs | 84 ++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/PluralKit.Bot/Commands/Switch.cs b/PluralKit.Bot/Commands/Switch.cs index 021a83fa..a344ae7c 100644 --- a/PluralKit.Bot/Commands/Switch.cs +++ b/PluralKit.Bot/Commands/Switch.cs @@ -110,46 +110,58 @@ public class Switch var newMembers = await ctx.ParseMemberList(ctx.System.Id); - if (ctx.MatchFlag("prepend", "p")) - { - if (ctx.MatchFlag("append", "a")) - throw Errors.DuplicateSwitchMembers; - - await using var conn = await ctx.Database.Obtain(); - var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); - var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); - newMembers.AddRange(currentSwitchMembers); - } - else if (ctx.MatchFlag("append", "a")) - { - await using var conn = await ctx.Database.Obtain(); - var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); - var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); - currentSwitchMembers.AddRange(newMembers); - newMembers = currentSwitchMembers; - } - else if (ctx.MatchFlag("first", "f")) - { - await using var conn = await ctx.Database.Obtain(); - var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); - var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); - var member = newMembers[0]; - currentSwitchMembers = currentSwitchMembers.Where(m => m.Id != member.Id).ToList(); - newMembers = new List { member }; - newMembers.AddRange(currentSwitchMembers); - } + if (ctx.MatchFlag("first", "f")) + newMembers = await FirstInSwitch(ctx, newMembers[0]); else if (ctx.MatchFlag("remove", "r")) - { - await using var conn = await ctx.Database.Obtain(); - var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); - var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); - var memberIds = newMembers.Select(m => m.Id.Value); - currentSwitchMembers = currentSwitchMembers.Where(m => !memberIds.Contains(m.Id.Value)).ToList(); - newMembers = currentSwitchMembers; - } + newMembers = await RemoveFromSwitch(ctx, newMembers); + else if (ctx.MatchFlag("append", "a")) + newMembers = await AppendToSwitch(ctx, newMembers); + else if (ctx.MatchFlag("prepend", "p")) + newMembers = await PrependToSwitch(ctx, newMembers); await DoEditCommand(ctx, newMembers); } + public async Task> PrependToSwitch(Context ctx, List members) + { + await using var conn = await ctx.Database.Obtain(); + var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); + var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); + members.AddRange(currentSwitchMembers); + + return members; + } + public async Task> AppendToSwitch(Context ctx, List members) + { + await using var conn = await ctx.Database.Obtain(); + var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); + var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); + currentSwitchMembers.AddRange(members); + members = currentSwitchMembers; + + return members; + } + public async Task> RemoveFromSwitch(Context ctx, List members) + { + await using var conn = await ctx.Database.Obtain(); + var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); + var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); + var memberIds = members.Select(m => m.Id.Value); + currentSwitchMembers = currentSwitchMembers.Where(m => !memberIds.Contains(m.Id.Value)).ToList(); + members = currentSwitchMembers; + + return members; + } + public async Task> FirstInSwitch(Context ctx, PKMember member) + { + await using var conn = await ctx.Database.Obtain(); + var currentSwitch = await ctx.Repository.GetLatestSwitch(ctx.System.Id); + var currentSwitchMembers = await ctx.Repository.GetSwitchMembers(conn, currentSwitch.Id).ToListAsync().AsTask(); + currentSwitchMembers = currentSwitchMembers.Where(m => m.Id != member.Id).ToList(); + var members = new List { member }; + members.AddRange(currentSwitchMembers); + + return members; + } public async Task SwitchEditOut(Context ctx) {