> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Usando dados de grupo compartilhados

> Use os dados de grupo compartilhados do PlayFab com o CloudScript para armazenar o estado de jogos baseados em turnos, dados de pequenos grupos e gerenciar permissões de leitura/gravação para membros do grupo.

Os dados de grupo compartilhados são uma maneira simples de os jogadores compartilharem algumas informações com uma lista bem restrita de outros jogadores.

<Note>
  Os dados de grupo compartilhados foram originalmente projetados para serem controlados de forma autoritativa pelo servidor na maioria dos casos, e a recomendação anterior era *não* adicionar jogadores diretamente aos dados de grupo compartilhados, pois isso lhes dava permissões de leitura/gravação (permitindo trapaças). No entanto, nossa nova [Política de acesso à API](/pt-BR/services/playfab/api-references/api-access-policy) permite uma variação muito maior de funcionalidade e segurança em relação ao design original. Mais detalhes estão disponíveis na seção avançada deste documento.
</Note>

<Warning>
  Os dados de grupo compartilhados não devem ser usados por grupos com mais de cerca de uma dúzia de jogadores, no máximo. Um problema é que muitos jogadores tentando ler os mesmos dados ao mesmo tempo resultará em atrasos na leitura dos dados (os dados de grupo compartilhados não são *fragmentados* nem *armazenados em cache*, como acontece com dados destinados a serem lidos por muitos jogadores ao mesmo tempo, como os dados do título). E é preciso tomar cuidado especial para impedir que os jogadores sobrescrevam os dados uns dos outros. Caso vários jogadores tentem gravar na mesma chave ao mesmo tempo, apenas uma dessas gravações "vencerá", resultando na perda dos dados do outro usuário.
</Warning>

## Exemplo: jogos multijogador assíncronos baseados em turnos

O caso de uso original, e ainda o melhor, para dados de grupo compartilhados é mais bem descrito como armazenar o estado de um jogo de tabuleiro online. Os jogadores se revezam modificando os dados via CloudScript, com uma ordem de turnos clara.

Os jogadores podem sair e retomar o jogo mais tarde, com o estado do jogo armazenado na nuvem.

O exemplo de CloudScript a seguir é a estrutura baseada em turnos de qualquer jogo de tabuleiro comum. O jogo de tabuleiro em si está representado como pseudocódigo.

### Suposições

Os dados de grupo compartilhados que representam o jogo já foram iniciados e seus membros já estão definidos.

```javascript theme={null}
// CloudScript/Javascript
const MY_GAME_GROUP_KEYS: Array<string> = ["gameState", "currentPlayerTurn"];
interface PlayerTurnArgs {
    sharedGroupId: string;
    nextPlayerTurn: string;
    turnData: any;
}
handlers.TakePlayerTurn = function (args: PlayerTurnArgs) {
    var getRequest: PlayFabServerModels.GetSharedGroupDataRequest = { SharedGroupId: args.sharedGroupId, GetMembers: true, Keys: MY_GAME_GROUP_KEYS };
    var gameData: PlayFabServerModels.GetSharedGroupDataResult = server.GetSharedGroupData(getRequest);
    CheckValidPlayer(currentPlayerId, args.sharedGroupId, gameData.Members, gameData.Data["currentPlayerTurn"].Value, args.nextPlayerTurn);
    var newGameStateJson = UpdateGameState(args.turnData, gameData.Data["gameState"].Value);
    var updateRequest: PlayFabServerModels.UpdateSharedGroupDataRequest = {
        SharedGroupId: args.sharedGroupId,
        Data: {
            "gameState": newGameStateJson,
            "currentPlayerTurn": args.nextPlayerTurn
        }
    };
    server.UpdateSharedGroupData(updateRequest);
}
function CheckValidPlayer(playFabId: string, sharedGroupId: string, members: Array<string>, currentPlayerTurn: string, nextPlayerTurn: string): void {
    var validCurPlayer = false;
    var validNextPlayer = false;
    for (var m = 0; m < members.length; m++) {
        if (members[m] === playFabId)
            validCurPlayer = true;
        if (members[m] === nextPlayerTurn)
            validNextPlayer = true;
    }
    if (!validCurPlayer || !validNextPlayer) // Take extreme action against a player trying to cheat
    {
        server.BanUsers({ Bans: [{ PlayFabId: playFabId, Reason: "Trying to play a game you don't belong to: " + sharedGroupId }] });
        throw "You have been banned";
    }

    if (playFabId !== currentPlayerTurn)
        // May wish to additionally implement a spam-counter here and potentially take more extreme action for high-spam count
        throw "Not your turn";
}
function UpdateGameState(turnData: any, currentState: string): string {
    // PSEUDO-CODE-STUB: Update the turn-based game state according to the rules of this game
    return JSON.stringify({});
}
```

Em alto nível, você pode usar os dados de grupo compartilhados para implementar grupos/incursões ou outros grupos semipermanentes de jogadores, desde que o tamanho do grupo seja relativamente pequeno, conforme mencionado.

Embora atualmente não haja um limite estritamente imposto, o uso com muitos jogadores não é compatível e, em casos extremos, pode resultar na limitação do recurso do título para evitar impacto em outros usuários do serviço.

### Principais restrições

* **Dados de grupo compartilhados**:
  * Contêm apenas dados simples de pares chave/valor (cadeias de caracteres). Para uso como qualquer outro tipo de dados (como itens de inventário, Statistics, moeda virtual etc.), o título deve fornecer as conversões necessárias.
  * Não são *fragmentados* nem *armazenados em cache*, portanto não serão responsivos quando acessados simultaneamente por vários jogadores. Os recursos que os utilizam devem ser projetados pensando em pequenos grupos de jogadores e não devem permitir gravações simultâneas.

### Preocupações com permissões do cliente

Não há sistema de funções/classificações dentro de um grupo, o que significa que qualquer membro do grupo tem autoridade absoluta dentro do grupo (não há um líder definido).

Sendo direto, isso significa que, a menos que você desabilite os métodos de dados de grupo compartilhados do cliente com nossa [Política de acesso à API](/pt-BR/services/playfab/api-references/api-access-policy), os clientes terão *controle total dos dados*, o que pode resultar em exploração dos dados.

A prática recomendada é *não* usar dados de grupo compartilhados para dados que afetam a jogabilidade ou desabilitar os métodos de dados de grupo compartilhados na API de cliente.


## Related topics

- [Obter dados de grupo compartilhado](/pt-BR/services/playfab/api-references/rest/client/shared-group-data/get-shared-group-data.md)
- [Atualizar dados de grupo compartilhado](/pt-BR/services/playfab/api-references/rest/client/shared-group-data/update-shared-group-data.md)
- [Obter dados do grupo compartilhado](/pt-BR/services/playfab/api-references/rest/server/shared-group-data/get-shared-group-data.md)
- [Atualizar dados do grupo compartilhado](/pt-BR/services/playfab/api-references/rest/server/shared-group-data/update-shared-group-data.md)
- [Grupos de entidades](/pt-BR/services/playfab/community/associations/groups/quickstart.md)
