From 3efc28fcc57558e95766bc4e8ea63d61e80f125c Mon Sep 17 00:00:00 2001 From: binsarjr Date: Thu, 21 Mar 2024 04:03:31 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(random):=20add=20ResolveToHdAc?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new action that allows users to upscale images to HD quality. --- .../message/random/ResolveToHdAction.ts | 89 +++++++++++++++++++ .../commands/messagesHandler/random.ts | 2 + src/supports/message.ts | 19 ++++ 3 files changed, 110 insertions(+) create mode 100644 src/actions/message/random/ResolveToHdAction.ts diff --git a/src/actions/message/random/ResolveToHdAction.ts b/src/actions/message/random/ResolveToHdAction.ts new file mode 100644 index 0000000..de36217 --- /dev/null +++ b/src/actions/message/random/ResolveToHdAction.ts @@ -0,0 +1,89 @@ +import type { WAMessage, WASocket } from "@whiskeysockets/baileys"; +import FormData from "form-data"; +import got from "got"; +import BaseMessageHandlerAction from "../../../foundation/actions/BaseMessageHandlerAction.js"; +import { Queue } from "../../../services/queue.js"; +import { withSign } from "../../../supports/flag.js"; +import { + downloadContentBufferFromMessage, + getJid, + getMessageFromViewOnce, +} from "../../../supports/message.js"; +import type { MessagePattern } from "../../../types/MessagePattern.js"; + +export default class extends BaseMessageHandlerAction { + patterns(): MessagePattern { + return [withSign("hd")]; + } + + async process(socket: WASocket, _message: WAMessage): Promise { + this.reactToProcessing(socket, _message); + + const message = getMessageFromViewOnce(_message); + + let mediaKey: Uint8Array | null | undefined; + let directPath: string | null | undefined; + let url: string | null | undefined; + + let photoBuffer: Buffer; + + if ( + message?.extendedTextMessage?.contextInfo?.quotedMessage?.imageMessage + ) { + mediaKey = + message!.extendedTextMessage!.contextInfo!.quotedMessage!.imageMessage! + .mediaKey; + directPath = + message!.extendedTextMessage!.contextInfo!.quotedMessage!.imageMessage! + .directPath; + url = + message!.extendedTextMessage!.contextInfo!.quotedMessage!.imageMessage! + .url; + } else if (message?.imageMessage) { + mediaKey = message!.imageMessage!.mediaKey; + directPath = message!.imageMessage!.directPath; + url = message!.imageMessage!.url; + } else { + return; + } + + photoBuffer = await downloadContentBufferFromMessage( + { directPath, mediaKey, url }, + "image" + ); + + const data = new FormData(); + data.append("image", photoBuffer, "image.jpg"); + data.append("scale", "4"); + + const result = await got + .post("https://api2.pixelcut.app/image/upscale/v1", { + body: data, + headers: { + accept: "application/json", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" + + Date.now(), + }, + }) + .json<{ result_url: string }>(); + + Queue.add(async () => { + if (!result.result_url) { + this.reactToFailed(socket, _message); + return; + } + + await socket.sendMessage( + getJid(_message), + { + image: { + url: result.result_url, + }, + }, + { quoted: _message } + ); + await this.reactToDone(socket, _message); + }); + } +} diff --git a/src/configs/commands/messagesHandler/random.ts b/src/configs/commands/messagesHandler/random.ts index 4ddf544..e3d7058 100644 --- a/src/configs/commands/messagesHandler/random.ts +++ b/src/configs/commands/messagesHandler/random.ts @@ -1,8 +1,10 @@ import InfoServerAction from "../../../actions/message/random/InfoServerAction.js"; import PingAction from "../../../actions/message/random/PingAction.js"; +import ResolveToHdAction from "../../../actions/message/random/ResolveToHdAction.js"; import type BaseMessageHandlerAction from "../../../foundation/actions/BaseMessageHandlerAction.js"; export default [ new PingAction(), new InfoServerAction(), + new ResolveToHdAction(), ]; diff --git a/src/supports/message.ts b/src/supports/message.ts index 8f091e1..3dbd57e 100644 --- a/src/supports/message.ts +++ b/src/supports/message.ts @@ -6,6 +6,7 @@ import { type DownloadableMessage, type MediaDownloadOptions, type MediaType, + type MessageType, type MiscMessageGenerationOptions, type WAMessage, type WASocket, @@ -146,3 +147,21 @@ export const downloadContentBufferFromMessage = async ( return Buffer.concat(bufferArray); }; + +export const downloadQuotedMessageMedia = async ( + message: proto.IMessage +): Promise => { + const type = Object.keys(message)[0] as MessageType; + const msg = message[type as keyof typeof message]; + + const stream = await downloadContentFromMessage( + msg as DownloadableMessage, + type.replace("Message", "") as MediaType + ); + let buffer = Buffer.from([]); + for await (const chunk of stream) { + buffer = Buffer.concat([buffer, chunk]); + } + + return buffer; +};