Documentação do Steamworks
Notificações de jogo

Visão geral

Notificações de jogo Steam é um sistema para a transmissão de notificações offline a usuários para jogos com partidas multijogadoras assíncronas, como Xadrez.

O propósito da API é notificar usuários de que há uma ação pendente em uma sessão de partida em andamento. No exemplo de Xadrez, o estado da sessão é atualizado após o movimento de cada jogador. O Steam então enviará notificações aos usuários com base no estado da sessão de partida para alertá-los quando for a vez de jogarem.

Responsabilidades do jogo

Um jogo offline típico cuida de uma sessão de partida, atualizando a situação de cada jogador com estados que, por sua vez, enviarão uma notificação ao usuário para que saibam que precisam iniciar o jogo e realizar uma ação. Ao iniciar e realizar as ações no jogo, espera-se que este atualize a sessão de partida novamente com estados atualizados para todos os usuários na sessão.

Responsabilidades do Steam

O Steam cuidará da notificação de usuários em uma sessão de partida com base nos estados informados pelo jogo e as configurações específicas selecionadas pelo usuário para o jogo. Um alerta será exibido no cliente Steam e no navegador quando houver uma ação pendente para um jogo.

Requisitos

A API de notificações de jogo é oferecida por métodos da Web API e requer uma chave de distribuidora válida. As chamadas aos métodos da Web API devem originar de um servidor hospedado separado do cliente do jogo — a chave de distribuidora não deve ser integrada a qualquer código do cliente do jogo.

Autenticação e contas externas

Para chamar as APIs de notificações de jogo, é necessário primeiro estabelecer a identidade do usuário Steam atual do jogo. É possível fazê-lo de duas formas: o cliente do jogo pode gerar um ticket de sessão para autenticação e passá-lo de volta ao servidor, ou um jogo baseado na web pode verificar o usuário com OpenID. Instruções para tal estão disponíveis aqui. É importante não confiar na identidade do usuário em mensagens enviadas diretamente do cliente do jogo ao servidor, por ser possível modificá-las.
Para jogos que usam contas externas, use as instruções acima, mas armazene o ID Steam do usuário no sistema.

API de notificações de jogo

Visão geral técnica

A API de notificações de jogo é escrita e exposta por Web APIs e requer 4 parâmetros em cada método:
  • appid (o ID de aplicativo do jogo);
  • format (o formato do resultado. Recomendamos valor de retorno json);
  • input_json (os parâmetros exigidos por um método, codificados em um JSON);
  • key (a chave de distribuidora a passar com cada chamada).
A API retornará um código de estado HTTP 200 se bem-sucedida, com detalhes no corpo da mensagem (se aplicável).

Valores constantes

UserState

Uma string definida como uma das abaixo:
  • waiting — O usuário está aguardando outros jogadores e não está bloqueando nenhuma ação. Nenhuma notificação será enviada ao usuário por estar aguardando uma ação de outro usuário;
  • ready — O usuário está pronto — a sessão de partida está aguardando uma resposta do usuário. Uma notificação será enviada ao usuário até este estado ser removido;
  • done — A partida foi concluída para o usuário. O usuário será notificado da conclusão da partida, mas nenhuma ação é exigida.

Estruturas de dados (JSON)

Todas as estruturas de dados são representadas no formato JSON.

Variable

{ "key": "nome_da_chave", // string "value": "valor_da_chave" // string }

LocalizedText

{ "token": "valor", // string mapeada a um token de localizacao "variables": [ // Vetor de objetos "Variable" (acima) ] }

UserStatus

{ "steamid": "76561197960265729", // uint64 "state": // Uma das constantes "UserState" (descritas acima), "title": // Um objeto "LocalizedText" (descrito acima), "message": // Um objeto "LocalizedText" (descrito acima) }

Session

{ "sessionid": "1", // uint64 "title": // Um objeto "LocalizedText" (acima), "time_created": "100000", // Horario no formato de Era Unix (segundos desde 1 de janeiro de 1970). "time_updated": "200000", // Horario no formato de Era Unix (segundos desde 1 de janeiro de 1970). // Valor de 64 bits informado pelo desenvolvedor no momento da criacao da sessao, que sera passado ao jogo na inicializacao. // Use para vincular o objeto de sessao ao objeto no backend. Nao usado internamente pelo Steam. "context": "31415926", "user_status": [ // Vetor de objetos "UserStatus" (descritos acima) ] }

RequestedSession

{ "sessionid": "1", // uint64 "include_all_user_messages": "0" // bool }

APIs comuns disponíveis

Consulte IGameNotificationsService para ver a lista completa.

Iniciar sessões de partida específicas

Usuários terão como ver todas as sessões de partida ativas na respectiva página de perfil na Comunidade Steam. Juntamente com o estado da partida, há um botão para que o Steam inicie o jogo com parâmetros de inicialização específicos que definem a sessão de partida. Quando um jogo é iniciado dessa forma, um parâmetro de inicialização "_sessionid" será informado ao jogo; para recuperá-lo, use a função ISteamApps::GetLaunchQueryParam.
Exemplo:
const char *pchSessionID = ISteamApps()->GetLaunchQueryParam("_sessionid");
Um jogo que permite carregar uma partida diretamente desta forma deve chamar a interface na inicialização do jogo, determinar se a string de ID de sessão está presente e válida para o usuário atual e então, carregar a partida.

Localização

A localização é informada pelo desenvolvedor do jogo por uma ferramenta de localização que é parte da configuração do aplicativo. Você é responsável por definir a tradução de cada idioma para cada string informada na ferramenta de localização. Strings que não estiverem traduzidas no idioma do jogador serão exibidas em inglês.
A API de notificações de jogo permite a localização das seguintes propriedades:

Cada LocalizedText é composto de dois componentes:

Um token é uma chave que começa com o símbolo "#" e representa uma string localizada em diferentes idiomas por meio da ferramenta de localização da configuração de aplicativo. Um único token pode conter várias variáveis, que são substituídas em tempo de execução dependendo do contexto da partida no momento da geração do texto. Um exemplo seria:
#InvitationText = "{{user}} has invited you to play a game of Chess."

No exemplo acima, a tradução em inglês para #InvitationText contém uma única variável, chamada "user". Quando quiser exibir essa mensagem de texto a um usuário quando "SteamUserName" o convidar para uma partida, atualize o objeto LocalizationText com as seguintes propriedades:
"message": { "token": "#InvitationText", "variables": [ { "key": "user", "value": "Michael" } ] }

Quando o jogador visualizar o estado, ele então verá esta mensagem (no seu idioma): "Michael has invited you to play a game of Chess."
Tokens de localização podem ser enviados na seção "Notificações assíncronas" da aba "Comunidade" da página de configurações do Steamworks para o aplicativo.
Cada idioma pode ser enviado individualmente em arquivos VDF em um formato similar a:
"lang" { "Language" "brazilian" "Tokens" { "TheNameOfTheToken" "O texto localizado associado ao token" "TheNameOfAnotherToken" "O texto localizado associado ao segundo token" } }

Também é possível enviar os tokens para todos os idiomas em um único arquivo, no formato:
"lang" { "english" { "Tokens" { "TheNameOfTheToken" "The localized text associated with the token" "TheNameOfAnotherToken" "The localized text associated with the second token" } } "brazilian" { "Tokens" { "TheNameOfTheToken" "O texto localizado associado ao token" "TheNameOfAnotherToken" "O texto localizado associado ao segundo token" } } }