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
server.tssobe o Next.js 15 (App Router) e o Socket.IO no mesmo servidor HTTP.- 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. - PostgreSQL guarda usuários, anúncios, lances e intenções (Prisma em
prisma/schema.prismae SQL puro emlib/db/migrations/); Redis atende autenticação, Socket.IO e controle de uso da IA; MongoDB guarda chats e mensagens. - O catálogo de itens sai de
data/tibiawiki.db(com imagens emdata/images/) e é importado porlib/items/import-from-sqlite.ts. - 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). /precose/sobreestão em construção.pnpm testcobre só a validação dos metadados de itens (3 testes); não há CI.
Licença
Sem licença publicada: todos os direitos reservados.
Feito por Evandro Fonseca Junior · git.evandro.dev.br