diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index faaf2fa1..82bb8902 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -161,6 +161,18 @@ export const presenceSchema: JSONSchema7 = { required: ['options', 'number'], }; +export const presenceOnlySchema: JSONSchema7 = { + $id: v4(), + type: 'object', + properties: { + presence: { + type: 'string', + enum: ['unavailable', 'available', 'composing', 'recording', 'paused'], + }, + }, + required: ['presence'], +}; + export const pollMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', diff --git a/src/whatsapp/controllers/instance.controller.ts b/src/whatsapp/controllers/instance.controller.ts index e106aca7..91103e33 100644 --- a/src/whatsapp/controllers/instance.controller.ts +++ b/src/whatsapp/controllers/instance.controller.ts @@ -7,7 +7,7 @@ import { ConfigService, HttpServer, WaBusiness } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { BadRequestException, InternalServerErrorException } from '../../exceptions'; import { RedisCache } from '../../libs/redis.client'; -import { InstanceDto } from '../dto/instance.dto'; +import { InstanceDto, SetPresenceDto } from '../dto/instance.dto'; import { RepositoryBroker } from '../repository/repository.manager'; import { AuthService, OldToken } from '../services/auth.service'; import { CacheService } from '../services/cache.service'; @@ -656,6 +656,11 @@ export class InstanceController { return this.waMonitor.instanceInfo(); } + public async setPresence({ instanceName }: InstanceDto, data: SetPresenceDto) { + this.logger.verbose('requested sendPresence from ' + instanceName + ' instance'); + return await this.waMonitor.waInstances[instanceName].setPresence(data); + } + public async logout({ instanceName }: InstanceDto) { this.logger.verbose('requested logout from ' + instanceName + ' instance'); const { instance } = await this.connectionState({ instanceName }); diff --git a/src/whatsapp/dto/instance.dto.ts b/src/whatsapp/dto/instance.dto.ts index f03f4c8e..eaf21aab 100644 --- a/src/whatsapp/dto/instance.dto.ts +++ b/src/whatsapp/dto/instance.dto.ts @@ -1,3 +1,5 @@ +import { WAPresence } from "@whiskeysockets/baileys"; + export class InstanceDto { instanceName: string; instanceId?: string; @@ -40,3 +42,7 @@ export class InstanceDto { typebot_listening_from_me?: boolean; proxy?: string; } + +export class SetPresenceDto { + presence: WAPresence; +} diff --git a/src/whatsapp/routers/chat.router.ts b/src/whatsapp/routers/chat.router.ts index a0ce3216..d8096c79 100644 --- a/src/whatsapp/routers/chat.router.ts +++ b/src/whatsapp/routers/chat.router.ts @@ -9,6 +9,7 @@ import { messageUpSchema, messageValidateSchema, presenceSchema, + presenceOnlySchema, privacySettingsSchema, profileNameSchema, profilePictureSchema, diff --git a/src/whatsapp/routers/instance.router.ts b/src/whatsapp/routers/instance.router.ts index 96a1a5da..6d4727e2 100644 --- a/src/whatsapp/routers/instance.router.ts +++ b/src/whatsapp/routers/instance.router.ts @@ -3,9 +3,9 @@ import { RequestHandler, Router } from 'express'; import { Auth, ConfigService, Database } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { dbserver } from '../../libs/db.connect'; -import { instanceNameSchema, oldTokenSchema } from '../../validate/validate.schema'; +import {instanceNameSchema, oldTokenSchema, presenceOnlySchema} from '../../validate/validate.schema'; import { RouterBroker } from '../abstract/abstract.router'; -import { InstanceDto } from '../dto/instance.dto'; +import { InstanceDto, SetPresenceDto } from '../dto/instance.dto'; import { OldToken } from '../services/auth.service'; import { instanceController } from '../whatsapp.module'; import { HttpStatus } from './index.router'; @@ -98,6 +98,22 @@ export class InstanceRouter extends RouterBroker { return res.status(HttpStatus.OK).json(response); }) + .post(this.routerPath('setPresence'), ...guards, async (req, res) => { + logger.verbose('request received in setPresence'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + const response = await this.dataValidate({ + request: req, + schema: presenceOnlySchema, + ClassRef: SetPresenceDto, + execute: (instance, data) => instanceController.setPresence(instance, data), + }); + + return res.status(HttpStatus.CREATED).json(response); + }) .delete(this.routerPath('logout'), ...guards, async (req, res) => { logger.verbose('request received in logoutInstances'); logger.verbose('request body: '); diff --git a/src/whatsapp/services/whatsapp.baileys.service.ts b/src/whatsapp/services/whatsapp.baileys.service.ts index a081b5b7..e9e7147a 100644 --- a/src/whatsapp/services/whatsapp.baileys.service.ts +++ b/src/whatsapp/services/whatsapp.baileys.service.ts @@ -89,7 +89,7 @@ import { GroupUpdateParticipantDto, GroupUpdateSettingDto, } from '../dto/group.dto'; -import { InstanceDto } from '../dto/instance.dto'; +import { InstanceDto, SetPresenceDto } from '../dto/instance.dto'; import { HandleLabelDto, LabelDto } from '../dto/label.dto'; import { ContactMessage, @@ -1830,7 +1830,6 @@ export class BaileysStartupService extends WAStartupService { } // Instance Controller - public async sendPresence(data: SendPresenceDto) { try { const { number } = data; @@ -1863,6 +1862,17 @@ export class BaileysStartupService extends WAStartupService { } } + // Presence Controller + public async setPresence(data: SetPresenceDto) { + try { + await this.client.sendPresenceUpdate(data.presence); + this.logger.verbose('Sending presence update: ' + data.presence); + } catch (error) { + this.logger.error(error); + throw new BadRequestException(error.toString()); + } + } + // Send Message Controller public async textMessage(data: SendTextDto, isChatwoot = false) { this.logger.verbose('Sending text message'); diff --git a/src/whatsapp/services/whatsapp.business.service.ts b/src/whatsapp/services/whatsapp.business.service.ts index 0d4f723c..874e75dc 100644 --- a/src/whatsapp/services/whatsapp.business.service.ts +++ b/src/whatsapp/services/whatsapp.business.service.ts @@ -1185,6 +1185,9 @@ export class BusinessStartupService extends WAStartupService { public async sendPresence() { throw new BadRequestException('Method not available on WhatsApp Business API'); } + public async setPresence() { + throw new BadRequestException('Method not available on WhatsApp Business API'); + } public async fetchPrivacySettings() { throw new BadRequestException('Method not available on WhatsApp Business API'); }