Skip to content

Commit 69c1059

Browse files
committed
feat: Route to send status broadcast
1 parent 26b2903 commit 69c1059

7 files changed

Lines changed: 94 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 1.1.4 (homolog)
2+
3+
### Features
4+
5+
* Route to send status broadcast
6+
17
# 1.1.3 (2023-07-06 11:43)
28

39
### Features

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040
},
4141
"homepage": "https://github.com/DavidsonGomes/evolution-api#readme",
4242
"dependencies": {
43+
"@whiskeysockets/baileys": "github:EvolutionAPI/Baileys",
4344
"@adiwajshing/keyed-db": "^0.2.4",
4445
"@ffmpeg-installer/ffmpeg": "^1.1.0",
4546
"@hapi/boom": "^10.0.1",
46-
"@whiskeysockets/baileys": "^6.3.0",
4747
"axios": "^1.3.5",
4848
"class-validator": "^0.13.2",
4949
"compression": "^1.7.4",

src/validate/validate.schema.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,34 @@ export const pollMessageSchema: JSONSchema7 = {
189189
required: ['pollMessage', 'number'],
190190
};
191191

192+
export const statusMessageSchema: JSONSchema7 = {
193+
$id: v4(),
194+
type: 'object',
195+
properties: {
196+
statusMessage: {
197+
type: 'object',
198+
properties: {
199+
text: { type: 'string' },
200+
backgroundColor: { type: 'string' },
201+
font: { type: 'integer', minimum: 0, maximum: 5 },
202+
statusJidList: {
203+
type: 'array',
204+
minItems: 1,
205+
uniqueItems: true,
206+
items: {
207+
type: 'string',
208+
pattern: '^\\d+',
209+
description: '"statusJidList" must be an array of numeric strings',
210+
},
211+
},
212+
},
213+
required: ['text', 'backgroundColor', 'font', 'statusJidList'],
214+
...isNotEmpty('text', 'backgroundColor', 'font', 'statusJidList'),
215+
},
216+
},
217+
required: ['statusMessage'],
218+
};
219+
192220
export const mediaMessageSchema: JSONSchema7 = {
193221
$id: v4(),
194222
type: 'object',

src/whatsapp/controllers/sendMessage.controller.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
SendMediaDto,
1212
SendPollDto,
1313
SendReactionDto,
14+
SendStatusDto,
1415
SendStickerDto,
1516
SendTextDto,
1617
} from '../dto/sendMessage.dto';
@@ -80,6 +81,10 @@ export class SendMessageController {
8081
return await this.waMonitor.waInstances[instanceName].pollMessage(data);
8182
}
8283

84+
public async sendStatus({ instanceName }: InstanceDto, data: SendStatusDto) {
85+
return await this.waMonitor.waInstances[instanceName].statusMessage(data);
86+
}
87+
8388
public async sendLinkPreview({ instanceName }: InstanceDto, data: SendLinkPreviewDto) {
8489
return await this.waMonitor.waInstances[instanceName].linkPreview(data);
8590
}

src/whatsapp/dto/sendMessage.dto.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ class linkPreviewMessage {
3232
text: string;
3333
}
3434

35+
class StatusMessage {
36+
text: string;
37+
backgroundColor: string;
38+
font: number;
39+
statusJidList: string[];
40+
}
41+
3542
class PollMessage {
3643
name: string;
3744
selectableCount: number;
@@ -46,6 +53,10 @@ export class SendLinkPreviewDto extends Metadata {
4653
linkPreview: linkPreviewMessage;
4754
}
4855

56+
export class SendStatusDto extends Metadata {
57+
statusMessage: StatusMessage;
58+
}
59+
4960
export class SendPollDto extends Metadata {
5061
pollMessage: PollMessage;
5162
}

src/whatsapp/routers/sendMessage.router.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
mediaMessageSchema,
1010
pollMessageSchema,
1111
reactionMessageSchema,
12+
statusMessageSchema,
1213
stickerMessageSchema,
1314
textMessageSchema,
1415
} from '../../validate/validate.schema';
@@ -22,6 +23,7 @@ import {
2223
SendMediaDto,
2324
SendPollDto,
2425
SendReactionDto,
26+
SendStatusDto,
2527
SendStickerDto,
2628
SendTextDto,
2729
} from '../dto/sendMessage.dto';
@@ -124,6 +126,16 @@ export class MessageRouter extends RouterBroker {
124126

125127
return res.status(HttpStatus.CREATED).json(response);
126128
})
129+
.post(this.routerPath('sendStatus'), ...guards, async (req, res) => {
130+
const response = await this.dataValidate<SendStatusDto>({
131+
request: req,
132+
schema: statusMessageSchema,
133+
ClassRef: SendStatusDto,
134+
execute: (instance, data) => sendMessageController.sendStatus(instance, data),
135+
});
136+
137+
return res.status(HttpStatus.CREATED).json(response);
138+
})
127139
.post(this.routerPath('sendLinkPreview'), ...guards, async (req, res) => {
128140
const response = await this.dataValidate<SendLinkPreviewDto>({
129141
request: req,

src/whatsapp/services/whatsapp.service.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import {
7777
SendPollDto,
7878
SendLinkPreviewDto,
7979
SendStickerDto,
80+
SendStatusDto,
8081
} from '../dto/sendMessage.dto';
8182
import { arrayUnique, isBase64, isURL } from 'class-validator';
8283
import {
@@ -1098,6 +1099,11 @@ export class WAStartupService {
10981099
return number;
10991100
}
11001101

1102+
if (number.includes('@broadcast')) {
1103+
this.logger.verbose('Number already contains @broadcast');
1104+
return number;
1105+
}
1106+
11011107
const formattedBRNumber = this.formatBRNumber(number);
11021108
if (formattedBRNumber !== number) {
11031109
this.logger.verbose(
@@ -1152,7 +1158,7 @@ export class WAStartupService {
11521158

11531159
const jid = this.createJid(number);
11541160
const isWA = (await this.whatsappNumber({ numbers: [jid] }))[0];
1155-
if (!isWA.exists && !isJidGroup(isWA.jid)) {
1161+
if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) {
11561162
throw new BadRequestException(isWA);
11571163
}
11581164

@@ -1229,7 +1235,8 @@ export class WAStartupService {
12291235
!message['audio'] &&
12301236
!message['poll'] &&
12311237
!message['linkPreview'] &&
1232-
!message['sticker']
1238+
!message['sticker'] &&
1239+
!message['status']
12331240
) {
12341241
if (!message['audio']) {
12351242
this.logger.verbose('Sending message');
@@ -1258,6 +1265,21 @@ export class WAStartupService {
12581265
);
12591266
}
12601267

1268+
if (message['status']) {
1269+
this.logger.verbose('Sending message');
1270+
return await this.client.sendMessage(
1271+
sender,
1272+
{
1273+
text: message['status'].text,
1274+
} as unknown as AnyMessageContent,
1275+
{
1276+
backgroundColor: message['status'].backgroundColor,
1277+
font: message['status'].font,
1278+
statusJidList: message['status'].statusJidList,
1279+
} as unknown as MiscMessageGenerationOptions,
1280+
);
1281+
}
1282+
12611283
this.logger.verbose('Sending message');
12621284
return await this.client.sendMessage(
12631285
sender,
@@ -1335,6 +1357,13 @@ export class WAStartupService {
13351357
);
13361358
}
13371359

1360+
public async statusMessage(data: SendStatusDto) {
1361+
this.logger.verbose('Sending status message');
1362+
return await this.sendMessageWithTyping('status@broadcast', {
1363+
status: data.statusMessage,
1364+
});
1365+
}
1366+
13381367
private async prepareMediaMessage(mediaMessage: MediaMessage) {
13391368
try {
13401369
this.logger.verbose('Preparing media message');

0 commit comments

Comments
 (0)