Files
pagodera/README.md
T

7.2 KiB

O catálogo de itens vem no repositório (data/tibiawiki.db, SQLite com dados do TibiaWiki BR). Lido com o SQLite embutido do Node 22.13+, sem instalar nada:

$ node --no-warnings -e "const db = new (require('node:sqlite').DatabaseSync)('data/tibiawiki.db', { readOnly: true }); const t = db.prepare(\"select name from sqlite_master where type = 'table' and name not like 'sqlite_%'\").all(); const n = t.reduce((s, { name }) => s + db.prepare('select count(*) as c from ' + name).get().c, 0); console.log(t.length + ' categorias, ' + n + ' itens'); console.table(db.prepare('select nome, lvl, voc, peso from espadas order by lvl desc limit 3').all())"
28 categorias, 2575 itens
┌─────────┬────────────────────────┬─────┬───────────┬──────┐
│ (index) │ nome                   │ lvl │ voc       │ peso │
├─────────┼────────────────────────┼─────┼───────────┼──────┤
│ 0       │ 'Grand Sanguine Blade' │ 600 │ 'Knights' │ 6000 │
│ 1       │ 'Grand Sanguine Razor' │ 600 │ 'Knights' │ 7900 │
│ 2       │ 'Sanguine Blade'       │ 600 │ 'Knights' │ 6100 │
└─────────┴────────────────────────┴─────┴───────────┴──────┘

O que é

Tibia Trade (repositório pagodera) é um marketplace web para comprar, vender e leiloar itens de Tibia, separado por servidor. A interface tem português e inglês (next-intl, messages/pt.json e messages/en.json).

Página O que faz
/market Anúncios de venda por servidor, leilões com lances, intenções de compra ("Minhas intenções") e chat com o vendedor
/market/analytics Impressões e cliques dos seus anúncios
/library Catálogo de itens por categoria
/apoiar Doação por PIX (QR code gerado pelo AbacatePay)
/admin Cadastro de itens e categorias e gestão de planos de assinatura
/precos, /sobre Ainda mostram "em construção"

Por que usar

  • Preço no meio que o jogador usa: cada anúncio aceita PIX, Tibia Coins, gold coins ou troca.
  • Leilão de verdade: anúncios podem ter prazo (auction_ends_at) e incremento mínimo de lance; cada lance gera notificação.
  • Negociação registrada: o comprador abre uma intenção de compra, que vira um chat em tempo real com o vendedor (Socket.IO no servidor customizado server.ts, mensagens no MongoDB); o vendedor marca o anúncio como vendido.

Quando não usar: se você precisa de pagamento garantido entre comprador e vendedor. O escrow existe só no modelo de dados (status in_escrow, tabela Transaction, taxa de 2%); nenhuma rota movimenta dinheiro, e o AbacatePay só é usado para doações. Também não serve para quem quer subir algo leve: o app precisa de PostgreSQL, Redis e MongoDB.

Como funciona

  1. server.ts sobe o Next.js 15 (App Router) e o Socket.IO no mesmo servidor HTTP.
  2. As rotas em app/api/ cuidam de autenticação (JWT com refresh, senhas com bcrypt), anúncios, lances, intenções de compra, chats, notificações, servidores, assinaturas e doações.
  3. PostgreSQL guarda usuários, anúncios, lances e intenções (Prisma em prisma/schema.prisma e SQL puro em lib/db/migrations/); Redis atende autenticação, Socket.IO e controle de uso da IA; MongoDB guarda chats e mensagens.
  4. O catálogo de itens sai de data/tibiawiki.db (com imagens em data/images/) e é importado por lib/items/import-from-sqlite.ts.
  5. No admin, a análise de um item novo pode usar o Gemini (GEMINI_API_KEY); sem a chave, o app usa um fallback estático.

Início rápido

Requisitos: Node.js 18+ (o deploy em nixpacks.toml usa nodejs_18), pnpm, e instâncias de PostgreSQL, Redis e MongoDB. Não existe .env.example: crie o .env com as variáveis abaixo.

git clone https://git.evandro.dev.br/evandro/pagodera.git
cd pagodera
pnpm install        # o postinstall roda `prisma generate`
pnpm db:migrate     # aplica as migrações SQL no PostgreSQL (PG_DB)
pnpm db:seed        # cadastra os servidores de Tibia
pnpm dev            # tsx server.ts → http://localhost:3000

Outros scripts: pnpm build (next build --turbopack), pnpm start (NODE_ENV=production tsx server.ts, sintaxe de shell POSIX), pnpm lint (Biome), pnpm test (tests/run-tests.ts), pnpm db:test (testa a conexão).

Configuração

Variável Uso
PG_DB Connection string do PostgreSQL para o pool pg e as migrações (obrigatória)
DATABASE_URL_APP Connection string do PostgreSQL para o Prisma
REDIS_DB Connection string do Redis (obrigatória)
MONGO_URL Connection string do MongoDB, para chats (obrigatória)
JWT_SECRET, JWT_REFRESH_SECRET Assinatura dos tokens de acesso e de refresh (obrigatórias)
NEXT_PUBLIC_BASE_URL Origem aceita pelo Socket.IO (padrão http://localhost:3000)
GEMINI_API_KEY Análise de itens no admin (opcional)
ABACATE_APIKEY, ABACATE_TEST_APIKEY, ABACATEPAY_WEBHOOK_SECRET, ABACATEPAY_WHITELIST_IPS Doações por PIX e o webhook do AbacatePay (veja ABACATEPAY_SETUP.md)
HOSTNAME, PORT Endereço do servidor (padrão localhost:3000)

Estado do projeto

Em desenvolvimento (package.json na versão 0.1.0). O último commit no branch padrão (develop) é de 2025-11-22; o branch wip/2026-10-20 guarda um snapshot de alterações ainda não finalizadas. O ambiente de desenvolvimento tibiatrade.evandro.dev.br não respondia com o app em 2026-10-24.

O que falta:

  • Escrow e pagamento entre usuários (veja "Quando não usar").
  • O webhook de doações ainda não persiste a doação nem envia e-mail (pendências marcadas em app/api/webhooks/abacatepay/route.ts).
  • /precos e /sobre estão em construção.
  • pnpm test cobre só a validação dos metadados de itens (3 testes); não há CI.

Licença

Sem licença publicada: todos os direitos reservados.