# Ejemplos de CLI

Esta práctica demuestra cómo jugar con la API de contenido en un terminal. Usaremos la instancia de la Decentraland Foundation en `peer.decentraland.org`, y todo lo que necesitas es el `curl` herramienta de línea de comandos.

{% hint style="info" %}
Puedes usar [`httpie`](https://github.com/httpie/httpie) o formatear respuestas con [`jq`](https://github.com/stedolan/jq) para obtener JSONs más legibles con cada solicitud. En esta guía, mostraremos documentos formateados para mayor claridad.
{% endhint %}

Esto es lo que haremos:

1. Consultar el estado del servidor de contenido.
2. Localiza y descarga un [snapshot](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) con una lista de entidades.
3. Obtén el manifiesto de una entidad.
4. Descarga uno de los archivos de la entidad.

Comencemos consultando el estado del servidor usando `/about`:

```bash
curl "https://peer.decentraland.org/about"
```

```js
{
  "healthy": true,
  "content": {
    "healthy": true,
    "version": "6.5.0",
  },
  // ... más información del servidor (flags de características, versiones, rutas, etc.)
}
```

Parece que el servidor está activo y funcionando con normalidad (`"healthy": true`), y nos está dando información sobre la versión que implementa para cada conjunto de características, además de algunas opciones de configuración de la instancia.

Estamos interesados en descargar contenido, así que exploremos los [snapshots](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md) para obtener algunos identificadores vía `/content/snapshots`.

```bash
curl "https://peer.decentraland.org/content/snapshots"
```

```js
[
  {
    "hash": "bafybeia6qoum64psaooiqo3f45i6hykfwx723uc236waub3gng2naof224",
    "timeRange": {
      "initTimestamp": 1689120000000,
      "endTimestamp": 1689206400000
    },
    "replacedSnapshotHashes": [],
    "numberOfEntities": 981,
    "generationTimestamp": 1689219353866
  },
  // ...más archivos de snapshot
]
```

Cada elemento en el arreglo describe un [snapshot](https://github.com/decentraland/docs/blob/main/contributor/practice/snapshots/README.md). Tomemos un `hash` y descarguemos el archivo desde el `/content/contents` endpoint.

```bash
curl "https://peer.decentraland.org/content/contents/bafybeia6qoum64psaooiqo3f45i6hykfwx723uc236waub3gng2naof224" > snapshot
```

{% hint style="info" %}
Puedes experimentar con snapshots más grandes, como en el [ejemplo avanzado en python](https://github.com/decentraland/documentation/blob/main/content/contributor/content/practice/snapshots.py). Para probar esto de forma interactiva, probablemente quieras uno de los más pequeños.
{% endhint %}

Podemos comprobar que descargamos el archivo correcto en un formato que conocemos, mirando la primera línea:

```bash
head -n1 snapshot
```

```
### Decentraland json snapshot
```

¡Genial! Ahora tenemos un resumen local de todas las entidades que fueron capturadas en ese snapshot. Tomemos la primera listada (la segunda línea en el archivo), un `perfil`:

```bash
tail -n+2 snapshot | head -n1 
```

```js
{
  "entityId": "bafkreif7hjremkxlvixyxoxnoo7bdcnf7qqp245sjb2pag2nk3n6o6yc4c",
  "entityType": "profile",
  "pointers": [
    "0x271cdb3b1c792c336c4b2bdc52c4f415d0046b92"
  ],
  "authChain": [
    // Véase https://docs.decentraland.org/contributor/auth/authchain/
  ],
  "entityTimestamp": 1689120135624
}
```

{% hint style="info" %}
Dado que los snapshots expiran y las entidades son reemplazadas, los identificadores en este artículo no funcionarán. Sigue los pasos en tu línea de comandos para obtener IDs de archivos reales y activos.
{% endhint %}

Esta es información que podríamos guardar. Usaremos el `entityId` para descargar el manifiesto JSON de la entidad, pero persistir los [pointer](https://github.com/decentraland/docs/blob/main/contributor/practice/pointers/README.md) listados es una buena idea si queremos localizar esta entidad y cualquier versión actualizada en el futuro.

También tenemos la [auth chain](https://github.com/decentraland/docs/blob/main/contributor/entities/README.md#ownership) usada para firmar esta entidad, y podríamos validar las firmas listadas para verificar la autenticidad de cualquier archivo relacionado que descarguemos.

Vamos a obtener el manifiesto de la entidad. Recuerda, el `entityId` es el [file identifier](https://github.com/decentraland/docs/blob/main/contributor/practice/\(filesystem/README.md#identifiers\)) que necesitamos, y podemos usar el `/content/contents` endpoint de nuevo:

```bash
curl "https://peer.decentraland.org/content/contents/bafkreigcreq7rv6b2wf4zc4fsnif43ziwb4q46v4qhsewpf7gbsyxew3om"
```

```js
{
  "version": "v3",
  "type": "profile",
  "pointers": [
    "0x273cdb3b1c791c336c4b2bcc52c4f415d0046b91"
  ],
  "timestamp": 1689120135624,
  "content": [
    {
      "file": "body.png",
      "hash": "bafybeibzaqkirz7fk474xvyhurho5xviphs7anawaceb6gscuigia4x33u"
    },
    // ...more files
  ],
  "metadata": {
    // ...avatares y otra información
  }
}
```

Esta `perfil` entidad tiene toda la información que World Explorers utiliza para renderizar y animar a un jugador. Si nos interesa obtener uno de los archivos empaquetados, podemos continuar usando el `/content/contents` endpoint.

Si miramos el `content` campo, podemos ver el `hash` del archivo internamente llamado `body.png`. Vamos a conseguirlo:

```bash
curl "https://peer.decentraland.org/content/contents/bafybeibzaqkirz7fk474xvyhurho5xviphs7anawaceb6gscuigia4x33u" > body.png
```

Podemos abrir este `png` archivo en un visor de imágenes o en un navegador web, y ver el trabajo del autor. ¡Buen trabajo!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/contributor/contributor-es/contenido/practica/cli-examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
