Damas Online

O que é Damas Online?

É um projeto open source de um jogo de Damas online. A ideia era ser multiplataforma, mas por falta de tempo, só consegui fazer no mobile.

Tecnologias Usadas

Usado em Ambos

  • TypeScript para tipagem (seria um inferno fazer um projeto desse tamanho sem ele).
  • Socket.io para a comunicação em tempo real.

Frontend mobile:

Desenvolvido com React Native usando as seguintes libs:

  • Expo Router para navegação (me arrependi de ter usado, foi uma piada de mau gosto ter tanta dor de cabeça só para definir uma rota que não fosse a primeira em ordem alfabética como a inicial).
  • Unistyles 2.0 para temas de cores (mesmo só tendo criado um tema até agora).
  • React Query para gerenciar estados relacionados a chamadas de rede.
  • Axios para requisições (o interceptor facilitou muito a vida).
  • Diversas outras libs do ecossistema Expo, incluindo o expo-updates para atualizações OTA.

Backend:

Desenvolvido com o framework NestJS junto ao banco de dados PostgreSQL, usando as seguintes libs:

  • TypeORM como ORM (essa escolha foi para aprender algo novo, já que estava acostumado com Prisma).
  • @nestjs/jwt para geração de tokens JWT.
  • Bcrypt para gerar o hash da senha dos usuários.
  • Jest e outros pacotes para os testes.
  • Libs complementares do NestJS, como class-validator para os DTOs.

Funcionalidades

Já escrevi sobre esse tópico no README do backend e no mobile. Vou pegar alguns trechos de ambos:

Segurança

  • Autenticação de Usuário: Permite autenticação via nome e senha, gerando um token JWT.
  • Revalidação de Token: Garante a revalidação de tokens que expiraram.
  • Autenticação OAuth2: Integração com provedores OAuth2 como Google, Discord e GitHub, permitindo que os usuários criem contas diretamente através desses serviços.
  • Conexões WebSocket Protegidas: Implementa conexões WebSocket seguras usando tokens.
  • Desconfiança com o Frontend: O backend utiliza o UUID diretamente do token para identificar o usuário, incluindo nas conexões WebSocket.

Demonstração de login normal e OATUH2

Usuário

  • Cadastro de Usuário: Permite criar um novo usuário no sistema.
  • Verificação de Usuário: verifica se o nome de usuário ou email já existe.
  • Manipulação de Usuário: Rotas protegidas por token para obter, editar e excluir usuários.

Demonstração de edição de nome e logout

Jogo

  • Fila de Pareamento: Gerencia a fila de jogadores que desejam criar uma partida, organizando os pareamentos de forma automática.

  • Requisição de Caminhos Disponíveis: O frontend pode solicitar ao backend os caminhos que uma peça pode se mover, facilitando a exibição dos movimentos permitidos na interface.

  • Movimentação das Peças: As peças podem ser movidas ao longo do tabuleiro se o movimento for válido; quaisquer efeitos, como captura e promoção para dama, são feitos automaticamente.

  • Gerenciamento de Turnos: Controla a alternância de turnos entre os jogadores, garantindo que cada jogador realize sua jogada apenas na sua vez.

  • Ranking de Partidas: Implementa um sistema de classificação dos jogadores com base em suas performances em partidas anteriores, permitindo comparar habilidades e desempenho.

  • Histórico de Partidas: Os jogadores podem acessar um registro detalhado de todas as suas partidas jogadas anteriormente, incluindo resultados, datas e adversários.

  • Finalização de Partida Automática: A partida termina automaticamente quando um jogador fica sem peças no tabuleiro.

  • ...O resto está no repositório do backend, incluindo as regras do jogo.

O HTML do lado esquerdo está no backend e é apenas para testes, por isso é simples.

Está Online!

Aproveitei esse projeto para também praticar CI/CD. O repositório mobile possui uma action que, a cada release, compila o projeto, anexa um APK ao release e também publica uma atualização OTA via EAS Update para aqueles que já têm instalada uma versão do DamasPaia com runtime compatível.

No backend, influenciado por um vídeo do Akita, fui aprender a mexer no Heroku. Aproveitarei o bônus de $312 que eles oferecem para estudantes e vou deixar online por um tempo. Se alguém tiver vontade de fazer o frontend web, dá até para compartilhar o mesmo backend, tornando o jogo verdadeiramente multiplataforma.

Convido vocês a testarem! Aqui está o link do APK: damas-paia_release

Lembrando que, para iniciar uma partida, outra pessoa também precisa estar na fila. Peça a um amigo para testar junto.

Um pouco sobre mim

Me chamo Leonardo, tenho 18 anos e estou finalizando o ensino médio. Recentemente, terminei o curso de Técnico em Informática para Internet de um IF. A partir daí, me dediquei ao projeto deste post.

Meus meios de contato estão disponíveis no meu GitHub: 6aleatorio6.

Fim

Esse post marca o fim de algo que comecei há 3 meses e é o meu último projeto para o portfólio. Espero que tenham gostado! Talvez um dia eu escreva mais sobre o desenvolvimento desse projeto, como:

  • Meus traumas com o Expo Router
  • Minha tentativa de fazer testes no frontend, para no final o MSW não ter suporte a socket.io
  • Meus malabarismos com as tipagens no TypeScript
  • As dezenas de horas gastas na validação de formulários (se alguém for olhar o código, pode me dizer se compensa transformar aquilo em uma lib?)
  • Algumas funcionalidades que planejava implementar, mas acabei deixando de lado por falta de tempo e cansaço com o projeto.

Mas, para encerrar, aqui estão os repositórios do projeto:

Plataforma Tecnologia Status
Backend NestJS Finalizado
Mobile React Native Finalizado
Web React Não iniciado

boa tarde, sr.

parabéns pelo projeto.

felizmente, não baixo nenhum apk qualquer da internet por fins óbvios.

de toda forma, é possível notar que o sr fez um trabalho, com escopo bem fechadinho do início ao fim, e entregou um projeto de ponta a ponta, o que é mais valioso ainda frente à tua idade.

gostei de algumas de tuas escolhas no backend com o nest.

quais foram tuas dificuldades com este projeto?

parece que o sr tem vontade em seguir dev mobile? é isso? sabe dizer o pq de não ter escolhido dev web para este projeto?

tente publicar em .AAB na google play store. assim, diminui a barreira de entrada para que as pessoas testem teu aplicativo, o que vale também para recrutadores.

Boa tarde, Dealmeida. Obrigado pelo comentario, isso significa muito. --- > parece que o sr tem vontade em seguir dev mobile? é isso? sabe dizer o pq de não ter escolhido dev web para este projeto? Na verdade sou mais dev web, já que esse app foi desenvolvido com React native, algo mais proximo da web do que do código nativo das plataforma mobile. E eu tinha começado esse projeto com a intensão de ele ter um frontend web e mobile, tanto que até planejei upar a web no github pages. Talvez mais pra frente eu faça um front web para ele --- > quais foram tuas dificuldades com este projeto? Sinceramente, teve tantas difuldades do mesmo nivel que não sei por onde começar. Então vou me restringir a 3 no banckend: - Autenticaçao no WebSocket: Por nunca ter usado socket\.io no NestJs, não sabia a melhor forma de implementar. Por sorte essa [issue no github do nestJs](https://github.com/nestjs/nest/issues/882) deu um norte - Testes e2e: embora eu tenha demorado para construir o setup e tenha dado dor de cabeça mais pra frente, sem duvidas compensou, nem sei quanto tempo poupou de testar manualmente. - Lidar com Reconexão na partida: isso foi algo que me roubou algumas noites de sono e que sem duvidas compliquei demais (quase me levou a implementar redis no projeto, por sorte fiquei com medo de quantos bugs e complicações iria trazer), no final eu implementei a forma mais simples com um endpoint para finalizar partidas pendentes. E uma coisa que tenho que mencionar foi minha péssima gestão de tempo no projeto, ficando dias em detalhes com pouca importancia. --- > tente publicar em .AAB na google play store. assim, diminui a barreira de entrada para que as pessoas testem teu aplicativo, o que vale também para recrutadores. Até pensei nisso, mas infelizmente não tenho uma conta de dev da Google Play. Edit: tem alguma forma de aumentar a confiabilidade de um apk?