feat: /settings/security/member-add-mode - fix #2165

This commit is contained in:
devlikepro committed 2026-07-22 17:35:49 +07:00
1 parent 216e00cc25
commit 2c1ea2c7c1
6 files changed
+85 -2

No files matched your search

+13
View File
@@ -11362,6 +11362,15 @@ export namespace messages {
responseSerialize: (message: Empty) => Buffer.from(message.serialize()),
responseDeserialize: (bytes: Buffer) => Empty.deserialize(new Uint8Array(bytes))
},
SetGroupMemberAddMode: {
path: "/messages.MessageService/SetGroupMemberAddMode",
requestStream: false,
responseStream: false,
requestSerialize: (message: JidBoolRequest) => Buffer.from(message.serialize()),
requestDeserialize: (bytes: Buffer) => JidBoolRequest.deserialize(new Uint8Array(bytes)),
responseSerialize: (message: Empty) => Buffer.from(message.serialize()),
responseDeserialize: (bytes: Buffer) => Empty.deserialize(new Uint8Array(bytes))
},
UpdateGroupParticipants: {
path: "/messages.MessageService/UpdateGroupParticipants",
requestStream: false,
@@ -11734,6 +11743,7 @@ export namespace messages {
abstract SetGroupPicture(call: grpc_1.ServerUnaryCall<SetPictureRequest, Empty>, callback: grpc_1.sendUnaryData<Empty>): void;
abstract SetGroupLocked(call: grpc_1.ServerUnaryCall<JidBoolRequest, Empty>, callback: grpc_1.sendUnaryData<Empty>): void;
abstract SetGroupAnnounce(call: grpc_1.ServerUnaryCall<JidBoolRequest, Empty>, callback: grpc_1.sendUnaryData<Empty>): void;
abstract SetGroupMemberAddMode(call: grpc_1.ServerUnaryCall<JidBoolRequest, Empty>, callback: grpc_1.sendUnaryData<Empty>): void;
abstract UpdateGroupParticipants(call: grpc_1.ServerUnaryCall<UpdateParticipantsRequest, JsonList>, callback: grpc_1.sendUnaryData<JsonList>): void;
abstract GetProfilePicture(call: grpc_1.ServerUnaryCall<ProfilePictureRequest, ProfilePictureResponse>, callback: grpc_1.sendUnaryData<ProfilePictureResponse>): void;
abstract SendPresence(call: grpc_1.ServerUnaryCall<PresenceRequest, Empty>, callback: grpc_1.sendUnaryData<Empty>): void;
@@ -11861,6 +11871,9 @@ export namespace messages {
SetGroupAnnounce: GrpcUnaryServiceInterface<JidBoolRequest, Empty> = (message: JidBoolRequest, metadata: grpc_1.Metadata | grpc_1.CallOptions | grpc_1.requestCallback<Empty>, options?: grpc_1.CallOptions | grpc_1.requestCallback<Empty>, callback?: grpc_1.requestCallback<Empty>): grpc_1.ClientUnaryCall => {
return super.SetGroupAnnounce(message, metadata, options, callback);
};
SetGroupMemberAddMode: GrpcUnaryServiceInterface<JidBoolRequest, Empty> = (message: JidBoolRequest, metadata: grpc_1.Metadata | grpc_1.CallOptions | grpc_1.requestCallback<Empty>, options?: grpc_1.CallOptions | grpc_1.requestCallback<Empty>, callback?: grpc_1.requestCallback<Empty>): grpc_1.ClientUnaryCall => {
return super.SetGroupMemberAddMode(message, metadata, options, callback);
};
UpdateGroupParticipants: GrpcUnaryServiceInterface<UpdateParticipantsRequest, JsonList> = (message: UpdateParticipantsRequest, metadata: grpc_1.Metadata | grpc_1.CallOptions | grpc_1.requestCallback<JsonList>, options?: grpc_1.CallOptions | grpc_1.requestCallback<JsonList>, callback?: grpc_1.requestCallback<JsonList>): grpc_1.ClientUnaryCall => {
return super.UpdateGroupParticipants(message, metadata, options, callback);
};
@@ -1050,6 +1050,18 @@ setGroupAnnounce: {
responseDeserialize: deserialize_messages_Empty,
},
// send messages only by admins
setGroupMemberAddMode: {
path: '/messages.MessageService/SetGroupMemberAddMode',
requestStream: false,
responseStream: false,
requestType: gows_pb.JidBoolRequest,
responseType: gows_pb.Empty,
requestSerialize: serialize_messages_JidBoolRequest,
requestDeserialize: deserialize_messages_JidBoolRequest,
responseSerialize: serialize_messages_Empty,
responseDeserialize: deserialize_messages_Empty,
},
// who can add members - true - all members, false - admins only
updateGroupParticipants: {
path: '/messages.MessageService/UpdateGroupParticipants',
requestStream: false,
@@ -119,6 +119,7 @@ import {
GroupSortField,
Participant,
ParticipantsRequest,
SettingsMemberAddMode,
SettingsSecurityChangeInfo,
} from '@waha/structures/groups.dto';
import { ReplyToMessage } from '@waha/structures/message.dto';
@@ -1650,6 +1651,24 @@ export class WhatsappSessionGoWSCore extends WhatsappSession {
return;
}
public async getMemberAddMode(id): Promise<SettingsMemberAddMode> {
const group = await this.getGroup(id);
return {
membersCanAddNewMember: group.MemberAddMode === 'all_member_add',
};
}
@Activity()
public async setMemberAddMode(id, value) {
const req = new messages.JidBoolRequest({
session: this.session,
jid: id,
value: value,
});
await promisify(this.client.SetGroupMemberAddMode)(req);
return;
}
public deleteGroup(id) {
throw new NotImplementedByEngineError();
}
+1 -1
View File
@@ -34,7 +34,7 @@ function ToGroupInfo(
subject: group.name,
description: group.description,
invite: invite,
membersCanAddNewMember: groupMetadata.restrict,
membersCanAddNewMember: groupMetadata.memberAddMode === 'all_member_add',
membersCanSendMessages: groupMetadata.announce,
newMembersApprovalRequired: groupMetadata.membershipApprovalMode,
participants: participants,
@@ -108,6 +108,7 @@ import {
GroupParticipant,
GroupSortField,
ParticipantsRequest,
SettingsMemberAddMode,
SettingsSecurityChangeInfo,
} from '@waha/structures/groups.dto';
import { Label, LabelDTO, LabelID } from '@waha/structures/labels.dto';
@@ -1535,6 +1536,22 @@ export class WhatsappSessionWebJSCore extends WhatsappSession {
return groupChat.setMessagesAdminsOnly(value);
}
public async getMemberAddMode(id): Promise<SettingsMemberAddMode> {
const groupChat = (await this.whatsapp.getChatById(id)) as GroupChat;
return {
membersCanAddNewMember:
// @ts-ignore
groupChat.groupMetadata.memberAddMode === 'all_member_add',
};
}
@Activity()
public async setMemberAddMode(id, value) {
const groupChat = (await this.whatsapp.getChatById(id)) as GroupChat;
// The library setter is inverted - it takes "adminsOnly"
return groupChat.setAddMembersAdminsOnly(!value);
}
public async getGroups(pagination: PaginationParams) {
const chats = await this.whatsapp.getChats();
const groups = lodash.filter(chats, (chat) => chat.isGroup);
+23 -1
View File
@@ -165,6 +165,7 @@ import {
GroupParticipantRole,
GroupSortField,
ParticipantsRequest,
SettingsMemberAddMode,
SettingsSecurityChangeInfo,
} from '@waha/structures/groups.dto';
import { ContactQuery, ContactRequest } from '@waha/structures/contacts.dto';
@@ -1412,6 +1413,26 @@ export class WhatsappSessionWPPCore extends WhatsappSession {
);
}
public async getMemberAddMode(id): Promise<SettingsMemberAddMode> {
const group = await this.wpp!.getChatById(this.ensureSuffix(id));
// Undocumented property - 'all_member_add' or 'admin_add'
const memberAddMode = group?.groupMetadata?.memberAddMode;
return {
membersCanAddNewMember: memberAddMode === 'all_member_add',
};
}
@Activity()
public setMemberAddMode(id: string, value: boolean): Promise<boolean> {
// Not in the GroupProperty enum, but wa-js passes the property through
// to WhatsApp's setGroupProperty - 1 - all members, 0 - admins only
return this.wpp!.setGroupProperty(
this.ensureSuffix(id),
'member_add_mode' as GroupProperty,
value,
);
}
@Activity()
public deleteGroup(id: string): Promise<boolean> {
return this.wpp!.deleteChat(this.ensureSuffix(id));
@@ -1874,7 +1895,8 @@ export class WhatsappSessionWPPCore extends WhatsappSession {
subject: group?.name || '',
description: group?.groupMetadata?.desc || '',
invite: null,
membersCanAddNewMember: !group?.groupMetadata?.restrict,
membersCanAddNewMember:
group?.groupMetadata?.memberAddMode === 'all_member_add',
membersCanSendMessages: !group?.groupMetadata?.announce,
newMembersApprovalRequired:
!!group?.groupMetadata?.membershipApprovalMode,