mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-20 02:06:43 -06:00
new_feature_lottieMessage_healthCheck
This commit is contained in:
parent
5f530e1fcd
commit
855c24f38d
@ -2,7 +2,7 @@ services:
|
|||||||
api:
|
api:
|
||||||
container_name: evolution_api_${ENVIROMNENT}
|
container_name: evolution_api_${ENVIROMNENT}
|
||||||
build: .
|
build: .
|
||||||
#image: evoapicloud/evolution-api:latest
|
image: adaptweb/evolution-api:1.2.1
|
||||||
restart: always
|
restart: always
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
- redis
|
||||||
@ -24,11 +24,11 @@ services:
|
|||||||
- evolution-net
|
- evolution-net
|
||||||
container_name: redis_${ENVIROMNENT}
|
container_name: redis_${ENVIROMNENT}
|
||||||
command: >
|
command: >
|
||||||
redis-server --port 6379 --appendonly yes
|
redis-server --port 11235 --appendonly yes
|
||||||
volumes:
|
volumes:
|
||||||
- evolution_redis:/data
|
- evolution_redis:/data
|
||||||
ports:
|
ports:
|
||||||
- ${REDIS_PORT}:6379
|
- ${REDIS_PORT}:11235
|
||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
container_name: postgres_${ENVIROMNENT}
|
container_name: postgres_${ENVIROMNENT}
|
||||||
@ -38,7 +38,7 @@ services:
|
|||||||
command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"]
|
command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"]
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- ${DATABASE_PORT}:5432
|
- ${DATABASE_PORT}:11234
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=user
|
- POSTGRES_USER=user
|
||||||
- POSTGRES_PASSWORD=pass
|
- POSTGRES_PASSWORD=pass
|
||||||
|
@ -43,7 +43,6 @@ export class ChatController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async fetchProfilePicture({ instanceName }: InstanceDto, data: NumberDto) {
|
public async fetchProfilePicture({ instanceName }: InstanceDto, data: NumberDto) {
|
||||||
console.dir("Fetching profile picture...");
|
|
||||||
return await this.waMonitor.waInstances[instanceName].profilePicture(data.number);
|
return await this.waMonitor.waInstances[instanceName].profilePicture(data.number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
src/api/controllers/health.controller.ts
Normal file
23
src/api/controllers/health.controller.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { WAMonitoringService } from '@api/services/monitor.service';
|
||||||
|
|
||||||
|
import { UnauthorizedException } from '../../exceptions';
|
||||||
|
import { PrismaRepository } from '../repository/repository.service';
|
||||||
|
|
||||||
|
export class HealthController {
|
||||||
|
constructor(
|
||||||
|
private readonly waMonitor: WAMonitoringService,
|
||||||
|
private readonly prismaRepository: PrismaRepository,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public async checkHealth() {
|
||||||
|
const instancesByKey = await this.prismaRepository.instance.findMany();
|
||||||
|
|
||||||
|
if (instancesByKey.length > 0) {
|
||||||
|
const names = instancesByKey.map((instance) => instance.name);
|
||||||
|
|
||||||
|
return this.waMonitor.instanceInfo(names);
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -98,6 +98,7 @@ import makeWASocket, {
|
|||||||
Contact,
|
Contact,
|
||||||
delay,
|
delay,
|
||||||
DisconnectReason,
|
DisconnectReason,
|
||||||
|
downloadContentFromMessage,
|
||||||
downloadMediaMessage,
|
downloadMediaMessage,
|
||||||
fetchLatestBaileysVersion,
|
fetchLatestBaileysVersion,
|
||||||
generateWAMessageFromContent,
|
generateWAMessageFromContent,
|
||||||
@ -1248,6 +1249,7 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
received?.message?.imageMessage ||
|
received?.message?.imageMessage ||
|
||||||
received?.message?.videoMessage ||
|
received?.message?.videoMessage ||
|
||||||
received?.message?.stickerMessage ||
|
received?.message?.stickerMessage ||
|
||||||
|
received?.message?.lottieStickerMessage ||
|
||||||
received?.message?.documentMessage ||
|
received?.message?.documentMessage ||
|
||||||
received?.message?.documentWithCaptionMessage ||
|
received?.message?.documentWithCaptionMessage ||
|
||||||
received?.message?.ptvMessage ||
|
received?.message?.ptvMessage ||
|
||||||
@ -1362,11 +1364,32 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (1/* this.localWebhook.enabled */) {
|
||||||
if (this.localWebhook.enabled) {
|
if (1/* isMedia && this.localWebhook.webhookBase64 */) {
|
||||||
if (isMedia && this.localWebhook.webhookBase64) {
|
|
||||||
try {
|
try {
|
||||||
const buffer = await downloadMediaMessage(
|
let buffer : Buffer = null;
|
||||||
|
console.dir({received}, {depth: null});
|
||||||
|
if ((received.message.stickerMessage && received.message.stickerMessage.url === 'https://web.whatsapp.net')
|
||||||
|
|| (received.message.lottieStickerMessage && received.message.lottieStickerMessage.message.stickerMessage.url)) { /*Fixing broken URLs from sticker messages*/
|
||||||
|
const newUrl = `https://mmg.whatsapp.net${received.message.lottieStickerMessage ? received.message.lottieStickerMessage.message.stickerMessage.directPath : received.message.stickerMessage.directPath }`;
|
||||||
|
|
||||||
|
const stream = await downloadContentFromMessage(
|
||||||
|
{
|
||||||
|
mediaKey: received.message?.stickerMessage?.mediaKey || received.message.lottieStickerMessage?.message?.stickerMessage?.mediaKey,
|
||||||
|
directPath: received.message?.stickerMessage?.directPath || received.message.lottieStickerMessage?.message?.stickerMessage?.directPath,
|
||||||
|
url: newUrl
|
||||||
|
},
|
||||||
|
'sticker',
|
||||||
|
{},
|
||||||
|
)
|
||||||
|
const chunks = [];
|
||||||
|
for await (const chunk of stream) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}
|
||||||
|
buffer = Buffer.concat(chunks);
|
||||||
|
messageRaw.message.url = newUrl;
|
||||||
|
} else {
|
||||||
|
buffer = await downloadMediaMessage(
|
||||||
{ key: received.key, message: received?.message },
|
{ key: received.key, message: received?.message },
|
||||||
'buffer',
|
'buffer',
|
||||||
{},
|
{},
|
||||||
@ -1375,7 +1398,7 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
reuploadRequest: this.client.updateMediaMessage,
|
reuploadRequest: this.client.updateMediaMessage,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
}
|
||||||
messageRaw.message.base64 = buffer ? buffer.toString('base64') : undefined;
|
messageRaw.message.base64 = buffer ? buffer.toString('base64') : undefined;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.error(['Error converting media to base64', error?.message]);
|
this.logger.error(['Error converting media to base64', error?.message]);
|
||||||
@ -1383,6 +1406,7 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.dir({webhookMessage: messageRaw}, {depth: null})
|
||||||
this.logger.log(messageRaw);
|
this.logger.log(messageRaw);
|
||||||
|
|
||||||
this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);
|
this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);
|
||||||
@ -1508,13 +1532,11 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
if (!findMessage) {
|
if (!findMessage) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update.message === null && update.status === undefined) {
|
if (update.message === null && update.status === undefined) {
|
||||||
|
|
||||||
const deletedMessage = {
|
const deletedMessage = {
|
||||||
id: findMessage.id,
|
id: findMessage.id,
|
||||||
instanceId: this.instanceId,
|
instanceId: this.instanceId,
|
||||||
@ -1526,7 +1548,7 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
pushName: findMessage.pushName,
|
pushName: findMessage.pushName,
|
||||||
participant: findMessage.participant,
|
participant: findMessage.participant,
|
||||||
message: findMessage.message,
|
message: findMessage.message,
|
||||||
}
|
};
|
||||||
|
|
||||||
this.sendDataWebhook(Events.MESSAGES_DELETE, deletedMessage);
|
this.sendDataWebhook(Events.MESSAGES_DELETE, deletedMessage);
|
||||||
|
|
||||||
@ -1756,7 +1778,7 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (events['messages.upsert']) {
|
if (events['messages.upsert']) {
|
||||||
const payload = events['messages.upsert'];
|
const payload = events['messages.upsert']
|
||||||
this.messageHandle['messages.upsert'](payload, settings);
|
this.messageHandle['messages.upsert'](payload, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1880,12 +1902,10 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async profilePicture(number: string) {
|
public async profilePicture(number: string) {
|
||||||
console.dir(`converting jid:${number}`);
|
|
||||||
const jid = createJid(number);
|
const jid = createJid(number);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const profilePictureUrl = await this.client.profilePictureUrl(jid, 'image');
|
const profilePictureUrl = await this.client.profilePictureUrl(jid, 'image');
|
||||||
console.dir({ profilePictureUrl });
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
wuid: jid,
|
wuid: jid,
|
||||||
@ -2280,7 +2300,8 @@ export class BaileysStartupService extends ChannelStartupService {
|
|||||||
messageSent?.message?.documentMessage ||
|
messageSent?.message?.documentMessage ||
|
||||||
messageSent?.message?.documentWithCaptionMessage ||
|
messageSent?.message?.documentWithCaptionMessage ||
|
||||||
messageSent?.message?.ptvMessage ||
|
messageSent?.message?.ptvMessage ||
|
||||||
messageSent?.message?.audioMessage;
|
messageSent?.message?.audioMessage ||
|
||||||
|
messageSent?.message?.lottieStickerMessage;
|
||||||
|
|
||||||
if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && !isIntegration) {
|
if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && !isIntegration) {
|
||||||
this.chatwootService.eventWhatsapp(
|
this.chatwootService.eventWhatsapp(
|
||||||
|
@ -1597,6 +1597,7 @@ export class ChatwootService {
|
|||||||
'audioMessage',
|
'audioMessage',
|
||||||
'videoMessage',
|
'videoMessage',
|
||||||
'stickerMessage',
|
'stickerMessage',
|
||||||
|
'lottieStickerMessage',
|
||||||
'viewOnceMessageV2',
|
'viewOnceMessageV2',
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -1651,6 +1652,7 @@ export class ChatwootService {
|
|||||||
extendedTextMessage: msg.extendedTextMessage?.text,
|
extendedTextMessage: msg.extendedTextMessage?.text,
|
||||||
messageContextInfo: msg.messageContextInfo?.stanzaId,
|
messageContextInfo: msg.messageContextInfo?.stanzaId,
|
||||||
stickerMessage: undefined,
|
stickerMessage: undefined,
|
||||||
|
lottieStickerMessage: undefined,
|
||||||
documentMessage: msg.documentMessage?.caption,
|
documentMessage: msg.documentMessage?.caption,
|
||||||
documentWithCaptionMessage: msg.documentWithCaptionMessage?.message?.documentMessage?.caption,
|
documentWithCaptionMessage: msg.documentWithCaptionMessage?.message?.documentMessage?.caption,
|
||||||
audioMessage: msg.audioMessage?.caption,
|
audioMessage: msg.audioMessage?.caption,
|
||||||
|
@ -497,6 +497,7 @@ class ChatwootImport {
|
|||||||
videoMessage: msg.message.videoMessage,
|
videoMessage: msg.message.videoMessage,
|
||||||
audioMessage: msg.message.audioMessage,
|
audioMessage: msg.message.audioMessage,
|
||||||
stickerMessage: msg.message.stickerMessage,
|
stickerMessage: msg.message.stickerMessage,
|
||||||
|
lottieStickerMessage: msg.message.lottieStickerMessage,
|
||||||
templateMessage: msg.message.templateMessage?.hydratedTemplate?.hydratedContentText,
|
templateMessage: msg.message.templateMessage?.hydratedTemplate?.hydratedContentText,
|
||||||
};
|
};
|
||||||
const typeKey = Object.keys(types).find((key) => types[key] !== undefined);
|
const typeKey = Object.keys(types).find((key) => types[key] !== undefined);
|
||||||
@ -531,6 +532,9 @@ class ChatwootImport {
|
|||||||
case 'stickerMessage':
|
case 'stickerMessage':
|
||||||
return '_<Sticker Message>_';
|
return '_<Sticker Message>_';
|
||||||
|
|
||||||
|
case 'lottieStickerMessage':
|
||||||
|
return '_<lottieStickerMessage>_';
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
18
src/api/routes/health.router.ts
Normal file
18
src/api/routes/health.router.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { RequestHandler, Router } from "express";
|
||||||
|
import { RouterBroker } from "../abstract/abstract.router";
|
||||||
|
import { HttpStatus } from "./index.router";
|
||||||
|
import { healthController } from "@api/server.module";
|
||||||
|
|
||||||
|
|
||||||
|
export class HealthRouter extends RouterBroker {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.router
|
||||||
|
.get(this.routerPath('healthz', false), async (req, res) => {
|
||||||
|
await healthController.checkHealth();
|
||||||
|
return res.status(HttpStatus.OK).json({msg: 'healthy'});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly router: Router = Router();
|
||||||
|
}
|
@ -22,6 +22,7 @@ import { MessageRouter } from './sendMessage.router';
|
|||||||
import { SettingsRouter } from './settings.router';
|
import { SettingsRouter } from './settings.router';
|
||||||
import { TemplateRouter } from './template.router';
|
import { TemplateRouter } from './template.router';
|
||||||
import { ViewsRouter } from './view.router';
|
import { ViewsRouter } from './view.router';
|
||||||
|
import { HealthRouter} from './health.router';
|
||||||
|
|
||||||
enum HttpStatus {
|
enum HttpStatus {
|
||||||
OK = 200,
|
OK = 200,
|
||||||
@ -57,6 +58,8 @@ router.get('/assets/*', (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.dir(new HealthRouter().router, { depth: null });
|
||||||
|
|
||||||
router
|
router
|
||||||
.use((req, res, next) => telemetry.collectTelemetry(req, res, next))
|
.use((req, res, next) => telemetry.collectTelemetry(req, res, next))
|
||||||
|
|
||||||
@ -79,6 +82,7 @@ router
|
|||||||
facebookUserToken: process.env.FACEBOOK_USER_TOKEN,
|
facebookUserToken: process.env.FACEBOOK_USER_TOKEN,
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
.use('', new HealthRouter().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('/call', new CallRouter(...guards).router)
|
||||||
|
@ -40,6 +40,7 @@ import { WAMonitoringService } from './services/monitor.service';
|
|||||||
import { ProxyService } from './services/proxy.service';
|
import { ProxyService } from './services/proxy.service';
|
||||||
import { SettingsService } from './services/settings.service';
|
import { SettingsService } from './services/settings.service';
|
||||||
import { TemplateService } from './services/template.service';
|
import { TemplateService } from './services/template.service';
|
||||||
|
import { HealthController } from './controllers/health.controller';
|
||||||
|
|
||||||
const logger = new Logger('WA MODULE');
|
const logger = new Logger('WA MODULE');
|
||||||
|
|
||||||
@ -107,6 +108,9 @@ export const eventManager = new EventManager(prismaRepository, waMonitor);
|
|||||||
export const chatbotController = new ChatbotController(prismaRepository, waMonitor);
|
export const chatbotController = new ChatbotController(prismaRepository, waMonitor);
|
||||||
export const channelController = new ChannelController(prismaRepository, waMonitor);
|
export const channelController = new ChannelController(prismaRepository, waMonitor);
|
||||||
|
|
||||||
|
//Health check
|
||||||
|
export const healthController = new HealthController(waMonitor, prismaRepository);
|
||||||
|
|
||||||
// channels
|
// channels
|
||||||
export const evolutionController = new EvolutionController(prismaRepository, waMonitor);
|
export const evolutionController = new EvolutionController(prismaRepository, waMonitor);
|
||||||
export const metaController = new MetaController(prismaRepository, waMonitor);
|
export const metaController = new MetaController(prismaRepository, waMonitor);
|
||||||
|
@ -552,6 +552,11 @@ export class ChannelStartupService {
|
|||||||
cleanedMessage.message.stickerMessage = {};
|
cleanedMessage.message.stickerMessage = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Limpa LottieStickerMessage
|
||||||
|
if(cleanedMessage.message.lottieStickerMessage) {
|
||||||
|
cleanedMessage.message.lottieStickerMessage = {};
|
||||||
|
}
|
||||||
|
|
||||||
// Limpa documentMessage
|
// Limpa documentMessage
|
||||||
if (cleanedMessage.message.documentMessage) {
|
if (cleanedMessage.message.documentMessage) {
|
||||||
cleanedMessage.message.documentMessage = {
|
cleanedMessage.message.documentMessage = {
|
||||||
|
@ -139,6 +139,7 @@ export const TypeMediaMessage = [
|
|||||||
'audioMessage',
|
'audioMessage',
|
||||||
'videoMessage',
|
'videoMessage',
|
||||||
'stickerMessage',
|
'stickerMessage',
|
||||||
|
'lottieStickerMessage',
|
||||||
'ptvMessage',
|
'ptvMessage',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user