Plataforma de bots
Crie o bot do seu servidor.
Enquetes, jogos, boas-vindas, avisos e o que mais sua turma precisar. Escreva o código você mesmo ou peça para uma IA escrever por você.
Bot nunca vira administrador e só ganha as permissões de quem instala.
O que um bot faz no Falafy
Comandos de barra
Digite / e o bot mostra o que sabe fazer, com opções e autocompletar.
Botões e menus
Quem lê clica e o bot reage na hora, na mesma mensagem.
Formulários
Abre uma janelinha com campos para a pessoa preencher.
Só para você
Respostas que só quem usou o comando vê.
Avisos por webhook
Outros serviços mandam mensagem no canal, sem bot rodando.
Comece em três passos
- 1
Crie o app
No Falafy, abra Configurações > Desenvolvedor e clique em Criar aplicação. Guarde o token: ele aparece uma vez só.
- 2
Instale no servidor
Gere o link de instalação, marque as permissões e escolha o servidor de teste.
- 3
Escolha o caminho
Escreva o código com o exemplo abaixo ou cole o prompt numa IA e rode o arquivo.
Dois caminhos, o mesmo bot
Manual
// bot.mjs: Node 22 e o pacote ws, sem SDK
// npm i ws
// FALAFY_TOKEN=... SERVER_ID=... node bot.mjs
import WebSocket from 'ws';
const TOKEN = process.env.FALAFY_TOKEN; // Configurações > Desenvolvedor
const SERVER_ID = process.env.SERVER_ID;
const API = 'https://falafy.com.br/api/v1';
const api = (method, path, body) =>
fetch(API + path, {
method,
headers: { authorization: `Bot ${TOKEN}`, 'content-type': 'application/json' },
body: body && JSON.stringify(body),
}).then((r) => (r.status === 204 ? null : r.json()));
// responde a uma interação (sem Authorization: o token da interação é a credencial)
const reply = (i, body) =>
fetch(`${API}/interactions/${i.id}/${i.token}/callback`, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(body),
});
// registra os comandos só neste servidor (valem na hora)
const me = await api('GET', '/users/@me');
await api('PUT', `/applications/${me.id}/servers/${SERVER_ID}/commands`, [
{ name: 'ping', description: 'Responde pong' },
{ name: 'dado', description: 'Rola um dado',
options: [{ type: 4, name: 'lados', description: 'Quantos lados', minValue: 2, maxValue: 100 }] },
]);
const roll = (lados) => ({
content: `🎲 ${1 + Math.floor(Math.random() * lados)} (d${lados})`,
components: [{ type: 1, components: [{ type: 2, style: 1, label: 'Rolar de novo', customId: `dado:${lados}` }] }],
});
const { url } = await api('GET', '/gateway/bot');
function connect() {
const ws = new WebSocket(url);
let ping;
ws.on('open', () => {
ws.send(JSON.stringify({ op: 'IDENTIFY', token: `Bot ${TOKEN}`, intents: 1 })); // SERVERS
ping = setInterval(() => ws.send(JSON.stringify({ op: 'PING' })), 30_000);
});
ws.on('close', () => { clearInterval(ping); setTimeout(connect, 5_000); }); // caiu? reconecta
ws.on('message', (raw) => {
const f = JSON.parse(raw);
if (f.op === 'READY') console.log('online como', f.d.user.displayName);
if (f.op !== 'EVENT' || f.event.t !== 'INTERACTION_CREATE') return;
const i = f.event.d;
// flags 64 = efêmera: só quem usou o comando vê
if (i.type === 2 && i.data.name === 'ping') reply(i, { type: 4, data: { content: 'pong', flags: 64 } });
if (i.type === 2 && i.data.name === 'dado') {
const lados = i.data.options.find((o) => o.name === 'lados')?.value ?? 6;
reply(i, { type: 4, data: roll(lados) });
}
// clique no botão: tipo 7 edita a mesma mensagem
if (i.type === 3 && i.data.customId.startsWith('dado:')) reply(i, { type: 7, data: roll(Number(i.data.customId.slice(5))) });
});
}
connect();
Como rodar
- Instale o Node 22 ou mais novo e, numa pasta nova, rode
npm i ws. - Salve o código como
bot.mjs. - Copie o ID do servidor: clique com o botão direito no ícone do servidor e escolha Copiar ID do servidor.
- Rode
FALAFY_TOKEN=seu_token SERVER_ID=id_do_servidor node bot.mjs. No Windows (PowerShell):$env:FALAFY_TOKEN="seu_token"; $env:SERVER_ID="id"; node bot.mjs. - No servidor, digite
/pingou/dado.
O SDK oficial em TypeScript (@falafy/bot) ainda não foi publicado no npm. Este exemplo não depende dele.
Com IA
Escreva um bot para o Falafy em um único arquivo bot.mjs (Node 22, ESM, só a dependência ws; use o fetch nativo). O token fica em process.env.FALAFY_TOKEN e nunca aparece no código nem em logs. O Falafy não é o Discord: use só a API descrita aqui e não invente rotas.
API do Falafy
- REST: base https://falafy.com.br/api/v1, header Authorization: Bot <token>, corpo JSON, campos em camelCase. IDs são strings UUID. Respostas 204 vêm sem corpo.
- GET /users/@me devolve o usuário do bot. O id dele também é o applicationId (appId).
- GET /gateway/bot devolve { url } do WebSocket do gateway.
- Comandos de barra: PUT /applications/{appId}/servers/{serverId}/commands com uma lista que substitui todos os comandos do bot nesse servidor (valem na hora). Comando: { name (a-z, 0-9, _ e -, até 32), description (até 100), options?: [{ type, name, description, required?, choices?: [{ name, value }], minValue?, maxValue?, minLength?, maxLength?, autocomplete? }] }. Tipos de opção: 3 texto, 4 inteiro, 5 booleano, 6 usuário, 7 canal, 8 cargo, 10 número. Opções obrigatórias vêm antes das opcionais.
- Gateway: conecte na url e, ao abrir, envie {"op":"IDENTIFY","token":"Bot <token>","intents":N}. Chega {"op":"READY","d":{ user, servers, channels, roles, resumeId }}. Envie {"op":"PING"} a cada 30 s (a resposta é {"op":"PONG"}). Eventos chegam como {"op":"EVENT","event":{"t":"NOME","d":{...}},"seq":n}. Se a conexão cair, espere uns segundos, reconecte e envie IDENTIFY de novo.
- Intents (some os valores): SERVERS 1, SERVER_MEMBERS 2 (privilegiada), SERVER_MESSAGES 512, SERVER_MESSAGE_REACTIONS 1024, DIRECT_MESSAGES 4096, MESSAGE_CONTENT 32768 (privilegiada). As privilegiadas precisam ser ativadas antes no portal (Configurações > Desenvolvedor). Sem MESSAGE_CONTENT o bot só vê o texto de DMs e de mensagens que mencionam o bot. INTERACTION_CREATE chega sempre, sem intent.
- Eventos úteis: MESSAGE_CREATE (d: { id, channelId, author: { id, username, displayName }, content, mentions }), MEMBER_JOIN (d: { serverId, user }), INTERACTION_CREATE.
- INTERACTION_CREATE (d): { id, token, type (2 comando, 3 componente, 4 autocomplete, 5 modal), applicationId, serverId, channelId, user: { id, username, displayName }, member: { roleIds, permissions } ou null, data, message? }. data de comando: { name, options: [{ name, type, value }] }. data de componente: { customId, values? }. data de modal: { customId, fields: [{ customId, value }] }.
- Responder: POST /interactions/{id}/{token}/callback, sem Authorization, uma única vez e em até 3 segundos. Corpo { type, data }: 4 mensagem; 5 "pensando…" (depois edite com PATCH /webhooks/{appId}/{token}/messages/@original); 6 confirma o clique sem mudar nada; 7 edita a mensagem do componente; 8 escolhas do autocomplete ({ choices: [{ name, value }] }); 9 abre um modal ({ customId, title, components: [{ type: 1, components: [{ type: 4, customId, label, style: 1 curto ou 2 parágrafo }] }] }). data.flags = 64 deixa a resposta efêmera (só quem usou vê). Follow-ups: POST /webhooks/{appId}/{token} por até 15 minutos.
- Mensagem: content (até 2000), embeds (até 10), components (até 5 linhas). Embed: { title, description, url, color (inteiro), fields: [{ name, value, inline }], footer: { text }, image: { url }, thumbnail: { url } }, URLs só https. Linha { type: 1, components } com até 5 botões ou 1 menu. Botão { type: 2, style, label }: style 1 primário, 2 secundário, 3 sucesso, 4 perigo (com customId) ou 5 link (com url e sem customId; não gera interação). Menu { type: 3, customId, placeholder, options: [{ label, value, description? }], minValues?, maxValues? }.
- Mensagens: POST /channels/{channelId}/messages { content, embeds, components, replyToId }; PATCH e DELETE /channels/{channelId}/messages/{messageId}; reação: PUT /channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me.
- Cargos: GET /servers/{serverId}/roles; PUT e DELETE /servers/{serverId}/members/{userId}/roles/{roleId}. O bot precisa da permissão Gerenciar cargos e de um cargo acima do cargo que vai dar.
- DM: POST /users/@me/channels { recipientId } devolve o canal; depois POST /channels/{id}/messages. Só funciona com quem divide um servidor com o bot.
- Limites: em 429, espere body.retryAfter segundos e tente de novo. Erros vêm como { code, message, status }.
- Não existe (não tente): entrar em canal de voz, expulsar, banir ou silenciar membros, criar canais ou tópicos, enviar arquivos ou anexos.
Requisitos: registre os comandos no SERVER_ID ao iniciar; trate erros sem derrubar o processo; no topo do arquivo, explique como rodar (npm i ws e FALAFY_TOKEN=... node bot.mjs) e quais permissões e intents ativar no portal.
O bot que eu quero: /enquete com uma pergunta e opções, um botão por opção e a contagem atualizando ao vivo.
SERVER_ID: [cole aqui o ID do servidor]
Como usar
- Copie o prompt e troque o texto de "O bot que eu quero" pelo seu pedido.
- Cole o ID do servidor no fim e mande para a IA.
- Salve a resposta como
bot.mjse rode como no caminho Manual. - Deu erro? Cole a mensagem de erro na mesma conversa e peça a correção.
Nunca cole o seu token na conversa com a IA. Ele fica só no seu computador, na variável FALAFY_TOKEN.
Novo
Uma loja no seu servidor
Venda cargos VIP, chaves, ingressos ou o que a sua comunidade quiser. O bot mostra o catálogo, gera o pagamento na sua conta e entrega sozinho quando o pagamento cai.
1Catálogo
/loja posta os produtos com um menu ou um botão para cada um.
2Pagamento
O bot cria a cobrança na sua conta (Mercado Pago com Pix ou Stripe) e manda o link só para quem clicou.
3Confirmação
O provedor avisa o servidor do seu bot quando o pagamento é aprovado.
4Entrega
O bot dá o cargo, manda o item por DM e registra a venda no canal da equipe.
O coração da loja
// loja.mjs (trecho): junte com o bot.mjs do caminho Manual
// variáveis: MP_ACCESS_TOKEN, MP_WEBHOOK_SECRET, ROLE_VIP, STAFF_CHANNEL
import http from 'node:http';
import crypto from 'node:crypto';
const MP = 'https://api.mercadopago.com';
const mpAuth = { authorization: `Bearer ${process.env.MP_ACCESS_TOKEN}`, 'content-type': 'application/json' };
const PRODUCTS = { vip30: { title: 'VIP 30 dias', price: 15, roleId: process.env.ROLE_VIP } };
const delivered = new Set(); // em produção, guarde num arquivo ou banco: entrega uma vez por pagamento
// 1) clique em "Comprar": cria a cobrança na conta do vendedor
async function onBuy(i, productId) {
await reply(i, { type: 5, data: { flags: 64 } }); // "pensando…" só para quem clicou (criar a cobrança pode passar de 3 s)
const p = PRODUCTS[productId];
const pref = await fetch(`${MP}/checkout/preferences`, {
method: 'POST',
headers: mpAuth,
body: JSON.stringify({
items: [{ title: p.title, quantity: 1, unit_price: p.price, currency_id: 'BRL' }],
external_reference: `${i.user.id}:${productId}`,
}),
}).then((r) => r.json());
await api('PATCH', `/webhooks/${me.id}/${i.token}/messages/@original`, {
content: `${p.title}: R$ ${p.price.toFixed(2)}`,
components: [{ type: 1, components: [{ type: 2, style: 5, label: 'Pagar', url: pref.init_point }] }],
});
}
// 2) webhook do Mercado Pago: confere a assinatura e busca o pagamento na API dele
http.createServer(async (req, res) => {
const id = new URL(req.url, 'http://bot').searchParams.get('data.id');
if (req.method !== 'POST' || !id || !validSignature(req, id)) return res.writeHead(401).end();
res.writeHead(200).end();
const pay = await fetch(`${MP}/v1/payments/${id}`, { headers: mpAuth }).then((r) => r.json());
const [userId, productId] = String(pay.external_reference).split(':');
const p = PRODUCTS[productId];
if (pay.status !== 'approved' || !p || pay.transaction_amount !== p.price) return;
if (delivered.has(pay.id)) return;
delivered.add(pay.id);
await deliver(userId, p, pay.id);
}).listen(8080);
function validSignature(req, dataId) {
const sig = Object.fromEntries(String(req.headers['x-signature'] ?? '').split(',').map((kv) => kv.trim().split('=')));
const manifest = `id:${dataId};request-id:${req.headers['x-request-id']};ts:${sig.ts};`;
const want = crypto.createHmac('sha256', process.env.MP_WEBHOOK_SECRET).update(manifest).digest('hex');
return typeof sig.v1 === 'string' && sig.v1.length === want.length && crypto.timingSafeEqual(Buffer.from(sig.v1), Buffer.from(want));
}
// 3) entrega: cargo, DM com o item e registro para a equipe
async function deliver(userId, p, paymentId) {
await api('PUT', `/servers/${SERVER_ID}/members/${userId}/roles/${p.roleId}`);
const dm = await api('POST', '/users/@me/channels', { recipientId: userId });
await api('POST', `/channels/${dm.id}/messages`, { content: `Pagamento confirmado! Você recebeu: ${p.title}.` });
await api('POST', `/channels/${process.env.STAFF_CHANNEL}/messages`, { content: `Venda ${paymentId}: ${p.title} para ${userId}` });
}
Usa as funções api() e reply() e as constantes me e SERVER_ID do exemplo Manual. Configure a URL pública do seu bot (por exemplo https://seu.dominio/) como webhook de Pagamentos no painel do Mercado Pago.
Antes de vender
- O dinheiro vai direto para a sua conta no Mercado Pago ou na Stripe. O Falafy não processa, não recebe e não guarda pagamentos.
- Você é responsável pelo que vende e pela entrega, e precisa seguir os Termos de uso do Falafy e as regras do seu provedor de pagamento.
- Nunca peça nem guarde dados de cartão: a pessoa paga na página do provedor.
- Chaves e tokens só em variáveis de ambiente, nunca no código, em prints ou na conversa com a IA.
- Valide a assinatura de todo webhook e confirme o pagamento na API do provedor antes de entregar.
- Entregue uma vez só por id de pagamento: o provedor pode mandar o mesmo aviso mais de uma vez.
- O cargo do bot precisa ficar acima dos cargos que ele vende, e o bot precisa da permissão Gerenciar cargos.
- Quer um aviso de cada venda sem mexer no bot? Crie um webhook de entrada no canal da equipe e poste nele.
Prompt da loja
Escreva um bot para o Falafy em um único arquivo bot.mjs (Node 22, ESM, só a dependência ws; use o fetch nativo). O token fica em process.env.FALAFY_TOKEN e nunca aparece no código nem em logs. O Falafy não é o Discord: use só a API descrita aqui e não invente rotas.
API do Falafy
- REST: base https://falafy.com.br/api/v1, header Authorization: Bot <token>, corpo JSON, campos em camelCase. IDs são strings UUID. Respostas 204 vêm sem corpo.
- GET /users/@me devolve o usuário do bot. O id dele também é o applicationId (appId).
- GET /gateway/bot devolve { url } do WebSocket do gateway.
- Comandos de barra: PUT /applications/{appId}/servers/{serverId}/commands com uma lista que substitui todos os comandos do bot nesse servidor (valem na hora). Comando: { name (a-z, 0-9, _ e -, até 32), description (até 100), options?: [{ type, name, description, required?, choices?: [{ name, value }], minValue?, maxValue?, minLength?, maxLength?, autocomplete? }] }. Tipos de opção: 3 texto, 4 inteiro, 5 booleano, 6 usuário, 7 canal, 8 cargo, 10 número. Opções obrigatórias vêm antes das opcionais.
- Gateway: conecte na url e, ao abrir, envie {"op":"IDENTIFY","token":"Bot <token>","intents":N}. Chega {"op":"READY","d":{ user, servers, channels, roles, resumeId }}. Envie {"op":"PING"} a cada 30 s (a resposta é {"op":"PONG"}). Eventos chegam como {"op":"EVENT","event":{"t":"NOME","d":{...}},"seq":n}. Se a conexão cair, espere uns segundos, reconecte e envie IDENTIFY de novo.
- Intents (some os valores): SERVERS 1, SERVER_MEMBERS 2 (privilegiada), SERVER_MESSAGES 512, SERVER_MESSAGE_REACTIONS 1024, DIRECT_MESSAGES 4096, MESSAGE_CONTENT 32768 (privilegiada). As privilegiadas precisam ser ativadas antes no portal (Configurações > Desenvolvedor). Sem MESSAGE_CONTENT o bot só vê o texto de DMs e de mensagens que mencionam o bot. INTERACTION_CREATE chega sempre, sem intent.
- Eventos úteis: MESSAGE_CREATE (d: { id, channelId, author: { id, username, displayName }, content, mentions }), MEMBER_JOIN (d: { serverId, user }), INTERACTION_CREATE.
- INTERACTION_CREATE (d): { id, token, type (2 comando, 3 componente, 4 autocomplete, 5 modal), applicationId, serverId, channelId, user: { id, username, displayName }, member: { roleIds, permissions } ou null, data, message? }. data de comando: { name, options: [{ name, type, value }] }. data de componente: { customId, values? }. data de modal: { customId, fields: [{ customId, value }] }.
- Responder: POST /interactions/{id}/{token}/callback, sem Authorization, uma única vez e em até 3 segundos. Corpo { type, data }: 4 mensagem; 5 "pensando…" (depois edite com PATCH /webhooks/{appId}/{token}/messages/@original); 6 confirma o clique sem mudar nada; 7 edita a mensagem do componente; 8 escolhas do autocomplete ({ choices: [{ name, value }] }); 9 abre um modal ({ customId, title, components: [{ type: 1, components: [{ type: 4, customId, label, style: 1 curto ou 2 parágrafo }] }] }). data.flags = 64 deixa a resposta efêmera (só quem usou vê). Follow-ups: POST /webhooks/{appId}/{token} por até 15 minutos.
- Mensagem: content (até 2000), embeds (até 10), components (até 5 linhas). Embed: { title, description, url, color (inteiro), fields: [{ name, value, inline }], footer: { text }, image: { url }, thumbnail: { url } }, URLs só https. Linha { type: 1, components } com até 5 botões ou 1 menu. Botão { type: 2, style, label }: style 1 primário, 2 secundário, 3 sucesso, 4 perigo (com customId) ou 5 link (com url e sem customId; não gera interação). Menu { type: 3, customId, placeholder, options: [{ label, value, description? }], minValues?, maxValues? }.
- Mensagens: POST /channels/{channelId}/messages { content, embeds, components, replyToId }; PATCH e DELETE /channels/{channelId}/messages/{messageId}; reação: PUT /channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me.
- Cargos: GET /servers/{serverId}/roles; PUT e DELETE /servers/{serverId}/members/{userId}/roles/{roleId}. O bot precisa da permissão Gerenciar cargos e de um cargo acima do cargo que vai dar.
- DM: POST /users/@me/channels { recipientId } devolve o canal; depois POST /channels/{id}/messages. Só funciona com quem divide um servidor com o bot.
- Limites: em 429, espere body.retryAfter segundos e tente de novo. Erros vêm como { code, message, status }.
- Não existe (não tente): entrar em canal de voz, expulsar, banir ou silenciar membros, criar canais ou tópicos, enviar arquivos ou anexos.
Requisitos: registre os comandos no SERVER_ID ao iniciar; trate erros sem derrubar o processo; no topo do arquivo, explique como rodar (npm i ws e FALAFY_TOKEN=... node bot.mjs) e quais permissões e intents ativar no portal.
O bot que eu quero: uma loja. /loja posta um embed com os produtos (nome, preço e descrição, definidos numa lista no topo do arquivo) e um menu de seleção. Quando alguém escolhe um produto, responda com tipo 5 e flags 64, crie o pagamento na MINHA conta do Mercado Pago (Checkout Pro, POST https://api.mercadopago.com/checkout/preferences com MP_ACCESS_TOKEN, external_reference = "<userId>:<produto>") e edite a resposta com um botão de link (style 5) para pagar. Suba um servidor HTTP com node:http na porta 8080 para o webhook de pagamentos do Mercado Pago: valide o cabeçalho x-signature com MP_WEBHOOK_SECRET, busque o pagamento em GET https://api.mercadopago.com/v1/payments/{id}, confira status approved e o valor, e entregue uma única vez por id de pagamento (guarde os ids entregues num arquivo JSON). Entregar = dar o cargo do produto, abrir uma DM com a pessoa e mandar o item ou código, e postar um registro no canal STAFF_CHANNEL. Nunca guarde dados de cartão. Chaves só em variáveis de ambiente. Se eu preferir Stripe: Checkout Session com STRIPE_SECRET_KEY e webhook checkout.session.completed validado com STRIPE_WEBHOOK_SECRET.
SERVER_ID: [cole aqui o ID do servidor]
Nunca cole o seu token na conversa com a IA. Ele fica só no seu computador, na variável FALAFY_TOKEN.
O que dá para criar
Ideias prontas: abra uma e copie o prompt já completo para a sua IA.
Enquete ao vivoFunciona hoje Botão por opção e contagem subindo na hora. Ver prompt
Prompt
/enquete pergunta:<texto> opcoes:<texto separado por vírgula>. Posta um embed com a pergunta e um botão por opção (até 5). Cada clique conta um voto por pessoa (dá para trocar o voto) e atualiza a mesma mensagem com tipo 7, mostrando barras de texto e o número de votos.
Jogos rápidosFunciona hoje Dado, pedra-papel-tesoura, quiz com menu. Ver prompt
Prompt
/dado lados:<inteiro>, /ppt com três botões (pedra, papel, tesoura) contra o bot, e /quiz com uma pergunta de uma lista no código e um menu de seleção com as respostas; ao escolher, edita a mensagem dizendo se acertou.
Boas-vindasFunciona hoje Mensagem de chegada e cargo automático. Ver prompt
Prompt
quando alguém entra no servidor (evento MEMBER_JOIN, intent SERVER_MEMBERS ativada no portal), manda um embed de boas-vindas no canal WELCOME_CHANNEL com o nome da pessoa e dá o cargo MEMBER_ROLE. IDs em variáveis de ambiente.
Escolha seus cargosFunciona hoje Botões para cada pessoa pegar os cargos dela. Ver prompt
Código
// clique no botão "cargo:<roleId>": dá ou tira o cargo
if (i.type === 3 && i.data.customId.startsWith('cargo:')) {
const roleId = i.data.customId.slice(6);
const tem = i.member.roleIds.includes(roleId);
await api(tem ? 'DELETE' : 'PUT', `/servers/${i.serverId}/members/${i.user.id}/roles/${roleId}`);
reply(i, { type: 4, data: { content: tem ? 'Cargo removido.' : 'Cargo adicionado!', flags: 64 } });
}
Prompt
/cargos posta uma mensagem com um botão para cada cargo de uma lista no código (nome e roleId). Clicar dá o cargo se a pessoa não tem e tira se já tem, e responde de forma efêmera dizendo o que mudou.
Níveis e XPFunciona hoje Quem conversa sobe de nível; /rank mostra. Ver prompt
Prompt
conta mensagens por pessoa (evento MESSAGE_CREATE, intent SERVER_MESSAGES; não precisa ler o texto), dá XP com intervalo mínimo de 60 s por pessoa, guarda tudo num arquivo JSON e tem /rank (o seu nível e XP, efêmero) e /top (os 10 primeiros num embed).
Avisos automáticosFunciona hoje Deploy, loja, live: chega no canal por webhook. Ver prompt
Código
curl -X POST "$FALAFY_WEBHOOK_URL" \
-H "content-type: application/json" \
-d '{"username":"CI","embeds":[{"title":"Deploy ok · main","color":13168730}]}'
Prompt
um script que recebe avisos de outro serviço (por exemplo o meu CI) e posta no canal com um webhook de entrada do Falafy, com embed de título, cor e campos. A URL do webhook fica na variável FALAFY_WEBHOOK_URL.
Assistente com IAFunciona hoje /pergunta responde com a IA que você escolher. Ver prompt
Prompt
/pergunta texto:<texto>. Responde com tipo 5 (pensando…), chama a API de IA que eu usar (chave em AI_API_KEY) com um limite de 1 pergunta a cada 20 s por pessoa e edita a resposta original com o texto (cortado em 2000 caracteres).
Tickets de suporteEm breve Formulário que abre um canal privado. Ver prompt
Prompt
/ticket abre um modal com assunto e descrição. Bots ainda não criam canais, então por enquanto o bot posta o pedido num embed no canal STAFF_CHANNEL com um botão "Assumir" e avisa a pessoa por DM quando alguém da equipe assumir.
LojaFunciona hoje Catálogo, pagamento na sua conta e entrega automática. Ver prompt
Prompt
uma loja. /loja posta um embed com os produtos (nome, preço e descrição, definidos numa lista no topo do arquivo) e um menu de seleção. Quando alguém escolhe um produto, responda com tipo 5 e flags 64, crie o pagamento na MINHA conta do Mercado Pago (Checkout Pro, POST https://api.mercadopago.com/checkout/preferences com MP_ACCESS_TOKEN, external_reference = "<userId>:<produto>") e edite a resposta com um botão de link (style 5) para pagar. Suba um servidor HTTP com node:http na porta 8080 para o webhook de pagamentos do Mercado Pago: valide o cabeçalho x-signature com MP_WEBHOOK_SECRET, busque o pagamento em GET https://api.mercadopago.com/v1/payments/{id}, confira status approved e o valor, e entregue uma única vez por id de pagamento (guarde os ids entregues num arquivo JSON). Entregar = dar o cargo do produto, abrir uma DM com a pessoa e mandar o item ou código, e postar um registro no canal STAFF_CHANNEL. Nunca guarde dados de cartão. Chaves só em variáveis de ambiente. Se eu preferir Stripe: Checkout Session com STRIPE_SECRET_KEY e webhook checkout.session.completed validado com STRIPE_WEBHOOK_SECRET.
Quer os detalhes?
Referência completa da API, gateway, interações, webhooks e limites.