> ## 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.

# Tabelas de classificação usando o Azure Functions

> Tutorial para criar tabelas de classificação do PlayFab com o CloudScript do Azure Functions, mostrando como enviar pontuações e consultar classificações a partir de código do lado do servidor.

Neste tutorial, você aprenderá a implementar tabelas de classificação usando o CloudScript, especificamente por meio do [Azure Functions](/pt-BR/services/playfab/live-service-management/service-gateway/automation/cloudscript-af).
Essa abordagem é poderosa porque permite criar lógica personalizada do lado do servidor sem exigir atualizações do cliente.

Ao definir a lógica relacionada às tabelas de classificação em uma Azure Function, seu cliente pode invocar essa função para executar o código. Se forem necessárias alterações mais tarde, você poderá atualizar a Azure Function de forma independente, muitas vezes sem modificar o cliente, dependendo da complexidade da atualização.

## Pré-requisitos

Para seguir este tutorial, você precisa de:

* Uma conta do PlayFab. Se você não tiver uma, poderá criá-la [aqui](https://developer.playfab.com/).
* Uma assinatura do Azure. Se você não tiver uma, poderá criá-la [aqui](https://azure.microsoft.com/free/).

Para obter mais detalhes sobre como criar uma Azure Function, confira este guia: [Criar sua primeira função no Azure usando o Visual Studio](https://learn.microsoft.com/azure/azure-functions/functions-create-your-first-function-visual-studio)

## Criar uma tabela de classificação usando o Azure Functions

Nesta seção, vamos criar uma tabela de classificação que permite enviar pontuações e recuperar as melhores pontuações.

```C# theme={null}
[Function("LeaderboardExample")]
public async Task<HttpResponseData> RunAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    PlayFabSettings.staticSettings.TitleId = "78C3E"; // Change this value to your own titleId from PlayFab Game Manager
    PlayFabSettings.staticSettings.DeveloperSecretKey = "WJT5SBP7PUFH61JHE39QQ4F1SJKGBWBJR647CH1WYB9CS3MZDD"; // Change this to your title's secret key from Game Manager
                                                                                                              // Check if parameter exists
    if (string.IsNullOrEmpty(req.Query["leaderboardName"]))
    {
        var badResponse = req.CreateResponse(HttpStatusCode.BadRequest);
        badResponse.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        badResponse.WriteString("Please pass a leaderboardName on the query string");
        return badResponse;
    }

    PlayFabAuthenticationContext authContext = await LoginAsTitleEntity();
    var result = await CreateLeaderboardDefinitionAsync(authContext, req.Query["leaderboardName"]);
    if (result != null)
    {
        if (result.Error != null) {
            PlayFabError apiError = result.Error;
            var response = req.CreateResponse(HttpStatusCode.BadRequest);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            if (apiError != null)
            {
                response.WriteString("Something went wrong with your API call.  :");
                response.WriteString("Here's some debug information:");
                response.WriteString(PlayFabUtil.GenerateErrorReport(apiError));
                return response;
            }
            response.WriteString("Something went wrong with your API call but it wasn't possible to get a PlayFab error description.");
            return response;
        }
        else
        {
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            response.WriteString("Leaderboard created successfully!");
            return response;
        }
    }
    else 
    {
        var response = req.CreateResponse(HttpStatusCode.BadRequest);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        response.WriteString("Something went wrong with your API call.  :");
        return response;
    }    
    
}

```

* O atributo de função `[Function("LeaderboardExample")]` define o nome da função, neste caso `LeaderboardExample`.
* A função é disparada por uma solicitação HTTP, conforme indicado pelo atributo `[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]`. Isso significa que a função pode ser acessada pelos métodos HTTP GET e POST sem nenhuma autenticação.
* Dentro da função, definimos o Title ID do PlayFab e a Developer Secret Key para autenticar nossas solicitações aos serviços do PlayFab. Você pode alterar a forma de acessar esses valores com base no que for mais adequado ao seu caso específico e aos seus requisitos de segurança.
* A função verifica se o parâmetro de consulta "leaderboardName" foi fornecido na solicitação.
* Em seguida, chamamos o método `LoginAsTitleEntity` para autenticar como uma entidade de título, o que é necessário para criar definições de tabelas de classificação.
* Por fim, chamamos o método `CreateLeaderboardDefinitionAsync` para criar uma definição de tabela de classificação com o nome fornecido. Para saber mais sobre a criação de tabelas de classificação, confira [Criar uma tabela de classificação básica](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard) e [Fazendo mais com tabelas de classificação](/pt-BR/services/playfab/community/leaderboards/doing-more-with-leaderboards).

O método RunAsync serve como ponto de entrada da sua Azure Function. A partir dele, você pode definir e chamar métodos adicionais para criar sua lógica de jogo personalizada. A forma como você trata erros ou interage com vários serviços do PlayFab fica totalmente a seu critério, oferecendo total flexibilidade na sua implementação.

Além disso, você pode configurar regras de automação para disparar essa Azure Function com base em eventos específicos. Para obter mais detalhes, consulte [aqui](/pt-BR/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart).

## Confira também

* [Fazendo mais com tabelas de classificação](/pt-BR/services/playfab/community/leaderboards/doing-more-with-leaderboards).
* [Criar uma tabela de classificação básica](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard).
* [Níveis manuais](/pt-BR/services/playfab/community/leaderboards/manual-tiers).
* [Limites](/pt-BR/services/playfab/community/leaderboards/limits-leaderboards).
* [Cota](/pt-BR/services/playfab/community/leaderboards/quota-leaderboards).
* [Tabelas de classificação sazonais](/pt-BR/services/playfab/community/leaderboards/seasonal-leaderboards).
* [Classificando jogadores por estatísticas](/pt-BR/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [Adicionar dados contextuais às tabelas de classificação](/pt-BR/services/playfab/community/leaderboards/metadata-leaderboards).
* [Tabelas de classificação com PlayStream](/pt-BR/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry).
* [Referência da API](/pt-BR/services/playfab/community/leaderboards/api-reference).


## Related topics

- [Tabelas de classificação com níveis manuais](/pt-BR/services/playfab/community/leaderboards/manual-tiers.md)
- [Tabelas de classificação com PlayStream e Telemetry](/pt-BR/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry.md)
- [Tabelas de classificação sazonais](/pt-BR/services/playfab/community/leaderboards/seasonal-leaderboards.md)
- [Tabelas de classificação de grupos](/pt-BR/services/playfab/community/leaderboards/group-leaderboards.md)
- [Usando tabelas de prêmios](/pt-BR/services/playfab/community/leaderboards/tournaments-leaderboards/using-prize-tables.md)
