From 685f3c6aa6173383d6c31b87ed51cf8ed0ca44ce Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Dec 2020 14:40:49 -0500 Subject: [PATCH] feat: option to allow auto-joining of groups (optionally skip the "request membership" step) --- public/language/en-GB/admin/manage/groups.json | 2 ++ public/language/en-GB/groups.json | 2 ++ public/src/admin/manage/group.js | 1 + src/groups/create.js | 2 ++ src/groups/data.js | 2 +- src/groups/invite.js | 8 +++++++- src/groups/update.js | 4 ++++ src/views/admin/manage/group.tpl | 12 ++++++++++++ 8 files changed, 31 insertions(+), 2 deletions(-) diff --git a/public/language/en-GB/admin/manage/groups.json b/public/language/en-GB/admin/manage/groups.json index 911fcce010..a26e51aafa 100644 --- a/public/language/en-GB/admin/manage/groups.json +++ b/public/language/en-GB/admin/manage/groups.json @@ -34,6 +34,8 @@ "edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", "edit.add-user": "Add User to Group", "edit.add-user-search": "Search Users", + "edit.autojoin": "Enable Auto-Join", + "edit.autojoin-details": "Allow any user with access to the group to join without confirmation", "edit.members": "Member List", "control-panel": "Groups Control Panel", "revert": "Revert", diff --git a/public/language/en-GB/groups.json b/public/language/en-GB/groups.json index 0256067933..009b813288 100644 --- a/public/language/en-GB/groups.json +++ b/public/language/en-GB/groups.json @@ -53,6 +53,8 @@ "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", "details.delete_group": "Delete Group", "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.autojoin": "Enable Auto-Join", + "details.autojoin_help": "Allow any user with access to the group to join without confirmation", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 792560bf2b..660bf8f203 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -83,6 +83,7 @@ define('admin/manage/group', [ memberPostCids: $('#memberPostCids').val(), disableJoinRequests: $('#group-disableJoinRequests').is(':checked'), disableLeave: $('#group-disableLeave').is(':checked'), + autojoin: $('#group-autojoin').is(':checked'), }, }, function (err) { if (err) { diff --git a/src/groups/create.js b/src/groups/create.js index 9bd56ebc1b..cdaaf670e0 100644 --- a/src/groups/create.js +++ b/src/groups/create.js @@ -14,6 +14,7 @@ module.exports = function (Groups) { disableJoinRequests = 1; } const disableLeave = parseInt(data.disableLeave, 10) === 1 ? 1 : 0; + const autojoin = parseInt(data.autojoin, 10) === 1 ? 1 : 0; const isHidden = parseInt(data.hidden, 10) === 1; Groups.validateGroupName(data.name); @@ -38,6 +39,7 @@ module.exports = function (Groups) { private: isPrivate ? 1 : 0, disableJoinRequests: disableJoinRequests, disableLeave: disableLeave, + autojoin: autojoin, }; await plugins.hooks.fire('filter:group.create', { group: groupData, data: data }); diff --git a/src/groups/data.js b/src/groups/data.js index ae518c27ca..870a424c8e 100644 --- a/src/groups/data.js +++ b/src/groups/data.js @@ -10,7 +10,7 @@ const translator = require('../translator'); const intFields = [ 'createtime', 'memberCount', 'hidden', 'system', 'private', - 'userTitleEnabled', 'disableJoinRequests', 'disableLeave', + 'userTitleEnabled', 'disableJoinRequests', 'disableLeave', 'autojoin', ]; module.exports = function (Groups) { diff --git a/src/groups/invite.js b/src/groups/invite.js index ad17a36ecf..ce364435d0 100644 --- a/src/groups/invite.js +++ b/src/groups/invite.js @@ -67,11 +67,12 @@ module.exports = function (Groups) { async function inviteOrRequestMembership(groupName, uids, type) { uids = Array.isArray(uids) ? uids : [uids]; uids = uids.filter(uid => parseInt(uid, 10) > 0); - const [exists, isMember, isPending, isInvited] = await Promise.all([ + const [exists, isMember, isPending, isInvited, canAutojoin] = await Promise.all([ Groups.exists(groupName), Groups.isMembers(uids, groupName), Groups.isPending(uids, groupName), Groups.isInvited(uids, groupName), + Groups.getGroupField(groupName, 'autojoin'), ]); if (!exists) { @@ -80,6 +81,11 @@ module.exports = function (Groups) { uids = uids.filter((uid, i) => !isMember[i] && ((type === 'invite' && !isInvited[i]) || (type === 'request' && !isPending[i]))); + if (canAutojoin) { + await Promise.all(uids.map(uid => Groups.join([groupName], uid))); + return uids; + } + const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending'; await db.setAdd(set, uids); const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership'; diff --git a/src/groups/update.js b/src/groups/update.js index 26d0cdad5c..17a843a78b 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -55,6 +55,10 @@ module.exports = function (Groups) { payload.disableLeave = values.disableLeave ? '1' : '0'; } + if (values.hasOwnProperty('autojoin')) { + payload.autojoin = values.autojoin ? '1' : '0'; + } + if (values.hasOwnProperty('name')) { await checkNameChange(groupName, values.name); } diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index ed37a7a8cc..2ff2dc6b3a 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -95,6 +95,18 @@ +
+
+ +
+
+