feat(NOWEB): expose group member-share-history-mode as a settable endpoint (#2283)

This commit is contained in:
Alison White authored and devlikepro committed 2026-10-02 13:07:08 +07:00
1 parent 9c080611b6
commit cc650fca3b
4 files changed
+61

No files matched your search

+23
View File
@@ -41,6 +41,7 @@ import {
JoinGroupResponse,
ParticipantsRequest,
SettingsMemberAddMode,
SettingsMemberShareHistoryMode,
SettingsMembershipApproval,
SettingsSecurityChangeInfo,
SubjectRequest,
@@ -346,6 +347,28 @@ export class GroupsController {
return session.getMemberAddMode(id);
}
@Put(':id/settings/security/member-share-history-mode')
@SessionApiParam
@GroupIdApiParam
@CheckPolicies(CanSession(Action.Send, FromParam('session')))
@ApiOperation({
summary:
'Update settings - members can send message history to new members',
description:
'Updates the group settings for whether members can share message history with new members, or only admins can.',
})
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
setMemberShareHistoryMode(
@WorkingSessionParam session: WhatsappSession,
@Param('id') id: string,
@Body() request: SettingsMemberShareHistoryMode,
) {
return session.setMemberShareHistoryMode(
id,
request.membersCanShareHistory,
);
}
@Put(':id/settings/security/membership-approval')
@SessionApiParam
@GroupIdApiParam
+4
View File
@@ -1025,6 +1025,10 @@ export abstract class WhatsappSession {
throw new NotImplementedByEngineError();
}
public setMemberShareHistoryMode(id, value) {
throw new NotImplementedByEngineError();
}
public getMembershipApprovalMode(
id: string,
): Promise<SettingsMembershipApproval> {
@@ -28,6 +28,7 @@ import makeWASocket, {
import { WACallEvent } from '@adiwajshing/baileys/lib/Types/Call';
import { BaileysEventMap } from '@adiwajshing/baileys/lib/Types/Events';
import { GroupMetadata } from '@adiwajshing/baileys/lib/Types/GroupMetadata';
import { executeWMexQuery } from '@adiwajshing/baileys/lib/Socket/mex';
import {
Label as NOWEBLabel,
LabelActionBody,
@@ -168,6 +169,7 @@ import {
GroupParticipant,
ParticipantsRequest,
SettingsMemberAddMode,
SettingsMemberShareHistoryMode,
SettingsMembershipApproval,
SettingsSecurityChangeInfo,
} from '@waha/structures/groups.dto';
@@ -296,6 +298,14 @@ export interface NowebConfig {
waVersion: WAVersion;
}
// WhatsApp Web MEX (w:mex) doc/query_id for the group property mutation that sets
// "members can send message history to new members". Captured from WhatsApp Web's
// WAWebMexUpdateGroupPropertyJobMutation on 2026-09-25 (see whatsapp-rust
// wacore/src/iq/mex_operations.rs, mod update_group_property). WhatsApp rotates these
// ids when Web is updated -- if this mutation starts failing, re-capture the query_id
// from a fresh WhatsApp Web session before assuming the endpoint itself is broken.
const MEX_QUERY_ID_UPDATE_GROUP_PROPERTY = '9418211574894172';
export class WhatsappSessionNoWebCore extends WhatsappSession {
private START_ATTEMPT_DELAY_SECONDS = 2;
private AUTO_RESTART_AFTER_SECONDS = 28 * 60;
@@ -2238,6 +2248,25 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
return await this.sock.groupMemberAddMode(id, mode);
}
@Activity()
public async setMemberShareHistoryMode(id, value) {
const mode = value ? 'ALL_MEMBER_SHARE' : 'ADMIN_SHARE';
const result = await executeWMexQuery<{ state?: string }>(
{ group_id: id, update: { member_share_group_history_mode: mode } },
MEX_QUERY_ID_UPDATE_GROUP_PROPERTY,
'xwa2_group_update_property',
this.sock.query,
this.sock.generateMessageTag,
);
if (result?.state !== 'ACTIVE') {
throw new Error(
`Failed to set member share history mode for group '${id}': ` +
`unexpected state '${result?.state}'`,
);
}
return result;
}
public async getMembershipApprovalMode(
id: string,
): Promise<SettingsMembershipApproval> {
+5
View File
@@ -31,6 +31,11 @@ export class SettingsMemberAddMode {
membersCanAddNewMember: boolean = true;
}
export class SettingsMemberShareHistoryMode {
@IsBoolean()
membersCanShareHistory: boolean = true;
}
export class SettingsMembershipApproval {
@IsBoolean()
newMembersApprovalRequired: boolean = false;