# VALORANT Rank Generator

Gerador de comandos de Rank/Elo do VALORANT para Streamlabs Cloudbot, StreamElements e Browser Source/OBS. Todo o frontend está em português do Brasil.

## API usada

O projeto usa a **HenrikDev Unofficial VALORANT API**, uma API comunitária não oficial. A documentação atual recomenda o endpoint MMR v3 por Riot ID e também documenta o v2 como alternativa. A API possui sistema de chaves e limites de requisição; por isso a chave deve ficar somente no backend/Secret do Cloudflare.

> Este projeto não é afiliado, patrocinado ou endossado pela Riot Games.

## Estrutura

```text
/
├── index.html
├── style.css
├── script.js
├── README.md
├── overlay/
│   └── index.html
└── functions/
    └── api/
        └── rank.js
```

## 1. Teste local

O site é estático, mas o endpoint `/api/rank` depende do runtime de Cloudflare Pages Functions. A forma recomendada é usar o Wrangler/Cloudflare Pages localmente.

Instale o Wrangler se ainda não tiver e execute o projeto com o ambiente de Pages Functions. Não é necessário Node.js rodando em produção.

## 2. Publicar no Cloudflare Pages

1. Crie um projeto no Cloudflare Pages.
2. Faça upload deste diretório ou conecte um repositório Git.
3. Como o projeto é estático + Pages Functions, não é necessário servidor/VPS.
4. Após o deploy, o domínio do Pages será usado automaticamente pelo frontend para gerar os comandos.

## 3. Secret da API

No Cloudflare Pages, adicione um Secret/Environment Variable chamado:

```text
HENRIKDEV_API_KEY
```

Cole sua chave HenrikDev **somente no backend**. Nunca coloque a chave em `script.js`, HTML ou outro arquivo público.

A documentação da HenrikDev informa que a API usa chaves e limites de requisição; a chave Basic é adequada para bots/uso educacional e chaves maiores existem para websites públicos. Consulte o painel da HenrikDev para criar a sua chave.

## 4. Endpoint

```text
GET /api/rank?player=btzx%23001&region=br&format=rank
GET /api/rank?player=btzx%23001&region=br&format=rank_rr
```

O endpoint de chat retorna **somente texto puro**. O formato `data` é reservado para o frontend/overlay e retorna JSON.

Formatos disponíveis:

- `rank`
- `rank_rr`
- `name_rank`
- `name_rank_rr`
- `full`
- `streamer`
- `minimal`
- `emoji`
- `custom`
- `data`

### Personalizado

Use `format=custom` e `template=` com:

```text
{riot_id} {name} {rank} {rank_en} {rr} {tier} {region} {region_name} {last_update}
```

## 5. Streamlabs Cloudbot

O site gera automaticamente:

```text
🎯 Elo atual: {readapi.https://SEU-DOMINIO/api/rank?player=btzx%23001&region=br&format=rank}
```

Copie exatamente o comando exibido pelo site para o Cloudbot.

## 6. StreamElements

O site gera automaticamente:

```text
🎯 Elo atual: $(customapi https://SEU-DOMINIO/api/rank?player=btzx%23001&region=br&format=rank)
```

## 7. Overlay

Exemplo:

```text
https://SEU-DOMINIO/overlay/?player=btzx%23001&region=br&size=normal&rr=1&name=1&icon=1&region_name=1
```

Adicione a URL como **Browser Source** no OBS/Streamlabs. O fundo é transparente.

## 8. Cache e proteção

O backend mantém um cache curto por jogador para reduzir chamadas repetidas. Também existe um rate limit básico por IP no Worker. Em produção, o Cloudflare pode fornecer controles adicionais de rate limiting/WAF.

## 9. Traduções

A tradução fica em `functions/api/rank.js`, no objeto `RANK_PT`.

## 10. Trocar a API futuramente

A função `upstream()` concentra a consulta externa. Para trocar de provedor, adapte somente essa função e mantenha o objeto normalizado esperado por `normalize()`.

## 11. Testes solicitados

Os testes funcionais de rede precisam ser executados depois que o projeto estiver publicado, porque o ambiente de desenvolvimento desta sessão não consegue fazer uma chamada HTTP direta à API externa. O código foi preparado para testar:

```text
/api/rank?player=btzx%23001&region=br&format=rank
/api/rank?player=btzx%23001&region=br&format=rank_rr
```

Não há rank fictício embutido no projeto: sem resposta válida da API, o backend retorna uma mensagem de erro em português.

## Endpoint de imagem

```text
GET /api/rank-image?player=btzx%23001&region=br
```

Retorna somente a URL do ícone de rank quando a API fornecer uma imagem.


## Deploy pelo Cloudflare Pages usando Drag & Drop

Este pacote usa **Advanced Mode** com `_worker.js`, justamente para funcionar
no upload pelo painel do Cloudflare Pages. A pasta `functions/` não é necessária
nesta versão.

No painel do Pages, envie o conteúdo deste ZIP como um projeto de Direct Upload.
O arquivo `_worker.js` deve ficar na raiz junto de `index.html`, `script.js` e `style.css`.

Depois do deploy, configure o Secret:

`HENRIKDEV_API_KEY`

O Worker atende:

- `/api/rank`
- `/api/rank-image`

Para todas as outras rotas, ele entrega os arquivos estáticos pelo binding `ASSETS`.

Documentação oficial do Advanced Mode:
https://developers.cloudflare.com/pages/functions/advanced-mode/

Documentação oficial de Direct Upload:
https://developers.cloudflare.com/pages/get-started/direct-upload/
