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

# Tablas de clasificación con Azure Functions

> Tutorial para crear tablas de clasificación de PlayFab con CloudScript de Azure Functions, que muestra cómo enviar puntuaciones y consultar clasificaciones desde código del lado servidor.

En este tutorial, aprenderá a implementar tablas de clasificación con CloudScript, específicamente mediante [Azure Functions](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af).
Este enfoque es eficaz porque le permite crear lógica personalizada del lado servidor sin necesidad de actualizaciones del cliente.

Al definir la lógica relacionada con las tablas de clasificación dentro de una función de Azure, el cliente puede invocar esa función para ejecutar el código. Si más adelante se necesitan cambios, puede actualizar la función de Azure de forma independiente, a menudo sin modificar el cliente, según la complejidad de la actualización.

## Requisitos previos

Para seguir este tutorial, necesita:

* Una cuenta de PlayFab. Si no tiene una, puede crearla [aquí](https://developer.playfab.com/).
* Una suscripción de Azure. Si no tiene una, puede crearla [aquí](https://azure.microsoft.com/free/).

Para obtener más detalles sobre cómo crear una función de Azure, consulte esta guía: [Creación de su primera función en Azure con Visual Studio](https://learn.microsoft.com/azure/azure-functions/functions-create-your-first-function-visual-studio)

## Creación de una tabla de clasificación con Azure Functions

En esta sección, vamos a crear una tabla de clasificación que le permite enviar puntuaciones y recuperar las mejores puntuaciones.

```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;
    }    
    
}

```

* Este atributo de función `[Function("LeaderboardExample")]` define el nombre de la función, en este caso `LeaderboardExample`.
* La función se desencadena mediante una solicitud HTTP, como indica el atributo `[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]`. Esto significa que se puede acceder a la función a través de los métodos HTTP GET y POST sin ninguna autenticación.
* Dentro de la función, establecemos el identificador de título de PlayFab y la clave secreta de desarrollador para autenticar nuestras solicitudes a los servicios de PlayFab. Puede cambiar la manera de acceder a estos valores según lo que mejor se ajuste a su caso particular y a sus requisitos de seguridad.
* La función comprueba si el parámetro de consulta "leaderboardName" se proporciona en la solicitud.
* A continuación, llamamos al método `LoginAsTitleEntity` para autenticarnos como entidad de título, lo que es necesario para crear definiciones de tablas de clasificación.
* Por último, llamamos al método `CreateLeaderboardDefinitionAsync` para crear una definición de tabla de clasificación con el nombre proporcionado. Para obtener más información sobre la creación de tablas de clasificación, puede consultar [Creación de una tabla de clasificación básica](/services/playfab/community/leaderboards/create-basic-leaderboard) y [Cómo hacer más con las tablas de clasificación](/services/playfab/community/leaderboards/doing-more-with-leaderboards).

El método RunAsync sirve como punto de entrada para su función de Azure. Desde ahí, puede definir y llamar a métodos adicionales para desarrollar su lógica de juego personalizada. La manera de controlar los errores o interactuar con varios servicios de PlayFab depende totalmente de usted, lo que le brinda plena flexibilidad en su implementación.

Además, puede configurar reglas de automatización para desencadenar esta función de Azure en función de eventos específicos. Para obtener más detalles, consulte [aquí](/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart).

## Consulte también

* [Cómo hacer más con las tablas de clasificación](/services/playfab/community/leaderboards/doing-more-with-leaderboards).
* [Creación de una tabla de clasificación básica](/services/playfab/community/leaderboards/create-basic-leaderboard).
* [Niveles manuales](/services/playfab/community/leaderboards/manual-tiers).
* [Límites](/services/playfab/community/leaderboards/limits-leaderboards).
* [Cuota](/services/playfab/community/leaderboards/quota-leaderboards).
* [Tablas de clasificación de temporada](/services/playfab/community/leaderboards/seasonal-leaderboards).
* [Clasificación de jugadores por estadísticas](/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [Adición de datos contextuales a las tablas de clasificación](/services/playfab/community/leaderboards/metadata-leaderboards).
* [Tablas de clasificación con PlayStream](/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry).
* [Referencia de la API](/services/playfab/community/leaderboards/api-reference).
