Case study

Brasa Bot

Bot de Discord serverless para organizar churrascos: cria o evento, controla quem vai e gera o código Pix para cada participante pagar.

Painel web do Brasa Bot com o título O Churrasco perfeito começa aqui, botão Começar Agora e a lista de próximos churrascos.
FIG. 01 — Painel web do Brasa Bot

Contexto e problema

Organizar um churrasco em grupo envolve lista de quem vai, valor por pessoa e cobrança.

A ideia era resolver tudo dentro do próprio servidor do Discord, sem servidor próprio para manter ligado.

Solução

  • O comando /brasa novo cria o evento com título, data e, opcionalmente, valor e chave Pix.
  • Botões para participar, sair e pagar; o organizador gerencia a lista e confirma os pagamentos.
  • O código Pix copia e cola (BR Code, com CRC16) é gerado pelo próprio bot.
  • Painel web em Next.js com login pelo Discord.
  • Respostas em português e em inglês, conforme o idioma de quem usa.

Decisões técnicas

  1. Tudo em um Cloudflare Worker, via Discord Interactions por HTTP

    Por quê
    Sem conexão WebSocket nem processo ligado o tempo todo: o Discord chama o Worker, que verifica a assinatura Ed25519 e responde.
    Trade-off
    O Discord exige resposta em 3 segundos; o Worker responde com uma mensagem adiada e termina o trabalho em segundo plano (ctx.waitUntil).
  2. Login do Discord convertido em sessão do Firebase

    Por quê
    O Worker faz o OAuth do Discord e assina um custom token (JWT RS256 com jose) para o Firebase Auth. Assim, o painel usa as regras de segurança do Firestore normalmente.
    Trade-off
    A chave da service account do Firebase fica nos secrets do Worker e passa a ser um ponto sensível.
  3. Pix gerado no bot, sem intermediário de pagamento

    Por quê
    O código copia e cola segue o padrão EMV do Banco Central e não depende de conta em intermediário nem de taxas.
    Trade-off
    Não há confirmação automática: o organizador marca quem pagou.

Stack

Bot
  • Cloudflare Workers
  • discord-interactions
  • itty-router
  • JavaScript
Dados e login
  • Firestore
  • Firebase Auth (custom token)
  • jose (JWT)
Painel
  • Next.js
  • React

Estado atual

  • Comando /brasa novo e botões de presença e pagamento implementados.
  • Ainda sem testes automatizados.
  • Confirmação automática de pagamento por API de Pix está no roadmap do repositório.

Imagens e diagrama

Fluxo: Discord → Worker → Firestore, e o painel web com login do DiscordDiscord/brasa novobotões do eventoCloudflare Workerverifica Ed25519resposta adiada (< 3 s)gera Pix copia e colaFirestoreeventospresença e pagosPainel webNext.jsFirebase Authcustom tokenHTTPlogin DiscordJWT RS256
FIG. 02 — Fluxo: Discord → Worker → Firestore, e o painel web com login do Discord

Um comando ou botão no Discord gera uma requisição HTTP para o Cloudflare Worker. O Worker verifica a assinatura, responde em menos de 3 segundos com uma mensagem adiada e grava o evento no Firestore. O painel web em Next.js faz login pelo Discord por meio do Worker, que devolve um custom token do Firebase.