// bot.js
import { Bot, defineBot, isMainModule, MemoryStore, slashCommandsPlugin } from '@botmesh/core'
import { BaileysProvider } from '@botmesh/baileys'
// Sustituye a la API de pedidos de tu tienda
const ORDERS = {
A100: { item: 'Zapatillas azules', status: '🚚 En camino', eta: 'el jueves' },
B200: { item: 'Chaqueta impermeable', status: '📦 Preparando el envío', eta: 'la semana que viene' },
C300: { item: 'Calcetines de lana', status: '✅ Entregado', eta: 'ya lo tienes' },
}
const findOrder = (code) => ORDERS[code.trim().toUpperCase()]
const createBot = defineBot((provider) => {
// Un store guardado en un archivo: los perfiles sobreviven a un reinicio (en producción, SQLite o Redis)
const bot = new Bot({ provider, lang: 'es', store: new MemoryStore({ file: './pedidos.json' }) })
bot.plug(slashCommandsPlugin, {
greeting: '📦 Envía "seguir" para seguir un pedido o "mis pedidos" para verlos. /forget borra tus datos.',
})
// 1. Una conversación que lee y escribe el perfil del usuario (ctx.user)
bot.conversation(
'seguir',
async (c, ctx) => {
const orders = ctx.user.ns('orders') // un namespace solo para esta función
const last = await orders.get('last')
// 2. Memoria por usuario: ofrece el último pedido en vez de preguntar otra vez
let code
if (last && (await c.choose(`¿Sigo el pedido ${last}?`, { yes: `Sí, ${last}`, other: 'Otro pedido' })) === 'yes') {
code = last
} else {
const answer = await c.ask('¿Cuál es tu número de pedido? (p. ej. A100)', {
validate: (body) => (findOrder(body) ? true : '🔎 No encuentro ese pedido. Revisa el número y prueba otra vez.'),
maxAttempts: 3,
})
code = answer.trim().toUpperCase()
}
// 3. Recuérdalo: el último pedido y todos los que sigue este usuario
const followed = (await orders.get('followed')) ?? []
await orders.update({ last: code, followed: followed.includes(code) ? followed : [...followed, code] })
const order = findOrder(code)
await c.say(`${order.status}\n${code} · ${order.item}\nLlega: ${order.eta}`)
},
{ trigger: ['seguir', 'dónde está mi pedido'] },
)
bot.when('mis pedidos', async (ctx) => {
const followed = (await ctx.user.ns('orders').get('followed')) ?? []
if (followed.length === 0) return ctx.reply('Todavía no sigues ningún pedido. Envía "seguir".')
await ctx.reply(followed.map((code) => `• ${code}: ${findOrder(code).status}`).join('\n'))
})
// 4. El usuario puede borrar lo que el bot recuerda de él
bot.command('forget', async (ctx) => {
await ctx.user.ns('orders').clear()
await ctx.reply('🧹 Hecho, olvidé tus pedidos.')
})
bot.onMessage((ctx) => ctx.reply('Envía "seguir", "mis pedidos" o /help.'))
return bot
})
export default createBot
// `node bot.js` se conecta a WhatsApp; `npx botmesh dev bot.js` se salta este bloque
if (isMainModule(import.meta)) {
const bot = await createBot(new BaileysProvider({ session: 'bot-pedidos' }))
bot.on('ready', () => console.log('✅ Conectado'))
await bot.start()
// Ctrl+C: para el bot para que el store escriba pedidos.json antes de salir
process.once('SIGINT', async () => {
await bot.stop()
process.exit(0)
})
}