Merge pull request #952 from fmedeiros95/v2.0.0

Adiciona a função de fake call
This commit is contained in:
Davidson Gomes 2024-10-07 11:02:06 -03:00 committed by GitHub
commit eee43bb073
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 83 additions and 1 deletions

View File

@ -55,7 +55,7 @@
"@sentry/node": "^8.28.0", "@sentry/node": "^8.28.0",
"amqplib": "^0.10.3", "amqplib": "^0.10.3",
"axios": "^1.6.5", "axios": "^1.6.5",
"baileys": "6.7.8", "baileys": "github:EvolutionAPI/Baileys",
"class-validator": "^0.14.1", "class-validator": "^0.14.1",
"compression": "^1.7.4", "compression": "^1.7.4",
"cors": "^2.8.5", "cors": "^2.8.5",

View File

@ -0,0 +1,11 @@
import { OfferCallDto } from '@api/dto/call.dto';
import { InstanceDto } from '@api/dto/instance.dto';
import { WAMonitoringService } from '@api/services/monitor.service';
export class CallController {
constructor(private readonly waMonitor: WAMonitoringService) {}
public async offerCall({ instanceName }: InstanceDto, data: OfferCallDto) {
return await this.waMonitor.waInstances[instanceName].offerCall(data);
}
}

View File

@ -1,5 +1,6 @@
import { InstanceDto } from '@api/dto/instance.dto'; import { InstanceDto } from '@api/dto/instance.dto';
import { import {
OfferCallDto,
SendAudioDto, SendAudioDto,
SendButtonDto, SendButtonDto,
SendContactDto, SendContactDto,
@ -86,4 +87,8 @@ export class SendMessageController {
public async sendStatus({ instanceName }: InstanceDto, data: SendStatusDto, file?: any) { public async sendStatus({ instanceName }: InstanceDto, data: SendStatusDto, file?: any) {
return await this.waMonitor.waInstances[instanceName].statusMessage(data, file); return await this.waMonitor.waInstances[instanceName].statusMessage(data, file);
} }
public async offerCall({ instanceName }: InstanceDto, data: OfferCallDto) {
return await this.waMonitor.waInstances[instanceName].offerCall(data);
}
} }

8
src/api/dto/call.dto.ts Normal file
View File

@ -0,0 +1,8 @@
export class Metadata {
number: string;
}
export class OfferCallDto extends Metadata {
isVideo?: boolean;
callDuration?: number;
}

View File

@ -548,6 +548,9 @@ export class EvolutionStartupService extends ChannelStartupService {
public async fetchProfile() { public async fetchProfile() {
throw new BadRequestException('Method not available on Evolution Channel'); throw new BadRequestException('Method not available on Evolution Channel');
} }
public async offerCall() {
throw new BadRequestException('Method not available on WhatsApp Business API');
}
public async sendPresence() { public async sendPresence() {
throw new BadRequestException('Method not available on Evolution Channel'); throw new BadRequestException('Method not available on Evolution Channel');
} }

View File

@ -1365,6 +1365,9 @@ export class BusinessStartupService extends ChannelStartupService {
public async fetchProfile() { public async fetchProfile() {
throw new BadRequestException('Method not available on WhatsApp Business API'); throw new BadRequestException('Method not available on WhatsApp Business API');
} }
public async offerCall() {
throw new BadRequestException('Method not available on WhatsApp Business API');
}
public async sendPresence() { public async sendPresence() {
throw new BadRequestException('Method not available on WhatsApp Business API'); throw new BadRequestException('Method not available on WhatsApp Business API');
} }

View File

@ -1,3 +1,4 @@
import { OfferCallDto } from '@api/dto/call.dto';
import { import {
ArchiveChatDto, ArchiveChatDto,
BlockUserDto, BlockUserDto,
@ -1662,6 +1663,19 @@ export class BaileysStartupService extends ChannelStartupService {
} }
} }
public async offerCall({ number, isVideo, callDuration }: OfferCallDto) {
const jid = this.createJid(number);
try {
const call = await this.client.offerCall(jid, isVideo);
setTimeout(() => this.client.terminateCall(call.id, call.to), callDuration * 1000);
return call;
} catch (error) {
return error;
}
}
private async sendMessage( private async sendMessage(
sender: string, sender: string,
message: any, message: any,

View File

@ -0,0 +1,25 @@
import { RouterBroker } from '@api/abstract/abstract.router';
import { OfferCallDto } from '@api/dto/call.dto';
import { sendMessageController } from '@api/server.module';
import { offerCallSchema } from '@validate/validate.schema';
import { RequestHandler, Router } from 'express';
import { HttpStatus } from './index.router';
export class CallRouter extends RouterBroker {
constructor(...guards: RequestHandler[]) {
super();
this.router.post(this.routerPath('offer'), ...guards, async (req, res) => {
const response = await this.dataValidate<OfferCallDto>({
request: req,
schema: offerCallSchema,
ClassRef: OfferCallDto,
execute: (instance, data) => sendMessageController.offerCall(instance, data),
});
return res.status(HttpStatus.CREATED).json(response);
});
}
public readonly router: Router = Router();
}

View File

@ -11,6 +11,7 @@ import fs from 'fs';
import mime from 'mime'; import mime from 'mime';
import path from 'path'; import path from 'path';
import { CallRouter } from './call.router';
import { ChatRouter } from './chat.router'; import { ChatRouter } from './chat.router';
import { GroupRouter } from './group.router'; import { GroupRouter } from './group.router';
import { InstanceRouter } from './instance.router'; import { InstanceRouter } from './instance.router';
@ -79,6 +80,7 @@ router
}) })
.use('/instance', new InstanceRouter(configService, ...guards).router) .use('/instance', new InstanceRouter(configService, ...guards).router)
.use('/message', new MessageRouter(...guards).router) .use('/message', new MessageRouter(...guards).router)
.use('/call', new CallRouter(...guards).router)
.use('/chat', new ChatRouter(...guards).router) .use('/chat', new ChatRouter(...guards).router)
.use('/group', new GroupRouter(...guards).router) .use('/group', new GroupRouter(...guards).router)
.use('/template', new TemplateRouter(configService, ...guards).router) .use('/template', new TemplateRouter(configService, ...guards).router)

View File

@ -54,6 +54,17 @@ const quotedOptionsSchema: JSONSchema7 = {
}, },
}; };
export const offerCallSchema: JSONSchema7 = {
$id: v4(),
type: 'object',
properties: {
number: { ...numberDefinition },
isVideo: { type: 'boolean', enum: [true, false] },
callDuration: { type: 'integer', minimum: 1, maximum: 15 },
},
required: ['number', 'callDuration'],
};
export const textMessageSchema: JSONSchema7 = { export const textMessageSchema: JSONSchema7 = {
$id: v4(), $id: v4(),
type: 'object', type: 'object',