Skip to content

Commit ee0f0f0

Browse files
add send presence router
1 parent 4c69b05 commit ee0f0f0

File tree

5 files changed

+76
-0
lines changed

5 files changed

+76
-0
lines changed

src/validate/validate.schema.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,16 @@ export const textMessageSchema: JSONSchema7 = {
149149
required: ['textMessage', 'number'],
150150
};
151151

152+
export const presenceSchema: JSONSchema7 = {
153+
$id: v4(),
154+
type: 'object',
155+
properties: {
156+
number: { ...numberDefinition },
157+
options: { ...optionsSchema, required: ['presence', 'delay'] },
158+
},
159+
required: ['options', 'number'],
160+
};
161+
152162
export const pollMessageSchema: JSONSchema7 = {
153163
$id: v4(),
154164
type: 'object',

src/whatsapp/controllers/sendMessage.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
SendLocationDto,
1212
SendMediaDto,
1313
SendPollDto,
14+
SendPresenceDto,
1415
SendReactionDto,
1516
SendStatusDto,
1617
SendStickerDto,
@@ -23,6 +24,11 @@ const logger = new Logger('MessageRouter');
2324
export class SendMessageController {
2425
constructor(private readonly waMonitor: WAMonitoringService) {}
2526

27+
public async sendPresence({ instanceName }: InstanceDto, data: SendPresenceDto) {
28+
logger.verbose('requested sendPresence from ' + instanceName + ' instance');
29+
return await this.waMonitor.waInstances[instanceName].sendPresence(data);
30+
}
31+
2632
public async sendText({ instanceName }: InstanceDto, data: SendTextDto) {
2733
logger.verbose('requested sendText from ' + instanceName + ' instance');
2834
return await this.waMonitor.waInstances[instanceName].textMessage(data);

src/whatsapp/dto/sendMessage.dto.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,18 @@ class PollMessage {
4646
values: string[];
4747
messageSecret?: Uint8Array;
4848
}
49+
export class SendPresenceDto extends Metadata {
50+
options: {
51+
presence: WAPresence;
52+
delay: number;
53+
};
54+
}
4955
export class SendTextDto extends Metadata {
5056
textMessage: TextMessage;
5157
}
58+
export class SendPresence extends Metadata {
59+
textMessage: TextMessage;
60+
}
5261

5362
export class SendStatusDto extends Metadata {
5463
statusMessage: StatusMessage;

src/whatsapp/routers/sendMessage.router.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
locationMessageSchema,
1010
mediaMessageSchema,
1111
pollMessageSchema,
12+
presenceSchema,
1213
reactionMessageSchema,
1314
statusMessageSchema,
1415
stickerMessageSchema,
@@ -23,6 +24,7 @@ import {
2324
SendLocationDto,
2425
SendMediaDto,
2526
SendPollDto,
27+
SendPresenceDto,
2628
SendReactionDto,
2729
SendStatusDto,
2830
SendStickerDto,
@@ -37,6 +39,22 @@ export class MessageRouter extends RouterBroker {
3739
constructor(...guards: RequestHandler[]) {
3840
super();
3941
this.router
42+
.post(this.routerPath('sendPresence'), ...guards, async (req, res) => {
43+
logger.verbose('request received in sendText');
44+
logger.verbose('request body: ');
45+
logger.verbose(req.body);
46+
47+
logger.verbose('request query: ');
48+
logger.verbose(req.query);
49+
const response = await this.dataValidate<null>({
50+
request: req,
51+
schema: presenceSchema,
52+
ClassRef: SendPresenceDto,
53+
execute: (instance, data) => sendMessageController.sendPresence(instance, data),
54+
});
55+
56+
return res.status(HttpStatus.CREATED).json(response);
57+
})
4058
.post(this.routerPath('sendText'), ...guards, async (req, res) => {
4159
logger.verbose('request received in sendText');
4260
logger.verbose('request body: ');

src/whatsapp/services/whatsapp.service.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import {
109109
SendLocationDto,
110110
SendMediaDto,
111111
SendPollDto,
112+
SendPresenceDto,
112113
SendReactionDto,
113114
SendStatusDto,
114115
SendStickerDto,
@@ -2387,6 +2388,38 @@ export class WAStartupService {
23872388
return this.stateConnection;
23882389
}
23892390

2391+
public async sendPresence(data: SendPresenceDto) {
2392+
try {
2393+
const { number } = data;
2394+
2395+
this.logger.verbose(`Check if number "${number}" is WhatsApp`);
2396+
const isWA = (await this.whatsappNumber({ numbers: [number] }))?.shift();
2397+
2398+
this.logger.verbose(`Exists: "${isWA.exists}" | jid: ${isWA.jid}`);
2399+
if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) {
2400+
throw new BadRequestException(isWA);
2401+
}
2402+
2403+
const sender = isWA.jid;
2404+
2405+
this.logger.verbose('Sending presence');
2406+
await this.client.presenceSubscribe(sender);
2407+
this.logger.verbose('Subscribing to presence');
2408+
2409+
await this.client.sendPresenceUpdate(data.options?.presence ?? 'composing', sender);
2410+
this.logger.verbose('Sending presence update: ' + data.options?.presence ?? 'composing');
2411+
2412+
await delay(data.options.delay);
2413+
this.logger.verbose('Set delay: ' + data.options.delay);
2414+
2415+
await this.client.sendPresenceUpdate('paused', sender);
2416+
this.logger.verbose('Sending presence update: paused');
2417+
} catch (error) {
2418+
this.logger.error(error);
2419+
throw new BadRequestException(error.toString());
2420+
}
2421+
}
2422+
23902423
// Send Message Controller
23912424
public async textMessage(data: SendTextDto, isChatwoot = false) {
23922425
this.logger.verbose('Sending text message');

0 commit comments

Comments
 (0)