Skip to content

Commit a41d92f

Browse files
Merge pull request #479 from dv336699/develop
feat(endpoint): add setPresence endpoint
2 parents 70d4eb3 + 5400f31 commit a41d92f

File tree

7 files changed

+58
-5
lines changed

7 files changed

+58
-5
lines changed

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/instance.controller.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { ConfigService, HttpServer, WaBusiness } from '../../config/env.config';
77
import { Logger } from '../../config/logger.config';
88
import { BadRequestException, InternalServerErrorException } from '../../exceptions';
99
import { RedisCache } from '../../libs/redis.client';
10-
import { InstanceDto } from '../dto/instance.dto';
10+
import { InstanceDto, SetPresenceDto } from '../dto/instance.dto';
1111
import { RepositoryBroker } from '../repository/repository.manager';
1212
import { AuthService, OldToken } from '../services/auth.service';
1313
import { CacheService } from '../services/cache.service';
@@ -656,6 +656,11 @@ export class InstanceController {
656656
return this.waMonitor.instanceInfo();
657657
}
658658

659+
public async setPresence({ instanceName }: InstanceDto, data: SetPresenceDto) {
660+
this.logger.verbose('requested sendPresence from ' + instanceName + ' instance');
661+
return await this.waMonitor.waInstances[instanceName].setPresence(data);
662+
}
663+
659664
public async logout({ instanceName }: InstanceDto) {
660665
this.logger.verbose('requested logout from ' + instanceName + ' instance');
661666
const { instance } = await this.connectionState({ instanceName });

src/whatsapp/dto/instance.dto.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { WAPresence } from "@whiskeysockets/baileys";
2+
13
export class InstanceDto {
24
instanceName: string;
35
instanceId?: string;
@@ -40,3 +42,7 @@ export class InstanceDto {
4042
typebot_listening_from_me?: boolean;
4143
proxy?: string;
4244
}
45+
46+
export class SetPresenceDto {
47+
presence: WAPresence;
48+
}

src/whatsapp/routers/chat.router.ts

Lines changed: 1 addition & 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,

src/whatsapp/routers/instance.router.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { RequestHandler, Router } from 'express';
33
import { Auth, ConfigService, Database } from '../../config/env.config';
44
import { Logger } from '../../config/logger.config';
55
import { dbserver } from '../../libs/db.connect';
6-
import { instanceNameSchema, oldTokenSchema } from '../../validate/validate.schema';
6+
import {instanceNameSchema, oldTokenSchema, presenceOnlySchema} from '../../validate/validate.schema';
77
import { RouterBroker } from '../abstract/abstract.router';
8-
import { InstanceDto } from '../dto/instance.dto';
8+
import { InstanceDto, SetPresenceDto } from '../dto/instance.dto';
99
import { OldToken } from '../services/auth.service';
1010
import { instanceController } from '../whatsapp.module';
1111
import { HttpStatus } from './index.router';
@@ -98,6 +98,22 @@ export class InstanceRouter extends RouterBroker {
9898

9999
return res.status(HttpStatus.OK).json(response);
100100
})
101+
.post(this.routerPath('setPresence'), ...guards, async (req, res) => {
102+
logger.verbose('request received in setPresence');
103+
logger.verbose('request body: ');
104+
logger.verbose(req.body);
105+
106+
logger.verbose('request query: ');
107+
logger.verbose(req.query);
108+
const response = await this.dataValidate<null>({
109+
request: req,
110+
schema: presenceOnlySchema,
111+
ClassRef: SetPresenceDto,
112+
execute: (instance, data) => instanceController.setPresence(instance, data),
113+
});
114+
115+
return res.status(HttpStatus.CREATED).json(response);
116+
})
101117
.delete(this.routerPath('logout'), ...guards, async (req, res) => {
102118
logger.verbose('request received in logoutInstances');
103119
logger.verbose('request body: ');

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ import {
8989
GroupUpdateParticipantDto,
9090
GroupUpdateSettingDto,
9191
} from '../dto/group.dto';
92-
import { InstanceDto } from '../dto/instance.dto';
92+
import { InstanceDto, SetPresenceDto } from '../dto/instance.dto';
9393
import { HandleLabelDto, LabelDto } from '../dto/label.dto';
9494
import {
9595
ContactMessage,
@@ -1830,7 +1830,6 @@ export class BaileysStartupService extends WAStartupService {
18301830
}
18311831

18321832
// Instance Controller
1833-
18341833
public async sendPresence(data: SendPresenceDto) {
18351834
try {
18361835
const { number } = data;
@@ -1863,6 +1862,17 @@ export class BaileysStartupService extends WAStartupService {
18631862
}
18641863
}
18651864

1865+
// Presence Controller
1866+
public async setPresence(data: SetPresenceDto) {
1867+
try {
1868+
await this.client.sendPresenceUpdate(data.presence);
1869+
this.logger.verbose('Sending presence update: ' + data.presence);
1870+
} catch (error) {
1871+
this.logger.error(error);
1872+
throw new BadRequestException(error.toString());
1873+
}
1874+
}
1875+
18661876
// Send Message Controller
18671877
public async textMessage(data: SendTextDto, isChatwoot = false) {
18681878
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)