+ subparser.addArgument("-r", "--remove-member")
+ .nargs("*")
+ .help("Specify one or more members to remove from the group");
+ subparser.addArgument("--admin").nargs("*").help("Specify one or more members to make a group admin");
+ subparser.addArgument("--remove-admin")
+ .nargs("*")
+ .help("Specify one or more members to remove group admin privileges");
+
+ subparser.addArgument("--reset-link")
+ .action(Arguments.storeTrue())
+ .help("Reset group link and create new link password");
+ subparser.addArgument("--link")
+ .help("Set group link state, with or without admin approval")
+ .choices("enabled", "enabled-with-approval", "disabled");
+
+ subparser.addArgument("--set-permission-add-member")
+ .help("Set permission to add new group members")
+ .choices("every-member", "only-admins");
+ subparser.addArgument("--set-permission-edit-details")
+ .help("Set permission to edit group details")
+ .choices("every-member", "only-admins");
+
+ subparser.addArgument("-e", "--expiration").type(int.class).help("Set expiration time of messages (seconds)");
+ }
+
+ GroupLinkState getGroupLinkState(String value) throws UserErrorException {
+ if (value == null) {
+ return null;
+ }
+ switch (value) {
+ case "enabled":
+ return GroupLinkState.ENABLED;
+ case "enabled-with-approval":
+ case "enabledWithApproval":
+ return GroupLinkState.ENABLED_WITH_APPROVAL;
+ case "disabled":
+ return GroupLinkState.DISABLED;
+ default:
+ throw new UserErrorException("Invalid group link state: " + value);
+ }
+ }
+
+ GroupPermission getGroupPermission(String value) throws UserErrorException {
+ if (value == null) {
+ return null;
+ }
+ switch (value) {
+ case "every-member":
+ case "everyMember":
+ return GroupPermission.EVERY_MEMBER;
+ case "only-admins":
+ case "onlyAdmins":
+ return GroupPermission.ONLY_ADMINS;
+ default:
+ throw new UserErrorException("Invalid group permission: " + value);
+ }
+ }
+
+ @Override
+ public void handleCommand(
+ final Namespace ns, final Manager m, final OutputWriter outputWriter
+ ) throws CommandException {
+ GroupId groupId = null;
+ final var groupIdString = ns.getString("group-id");
+ if (groupIdString != null) {
+ try {
+ groupId = Util.decodeGroupId(groupIdString);
+ } catch (GroupIdFormatException e) {
+ throw new UserErrorException("Invalid group id: " + e.getMessage());
+ }
+ }
+
+ var groupName = ns.getString("name");
+ var groupDescription = ns.getString("description");
+ var groupMembers = ns.<String>getList("member");
+ var groupRemoveMembers = ns.<String>getList("remove-member");
+ var groupAdmins = ns.<String>getList("admin");
+ var groupRemoveAdmins = ns.<String>getList("remove-admin");
+ var groupAvatar = ns.getString("avatar");
+ var groupResetLink = ns.getBoolean("reset-link");
+ var groupLinkState = getGroupLinkState(ns.getString("link"));
+ var groupExpiration = ns.getInt("expiration");
+ var groupAddMemberPermission = getGroupPermission(ns.getString("set-permission-add-member"));
+ var groupEditDetailsPermission = getGroupPermission(ns.getString("set-permission-edit-details"));
+
+ try {
+ boolean isNewGroup = false;
+ if (groupId == null) {
+ isNewGroup = true;
+ var results = m.createGroup(groupName,
+ groupMembers,
+ groupAvatar == null ? null : new File(groupAvatar));
+ ErrorUtils.handleSendMessageResults(results.second());
+ groupId = results.first();
+ groupName = null;
+ groupMembers = null;
+ groupAvatar = null;
+ }
+
+ var results = m.updateGroup(groupId,
+ groupName,
+ groupDescription,
+ groupMembers,
+ groupRemoveMembers,
+ groupAdmins,
+ groupRemoveAdmins,
+ groupResetLink,
+ groupLinkState,
+ groupAddMemberPermission,
+ groupEditDetailsPermission,
+ groupAvatar == null ? null : new File(groupAvatar),
+ groupExpiration);
+ Long timestamp = null;
+ if (results != null) {
+ timestamp = results.first();
+ ErrorUtils.handleSendMessageResults(results.second());
+ }
+ outputResult(outputWriter, timestamp, isNewGroup ? groupId : null);
+ } catch (AttachmentInvalidException e) {
+ throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage());
+ } catch (GroupNotFoundException e) {
+ logger.warn("Unknown group id: {}", groupIdString);
+ } catch (NotAGroupMemberException e) {
+ logger.warn("You're not a group member");
+ } catch (InvalidNumberException e) {
+ throw new UserErrorException("Failed to parse member number: " + e.getMessage());
+ } catch (IOException e) {
+ throw new UnexpectedErrorException("Failed to send message: " + e.getMessage());
+ }