feat: option to allow auto-joining of groups (optionally skip the "request membership" step)

This commit is contained in:
psychobunny
2020-12-01 14:40:49 -05:00
parent 43bbfb6780
commit 685f3c6aa6
8 changed files with 31 additions and 2 deletions

View File

@@ -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 });

View File

@@ -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) {

View File

@@ -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';

View File

@@ -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);
}