RESEARCH
Projeto: IdleRPG para WhatsApp
Resumo executivo
A ideia é criar um RPG passivo inspirado no IdleRPG de IRC, mas adaptado ao comportamento e às limitações do WhatsApp. Em vez de tentar copiar literalmente a experiência de um canal IRC — onde o jogador fica “idle” em um canal e é penalizado por falar — o jogo seria redesenhado para funcionar como uma experiência assíncrona por mensagens, com progressão automática, comandos simples, ranking, guildas, duelos e eventos acumulados.
O ponto central: não devemos fazer um clone cego do IdleRPG para WhatsApp. Isso seria tecnicamente frágil e provavelmente ruim como produto. O WhatsApp não é IRC. O melhor caminho é criar um jogo nativo para mensagens: menos spam, mais opt-in, mais progresso passivo e comandos curtos.
Inspiração
O IdleRPG original nasceu no IRC e funciona com uma lógica deliberadamente absurda: o jogador progride ao ficar parado. Falar, trocar nick, sair do canal ou ser kickado pode gerar penalidades. O charme está justamente nessa inversão: o melhor jogador é quem “não joga”.
No WhatsApp, essa mecânica precisa ser reinterpretada. Não existe o mesmo conceito público de presença em canal IRC, e uma experiência baseada em grupos poderia facilmente virar spam. Portanto, o espírito do IdleRPG deve ser preservado, mas a implementação precisa mudar.
Tese do produto
Um RPG passivo por WhatsApp, opt-in, 1:1, com ranking público, guildas, duelos assíncronos e eventos acumulados.
O jogo não deve depender de conversa constante. Ele deve recompensar a volta ocasional do jogador, não a insistência. A graça está em abrir o WhatsApp, digitar perfil, e descobrir que algo aconteceu enquanto você estava fora.
Princípios de design
1. WhatsApp não é IRC
Tentar simular um canal IRC dentro de um grupo de WhatsApp é uma má ideia. O grupo vira barulho, a API oficial não é ideal para esse tipo de uso, e bots não oficiais são instáveis.
2. O jogo deve ser assíncrono
O jogador não precisa estar online. O servidor calcula tudo com base no tempo passado desde a última resolução.
Exemplo:
Você ficou fora por 7h42m.
Enquanto isso:
- Encontrou uma Capa do Silêncio +2.
- Perdeu um duelo contra Ana.
- Sua guilda avançou 12% na quest "O Kernel Perdido".
3. Poucas mensagens, alto valor
O jogo não deve mandar notificações o tempo todo. O ideal é responder quando o jogador interage. Mensagens proativas devem ser raras, configuráveis e úteis.
4. Anti-spam como mecânica
No IRC, falar demais era penalizado. No WhatsApp, isso pode virar uma mecânica de “fadiga”.
Exemplos:
- comandos repetidos não aceleram progresso;
- flood aumenta fadiga;
- sumir por algumas horas gera bônus de descanso;
- interagir uma vez por dia dá recompensa;
- mandar mensagens inúteis como “up” não melhora nada.
5. O jogo precisa ser simples antes de ser complexo
O MVP deve ter poucos comandos e uma progressão clara. Nada de começar com IA, mapa gigante, economia complexa ou 40 classes.
Experiência do jogador
Registro
registrar Pablo Programador
Resposta:
Personagem criado.
Nome: Pablo
Classe: Programador
Nível: 1
Status: descansando
Use "perfil" para ver seu progresso.
Perfil
perfil
Resposta:
Pablo, Programador Nível 7
XP: 82%
Próximo nível em: 3h42m
Ouro: 128
Item raro: Teclado Mecânico +4
Status: descansando
Fadiga: baixa
Eventos acumulados
eventos
Resposta:
Enquanto você estava fora:
- Você encontrou Botas do Silêncio +2.
- Ganhou 31 de ouro.
- Foi desafiado por Ana e perdeu.
- Sua guilda concluiu 18% da quest "Compilar o Kernel Perdido".
Ranking
ranking
Resposta:
Top jogadores:
1. Ana — Nível 14
2. Pablo — Nível 12
3. Bruno — Nível 11
4. Clara — Nível 9
5. Diego — Nível 8
Duelo
duelar Ana
Resposta:
Você desafiou Ana.
Resultado:
Ana venceu.
Motivo:
Ela tinha mais agilidade e um Amuleto de Deploy +3.
Penalidade:
+18 minutos até seu próximo nível.
Comandos do MVP
registrar <nome> <classe>
perfil
eventos
ranking
inventario
duelar <nome>
guilda
quest
ajuda
Esses comandos são suficientes para validar se o loop central é divertido.
Classes iniciais
As classes devem ter sabor, mas sem balanceamento complexo no começo.
Sugestões:
| Classe | Tema | Bônus |
|---|---|---|
| Programador | código, bugs, deploy | mais chance de item técnico |
| Bardo | comunicação, carisma | bônus em guildas |
| Guerreiro | combate direto | bônus em duelos |
| Ladino | sorte, evasão | chance de evitar penalidade |
| Mago | eventos raros | chance maior de evento especial |
| Clérigo | recuperação | reduz fadiga |
Mecânicas principais
Progressão passiva
Cada personagem tem um campo last_resolved_at.
Quando o jogador manda qualquer comando, o servidor calcula quanto tempo passou desde a última resolução e aplica:
- ganho de XP;
- chance de item;
- eventos aleatórios;
- duelos pendentes;
- progresso de quest;
- efeitos de fadiga;
- mudanças de ranking.
Tempo até o próximo nível
O jogo pode manter o espírito do IdleRPG usando um contador regressivo.
Exemplo:
Próximo nível em: 5h13m
Eventos positivos reduzem esse tempo. Penalidades aumentam.
Fadiga
Fadiga é a resposta elegante ao spam.
Ações que podem aumentar fadiga:
- repetir comandos em sequência;
- tentar duelar muitas vezes;
- mandar mensagens sem comando;
- usar comandos em cooldown.
Efeitos possíveis:
- menor chance de item;
- mais tempo até o próximo nível;
- bloqueio temporário de duelos;
- mensagens sarcásticas do bot.
Descanso
O oposto da fadiga.
Se o jogador fica algumas horas sem interagir, recebe bônus moderado de descanso.
Exemplo:
Você descansou bem.
Bônus: -12 minutos até o próximo nível.
Itens
Itens devem ser simples no MVP.
Campos básicos:
- nome;
- raridade;
- tipo;
- modificador;
- descrição;
- equipado ou não.
Exemplo:
Teclado Mecânico +4
Tipo: arma
Raridade: raro
Efeito: melhora duelos contra bugs e deploys.
Duelos assíncronos
O jogador desafia outro personagem. O resultado pode ser resolvido imediatamente ou quando o alvo voltar.
Critérios simples:
- nível;
- classe;
- itens;
- fadiga;
- sorte.
Guildas
Guildas podem ser o equivalente social dos canais IRC, mas sem exigir grupo de WhatsApp.
Comandos:
guilda criar <nome>
guilda entrar <nome>
guilda membros
guilda ranking
Quests globais
Quests são objetivos coletivos que avançam com o tempo e com participação moderada.
Exemplo:
Quest ativa:
"O Kernel Perdido"
Progresso: 41%
Recompensa: item raro para todos os membros da guilda vencedora.
Arquitetura recomendada
Versão séria e estável
WhatsApp Cloud API
↓
Webhook HTTP
↓
Backend FastAPI ou NestJS
↓
PostgreSQL
↓
Redis
↓
Worker / fila / cron
↓
Painel web opcional
Componentes
1. WhatsApp Cloud API
Recebe mensagens e envia respostas. É o caminho oficial e mais seguro.
2. Backend
Responsável por:
- autenticar webhooks;
- interpretar comandos;
- resolver eventos;
- consultar e atualizar estado;
- enviar respostas.
3. PostgreSQL
Guarda estado persistente:
- jogadores;
- personagens;
- itens;
- eventos;
- guildas;
- duelos;
- quests;
- logs de mensagens.
4. Redis
Útil para:
- cooldowns;
- rate limit;
- filas leves;
- cache de ranking;
- bloqueios temporários.
5. Worker
Processa tarefas periódicas:
- quests globais;
- expiração de duelos;
- rankings;
- eventos sazonais;
- limpeza de logs.
6. Painel web
Não é obrigatório no MVP, mas seria ótimo para:
- ranking público;
- perfis;
- mapa ou lore;
- status de quests;
- administração.
Modelo de dados inicial
players
CREATE TABLE players (
id UUID PRIMARY KEY,
phone_number TEXT UNIQUE NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now(),
last_seen_at TIMESTAMP
);
characters
CREATE TABLE characters (
id UUID PRIMARY KEY,
player_id UUID REFERENCES players(id),
name TEXT NOT NULL,
class TEXT NOT NULL,
level INTEGER NOT NULL DEFAULT 1,
xp INTEGER NOT NULL DEFAULT 0,
gold INTEGER NOT NULL DEFAULT 0,
fatigue INTEGER NOT NULL DEFAULT 0,
next_level_at TIMESTAMP,
last_resolved_at TIMESTAMP NOT NULL DEFAULT now()
);
events
CREATE TABLE events (
id UUID PRIMARY KEY,
character_id UUID REFERENCES characters(id),
type TEXT NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now(),
seen_at TIMESTAMP
);
items
CREATE TABLE items (
id UUID PRIMARY KEY,
character_id UUID REFERENCES characters(id),
name TEXT NOT NULL,
rarity TEXT NOT NULL,
slot TEXT,
modifier INTEGER NOT NULL DEFAULT 0,
equipped BOOLEAN NOT NULL DEFAULT false
);
guilds
CREATE TABLE guilds (
id UUID PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now()
);
API interna sugerida
Resolver personagem
resolveCharacter(character_id)
Responsável por calcular o tempo desde last_resolved_at e aplicar eventos.
Interpretar comando
parseCommand(message_text)
Transforma texto cru em intenção.
Exemplo:
{
"command": "duel",
"target": "Ana"
}
Executar comando
executeCommand(player_id, command)
Aplica a lógica do jogo e retorna uma resposta formatada para WhatsApp.
WhatsApp: caminhos possíveis
Caminho A — Oficial
Usar a WhatsApp Cloud API.
Vantagens:
- mais estável;
- menor risco de banimento;
- adequado para produto real;
- webhooks oficiais;
- controle melhor de mensagens.
Desvantagens:
- menos liberdade;
- regras de templates;
- janela de atendimento;
- grupos podem ser limitados ou inviáveis dependendo do caso;
- custos e aprovação de conta/template.
Caminho B — Não oficial
Usar automação de WhatsApp Web, como Baileys.
Vantagens:
- mais liberdade;
- pode funcionar em grupos;
- bom para protótipo privado;
- mais parecido com bot de IRC.
Desvantagens:
- não é oficial;
- pode quebrar sem aviso;
- risco de bloqueio;
- risco operacional;
- péssima base para produto público.
Veredito: usar Cloud API para MVP sério. Usar Baileys apenas se for um experimento fechado, descartável e sem número importante.
Riscos
1. Política da plataforma
Esse é o maior risco. WhatsApp não é uma plataforma aberta como IRC. O produto precisa respeitar o modelo de mensagens, opt-in e baixa frequência.
2. Grupos
Bot em grupo é a fantasia mais divertida, mas também a parte mais problemática. Não deve ser o centro do MVP.
3. Spam
Se o jogo mandar mensagens demais, morre rápido. WhatsApp é íntimo; notificação ruim ali irrita mais que notificação em Discord ou Telegram.
4. Retenção falsa
Se o jogo recompensar interação compulsiva, pode virar um clicker chato. A graça deve estar no retorno ocasional.
5. Complexidade prematura
IA, lore procedural, marketplace, NFT, mapa gigante, app mobile: tudo isso é distração no começo. Primeiro o loop precisa ser divertido em texto puro.
Roadmap
Fase 0 — Protótipo local
Objetivo: validar regras sem WhatsApp.
Entregáveis:
- motor de progressão;
- classes;
- itens;
- eventos;
- duelos;
- ranking fake;
- interface CLI.
Fase 1 — MVP WhatsApp 1:1
Objetivo: bot funcional com comandos básicos.
Entregáveis:
- webhook;
- cadastro;
- perfil;
- eventos acumulados;
- ranking;
- inventário;
- duelos;
- logs.
Fase 2 — Social leve
Objetivo: adicionar comunidade sem depender de grupos.
Entregáveis:
- guildas;
- ranking por guilda;
- quests globais;
- convites;
- página web pública.
Fase 3 — Temporadas
Objetivo: dar motivo para voltar.
Entregáveis:
- temporadas mensais;
- reset parcial;
- itens sazonais;
- títulos;
- conquistas.
Fase 4 — Experimento em grupo
Objetivo: testar bot em grupo sem comprometer o produto principal.
Entregáveis:
- integração experimental;
- grupo pequeno;
- mensagens limitadas;
- fallback para 1:1.
MVP técnico sugerido
Stack
- Python + FastAPI
- PostgreSQL
- Redis
- RQ ou Celery
- WhatsApp Cloud API
- Docker Compose
- Painel simples em Next.js ou HTML server-side
Estrutura de pastas
whatsapp-idlerpg/
├── app/
│ ├── main.py
│ ├── config.py
│ ├── webhooks/
│ ├── game/
│ │ ├── commands.py
│ │ ├── resolver.py
│ │ ├── duels.py
│ │ ├── items.py
│ │ └── events.py
│ ├── db/
│ └── whatsapp/
├── migrations/
├── tests/
├── docker-compose.yml
└── README.md
Exemplo de loop de resolução
def resolve_character(character, now):
elapsed = now - character.last_resolved_at
if elapsed.total_seconds() <= 0:
return []
events = []
# Progresso passivo
minutes = elapsed.total_seconds() // 60
character.xp += int(minutes * base_xp_rate(character))
# Descanso
if minutes >= 180:
character.fatigue = max(0, character.fatigue - 2)
events.append("Você descansou bem e reduziu sua fadiga.")
# Evento aleatório
if should_roll_event(minutes):
events.append(roll_random_event(character))
# Level up
while character.xp >= xp_needed(character.level):
character.xp -= xp_needed(character.level)
character.level += 1
events.append(f"Você subiu para o nível {character.level}.")
character.last_resolved_at = now
return events
Tom do bot
O bot deve ter personalidade seca, engraçada e levemente sarcástica. Nada de textão motivacional.
Exemplos:
Você tentou farmar digitando "perfil" 12 vezes.
Resultado: absolutamente nada.
Fadiga +1.
Você encontrou uma Espada de Deploy.
Ela parece poderosa e mal testada.
Você perdeu um duelo contra Ana.
Motivo: ela estava descansada. Você estava emocionado.
Nome do projeto
Sugestões:
- ZapRPG
- IdleZap
- ZapQuest
- RPG de Bolso
- ZapIdle
- MuradMUD
- BotecoRPG
- Descanso & Dragões
- Calabouço Assíncrono
Melhor nome provisório: IdleZap.
É curto, claro e comunica a ideia rapidamente.
Decisão recomendada
Construir o projeto como IdleZap: um RPG passivo por WhatsApp, usando a API oficial como base e evitando grupos no MVP.
A primeira versão deve provar apenas uma coisa:
É divertido voltar depois de algumas horas e ver o que aconteceu com seu personagem?
Se a resposta for sim, vale expandir. Se a resposta for não, nenhum grupo, IA, ranking bonito ou feature social salva o produto.
Referências técnicas
- IdleRPG original — código-fonte e versões do bot: https://www.idlerpg.net/source.php
- WhatsApp Cloud API — envio de mensagens: https://developers.facebook.com/documentation/business-messaging/whatsapp/reference/whatsapp-business-phone-number/message-api/
- WhatsApp Cloud API — grupos / recipient_type: https://developers.secure.facebook.com/documentation/business-messaging/whatsapp/reference/groups/groups-query-api
- Baileys — biblioteca TypeScript para automação do WhatsApp Web: https://github.com/WhiskeySockets/Baileys
- Baileys docs — introdução: https://baileys.wiki/docs/intro/
Related documents
- 001
- 002
- 003
- 004
research · MD
100 jogos cozy para quem ama Stardew Valley - 005