Skip to content

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:

  1. Activación en Chat — Los usuarios escriben el comando directamente en DMs o canales
  2. Activación por Workflow — El código se ejecuta en respuesta a eventos o programaciones vía Workflows de Dailybot
  3. 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 activado
  • event.data.user_full_name — Nombre del usuario que activó el comando
  • event.data.targetChannel — Objeto del canal de chat donde se ejecutó el comando
Parseo de entrada del 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.

Peticiones HTTP con superagent
// 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:

javascript
return "Hola mundo!";

Respuesta JSON con Botones Interactivos

Devuelve un objeto JSON con un mensaje y botones interactivos:

Respuesta con 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

Los valores de los botones pueden referenciar el mismo comando con diferentes parámetros de consulta, habilitando flujos de trabajo interactivos de múltiples pasos desde un solo comando.

Dailybot SDK

El objeto DailybotSDK está disponible en tu código y proporciona acceso a almacenamiento persistente clave-valor.

Inicialización

Inicialización del SDK
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.

Operaciones de almacenamiento clave-valor
// 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

Comando de reserva de sala
// 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

Comando 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.query para 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