From 13810ec7ea3700ec0e1b676869a2522993827de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=ACRavindu=20Manoj=E2=9C=AC=20=E2=9C=93?= <88134633+ravindu01manoj@users.noreply.github.com> Date: Sat, 6 May 2023 23:40:43 +0530 Subject: [PATCH] feat: privacy settings update functions and profile pic remove function (#5) --- README.md | 48 ++++++++++++++++++++++++- src/Socket/chats.ts | 85 ++++++++++++++++++++++++++++++++++++++++++++- src/Types/Chat.ts | 7 ++++ 3 files changed, 138 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47b5144..52b1b52 100644 --- a/README.md +++ b/README.md @@ -741,6 +741,11 @@ await sock.sendMessage( const jid = '111234567890-1594482450@g.us' // can be your own too await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' }) ``` +- To remove your display picture or a group's + ``` ts + const jid = '111234567890-1594482450@g.us' // can be your own too + await sock.removeProfilePicture(jid) + ``` - To get someone's presence (if they're typing or online) ``` ts // the presence update is fetched and called here @@ -832,7 +837,48 @@ Of course, replace ``` xyz ``` with an actual ID. console.log("joined to: " + response) ``` Of course, replace ``` xxx ``` with invitation code. - + +## Privacy +- To get the privacy settings + ``` ts + const privacySettings = await sock.fetchPrivacySettings(true) + console.log("privacy settings: " + privacySettings) + ``` +- To update the LastSeen privacy + ``` ts + const value = 'all' // 'contacts' | 'contact_blacklist' | 'none' + await sock.updateLastSeenPrivacy(value) + ``` +- To update the Online privacy + ``` ts + const value = 'all' // 'match_last_seen' + await sock.updateOnlinePrivacy(value) + ``` +- To update the Profile Picture privacy + ``` ts + const value = 'all' // 'contacts' | 'contact_blacklist' | 'none' + await sock.updateProfilePicturePrivacy(value) + ``` +- To update the Status privacy + ``` ts + const value = 'all' // 'contacts' | 'contact_blacklist' | 'none' + await sock.updateStatusPrivacy(value) + ``` +- To update the Read Receipts privacy + ``` ts + const value = 'all' // 'none' + await sock.updateReadReceiptsPrivacy(value) + ``` +- To update the Groups Add privacy + ``` ts + const value = 'all' // 'contacts' | 'contact_blacklist' | 'none' + await sock.updateGroupsAddPrivacy(value) + ``` +- To update the Default Disappearing Mode + ``` ts + const duration = 86400 // 604800 | 7776000 | 0 + await sock.updateDefaultDisappearingMode(duration) + ``` ## Broadcast Lists & Stories **Note:** messages currently cannot be sent to broadcast lists from the MD version. diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index da53448..35cb8e3 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -1,7 +1,7 @@ import { Boom } from '@hapi/boom' import { proto } from '../../WAProto' import { PROCESSABLE_HISTORY_TYPES } from '../Defaults' -import { ALL_WA_PATCH_NAMES, ChatModification, ChatMutation, LTHashState, MessageUpsertType, PresenceData, SocketConfig, WABusinessHoursConfig, WABusinessProfile, WAMediaUpload, WAMessage, WAPatchCreate, WAPatchName, WAPresence } from '../Types' +import { ALL_WA_PATCH_NAMES, ChatModification, ChatMutation, LTHashState, MessageUpsertType, PresenceData, SocketConfig, WABusinessHoursConfig, WABusinessProfile, WAMediaUpload, WAMessage, WAPatchCreate, WAPatchName, WAPresence, WAPrivacyOnlineValue, WAPrivacyValue, WAReadReceiptsValue } from '../Types' import { chatModificationToAppPatch, ChatMutationMap, decodePatches, decodeSyncdSnapshot, encodeSyncdPatch, extractSyncdPatches, generateProfilePicture, getHistoryMsg, newLTHashState, processSyncAction } from '../Utils' import { makeMutex } from '../Utils/make-mutex' import processMessage from '../Utils/process-message' @@ -61,6 +61,69 @@ export const makeChatsSocket = (config: SocketConfig) => { return privacySettings } + /** helper function to run a privacy IQ query */ + const privacyQuery = async(name: string, value: string) => { + await query({ + tag: 'iq', + attrs: { + xmlns: 'privacy', + to: S_WHATSAPP_NET, + type: 'set' + }, + content: [{ + tag: 'privacy', + attrs: {}, + content: [ + { + tag: 'category', + attrs: { name, value } + } + ] + }] + }) + } + + const updateLastSeenPrivacy = async(value: WAPrivacyValue) => { + await privacyQuery('last', value) + } + + const updateOnlinePrivacy = async(value: WAPrivacyOnlineValue) => { + await privacyQuery('online', value) + } + + const updateProfilePicturePrivacy = async(value: WAPrivacyValue) => { + await privacyQuery('profile', value) + } + + const updateStatusPrivacy = async(value: WAPrivacyValue) => { + await privacyQuery('status', value) + } + + const updateReadReceiptsPrivacy = async(value: WAReadReceiptsValue) => { + await privacyQuery('readreceipts', value) + } + + const updateGroupsAddPrivacy = async(value: WAPrivacyValue) => { + await privacyQuery('groupadd', value) + } + + const updateDefaultDisappearingMode = async(duration: number) => { + await query({ + tag: 'iq', + attrs: { + xmlns: 'disappearing_mode', + to: S_WHATSAPP_NET, + type: 'set' + }, + content: [{ + tag: 'disappearing_mode', + attrs: { + duration : duration.toString() + } + }] + }) + } + /** helper function to run a generic IQ query */ const interactiveQuery = async(userNodes: BinaryNode[], queryNode: BinaryNode) => { const result = await query({ @@ -161,6 +224,18 @@ export const makeChatsSocket = (config: SocketConfig) => { }) } + /** remove the profile picture for yourself or a group */ + const removeProfilePicture = async(jid: string) => { + await query({ + tag: 'iq', + attrs: { + to: jidNormalizedUser(jid), + type: 'set', + xmlns: 'w:profile:picture' + } + }) + } + /** update the profile status for yourself */ const updateProfileStatus = async(status: string) => { await query({ @@ -857,9 +932,17 @@ export const makeChatsSocket = (config: SocketConfig) => { fetchBlocklist, fetchStatus, updateProfilePicture, + removeProfilePicture, updateProfileStatus, updateProfileName, updateBlockStatus, + updateLastSeenPrivacy, + updateOnlinePrivacy, + updateProfilePicturePrivacy, + updateStatusPrivacy, + updateReadReceiptsPrivacy, + updateGroupsAddPrivacy, + updateDefaultDisappearingMode, getBusinessProfile, resyncAppState, chatModify diff --git a/src/Types/Chat.ts b/src/Types/Chat.ts index ae21813..a89a9cd 100644 --- a/src/Types/Chat.ts +++ b/src/Types/Chat.ts @@ -3,6 +3,13 @@ import type { AccountSettings } from './Auth' import type { BufferedEventData } from './Events' import type { MinimalMessage } from './Message' +/** privacy settings in WhatsApp Web */ +export type WAPrivacyValue = 'all' | 'contacts' | 'contact_blacklist' | 'none' + +export type WAPrivacyOnlineValue = 'all' | 'match_last_seen' + +export type WAReadReceiptsValue = 'all' | 'none' + /** set of statuses visible to other people; see updatePresence() in WhatsAppWeb.Send */ export type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused'