Merge pull request #258 from dev-kittens/feat/member-group

Group improvements
This commit is contained in:
Astrid
2020-12-08 12:19:56 +01:00
committed by GitHub
8 changed files with 216 additions and 34 deletions

View File

@@ -318,49 +318,38 @@ namespace PluralKit.Bot
{
ctx.CheckOwnGroup(target);
var members = await ctx.ParseMemberList(ctx.System.Id);
var members = (await ctx.ParseMemberList(ctx.System.Id))
.Select(m => m.Id)
.Distinct()
.ToList();
await using var conn = await _db.Obtain();
var existingMembersInGroup = (await conn.QueryMemberList(target.System,
new DatabaseViewsExt.MemberListQueryOptions {GroupFilter = target.Id}))
.Select(m => m.Id.Value)
.Distinct()
.ToHashSet();
List<MemberId> toAction;
if (op == AddRemoveOperation.Add)
{
var membersNotInGroup = members
.Where(m => !existingMembersInGroup.Contains(m.Id.Value))
.Select(m => m.Id)
.Distinct()
toAction = members
.Where(m => !existingMembersInGroup.Contains(m.Value))
.ToList();
await _repo.AddMembersToGroup(conn, target.Id, membersNotInGroup);
if (membersNotInGroup.Count == members.Count)
await ctx.Reply(members.Count == 0 ? $"{Emojis.Success} Member added to group." : $"{Emojis.Success} {"members".ToQuantity(membersNotInGroup.Count)} added to group.");
else
if (membersNotInGroup.Count == 0)
await ctx.Reply(members.Count == 1 ? $"{Emojis.Error} Member not added to group (member already in group)." : $"{Emojis.Error} No members added to group (members already in group).");
else
await ctx.Reply($"{Emojis.Success} {"members".ToQuantity(membersNotInGroup.Count)} added to group ({"members".ToQuantity(members.Count - membersNotInGroup.Count)} already in group).");
await _repo.AddMembersToGroup(conn, target.Id, toAction);
}
else if (op == AddRemoveOperation.Remove)
{
var membersInGroup = members
.Where(m => existingMembersInGroup.Contains(m.Id.Value))
.Select(m => m.Id)
.Distinct()
toAction = members
.Where(m => existingMembersInGroup.Contains(m.Value))
.ToList();
await _repo.RemoveMembersFromGroup(conn, target.Id, membersInGroup);
if (membersInGroup.Count == members.Count)
await ctx.Reply(members.Count == 0 ? $"{Emojis.Success} Member removed from group." : $"{Emojis.Success} {"members".ToQuantity(membersInGroup.Count)} removed from group.");
else
if (membersInGroup.Count == 0)
await ctx.Reply(members.Count == 1 ? $"{Emojis.Error} Member not removed from group (member already not in group)." : $"{Emojis.Error} No members removed from group (members already not in group).");
else
await ctx.Reply($"{Emojis.Success} {"members".ToQuantity(membersInGroup.Count)} removed from group ({"members".ToQuantity(members.Count - membersInGroup.Count)} already not in group).");
await _repo.RemoveMembersFromGroup(conn, target.Id, toAction);
}
else return; // otherwise toAction "may be undefined"
await ctx.Reply(MiscUtils.GroupAddRemoveResponse<MemberId>(members, toAction, op));
}
public async Task ListGroupMembers(Context ctx, PKGroup target)