mirror of
https://github.com/FranP-code/Baileys.git
synced 2025-10-13 00:32:22 +00:00
* feat(feature/pdo-sync): initial commit * feat(feature/pdo-sync): Moved to conventional send functions, exported, patched some errors * fix(feature/pdo-sync): Linting and more bugsquatting * chore(feature/pdo-sync): linting done * feat/fix(feat/pdo-sync): Newsletter decrypt + ack * merge (#946) * fix: profilePictureUrl (#901) * Update module to latest version (#926) * Update package.json Update the module to the latest * Add files via upload * Fix: Readme use upsert events (#908) * Fix: getUSyncDevices (#862) * Update messages-send.ts * Update messages-send.ts * Update messages-send.ts * Fix lint * Fix lint * fix(master): update linting workflow to node 20 (current LTS) --------- Co-authored-by: Akhlaqul Muhammad Fadwa <75623219+zennn08@users.noreply.github.com> Co-authored-by: Rizz2Dev <muhamad.rizki27483@smp.belajar.id> Co-authored-by: Oscar Guindzberg <oscar.guindzberg@gmail.com> Co-authored-by: Bob <115008575+bobslavtriev@users.noreply.github.com> * chore(feature/pdo-sync): final linting * fix(feature/pdo-sync): make replies optional * feat(feat/pdo-sync): add <unavailable> handle * feat(feature/pdo-sync): Fixed the issues with peer messages and implemented some more logic * fix(feature/pdo-sync): Make progress optional * fix(feature/pdo-sync): Nullify and defeat Message absent from node if it is resolved immediately * feat(feature/pdo-sync): Export message absent from node and export PDO request ID with it --------- Co-authored-by: Akhlaqul Muhammad Fadwa <75623219+zennn08@users.noreply.github.com> Co-authored-by: Rizz2Dev <muhamad.rizki27483@smp.belajar.id> Co-authored-by: Oscar Guindzberg <oscar.guindzberg@gmail.com> Co-authored-by: Bob <115008575+bobslavtriev@users.noreply.github.com>
115 lines
3.1 KiB
TypeScript
115 lines
3.1 KiB
TypeScript
import { AxiosRequestConfig } from 'axios'
|
|
import { promisify } from 'util'
|
|
import { inflate } from 'zlib'
|
|
import { proto } from '../../WAProto'
|
|
import { Chat, Contact, WAMessageStubType } from '../Types'
|
|
import { isJidUser } from '../WABinary'
|
|
import { toNumber } from './generics'
|
|
import { normalizeMessageContent } from './messages'
|
|
import { downloadContentFromMessage } from './messages-media'
|
|
|
|
const inflatePromise = promisify(inflate)
|
|
|
|
export const downloadHistory = async(
|
|
msg: proto.Message.IHistorySyncNotification,
|
|
options: AxiosRequestConfig<any>
|
|
) => {
|
|
const stream = await downloadContentFromMessage(msg, 'md-msg-hist', { options })
|
|
const bufferArray: Buffer[] = []
|
|
for await (const chunk of stream) {
|
|
bufferArray.push(chunk)
|
|
}
|
|
|
|
let buffer = Buffer.concat(bufferArray)
|
|
|
|
// decompress buffer
|
|
buffer = await inflatePromise(buffer)
|
|
|
|
const syncData = proto.HistorySync.decode(buffer)
|
|
return syncData
|
|
}
|
|
|
|
export const processHistoryMessage = (item: proto.IHistorySync) => {
|
|
const messages: proto.IWebMessageInfo[] = []
|
|
const contacts: Contact[] = []
|
|
const chats: Chat[] = []
|
|
|
|
switch (item.syncType) {
|
|
case proto.HistorySync.HistorySyncType.INITIAL_BOOTSTRAP:
|
|
case proto.HistorySync.HistorySyncType.RECENT:
|
|
case proto.HistorySync.HistorySyncType.FULL:
|
|
case proto.HistorySync.HistorySyncType.ON_DEMAND:
|
|
for(const chat of item.conversations! as Chat[]) {
|
|
contacts.push({ id: chat.id, name: chat.name || undefined })
|
|
|
|
const msgs = chat.messages || []
|
|
delete chat.messages
|
|
delete chat.archived
|
|
delete chat.muteEndTime
|
|
delete chat.pinned
|
|
|
|
for(const item of msgs) {
|
|
const message = item.message!
|
|
messages.push(message)
|
|
|
|
if(!chat.messages?.length) {
|
|
// keep only the most recent message in the chat array
|
|
chat.messages = [{ message }]
|
|
}
|
|
|
|
if(!message.key.fromMe && !chat.lastMessageRecvTimestamp) {
|
|
chat.lastMessageRecvTimestamp = toNumber(message.messageTimestamp)
|
|
}
|
|
|
|
if(
|
|
(message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP
|
|
|| message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB
|
|
)
|
|
&& message.messageStubParameters?.[0]
|
|
) {
|
|
contacts.push({
|
|
id: message.key.participant || message.key.remoteJid!,
|
|
verifiedName: message.messageStubParameters?.[0],
|
|
})
|
|
}
|
|
}
|
|
|
|
if(isJidUser(chat.id) && chat.readOnly && chat.archived) {
|
|
delete chat.readOnly
|
|
}
|
|
|
|
chats.push({ ...chat })
|
|
}
|
|
|
|
break
|
|
case proto.HistorySync.HistorySyncType.PUSH_NAME:
|
|
for(const c of item.pushnames!) {
|
|
contacts.push({ id: c.id!, notify: c.pushname! })
|
|
}
|
|
|
|
break
|
|
}
|
|
|
|
return {
|
|
chats,
|
|
contacts,
|
|
messages,
|
|
syncType: item.syncType,
|
|
progress: item.progress,
|
|
}
|
|
}
|
|
|
|
export const downloadAndProcessHistorySyncNotification = async(
|
|
msg: proto.Message.IHistorySyncNotification,
|
|
options: AxiosRequestConfig<any>
|
|
) => {
|
|
const historyMsg = await downloadHistory(msg, options)
|
|
return processHistoryMessage(historyMsg)
|
|
}
|
|
|
|
export const getHistoryMsg = (message: proto.IMessage) => {
|
|
const normalizedContent = !!message ? normalizeMessageContent(message) : undefined
|
|
const anyHistoryMsg = normalizedContent?.protocolMessage?.historySyncNotification
|
|
|
|
return anyHistoryMsg
|
|
} |