Add group add/remove commands

This commit is contained in:
Ske 2020-07-07 15:28:53 +02:00
parent 6c5cb8cea7
commit 0f4c40b344
3 changed files with 63 additions and 1 deletions

View File

@ -50,6 +50,8 @@ namespace PluralKit.Bot
public static Command GroupList = new Command("group list", "group list", "Lists all groups in this system"); public static Command GroupList = new Command("group list", "group list", "Lists all groups in this system");
public static Command GroupRename = new Command("group rename", "group <group> name <new name>", "Renames a group"); public static Command GroupRename = new Command("group rename", "group <group> name <new name>", "Renames a group");
public static Command GroupDesc = new Command("group description", "group <group> description [description]", "Changes a group's description"); public static Command GroupDesc = new Command("group description", "group <group> description [description]", "Changes a group's description");
public static Command GroupAdd = new Command("group add", "group <group> add <member> [member 2] [member 3...]", "Adds one or more members to a group");
public static Command GroupRemove = new Command("group remove", "group <group> remove <member> [member 2] [member 3...]", "Removes one or more members from a group");
public static Command Switch = new Command("switch", "switch <member> [member 2] [member 3...]", "Registers a switch"); public static Command Switch = new Command("switch", "switch <member> [member 2] [member 3...]", "Registers a switch");
public static Command SwitchOut = new Command("switch out", "switch out", "Registers a switch with no members"); public static Command SwitchOut = new Command("switch out", "switch out", "Registers a switch with no members");
public static Command SwitchMove = new Command("switch move", "switch move <date/time>", "Moves the latest switch in time"); public static Command SwitchMove = new Command("switch move", "switch move <date/time>", "Moves the latest switch in time");
@ -333,6 +335,10 @@ namespace PluralKit.Bot
await ctx.Execute<Groups>(GroupRename, g => g.RenameGroup(ctx, target)); await ctx.Execute<Groups>(GroupRename, g => g.RenameGroup(ctx, target));
else if (ctx.Match("description", "info", "bio", "text", "desc")) else if (ctx.Match("description", "info", "bio", "text", "desc"))
await ctx.Execute<Groups>(GroupDesc, g => g.GroupDescription(ctx, target)); await ctx.Execute<Groups>(GroupDesc, g => g.GroupDescription(ctx, target));
else if (ctx.Match("add", "a"))
await ctx.Execute<Groups>(GroupAdd,g => g.AddRemoveMembers(ctx, target, Groups.AddRemoveOperation.Add));
else if (ctx.Match("remove", "rem", "r"))
await ctx.Execute<Groups>(GroupRemove, g => g.AddRemoveMembers(ctx, target, Groups.AddRemoveOperation.Remove));
else if (!ctx.HasNext()) else if (!ctx.HasNext())
await ctx.Execute<Groups>(GroupInfo, g => g.ShowGroupCard(ctx, target)); await ctx.Execute<Groups>(GroupInfo, g => g.ShowGroupCard(ctx, target));
else else

View File

@ -144,6 +144,44 @@ namespace PluralKit.Bot
await ctx.Reply(embed: eb.Build()); await ctx.Reply(embed: eb.Build());
} }
public async Task AddRemoveMembers(Context ctx, PKGroup target, AddRemoveOperation op)
{
ctx.CheckOwnGroup(target);
// Parse all arguments
var members = new List<PKMember>();
while (ctx.HasNext())
{
var member = await ctx.MatchMember();
if (member == null)
throw new PKSyntaxError(ctx.CreateMemberNotFoundError(ctx.PopArgument()));;
if (member.System != target.System)
throw new PKError($"Member **{member.Name}** (`{member.Hid}`) is not in your own system, so you can't add it to a group.");
members.Add(member);
}
if (members.Count == 0)
throw new PKSyntaxError("You must pass one or more members.");
await using var conn = await _db.Obtain();
if (op == AddRemoveOperation.Add)
{
await conn.AddMembersToGroup(target.Id, members.Select(m => m.Id));
await ctx.Reply($"{Emojis.Success} Members added to group.");
}
else if (op == AddRemoveOperation.Remove)
{
await conn.RemoveMembersFromGroup(target.Id, members.Select(m => m.Id));
await ctx.Reply($"{Emojis.Success} Members removed from group.");
}
}
public enum AddRemoveOperation
{
Add,
Remove
}
private static async Task<PKSystem> GetGroupSystem(Context ctx, PKGroup target, IPKConnection conn) private static async Task<PKSystem> GetGroupSystem(Context ctx, PKGroup target, IPKConnection conn)
{ {
var system = ctx.System; var system = ctx.System;

View File

@ -1,4 +1,6 @@
using System.Threading.Tasks; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Dapper; using Dapper;
@ -73,5 +75,21 @@ namespace PluralKit.Core
.Build("returning *"); .Build("returning *");
return conn.QueryFirstAsync<PKGroup>(query, pms); return conn.QueryFirstAsync<PKGroup>(query, pms);
} }
public static async Task AddMembersToGroup(this IPKConnection conn, GroupId group, IEnumerable<MemberId> members)
{
await using var w = conn.BeginBinaryImport("copy group_members (group_id, member_id) from stdin (format binary)");
foreach (var member in members)
{
await w.StartRowAsync();
await w.WriteAsync(group.Value);
await w.WriteAsync(member.Value);
}
await w.CompleteAsync();
}
public static Task RemoveMembersFromGroup(this IPKConnection conn, GroupId group, IEnumerable<MemberId> members) =>
conn.ExecuteAsync("delete from group_members where group_id = @Group and member_id = any(@Members)",
new {Group = group, Members = members.ToArray() });
} }
} }