From 3c87d6bbaf50c5238df981530f868a09a5f10f1e Mon Sep 17 00:00:00 2001 From: mimamch Date: Mon, 30 Oct 2023 09:56:11 +0700 Subject: [PATCH] not yet --- package.json | 2 +- pnpm-lock.yaml | 8 ++-- src/Defaults/index.ts | 1 + src/Socket/index.ts | 107 ++++++++++++++++++++++++++++++++++++++++++ src/Types/index.ts | 7 +++ 5 files changed, 120 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2a887c3..477658f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "@adiwajshing/keyed-db": "^0.2.4", "@hapi/boom": "^10.0.1", - "@whiskeysockets/baileys": "^6.2.1", + "@whiskeysockets/baileys": "^6.5.0", "mime": "^3.0.0", "pino": "^8.11.0", "qrcode-terminal": "^0.12.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21363f5..0ae76f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ dependencies: specifier: ^10.0.1 version: 10.0.1 '@whiskeysockets/baileys': - specifier: ^6.2.1 - version: 6.4.0(qrcode-terminal@0.12.0) + specifier: ^6.5.0 + version: 6.5.0(qrcode-terminal@0.12.0) mime: specifier: ^3.0.0 version: 3.0.0 @@ -154,8 +154,8 @@ packages: codec-parser: 2.4.3 dev: false - /@whiskeysockets/baileys@6.4.0(qrcode-terminal@0.12.0): - resolution: {integrity: sha512-SdCoVpILWX7z2WEe40BwNjMqpI6Guf0gbG80NNfsJBcRcDQIS9pkmazIhTvNKytWZm7BFZR+QNKcBUxdPqdLsQ==} + /@whiskeysockets/baileys@6.5.0(qrcode-terminal@0.12.0): + resolution: {integrity: sha512-ary0RNivsrl56wnn0ta37LwVGpCDabthERCV5lHHsbhJJFfp04g6+reiQAKvxo61oYxwxKjqq33kvID+AOr++A==} peerDependencies: jimp: ^0.16.1 link-preview-js: ^3.0.0 diff --git a/src/Defaults/index.ts b/src/Defaults/index.ts index 69565a6..6b5d0ec 100644 --- a/src/Defaults/index.ts +++ b/src/Defaults/index.ts @@ -10,6 +10,7 @@ export enum CALLBACK_KEY { ON_DISCONNECTED = "on-disconnected", ON_CONNECTING = "on-connecting", ON_MESSAGE_UPDATED = "on-message-updated", + ON_PAIRING_CODE = "on-pairing-code", } export abstract class Messages { diff --git a/src/Socket/index.ts b/src/Socket/index.ts index eca646a..235ba70 100644 --- a/src/Socket/index.ts +++ b/src/Socket/index.ts @@ -14,6 +14,7 @@ import type { MessageReceived, MessageUpdated, StartSessionParams, + StartSessionWithPairingCodeParams, } from "../Types"; import { CALLBACK_KEY, CREDENTIALS, Messages } from "../Defaults"; import { @@ -123,6 +124,106 @@ export const startSession = async ( return startSocket(); }; +export const startSessionWithPairingCode = async ( + sessionId: string, + options: StartSessionWithPairingCodeParams +): Promise => { + if (isSessionExistAndRunning(sessionId)) + throw new WhatsappError(Messages.sessionAlreadyExist(sessionId)); + const logger = pino({ level: "silent" }); + + const { version } = await fetchLatestBaileysVersion(); + const startSocket = async () => { + const { state, saveCreds } = await useMultiFileAuthState( + path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX) + ); + const sock: WASocket = makeWASocket({ + version, + printQRInTerminal: false, + auth: state, + logger, + markOnlineOnConnect: false, + browser: Browsers.ubuntu("Chrome"), + }); + sessions.set(sessionId, { ...sock }); + try { + if (!sock.authState.creds.registered) { + console.log("first time pairing"); + const code = await sock.requestPairingCode(options.phoneNumber); + console.log(code); + callback.get(CALLBACK_KEY.ON_PAIRING_CODE)?.(sessionId, code); + } + + sock.ev.process(async (events) => { + if (events["connection.update"]) { + const update = events["connection.update"]; + const { connection, lastDisconnect } = update; + if (update.qr) { + callback.get(CALLBACK_KEY.ON_QR)?.({ + sessionId, + qr: update.qr, + }); + } + if (connection == "connecting") { + callback.get(CALLBACK_KEY.ON_CONNECTING)?.(sessionId); + } + if (connection === "close") { + const code = (lastDisconnect?.error as Boom)?.output?.statusCode; + let retryAttempt = retryCount.get(sessionId) ?? 0; + let shouldRetry; + if (code != DisconnectReason.loggedOut && retryAttempt < 10) { + shouldRetry = true; + } + if (shouldRetry) { + retryAttempt++; + } + if (shouldRetry) { + retryCount.set(sessionId, retryAttempt); + startSocket(); + } else { + retryCount.delete(sessionId); + deleteSession(sessionId); + callback.get(CALLBACK_KEY.ON_DISCONNECTED)?.(sessionId); + } + } + if (connection == "open") { + retryCount.delete(sessionId); + callback.get(CALLBACK_KEY.ON_CONNECTED)?.(sessionId); + } + } + if (events["creds.update"]) { + await saveCreds(); + } + if (events["messages.update"]) { + const msg = events["messages.update"][0]; + const data: MessageUpdated = { + sessionId: sessionId, + messageStatus: parseMessageStatusCodeToReadable(msg.update.status!), + ...msg, + }; + callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)?.(sessionId, data); + } + if (events["messages.upsert"]) { + const msg = events["messages.upsert"] + .messages?.[0] as unknown as MessageReceived; + msg.sessionId = sessionId; + msg.saveImage = (path) => saveImageHandler(msg, path); + msg.saveVideo = (path) => saveVideoHandler(msg, path); + msg.saveDocument = (path) => saveDocumentHandler(msg, path); + callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)?.({ + ...msg, + }); + } + }); + return sock; + } catch (error) { + // console.log("SOCKET ERROR", error); + return sock; + } + }; + return startSocket(); +}; + /** * @deprecated Use startSession method instead */ @@ -216,3 +317,9 @@ export const onConnecting = (listener: (sessionId: string) => any) => { export const onMessageUpdate = (listener: (data: MessageUpdated) => any) => { callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener); }; + +export const onPairingCode = ( + listener: (sessionId: string, code: string) => any +) => { + callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener); +}; diff --git a/src/Types/index.ts b/src/Types/index.ts index b248d45..d01cdde 100644 --- a/src/Types/index.ts +++ b/src/Types/index.ts @@ -49,6 +49,13 @@ export interface StartSessionParams { printQR: boolean; } +export interface StartSessionWithPairingCodeParams { + /** + * Phone Number with Country Code + */ + phoneNumber: string; +} + export type MessageUpdated = WAMessageUpdate & { sessionId: string; messageStatus: