Skip to content

Commit e58f1d7

Browse files
committed
feat(endpoint): add setPresence endpoint
1 parent 5f5db20 commit e58f1d7

6 files changed

Lines changed: 55 additions & 1 deletion

File tree

src/validate/validate.schema.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,18 @@ export const presenceSchema: JSONSchema7 = {
161161
required: ['options', 'number'],
162162
};
163163

164+
export const presenceOnlySchema: JSONSchema7 = {
165+
$id: v4(),
166+
type: 'object',
167+
properties: {
168+
presence: {
169+
type: 'string',
170+
enum: ['unavailable', 'available', 'composing', 'recording', 'paused'],
171+
},
172+
},
173+
required: ['presence'],
174+
};
175+
164176
export const pollMessageSchema: JSONSchema7 = {
165177
$id: v4(),
166178
type: 'object',

src/whatsapp/controllers/chat.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
ProfileStatusDto,
1212
ReadMessageDto,
1313
SendPresenceDto,
14+
SetPresenceDto,
1415
UpdateMessageDto,
1516
WhatsAppNumberDto,
1617
} from '../dto/chat.dto';
@@ -85,6 +86,11 @@ export class ChatController {
8586
return await this.waMonitor.waInstances[instanceName].sendPresence(data);
8687
}
8788

89+
public async setPresence({ instanceName }: InstanceDto, data: SetPresenceDto) {
90+
logger.verbose('requested sendPresence from ' + instanceName + ' instance');
91+
return await this.waMonitor.waInstances[instanceName].setPresence(data);
92+
}
93+
8894
public async fetchPrivacySettings({ instanceName }: InstanceDto) {
8995
logger.verbose('requested fetchPrivacySettings from ' + instanceName + ' instance');
9096
return await this.waMonitor.waInstances[instanceName].fetchPrivacySettings();

src/whatsapp/dto/chat.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ export class SendPresenceDto extends Metadata {
110110
};
111111
}
112112

113+
export class SetPresenceDto {
114+
presence: WAPresence;
115+
}
116+
113117
export class UpdateMessageDto extends Metadata {
114118
number: string;
115119
key: proto.IMessageKey;

src/whatsapp/routers/chat.router.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
messageUpSchema,
1010
messageValidateSchema,
1111
presenceSchema,
12+
presenceOnlySchema,
1213
privacySettingsSchema,
1314
profileNameSchema,
1415
profilePictureSchema,
@@ -31,6 +32,7 @@ import {
3132
ProfileStatusDto,
3233
ReadMessageDto,
3334
SendPresenceDto,
35+
SetPresenceDto,
3436
UpdateMessageDto,
3537
WhatsAppNumberDto,
3638
} from '../dto/chat.dto';
@@ -250,6 +252,22 @@ export class ChatRouter extends RouterBroker {
250252

251253
return res.status(HttpStatus.CREATED).json(response);
252254
})
255+
.post(this.routerPath('setPresence'), ...guards, async (req, res) => {
256+
logger.verbose('request received in setPresence');
257+
logger.verbose('request body: ');
258+
logger.verbose(req.body);
259+
260+
logger.verbose('request query: ');
261+
logger.verbose(req.query);
262+
const response = await this.dataValidate<null>({
263+
request: req,
264+
schema: presenceOnlySchema,
265+
ClassRef: SetPresenceDto,
266+
execute: (instance, data) => chatController.setPresence(instance, data),
267+
});
268+
269+
return res.status(HttpStatus.CREATED).json(response);
270+
})
253271
// Profile routes
254272
.get(this.routerPath('fetchPrivacySettings'), ...guards, async (req, res) => {
255273
logger.verbose('request received in fetchPrivacySettings');

src/whatsapp/services/whatsapp.baileys.service.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ import {
7272
PrivacySettingDto,
7373
ReadMessageDto,
7474
SendPresenceDto,
75+
SetPresenceDto,
7576
UpdateMessageDto,
7677
WhatsAppNumberDto,
7778
} from '../dto/chat.dto';
@@ -1830,7 +1831,6 @@ export class BaileysStartupService extends WAStartupService {
18301831
}
18311832

18321833
// Instance Controller
1833-
18341834
public async sendPresence(data: SendPresenceDto) {
18351835
try {
18361836
const { number } = data;
@@ -1863,6 +1863,17 @@ export class BaileysStartupService extends WAStartupService {
18631863
}
18641864
}
18651865

1866+
// Presence Controller
1867+
public async setPresence(data: SetPresenceDto) {
1868+
try {
1869+
await this.client.sendPresenceUpdate(data.presence);
1870+
this.logger.verbose('Sending presence update: ' + data.presence);
1871+
} catch (error) {
1872+
this.logger.error(error);
1873+
throw new BadRequestException(error.toString());
1874+
}
1875+
}
1876+
18661877
// Send Message Controller
18671878
public async textMessage(data: SendTextDto, isChatwoot = false) {
18681879
this.logger.verbose('Sending text message');

src/whatsapp/services/whatsapp.business.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,9 @@ export class BusinessStartupService extends WAStartupService {
11851185
public async sendPresence() {
11861186
throw new BadRequestException('Method not available on WhatsApp Business API');
11871187
}
1188+
public async setPresence() {
1189+
throw new BadRequestException('Method not available on WhatsApp Business API');
1190+
}
11881191
public async fetchPrivacySettings() {
11891192
throw new BadRequestException('Method not available on WhatsApp Business API');
11901193
}

0 commit comments

Comments
 (0)