import { Channel } from '@waha/structures/channels.dto'; import { ChatPictureResponse } from '@waha/structures/chats.dto'; import { ChatRequest, MessageFileRequest, MessageImageRequest, MessageTextRequest, MessageVideoRequest, MessageVoiceRequest, WANumberExistResult, } from '@waha/structures/chatting.dto'; import { SessionInfo } from '@waha/structures/sessions.dto'; import axios, { AxiosInstance } from 'axios'; export class WAHASelf { public client: AxiosInstance; constructor() { // Set 'X-Api-Key' const key = process.env.WAHA_API_KEY_PLAIN; const port = parseInt(process.env.PORT) || parseInt(process.env.WHATSAPP_API_PORT) || 3000; const url = `http://localhost:${port}`; this.client = axios.create({ baseURL: url, headers: { 'X-Api-Key': key, 'Content-Type': 'application/json', }, }); } async fetch(url: string): Promise { const response = await this.client.get(url, { responseType: 'arraybuffer', }); return Buffer.from(response.data); } async qr(session: string): Promise { const url = `/api/${session}/auth/qr`; return await this.fetch(url); } async screenshot(session: string): Promise { const url = `/api/screenshot?session=${session}`; return await this.fetch(url); } async restart(session: string): Promise { const url = `/api/sessions/${session}/restart`; return await this.client.post(url); } async logout(session: string): Promise { const url = `/api/sessions/${session}/logout`; return await this.client.post(url); } async stop(session: string): Promise { const url = `/api/sessions/${session}/stop`; return await this.client.post(url); } async get(session: string): Promise { const url = `/api/sessions/${session}/`; return await this.client.get(url).then((response) => response.data); } async getContact(session: string, contactId: string) { const url = `/api/contacts`; const params = { session: session, contactId: contactId, }; return await this.client .get(url, { params: params }) .then((response) => response.data); } async contactCheckExists( session: string, phone: string, ): Promise { const url = `/api/contacts/check-exists`; const params = { phone: phone, session: session, }; return await this.client .get(url, { params: params }) .then((response) => response.data); } async getGroup(session: string, groupId: string) { const url = `/api/${session}/groups/${groupId}`; return await this.client.get(url).then((response) => response.data); } async getChannel(session: string, channelId: string): Promise { const url = `/api/${session}/channels/${channelId}`; return await this.client.get(url).then((response) => response.data); } async getChatPicture( session: string, chatId: string, ): Promise { const url = `/api/${session}/chats/${chatId}/picture`; return await this.client.get(url).then((response) => response.data?.url); } async sendText(body: MessageTextRequest): Promise { const url = `/api/sendText`; return await this.client.post(url, body).then((response) => response.data); } async sendImage(body: MessageImageRequest): Promise { const url = `/api/sendImage`; return await this.client.post(url, body).then((response) => response.data); } async sendVideo(body: MessageVideoRequest): Promise { const url = `/api/sendVideo`; return await this.client.post(url, body).then((response) => response.data); } async sendVoice(body: MessageVoiceRequest): Promise { const url = `/api/sendVoice`; return await this.client.post(url, body).then((response) => response.data); } async sendFile(body: MessageFileRequest): Promise { const url = `/api/sendFile`; return await this.client.post(url, body).then((response) => response.data); } async deleteMessage(session: string, chatId: string, messageId: string) { const url = `/api/${session}/chats/${chatId}/messages/${messageId}`; return await this.client.delete(url).then((response) => response.data); } async startTyping(body: ChatRequest) { const url = `/api/startTyping`; return await this.client.post(url, body).then((response) => response.data); } async stopTyping(body: ChatRequest) { const url = `/api/stopTyping`; return await this.client.post(url, body); } async readMessages(session: string, chatId: string) { const url = `/api/${session}/chats/${chatId}/messages/read`; return await this.client.post(url).then((response) => response.data); } async findPNByLid(session: string, lid: string): Promise { const url = `/api/${session}/lids/${lid}`; return await this.client.get(url).then((response) => response.data.pn); } async findLIDByPN(session: string, pn: string): Promise { const url = `/api/${session}/lids/pn/${pn}`; return await this.client.get(url).then((response) => response.data.lid); } /** * Get the server version * @returns Server version information */ async serverVersion(): Promise { const url = `/api/server/version`; return await this.client.get(url).then((response) => response.data); } /** * Get the server status * @returns Server status information */ async serverStatus(): Promise { const url = `/api/server/status`; return await this.client.get(url).then((response) => response.data); } /** * Reboot the server * @param force Whether to force reboot (true) or gracefully reboot (false) * @returns Server stop response */ async serverReboot(force: boolean = false): Promise { const url = `/api/server/stop`; return await this.client .post(url, { force }) .then((response) => response.data); } } export class WAHASessionAPI { constructor( private session: string, private api: WAHASelf, ) {} getContact(contactId: string): Promise { return this.api.getContact(this.session, contactId); } contactCheckExists(phone: string): Promise { return this.api.contactCheckExists(this.session, phone); } getGroup(groupId: string): Promise { return this.api.getGroup(this.session, groupId); } getChannel(channelId: string): Promise { return this.api.getChannel(this.session, channelId); } getChatPicture(chatId: string): Promise { return this.api.getChatPicture(this.session, chatId); } sendText(body: MessageTextRequest): Promise { body.session = this.session; return this.api.sendText(body); } sendImage(body: MessageImageRequest): Promise { body.session = this.session; return this.api.sendImage(body); } sendVideo(body: MessageVideoRequest): Promise { body.session = this.session; return this.api.sendVideo(body); } sendVoice(body: MessageVoiceRequest): Promise { body.session = this.session; return this.api.sendVoice(body); } sendFile(body: MessageFileRequest): Promise { body.session = this.session; return this.api.sendFile(body); } deleteMessage(chatId: string, messageId: string) { return this.api.deleteMessage(this.session, chatId, messageId); } startTyping(body: ChatRequest) { body.session = this.session; return this.api.startTyping(body); } stopTyping(body: ChatRequest) { body.session = this.session; return this.api.stopTyping(body); } readMessages(chatId: string) { return this.api.readMessages(this.session, chatId); } // // Lids // findPNByLid(lid: string) { return this.api.findPNByLid(this.session, lid); } findLIDByPN(pn: string) { return this.api.findLIDByPN(this.session, pn); } }