plazbot-cli
Version:
CLI para Plazbot SDK
83 lines (70 loc) • 3.09 kB
text/typescript
import { Command } from 'commander';
import { Message } from 'plazbot';
import { getStoredCredentials } from '../../utils/credentials';
import { logger } from '../../utils/logger';
import { createSpinner } from '../../utils/ui';
export const sendTemplateCommand = new Command('send-template')
.description('Envia un mensaje de template de WhatsApp con variables')
.requiredOption('-p, --phone <number>', 'Numero de telefono (con codigo de pais)')
.requiredOption('-t, --template <name>', 'Nombre del template')
.option('--var <vars...>', 'Variables del body (formato: name=valor)')
.option('--header-var <vars...>', 'Variables del header (formato: name=valor)')
.option('--file-url <url>', 'URL del archivo adjunto')
.option('--file-name <name>', 'Nombre del archivo adjunto')
.option('--dev', 'Usar ambiente de desarrollo', false)
.action(async (options: any) => {
try {
const credentials = await getStoredCredentials();
const messageClient = new Message({
workspaceId: credentials.workspace,
apiKey: credentials.apiKey,
zone: credentials.zone,
...(options.dev && { customUrl: "http://localhost:5090" })
});
// Parsear variables
const variablesBody = parseVariables(options.var);
const variablesHeader = parseVariables(options.headerVar);
// Archivo adjunto
const file = options.fileUrl ? {
fileUrl: options.fileUrl,
fileName: options.fileName || 'archivo',
} : undefined;
logger.title('Enviando template WhatsApp');
logger.label('Destino', options.phone);
logger.label('Template', options.template);
if (variablesBody.length > 0) {
logger.label('Variables body', variablesBody.map(v => `${v.variable}=${v.value}`).join(', '));
}
if (variablesHeader.length > 0) {
logger.label('Variables header', variablesHeader.map(v => `${v.variable}=${v.value}`).join(', '));
}
if (file) {
logger.label('Archivo', file.fileUrl);
}
const spinner = createSpinner('Enviando...');
spinner.start();
const params: any = {
to: options.phone,
template: options.template,
};
if (variablesBody.length > 0) params.variablesBody = variablesBody;
if (variablesHeader.length > 0) params.variablesHeader = variablesHeader;
if (file) params.file = file;
const response = await messageClient.onConversation(params);
spinner.succeed('Template enviado exitosamente');
if (options.dev) {
logger.warning('Ambiente: desarrollo');
}
} catch (error: unknown) {
const message = (error as Error)?.message || 'Error desconocido al enviar el template';
logger.error(message);
process.exit(1);
}
});
function parseVariables(vars: string[] | undefined): { variable: string; value: string }[] {
if (!vars) return [];
return vars.map(v => {
const [variable, ...rest] = v.split('=');
return { variable: variable.trim(), value: rest.join('=').trim() };
}).filter(v => v.variable && v.value);
}