Comandos Serverless - Dailybot Desarrolladores
Escribe y ejecuta código JavaScript serverless directamente en Dailybot. Construye comandos personalizados sin desplegar infraestructura.
Comandos de Código Serverless
Los comandos de código serverless te permiten escribir y ejecutar código JavaScript directamente dentro de Dailybot — sin necesidad de infraestructura de servidores. Tu código se ejecuta en el entorno seguro de Dailybot y puede hacer peticiones HTTP, acceder a almacenamiento persistente y devolver respuestas interactivas.
Ejecutar un Comando
Los comandos serverless se pueden activar de tres formas:
- Activación en Chat — Los usuarios escriben el comando directamente en DMs o canales
- Activación por Workflow — El código se ejecuta en respuesta a eventos o programaciones vía Workflows de Dailybot
- Programador de Comandos — Usa el SDK de Dailybot para programar una ejecución futura del comando
Entrada del Comando
Cuando se activa un comando, tu código recibe un objeto
event con contexto sobre la ejecución.
Query String
El texto adicional escrito después del nombre del comando
está disponible como event.query. Por ejemplo, al
escribir /growth_rate Julio, Agosto hace que
"Julio, Agosto" esté disponible vía
event.query.
Variables de Contexto
event.data.intent— El nombre del comando activadoevent.data.user_full_name— Nombre del usuario que activó el comandoevent.data.targetChannel— Objeto del canal de chat donde se ejecutó el comando
// Parsear entrada del query string
let query = event.query;
let month = null;
if (query) {
let parts = query.split(" ");
if (parts[0]) {
month = parts[0];
}
}
return `Generando reporte para ${month || 'este mes'}...`;Peticiones HTTP
La variable request está disponible en tu código
y envuelve la librería
superagent
para hacer peticiones HTTP.
// Petición GET
const response = await request.get('https://api.example.com/data');
const data = response.body;
// Petición POST con cuerpo JSON
const response = await request
.post('https://api.example.com/submit')
.send({ name: 'Dailybot', type: 'automation' })
.set('Authorization', 'Bearer your-token');Devolver Resultados
Respuesta String
Devuelve una cadena simple para mostrar como respuesta del comando:
return "Hola mundo!";Respuesta JSON con Botones Interactivos
Devuelve un objeto JSON con un mensaje y botones interactivos:
return {
"message": "Las ventas de la semana pasada aumentaron un 15% 📈",
"buttons": [
{
"label": "Mes pasado",
"label_after_click": "Obteniendo ventas del mes pasado...",
"value": "sales last month",
"button_type": "Command"
},
{
"label": "Trimestre pasado",
"label_after_click": "Obteniendo reporte trimestral...",
"value": "sales last quarter",
"button_type": "Command"
}
]
};Tip
Dailybot SDK
El objeto DailybotSDK está disponible en tu
código y proporciona acceso a almacenamiento persistente
clave-valor.
Inicialización
DailybotSDK.setAPIKey("tu_api_key");Almacenamiento Clave-Valor
Almacena objetos JSON en claves con alcance de usuario. Los datos se asocian con el usuario que hace la petición.
// Escribir datos
await DailybotSDK.Storage.write('preferences', {
theme: 'dark',
notifications: true
});
// Leer datos
let prefs = await DailybotSDK.Storage.read('preferences');
// prefs = { theme: 'dark', notifications: true }
// Eliminar datos
await DailybotSDK.Storage.delete('preferences');Ejemplos
Reserva de Sala de Reuniones
// Uso: /book-room conference-a 2026-02-15 14:00
const parts = event.query.split(" ");
const roomName = parts[0];
const date = parts[1];
const time = parts[2];
if (!roomName || !date || !time) {
return "Uso: /book-room <nombre-sala> <fecha> <hora>";
}
// Reservar la sala via API externa
const response = await request
.post('https://rooms.company.com/api/book')
.send({ room: roomName, date, time });
return `Reservada ${roomName} el ${date} a las ${time}. Confirmación: ${response.body.id}`;Buscador de Noticias Tech
// Obtener últimos titulares tech
try {
const response = await request
.get('https://newsapi.org/v2/top-headlines')
.query({ category: 'technology', pageSize: 5, apiKey: 'your_api_key' });
const headlines = response.body.articles
.map((a, i) => `${i + 1}. ${a.title}`)
.join('\n');
return `Titulares Tech de Hoy:\n${headlines}`;
} catch (error) {
return "No se pudieron obtener las noticias. Inténtalo de nuevo más tarde.";
}Patrones Avanzados
- Usa el almacenamiento SDK para construir flujos de trabajo con estado entre múltiples invocaciones
- Parsea
event.querypara aceptar subcomandos (ej.,/tool help,/tool status) - Encadena comandos usando botones interactivos para procesos de múltiples pasos
- Maneja errores de forma elegante y devuelve mensajes útiles a los usuarios
- Usa el programador para configurar obtención recurrente de datos o reportes