UNPKG

neroxbailx

Version:

baileys whatsapp-api

242 lines 7.78 kB
"use strict" Object.defineProperty(exports, "__esModule", { value: true }) const Types_1 = require("../Types") const Utils_1 = require("../Utils") const WABinary_1 = require("../WABinary") const groups_1 = require("./groups") const makeNewsletterSocket = (config) => { const sock = groups_1.makeGroupsSocket(config) const { authState, signalRepository, query, generateMessageTag } = sock const encoder = new TextEncoder() const newsletterQuery = async (jid, type, content) => (query({ tag: 'iq', attrs: { id: generateMessageTag(), type, xmlns: 'newsletter', to: jid, }, content })) const newsletterWMexQuery = async (jid, queryId, content) => (query({ tag: 'iq', attrs: { id: generateMessageTag(), type: 'get', xmlns: 'w:mex', to: WABinary_1.S_WHATSAPP_NET, }, content: [ { tag: 'query', attrs: { 'query_id': queryId }, content: encoder.encode(JSON.stringify({ variables: { 'newsletter_id': jid, ...content } })) } ] })) const parseFetchedUpdates = async (node, type) => { let child if (type === 'messages') { child = WABinary_1.getBinaryNodeChild(node, 'messages') } else { const parent = WABinary_1.getBinaryNodeChild(node, 'message_updates') child = WABinary_1.getBinaryNodeChild(parent, 'messages') } return await Promise.all(WABinary_1.getAllBinaryNodeChildren(child).map(async (messageNode) => { messageNode.attrs.from = child?.attrs.jid const views = parseInt(WABinary_1.getBinaryNodeChild(messageNode, 'views_count')?.attrs?.count || '0') const reactionNode = WABinary_1.getBinaryNodeChild(messageNode, 'reactions') const reactions = WABinary_1.getBinaryNodeChildren(reactionNode, 'reaction') .map(({ attrs }) => ({ count: +attrs.count, code: attrs.code })) const data = { 'server_id': messageNode.attrs.server_id, views, reactions } if (type === 'messages') { const { fullMessage: message, decrypt } = await Utils_1.decryptMessageNode(messageNode, authState.creds.me.id, authState.creds.me.lid || '', signalRepository, config.logger) await decrypt() data.message = message } return data })) } return { ...sock, newsletterQuery, newsletterWMexQuery, subscribeNewsletterUpdates: async (jid) => { const result = await newsletterQuery(jid, 'set', [{ tag: 'live_updates', attrs: {}, content: [] }]) return WABinary_1.getBinaryNodeChild(result, 'live_updates')?.attrs }, newsletterReactionMode: async (jid, mode) => { await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, { updates: { settings: { 'reaction_codes': { value: mode } } } }) }, newsletterUpdateDescription: async (jid, description) => { await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, { updates: { description: description || '', settings: null } }) }, newsletterUpdateName: async (jid, name) => { await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, { updates: { name, settings: null } }) }, newsletterUpdatePicture: async (jid, content) => { const { img } = await Utils_1.generateProfilePicture(content) await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, { updates: { picture: img.toString('base64'), settings: null } }) }, newsletterRemovePicture: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.JOB_MUTATION, { updates: { picture: '', settings: null } }) }, newsletterUnfollow: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.UNFOLLOW) }, newsletterFollow: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.FOLLOW) }, newsletterUnmute: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.UNMUTE) }, newsletterMute: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.MUTE) }, newsletterAction: async (jid, type) => { await newsletterWMexQuery(jid, Types_1.QueryIds[type.toUpperCase()]) }, newsletterCreate: async (name, description, picture) => { //TODO: Implement TOS system wide for Meta AI, communities, and here etc. /**tos query */ await query({ tag: 'iq', attrs: { to: WABinary_1.S_WHATSAPP_NET, xmlns: 'tos', id: generateMessageTag(), type: 'set' }, content: [ { tag: 'notice', attrs: { id: '20601218', stage: '5' }, content: [] } ] }) const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.CREATE, { input: { name, description: description || null, picture: picture ? (await Utils_1.generateProfilePicture(picture)).img.toString('base64') : null, settings: { reaction_codes: { value: 'ALL' } } } }) return extractNewsletterMetadata(result, true) }, newsletterMetadata: async (type, key, role) => { const result = await newsletterWMexQuery(undefined, Types_1.QueryIds.METADATA, { input: { key, type: type.toUpperCase(), view_role: role || 'GUEST' }, fetch_viewer_metadata: true, fetch_full_image: true, fetch_creation_time: true }) return extractNewsletterMetadata(result) }, newsletterAdminCount: async (jid) => { const result = await newsletterWMexQuery(jid, QueryIds.ADMIN_COUNT) const buff = WABinary_1.getBinaryNodeChild(result, 'result')?.content?.toString() return JSON.parse(buff).data[Types_1.XWAPaths.ADMIN_COUNT].admin_count }, newsletterChangeOwner: async (jid, userLid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.CHANGE_OWNER, { user_id: userLid }) }, newsletterDemote: async (jid, userLid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.DEMOTE, { user_id: userLid }) }, newsletterDelete: async (jid) => { await newsletterWMexQuery(jid, Types_1.QueryIds.DELETE) }, /**if code wasn't passed, the reaction will be removed (if is reacted) */ newsletterReactMessage: async (jid, serverId, code) => { await query({ tag: 'message', attrs: { to: jid, ...(!code ? { edit: '7' } : {}), type: 'reaction', server_id: serverId, id: Utils_1.generateMessageID() }, content: [{ tag: 'reaction', attrs: code ? { code } : {} }] }) }, newsletterFetchMessages: async (type, key, count, after) => { const result = await newsletterQuery(WABinary_1.S_WHATSAPP_NET, 'get', [ { tag: 'messages', attrs: { type, ...(type === 'invite' ? { key } : { jid: key }), count: count.toString(), after: after?.toString() || '100' } } ]) return await parseFetchedUpdates(result, 'messages') }, newsletterFetchUpdates: async (jid, count, after, since) => { const result = await newsletterQuery(jid, 'get', [ { tag: 'message_updates', attrs: { count: count.toString(), after: after?.toString() || '100', since: since?.toString() || '0' } } ]) return await parseFetchedUpdates(result, 'updates') } } } const extractNewsletterMetadata = (node, isCreate) => { const result = WABinary_1.getBinaryNodeChild(node, 'result')?.content?.toString() const metadataPath = JSON.parse(result).data[isCreate ? Types_1.XWAPaths.CREATE : Types_1.XWAPaths.NEWSLETTER] const metadata = { id: metadataPath.id, state: metadataPath.state.type, creation_time: +metadataPath.thread_metadata.creation_time, name: metadataPath.thread_metadata.name.text, nameTime: +metadataPath.thread_metadata.name.update_time, description: metadataPath.thread_metadata.description.text, descriptionTime: +metadataPath.thread_metadata.description.update_time, invite: metadataPath.thread_metadata.invite, handle: metadataPath.thread_metadata.handle, picture: Utils_1.getUrlFromDirectPath(metadataPath.thread_metadata.picture?.direct_path || ''), preview: Utils_1.getUrlFromDirectPath(metadataPath.thread_metadata.preview?.direct_path || ''), reaction_codes: metadataPath.thread_metadata?.settings?.reaction_codes?.value, subscribers: +metadataPath.thread_metadata.subscribers_count, verification: metadataPath.thread_metadata.verification, viewer_metadata: metadataPath.viewer_metadata } return metadata } module.exports = { makeNewsletterSocket, extractNewsletterMetadata }