feat: Add support for splitMessages and timePerChar in Integrations

This commit is contained in:
Davidson Gomes 2024-10-11 07:45:50 -03:00
parent 29e2cfaf96
commit d50da79f22
17 changed files with 566 additions and 73 deletions

View File

@ -5,6 +5,7 @@
* Fake Call function * Fake Call function
* Added unreadMessages to chats * Added unreadMessages to chats
* Pusher event integration * Pusher event integration
* Add support for splitMessages and timePerChar in Integrations
### Fixed ### Fixed

View File

@ -413,6 +413,8 @@ model OpenaiBot {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -436,6 +438,8 @@ model OpenaiSetting {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
speechToText Boolean? @default(false) speechToText Boolean? @default(false)
createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
@ -475,6 +479,8 @@ model Dify {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -496,6 +502,8 @@ model DifySetting {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback Dify? @relation(fields: [difyIdFallback], references: [id]) Fallback Dify? @relation(fields: [difyIdFallback], references: [id])
@ -519,6 +527,8 @@ model EvolutionBot {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -540,6 +550,8 @@ model EvolutionBotSetting {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback EvolutionBot? @relation(fields: [botIdFallback], references: [id]) Fallback EvolutionBot? @relation(fields: [botIdFallback], references: [id])
@ -563,6 +575,8 @@ model Flowise {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -584,6 +598,8 @@ model FlowiseSetting {
keepOpen Boolean? @default(false) keepOpen Boolean? @default(false)
debounceTime Int? @db.Int debounceTime Int? @db.Int
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false)
timePerChar Int? @default(50) @db.Int
createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp createdAt DateTime? @default(dbgenerated("CURRENT_TIMESTAMP")) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback Flowise? @relation(fields: [flowiseIdFallback], references: [id]) Fallback Flowise? @relation(fields: [flowiseIdFallback], references: [id])

View File

@ -395,6 +395,8 @@ model OpenaiBot {
stopBotFromMe Boolean? @default(false) @db.Boolean stopBotFromMe Boolean? @default(false) @db.Boolean
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
ignoreJids Json? ignoreJids Json?
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
@ -438,6 +440,8 @@ model OpenaiSetting {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
speechToText Boolean? @default(false) @db.Boolean speechToText Boolean? @default(false) @db.Boolean
createdAt DateTime? @default(now()) @db.Timestamp createdAt DateTime? @default(now()) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
@ -477,6 +481,8 @@ model Dify {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -498,6 +504,8 @@ model DifySetting {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
createdAt DateTime? @default(now()) @db.Timestamp createdAt DateTime? @default(now()) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback Dify? @relation(fields: [difyIdFallback], references: [id]) Fallback Dify? @relation(fields: [difyIdFallback], references: [id])
@ -521,6 +529,8 @@ model EvolutionBot {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -542,6 +552,8 @@ model EvolutionBotSetting {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
createdAt DateTime? @default(now()) @db.Timestamp createdAt DateTime? @default(now()) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback EvolutionBot? @relation(fields: [botIdFallback], references: [id]) Fallback EvolutionBot? @relation(fields: [botIdFallback], references: [id])
@ -565,6 +577,8 @@ model Flowise {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
triggerType TriggerType? triggerType TriggerType?
triggerOperator TriggerOperator? triggerOperator TriggerOperator?
triggerValue String? triggerValue String?
@ -586,6 +600,8 @@ model FlowiseSetting {
keepOpen Boolean? @default(false) @db.Boolean keepOpen Boolean? @default(false) @db.Boolean
debounceTime Int? @db.Integer debounceTime Int? @db.Integer
ignoreJids Json? ignoreJids Json?
splitMessages Boolean? @default(false) @db.Boolean
timePerChar Int? @default(50) @db.Integer
createdAt DateTime? @default(now()) @db.Timestamp createdAt DateTime? @default(now()) @db.Timestamp
updatedAt DateTime @updatedAt @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp
Fallback Flowise? @relation(fields: [flowiseIdFallback], references: [id]) Fallback Flowise? @relation(fields: [flowiseIdFallback], references: [id])

View File

@ -54,7 +54,9 @@ export class DifyController extends ChatbotController implements ChatbotControll
!data.stopBotFromMe || !data.stopBotFromMe ||
!data.keepOpen || !data.keepOpen ||
!data.debounceTime || !data.debounceTime ||
!data.ignoreJids !data.ignoreJids ||
!data.splitMessages ||
!data.timePerChar
) { ) {
const defaultSettingCheck = await this.settingsRepository.findFirst({ const defaultSettingCheck = await this.settingsRepository.findFirst({
where: { where: {
@ -71,6 +73,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false; if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false;
if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0; if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0;
if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || []; if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || [];
if (!data.splitMessages) data.splitMessages = defaultSettingCheck?.splitMessages || false;
if (!data.timePerChar) data.timePerChar = defaultSettingCheck?.timePerChar || 0;
if (!defaultSettingCheck) { if (!defaultSettingCheck) {
await this.settings(instance, { await this.settings(instance, {
@ -83,6 +87,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
keepOpen: data.keepOpen, keepOpen: data.keepOpen,
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}); });
} }
} }
@ -168,6 +174,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -349,6 +357,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -438,6 +448,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
difyIdFallback: data.difyIdFallback, difyIdFallback: data.difyIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -452,6 +464,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
debounceTime: updateSettings.debounceTime, debounceTime: updateSettings.debounceTime,
difyIdFallback: updateSettings.difyIdFallback, difyIdFallback: updateSettings.difyIdFallback,
ignoreJids: updateSettings.ignoreJids, ignoreJids: updateSettings.ignoreJids,
splitMessages: updateSettings.splitMessages,
timePerChar: updateSettings.timePerChar,
}; };
} }
@ -468,6 +482,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
difyIdFallback: data.difyIdFallback, difyIdFallback: data.difyIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
instanceId: instanceId, instanceId: instanceId,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -482,6 +498,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
debounceTime: newSetttings.debounceTime, debounceTime: newSetttings.debounceTime,
difyIdFallback: newSetttings.difyIdFallback, difyIdFallback: newSetttings.difyIdFallback,
ignoreJids: newSetttings.ignoreJids, ignoreJids: newSetttings.ignoreJids,
splitMessages: newSetttings.splitMessages,
timePerChar: newSetttings.timePerChar,
}; };
} catch (error) { } catch (error) {
this.logger.error(error); this.logger.error(error);
@ -520,6 +538,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
stopBotFromMe: false, stopBotFromMe: false,
keepOpen: false, keepOpen: false,
ignoreJids: [], ignoreJids: [],
splitMessages: false,
timePerChar: 0,
difyIdFallback: '', difyIdFallback: '',
fallback: null, fallback: null,
}; };
@ -534,6 +554,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
stopBotFromMe: settings.stopBotFromMe, stopBotFromMe: settings.stopBotFromMe,
keepOpen: settings.keepOpen, keepOpen: settings.keepOpen,
ignoreJids: settings.ignoreJids, ignoreJids: settings.ignoreJids,
splitMessages: settings.splitMessages,
timePerChar: settings.timePerChar,
difyIdFallback: settings.difyIdFallback, difyIdFallback: settings.difyIdFallback,
fallback: settings.Fallback, fallback: settings.Fallback,
}; };
@ -763,6 +785,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
let keepOpen = findBot?.keepOpen; let keepOpen = findBot?.keepOpen;
let debounceTime = findBot?.debounceTime; let debounceTime = findBot?.debounceTime;
let ignoreJids = findBot?.ignoreJids; let ignoreJids = findBot?.ignoreJids;
let splitMessages = findBot?.splitMessages;
let timePerChar = findBot?.timePerChar;
if (!expire) expire = settings.expire; if (!expire) expire = settings.expire;
if (!keywordFinish) keywordFinish = settings.keywordFinish; if (!keywordFinish) keywordFinish = settings.keywordFinish;
@ -771,8 +795,10 @@ export class DifyController extends ChatbotController implements ChatbotControll
if (!listeningFromMe) listeningFromMe = settings.listeningFromMe; if (!listeningFromMe) listeningFromMe = settings.listeningFromMe;
if (!stopBotFromMe) stopBotFromMe = settings.stopBotFromMe; if (!stopBotFromMe) stopBotFromMe = settings.stopBotFromMe;
if (!keepOpen) keepOpen = settings.keepOpen; if (!keepOpen) keepOpen = settings.keepOpen;
if (!debounceTime) debounceTime = settings.debounceTime; if (debounceTime === undefined || debounceTime === null) debounceTime = settings.debounceTime;
if (!ignoreJids) ignoreJids = settings.ignoreJids; if (!ignoreJids) ignoreJids = settings.ignoreJids;
if (splitMessages === undefined || splitMessages === null) splitMessages = settings?.splitMessages ?? false;
if (timePerChar === undefined || timePerChar === null) timePerChar = settings?.timePerChar ?? 0;
const key = msg.key as { const key = msg.key as {
id: string; id: string;
@ -819,6 +845,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
debouncedContent, debouncedContent,
msg?.pushName, msg?.pushName,
@ -841,6 +869,8 @@ export class DifyController extends ChatbotController implements ChatbotControll
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
content, content,
msg?.pushName, msg?.pushName,

View File

@ -18,6 +18,8 @@ export class DifyDto {
triggerOperator?: TriggerOperator; triggerOperator?: TriggerOperator;
triggerValue?: string; triggerValue?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }
export class DifySettingDto { export class DifySettingDto {
@ -31,4 +33,6 @@ export class DifySettingDto {
debounceTime?: number; debounceTime?: number;
difyIdFallback?: string; difyIdFallback?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }

View File

@ -382,16 +382,54 @@ export class DifyService {
} }
if (mediaType) { if (mediaType) {
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
textBuffer = ''; if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
if (mediaType === 'audio') { if (mediaType === 'audio') {
@ -428,15 +466,53 @@ export class DifyService {
} }
} }
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
}
} }
sendTelemetry('/message/sendText'); sendTelemetry('/message/sendText');

View File

@ -41,6 +41,8 @@ export const difySchema: JSONSchema7 = {
keepOpen: { type: 'boolean' }, keepOpen: { type: 'boolean' },
debounceTime: { type: 'integer' }, debounceTime: { type: 'integer' },
ignoreJids: { type: 'array', items: { type: 'string' } }, ignoreJids: { type: 'array', items: { type: 'string' } },
splitMessages: { type: 'boolean' },
timePerChar: { type: 'integer' },
}, },
required: ['enabled', 'botType', 'triggerType'], required: ['enabled', 'botType', 'triggerType'],
...isNotEmpty('enabled', 'botType', 'triggerType'), ...isNotEmpty('enabled', 'botType', 'triggerType'),
@ -71,6 +73,8 @@ export const difySettingSchema: JSONSchema7 = {
debounceTime: { type: 'integer' }, debounceTime: { type: 'integer' },
ignoreJids: { type: 'array', items: { type: 'string' } }, ignoreJids: { type: 'array', items: { type: 'string' } },
difyIdFallback: { type: 'string' }, difyIdFallback: { type: 'string' },
splitMessages: { type: 'boolean' },
timePerChar: { type: 'integer' },
}, },
required: [ required: [
'expire', 'expire',
@ -82,6 +86,8 @@ export const difySettingSchema: JSONSchema7 = {
'keepOpen', 'keepOpen',
'debounceTime', 'debounceTime',
'ignoreJids', 'ignoreJids',
'splitMessages',
'timePerChar',
], ],
...isNotEmpty( ...isNotEmpty(
'expire', 'expire',
@ -93,6 +99,8 @@ export const difySettingSchema: JSONSchema7 = {
'keepOpen', 'keepOpen',
'debounceTime', 'debounceTime',
'ignoreJids', 'ignoreJids',
'splitMessages',
'timePerChar',
), ),
}; };

View File

@ -50,7 +50,9 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
!data.stopBotFromMe || !data.stopBotFromMe ||
!data.keepOpen || !data.keepOpen ||
!data.debounceTime || !data.debounceTime ||
!data.ignoreJids !data.ignoreJids ||
!data.splitMessages ||
!data.timePerChar
) { ) {
const defaultSettingCheck = await this.settingsRepository.findFirst({ const defaultSettingCheck = await this.settingsRepository.findFirst({
where: { where: {
@ -67,6 +69,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false; if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false;
if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0; if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0;
if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || []; if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || [];
if (!data.splitMessages) data.splitMessages = defaultSettingCheck?.splitMessages || false;
if (!data.timePerChar) data.timePerChar = defaultSettingCheck?.timePerChar || 0;
if (!defaultSettingCheck) { if (!defaultSettingCheck) {
await this.settings(instance, { await this.settings(instance, {
@ -79,6 +83,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
keepOpen: data.keepOpen, keepOpen: data.keepOpen,
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}); });
} }
} }
@ -162,6 +168,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -335,6 +343,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -420,6 +430,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
botIdFallback: data.botIdFallback, botIdFallback: data.botIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -434,6 +446,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
debounceTime: updateSettings.debounceTime, debounceTime: updateSettings.debounceTime,
botIdFallback: updateSettings.botIdFallback, botIdFallback: updateSettings.botIdFallback,
ignoreJids: updateSettings.ignoreJids, ignoreJids: updateSettings.ignoreJids,
splitMessages: updateSettings.splitMessages,
timePerChar: updateSettings.timePerChar,
}; };
} }
@ -449,6 +463,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
botIdFallback: data.botIdFallback, botIdFallback: data.botIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
instanceId: instanceId, instanceId: instanceId,
}, },
}); });
@ -464,6 +480,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
debounceTime: newSetttings.debounceTime, debounceTime: newSetttings.debounceTime,
botIdFallback: newSetttings.botIdFallback, botIdFallback: newSetttings.botIdFallback,
ignoreJids: newSetttings.ignoreJids, ignoreJids: newSetttings.ignoreJids,
splitMessages: newSetttings.splitMessages,
timePerChar: newSetttings.timePerChar,
}; };
} catch (error) { } catch (error) {
this.logger.error(error); this.logger.error(error);
@ -500,6 +518,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
stopBotFromMe: false, stopBotFromMe: false,
keepOpen: false, keepOpen: false,
ignoreJids: [], ignoreJids: [],
splitMessages: false,
timePerChar: 0,
botIdFallback: '', botIdFallback: '',
fallback: null, fallback: null,
}; };
@ -514,6 +534,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
stopBotFromMe: settings.stopBotFromMe, stopBotFromMe: settings.stopBotFromMe,
keepOpen: settings.keepOpen, keepOpen: settings.keepOpen,
ignoreJids: settings.ignoreJids, ignoreJids: settings.ignoreJids,
splitMessages: settings.splitMessages,
timePerChar: settings.timePerChar,
botIdFallback: settings.botIdFallback, botIdFallback: settings.botIdFallback,
fallback: settings.Fallback, fallback: settings.Fallback,
}; };
@ -735,6 +757,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
let keepOpen = findBot?.keepOpen; let keepOpen = findBot?.keepOpen;
let debounceTime = findBot?.debounceTime; let debounceTime = findBot?.debounceTime;
let ignoreJids = findBot?.ignoreJids; let ignoreJids = findBot?.ignoreJids;
let splitMessages = findBot?.splitMessages;
let timePerChar = findBot?.timePerChar;
if (!expire) expire = settings.expire; if (!expire) expire = settings.expire;
if (!keywordFinish) keywordFinish = settings.keywordFinish; if (!keywordFinish) keywordFinish = settings.keywordFinish;
@ -745,6 +769,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
if (!keepOpen) keepOpen = settings.keepOpen; if (!keepOpen) keepOpen = settings.keepOpen;
if (!debounceTime) debounceTime = settings.debounceTime; if (!debounceTime) debounceTime = settings.debounceTime;
if (!ignoreJids) ignoreJids = settings.ignoreJids; if (!ignoreJids) ignoreJids = settings.ignoreJids;
if (splitMessages === undefined || splitMessages === null) splitMessages = settings?.splitMessages ?? false;
if (timePerChar === undefined || timePerChar === null) timePerChar = settings?.timePerChar ?? 0;
const key = msg.key as { const key = msg.key as {
id: string; id: string;
@ -791,6 +817,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
debouncedContent, debouncedContent,
msg?.pushName, msg?.pushName,
@ -813,6 +841,8 @@ export class EvolutionBotController extends ChatbotController implements Chatbot
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
content, content,
msg?.pushName, msg?.pushName,

View File

@ -17,6 +17,8 @@ export class EvolutionBotDto {
triggerOperator?: TriggerOperator; triggerOperator?: TriggerOperator;
triggerValue?: string; triggerValue?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }
export class EvolutionBotSettingDto { export class EvolutionBotSettingDto {
@ -30,4 +32,6 @@ export class EvolutionBotSettingDto {
debounceTime?: number; debounceTime?: number;
botIdFallback?: string; botIdFallback?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }

View File

@ -143,16 +143,54 @@ export class EvolutionBotService {
} }
if (mediaType) { if (mediaType) {
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
textBuffer = ''; if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
if (mediaType === 'audio') { if (mediaType === 'audio') {
@ -189,15 +227,54 @@ export class EvolutionBotService {
} }
} }
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
sendTelemetry('/message/sendText'); sendTelemetry('/message/sendText');

View File

@ -40,6 +40,8 @@ export const evolutionBotSchema: JSONSchema7 = {
keepOpen: { type: 'boolean' }, keepOpen: { type: 'boolean' },
debounceTime: { type: 'integer' }, debounceTime: { type: 'integer' },
ignoreJids: { type: 'array', items: { type: 'string' } }, ignoreJids: { type: 'array', items: { type: 'string' } },
splitMessages: { type: 'boolean' },
timePerChar: { type: 'integer' },
}, },
required: ['enabled', 'apiUrl', 'triggerType'], required: ['enabled', 'apiUrl', 'triggerType'],
...isNotEmpty('enabled', 'apiUrl', 'triggerType'), ...isNotEmpty('enabled', 'apiUrl', 'triggerType'),
@ -70,6 +72,8 @@ export const evolutionBotSettingSchema: JSONSchema7 = {
debounceTime: { type: 'integer' }, debounceTime: { type: 'integer' },
ignoreJids: { type: 'array', items: { type: 'string' } }, ignoreJids: { type: 'array', items: { type: 'string' } },
botIdFallback: { type: 'string' }, botIdFallback: { type: 'string' },
splitMessages: { type: 'boolean' },
timePerChar: { type: 'integer' },
}, },
required: [ required: [
'expire', 'expire',
@ -81,6 +85,8 @@ export const evolutionBotSettingSchema: JSONSchema7 = {
'keepOpen', 'keepOpen',
'debounceTime', 'debounceTime',
'ignoreJids', 'ignoreJids',
'splitMessages',
'timePerChar',
], ],
...isNotEmpty( ...isNotEmpty(
'expire', 'expire',
@ -92,6 +98,8 @@ export const evolutionBotSettingSchema: JSONSchema7 = {
'keepOpen', 'keepOpen',
'debounceTime', 'debounceTime',
'ignoreJids', 'ignoreJids',
'splitMessages',
'timePerChar',
), ),
}; };

View File

@ -50,7 +50,9 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
!data.stopBotFromMe || !data.stopBotFromMe ||
!data.keepOpen || !data.keepOpen ||
!data.debounceTime || !data.debounceTime ||
!data.ignoreJids !data.ignoreJids ||
!data.splitMessages ||
!data.timePerChar
) { ) {
const defaultSettingCheck = await this.settingsRepository.findFirst({ const defaultSettingCheck = await this.settingsRepository.findFirst({
where: { where: {
@ -67,6 +69,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false; if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false;
if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0; if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0;
if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || []; if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || [];
if (!data.splitMessages) data.splitMessages = defaultSettingCheck?.splitMessages || false;
if (!data.timePerChar) data.timePerChar = defaultSettingCheck?.timePerChar || 0;
if (!defaultSettingCheck) { if (!defaultSettingCheck) {
await this.settings(instance, { await this.settings(instance, {
@ -79,6 +83,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
keepOpen: data.keepOpen, keepOpen: data.keepOpen,
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}); });
} }
} }
@ -162,6 +168,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -335,6 +343,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -420,6 +430,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
flowiseIdFallback: data.flowiseIdFallback, flowiseIdFallback: data.flowiseIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -434,6 +446,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
debounceTime: updateSettings.debounceTime, debounceTime: updateSettings.debounceTime,
flowiseIdFallback: updateSettings.flowiseIdFallback, flowiseIdFallback: updateSettings.flowiseIdFallback,
ignoreJids: updateSettings.ignoreJids, ignoreJids: updateSettings.ignoreJids,
splitMessages: updateSettings.splitMessages,
timePerChar: updateSettings.timePerChar,
}; };
} }
@ -450,6 +464,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
flowiseIdFallback: data.flowiseIdFallback, flowiseIdFallback: data.flowiseIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
instanceId: instanceId, instanceId: instanceId,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -464,6 +480,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
debounceTime: newSetttings.debounceTime, debounceTime: newSetttings.debounceTime,
flowiseIdFallback: newSetttings.flowiseIdFallback, flowiseIdFallback: newSetttings.flowiseIdFallback,
ignoreJids: newSetttings.ignoreJids, ignoreJids: newSetttings.ignoreJids,
splitMessages: newSetttings.splitMessages,
timePerChar: newSetttings.timePerChar,
}; };
} catch (error) { } catch (error) {
this.logger.error(error); this.logger.error(error);
@ -500,6 +518,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
stopBotFromMe: false, stopBotFromMe: false,
keepOpen: false, keepOpen: false,
ignoreJids: [], ignoreJids: [],
splitMessages: false,
timePerChar: 0,
flowiseIdFallback: '', flowiseIdFallback: '',
fallback: null, fallback: null,
}; };
@ -514,6 +534,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
stopBotFromMe: settings.stopBotFromMe, stopBotFromMe: settings.stopBotFromMe,
keepOpen: settings.keepOpen, keepOpen: settings.keepOpen,
ignoreJids: settings.ignoreJids, ignoreJids: settings.ignoreJids,
splitMessages: settings.splitMessages,
timePerChar: settings.timePerChar,
flowiseIdFallback: settings.flowiseIdFallback, flowiseIdFallback: settings.flowiseIdFallback,
fallback: settings.Fallback, fallback: settings.Fallback,
}; };
@ -735,6 +757,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
let keepOpen = findBot?.keepOpen; let keepOpen = findBot?.keepOpen;
let debounceTime = findBot?.debounceTime; let debounceTime = findBot?.debounceTime;
let ignoreJids = findBot?.ignoreJids; let ignoreJids = findBot?.ignoreJids;
let splitMessages = findBot?.splitMessages;
let timePerChar = findBot?.timePerChar;
if (!expire) expire = settings.expire; if (!expire) expire = settings.expire;
if (!keywordFinish) keywordFinish = settings.keywordFinish; if (!keywordFinish) keywordFinish = settings.keywordFinish;
@ -745,6 +769,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
if (!keepOpen) keepOpen = settings.keepOpen; if (!keepOpen) keepOpen = settings.keepOpen;
if (!debounceTime) debounceTime = settings.debounceTime; if (!debounceTime) debounceTime = settings.debounceTime;
if (!ignoreJids) ignoreJids = settings.ignoreJids; if (!ignoreJids) ignoreJids = settings.ignoreJids;
if (splitMessages === undefined || splitMessages === null) splitMessages = settings?.splitMessages ?? false;
if (timePerChar === undefined || timePerChar === null) timePerChar = settings?.timePerChar ?? 0;
const key = msg.key as { const key = msg.key as {
id: string; id: string;
@ -791,6 +817,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
debouncedContent, debouncedContent,
msg?.pushName, msg?.pushName,
@ -813,6 +841,8 @@ export class FlowiseController extends ChatbotController implements ChatbotContr
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
content, content,
msg?.pushName, msg?.pushName,

View File

@ -17,6 +17,8 @@ export class FlowiseDto {
triggerOperator?: TriggerOperator; triggerOperator?: TriggerOperator;
triggerValue?: string; triggerValue?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }
export class FlowiseSettingDto { export class FlowiseSettingDto {
@ -30,4 +32,6 @@ export class FlowiseSettingDto {
debounceTime?: number; debounceTime?: number;
flowiseIdFallback?: string; flowiseIdFallback?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }

View File

@ -143,16 +143,54 @@ export class FlowiseService {
} }
if (mediaType) { if (mediaType) {
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
textBuffer = ''; if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
if (mediaType === 'audio') { if (mediaType === 'audio') {
@ -189,15 +227,54 @@ export class FlowiseService {
} }
} }
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
sendTelemetry('/message/sendText'); sendTelemetry('/message/sendText');

View File

@ -191,7 +191,9 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
!data.stopBotFromMe || !data.stopBotFromMe ||
!data.keepOpen || !data.keepOpen ||
!data.debounceTime || !data.debounceTime ||
!data.ignoreJids !data.ignoreJids ||
!data.splitMessages ||
!data.timePerChar
) { ) {
const defaultSettingCheck = await this.settingsRepository.findFirst({ const defaultSettingCheck = await this.settingsRepository.findFirst({
where: { where: {
@ -209,6 +211,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false; if (!data.keepOpen) data.keepOpen = defaultSettingCheck?.keepOpen || false;
if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0; if (!data.debounceTime) data.debounceTime = defaultSettingCheck?.debounceTime || 0;
if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || []; if (!data.ignoreJids) data.ignoreJids = defaultSettingCheck?.ignoreJids || [];
if (!data.splitMessages) data.splitMessages = defaultSettingCheck?.splitMessages || false;
if (!data.timePerChar) data.timePerChar = defaultSettingCheck?.timePerChar || 0;
if (!data.openaiCredsId) { if (!data.openaiCredsId) {
throw new Error('Openai Creds Id is required'); throw new Error('Openai Creds Id is required');
@ -226,6 +230,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
keepOpen: data.keepOpen, keepOpen: data.keepOpen,
debounceTime: data.debounceTime, debounceTime: data.debounceTime,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}); });
} }
} }
@ -338,6 +344,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -546,6 +554,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
triggerOperator: data.triggerOperator, triggerOperator: data.triggerOperator,
triggerValue: data.triggerValue, triggerValue: data.triggerValue,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -637,6 +647,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
speechToText: data.speechToText, speechToText: data.speechToText,
openaiIdFallback: data.openaiIdFallback, openaiIdFallback: data.openaiIdFallback,
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -653,6 +665,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
speechToText: updateSettings.speechToText, speechToText: updateSettings.speechToText,
openaiIdFallback: updateSettings.openaiIdFallback, openaiIdFallback: updateSettings.openaiIdFallback,
ignoreJids: updateSettings.ignoreJids, ignoreJids: updateSettings.ignoreJids,
splitMessages: updateSettings.splitMessages,
timePerChar: updateSettings.timePerChar,
}; };
} }
@ -671,6 +685,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
ignoreJids: data.ignoreJids, ignoreJids: data.ignoreJids,
speechToText: data.speechToText, speechToText: data.speechToText,
instanceId: instanceId, instanceId: instanceId,
splitMessages: data.splitMessages,
timePerChar: data.timePerChar,
}, },
}); });
@ -686,6 +702,9 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
debounceTime: newSetttings.debounceTime, debounceTime: newSetttings.debounceTime,
openaiIdFallback: newSetttings.openaiIdFallback, openaiIdFallback: newSetttings.openaiIdFallback,
ignoreJids: newSetttings.ignoreJids, ignoreJids: newSetttings.ignoreJids,
speechToText: newSetttings.speechToText,
splitMessages: newSetttings.splitMessages,
timePerChar: newSetttings.timePerChar,
}; };
} catch (error) { } catch (error) {
this.logger.error(error); this.logger.error(error);
@ -726,6 +745,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
stopBotFromMe: false, stopBotFromMe: false,
keepOpen: false, keepOpen: false,
ignoreJids: [], ignoreJids: [],
splitMessages: false,
timePerChar: 0,
openaiIdFallback: null, openaiIdFallback: null,
speechToText: false, speechToText: false,
fallback: null, fallback: null,
@ -742,6 +763,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
stopBotFromMe: settings.stopBotFromMe, stopBotFromMe: settings.stopBotFromMe,
keepOpen: settings.keepOpen, keepOpen: settings.keepOpen,
ignoreJids: settings.ignoreJids, ignoreJids: settings.ignoreJids,
splitMessages: settings.splitMessages,
timePerChar: settings.timePerChar,
openaiIdFallback: settings.openaiIdFallback, openaiIdFallback: settings.openaiIdFallback,
speechToText: settings.speechToText, speechToText: settings.speechToText,
fallback: settings.Fallback, fallback: settings.Fallback,
@ -972,6 +995,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
let keepOpen = findBot?.keepOpen; let keepOpen = findBot?.keepOpen;
let debounceTime = findBot?.debounceTime; let debounceTime = findBot?.debounceTime;
let ignoreJids = findBot?.ignoreJids; let ignoreJids = findBot?.ignoreJids;
let splitMessages = findBot?.splitMessages;
let timePerChar = findBot?.timePerChar;
if (!expire) expire = settings.expire; if (!expire) expire = settings.expire;
if (!keywordFinish) keywordFinish = settings.keywordFinish; if (!keywordFinish) keywordFinish = settings.keywordFinish;
@ -982,6 +1007,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
if (!keepOpen) keepOpen = settings.keepOpen; if (!keepOpen) keepOpen = settings.keepOpen;
if (!debounceTime) debounceTime = settings.debounceTime; if (!debounceTime) debounceTime = settings.debounceTime;
if (!ignoreJids) ignoreJids = settings.ignoreJids; if (!ignoreJids) ignoreJids = settings.ignoreJids;
if (splitMessages === undefined || splitMessages === null) splitMessages = settings?.splitMessages ?? false;
if (timePerChar === undefined || timePerChar === null) timePerChar = settings?.timePerChar ?? 0;
const key = msg.key as { const key = msg.key as {
id: string; id: string;
@ -1030,6 +1057,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
debouncedContent, debouncedContent,
); );
@ -1053,6 +1082,8 @@ export class OpenaiController extends ChatbotController implements ChatbotContro
keepOpen, keepOpen,
debounceTime, debounceTime,
ignoreJids, ignoreJids,
splitMessages,
timePerChar,
}, },
debouncedContent, debouncedContent,
); );

View File

@ -29,6 +29,8 @@ export class OpenaiDto {
triggerOperator?: TriggerOperator; triggerOperator?: TriggerOperator;
triggerValue?: string; triggerValue?: string;
ignoreJids?: any; ignoreJids?: any;
splitMessages?: boolean;
timePerChar?: number;
} }
export class OpenaiSettingDto { export class OpenaiSettingDto {
@ -44,4 +46,6 @@ export class OpenaiSettingDto {
openaiIdFallback?: string; openaiIdFallback?: string;
ignoreJids?: any; ignoreJids?: any;
speechToText?: boolean; speechToText?: boolean;
splitMessages?: boolean;
timePerChar?: number;
} }

View File

@ -188,16 +188,54 @@ export class OpenaiService {
} }
if (mediaType) { if (mediaType) {
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
textBuffer = ''; if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
if (mediaType === 'audio') { if (mediaType === 'audio') {
@ -234,15 +272,54 @@ export class OpenaiService {
} }
} }
const splitMessages = settings.splitMessages ?? false;
const timePerChar = settings.timePerChar ?? 0;
const minDelay = 1000;
const maxDelay = 20000;
if (textBuffer.trim()) { if (textBuffer.trim()) {
await instance.textMessage( if (splitMessages) {
{ const multipleMessages = textBuffer.trim().split('\n\n');
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000, for (let index = 0; index < multipleMessages.length; index++) {
text: textBuffer.trim(), const message = multipleMessages[index];
},
false, const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);
);
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.presenceSubscribe(remoteJid);
await instance.client.sendPresenceUpdate('composing', remoteJid);
}
await new Promise<void>((resolve) => {
setTimeout(async () => {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: message,
},
false,
);
resolve();
}, delay);
});
if (instance.integration === Integration.WHATSAPP_BAILEYS) {
await instance.client.sendPresenceUpdate('paused', remoteJid);
}
}
} else {
await instance.textMessage(
{
number: remoteJid.split('@')[0],
delay: settings?.delayMessage || 1000,
text: textBuffer.trim(),
},
false,
);
textBuffer = '';
}
} }
sendTelemetry('/message/sendText'); sendTelemetry('/message/sendText');