Blog

Dotinha: minhas partidas de Dota 2 num relatório do Power BI

Montei um BI das minhas últimas partidas de Dota 2 com a API do OpenDota e os textos oficiais do jogo em português. Mostro as páginas e o detalhe que faz a atualização agendada funcionar sem gateway.

5 min de leitura Power BI, Power Query, Projetos, HTML Content

Página Perfil do relatório Dotinha no Power BI, ao lado do título do post

Depois da Pokédex em Power BI, quis aplicar a mesma ideia a dados que mudam todo dia: as minhas partidas de Dota 2. O resultado é o Dotinha, um relatório que mostra as últimas partidas, compara com a carreira inteira e ainda traz a enciclopédia de heróis e itens com os textos oficiais em português.

Ele está publicado e aberto: abra o relatório no Power BI. O código está no GitHub.

Página Perfil com medalha, MMR estimado, KPIs das últimas 10 partidas, cartões das partidas e gráfico de GPM e XPM
A página Perfil: as últimas 10 partidas contra a carreira inteira.

As páginas

Perfil. Medalha, MMR estimado, vitórias e derrotas da carreira e a forma recente. Os KPIs das últimas partidas (KDA, GPM, XPM, dano, duração) vêm com a variação contra a média da carreira, para responder a pergunta que interessa: estou jogando melhor ou pior do que costumo? Abaixo, um cartão por partida, o gráfico de GPM e XPM e os destaques, como melhor KDA e maior dano.

Partidas. A lista das partidas com filtros (vitórias, derrotas, modo de jogo e herói) e, ao clicar, o placar completo: os dez jogadores com medalha, K/D/A, net worth, dano e itens. Também há gráficos da partida (net worth, dano e abates) e os itens com que eu terminei o jogo.

Placar completo de uma partida com os dois times, K/D/A, net worth, dano em heróis e itens
O placar de uma partida, no mesmo formato que os sites de estatística usam.

Heróis. Os 127 heróis com nomes, habilidades, talentos e história em português, além do vídeo animado de cada um. Cada ficha traz o meu histórico com aquele herói: partidas na carreira, winrate, quantas vezes joguei com ou contra ele e as partidas recentes. Também dá para ouvir as falas de cada herói.

Galeria de heróis com winrate por herói e a ficha do Outworld Destroyer com o histórico pessoal
Heróis: atributos oficiais e o meu histórico com cada um.

Itens. O catálogo com nomes em português, a receita (componentes e no que cada item se transforma) e quantas vezes eu e os outros jogadores compramos aquele item nas últimas partidas.

Catálogo de itens e a ficha do Cetro de Aghanim com receita e uso nas últimas partidas
Itens: receita, preço e quem comprou nas últimas partidas.

Aliados. As pessoas com quem eu mais joguei: partidas juntos, winrate em dupla comparado ao meu winrate geral e as últimas partidas em que estávamos no mesmo time.

Arena RPG. Um minijogo por turnos: você escolhe dois heróis e o nível, e a cada turno ataca, usa uma habilidade, defende ou bebe uma poção. Vida, mana, armadura e dano das habilidades vêm dos valores oficiais do jogo, e o inimigo responde com uma IA simples. Tem efeitos sonoros e as falas dos heróis.

Batalha na Arena RPG entre Windranger e Pugna, com barras de vida e mana e o registro dos turnos
Arena RPG: cada turno usa os atributos e as habilidades oficiais dos heróis.

Como funciona

Duas fontes públicas. As partidas, a carreira, os aliados e as constantes do jogo vêm da API do OpenDota. Os textos em português (heróis, habilidades, talentos e itens) vêm do datafeed oficial da dota2.com. Uma atualização faz cerca de 25 chamadas ao OpenDota e 130 ao datafeed, uma por herói.

Dois parâmetros. AccountID define o jogador e QtdPartidas, quantas partidas carregar. Troque o ID e o relatório inteiro passa a analisar outra pessoa.

O mesmo padrão da Pokédex. Cada página é um único visual HTML Content. Medidas DAX entregam os dados como objetos JavaScript, e um motor compartilhado monta as telas. Ao todo, são 97 medidas. O código de cada página fica em arquivos comuns (src/), e scripts em Python empacotam tudo nas medidas e regeneram o modelo (TMDL) e as páginas (PBIR).

O detalhe que faz a atualização agendada funcionar

Este foi o aprendizado mais útil do projeto, e serve para qualquer relatório que consome uma API.

O Power BI Service só agenda a atualização de uma fonte web se conseguir reconhecer a fonte antes de rodar a consulta. Se a URL for montada com texto concatenado, por exemplo "https://api.opendota.com/api/players/" & AccountID, o serviço trata a fonte como dinâmica e não deixa agendar.

A solução é manter a URL base fixa e mandar o resto pelo RelativePath. No Dotinha, toda chamada passa por uma função assim:

Power Query (M)
fnOpenDota = (relativePath as text) as any =>
    let
        bruto = Web.Contents(
            "https://api.opendota.com",
            [
                RelativePath = relativePath,
                Headers = [Accept = "application/json"]
            ]
        )
    in
        Json.Document(bruto)

E as consultas chamam fnOpenDota("api/players/" & Number.ToText(AccountID) & "/matches"). A parte variável continua lá, mas fora da URL base.

Com isso, a atualização agendada roda sem gateway. No serviço, as duas fontes ficam com acesso anônimo, nível de privacidade Público e a opção Ignorar conexão de teste marcada, porque a raiz dos sites não devolve JSON e o teste falharia.

Experimente

  1. Abra o relatório publicado. As imagens e os vídeos vêm da CDN da Steam, então a primeira carga leva alguns segundos.
  2. Em Partidas, clique numa partida para abrir o placar.
  3. Em Heróis, abra a ficha de um herói e ouça as falas.
  4. Na Arena RPG, escolha dois heróis e clique em Lutar.

Quer analisar a sua conta? Baixe o projeto no repositório, troque o AccountID e atualize. E se você precisa ligar o Power BI a uma API com atualização agendada, me mande uma mensagem.

Dados: OpenDota e dota2.com. Dota 2 e marcas relacionadas pertencem à Valve. Projeto pessoal, sem fins comerciais.

Leia também

  • Pokédex em Power BI: quando o relatório vira jogo

    Montei uma Pokédex interativa no Power BI com dados da PokeAPI, medidas DAX que geram HTML e quatro páginas em JavaScript, incluindo uma arena de batalhas. Mostro o resultado, as técnicas e o que dá para levar para um relatório de verdade.

    7 min de leitura Power BI, DAX, Projetos, HTML Content

  • K-Track: tudo que você assiste e lê, num só lugar

    Criei um app para acompanhar séries, animes, mangás, filmes e livros sem planilha e sem cinco aplicativos diferentes. Mostro o que ele faz, como foi construído e como começar de graça.

    5 min de leitura K-Track, Projetos, Python, FastAPI