falafy
PT
Baixar grátis

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. 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. 2

    Instale no servidor

    Gere o link de instalação, marque as permissões e escolha o servidor de teste.

  3. 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, só o pacote ws
// 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

  1. Instale o Node 22 ou mais novo e, numa pasta nova, rode npm i ws.
  2. Salve o código como bot.mjs.
  3. Copie o ID do servidor: clique com o botão direito no ícone do servidor e escolha Copiar ID do servidor.
  4. 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.
  5. No servidor, digite /ping ou /dado.

O SDK oficial em TypeScript (@falafy/bot) ainda não foi publicado no npm. Este exemplo não depende dele.

Com IA

Prompt para ChatGPT, Claude ou Gemini
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

  1. Copie o prompt e troque o texto de "O bot que eu quero" pelo seu pedido.
  2. Cole o ID do servidor no fim e mande para a IA.
  3. Salve a resposta como bot.mjs e rode como no caminho Manual.
  4. 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.

  1. 1Catálogo

    /loja posta os produtos com um menu ou um botão para cada um.

  2. 2Pagamento

    O bot cria a cobrança na sua conta (Mercado Pago com Pix ou Stripe) e manda o link só para quem clicou.

  3. 3Confirmação

    O provedor avisa o servidor do seu bot quando o pagamento é aprovado.

  4. 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) · Mercado Pago
// 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

Prompt para um bot de 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.

Ler a documentação