1
0
mirror of https://github.com/elyby/docs.git synced 2025-05-02 15:53:45 +05:30

ru docs seems to be done

This commit is contained in:
McModder 2025-02-05 18:03:09 +03:00
parent ea1227cdf9
commit aa2f5a343f
No known key found for this signature in database
GPG Key ID: A47A5642B5DA64BE
9 changed files with 315 additions and 87 deletions

@ -1,6 +1,6 @@
# Ely.by API (симуляция Mojang API)
Здесь приведена информация об API, совместимом с функционалом [Mojang API](http://wiki.vg/Mojang_API) Обращаем ваше внимание на то, что это не полноценное API Ely.by, а только набор дополнительных запросов, реализованных на базе нашего [сервера авторизации](./minecraft-auth.md).
Здесь приведена информация об API, совместимом с функционалом [Mojang API](http://wiki.vg/Mojang_API) Обращаем ваше внимание на то, что это не полноценное API Ely.by, а только набор дополнительных запросов, реализованных на базе нашего [сервера авторизации](./minecraft-auth).
## Запросы
:::note
@ -90,7 +90,7 @@ API не имеет ограничения на количество запро
В случае, если один из переданных никнеймов не найден в базе данных, для него не будет возвращено значения (он будет просто пропущен). Учитывайте эту ситуацию при парсинге ответа.
### Запрос информации о профиле по UUID {#profile-by-uuid}
См. [запрос профиля для сервера авторизации](./minecraft-auth.mdx#profile-request).
См. [запрос профиля для сервера авторизации](./minecraft-auth#profile-request).
## Возможные ошибки {#possible-errors}

@ -26,7 +26,8 @@
**Причина**: Пользователь ввёл/разработчик передал неверные значения.
**Решение**: Необходимо вывести пользователю уведомление о неправильно введённых данных.
{#not-found}Для индикации ошибки **Not Found** используется ответ с `404` статусом
#### Not Found {#not-found}
Для индикации ошибки **Not Found** используется ответ с `404` статусом
## Авторизация в лаунчере {#launcher}
В этом разделе описана авторизация для игрового лаунчера и описывает действия, необходимые для получения `accessToken` для игрового клиента Minecraft. В результате авторизации будет получен **JWT-токен** с [правами доступа](./oauth.md#available-scopes) `minecraft_server_session`.
@ -100,7 +101,7 @@
> * **clientToken** (*string*) Уникальный идентификатор клиента, относительно которого получен accessToken.
> * **requestUser** (*bool*) Если поле передано как `true`, то в ответе сервера будет присутствовать поле `user`.
::note
:::note
В оригинальном протоколе так же передаётся значение `selectedProfile`, но в реализации Mojang он не влияет ни на что. Наша реализация сервера авторизации игнорирует этот параметр и опирается на значения `accessToken` и `clientToken`.
:::
@ -217,10 +218,12 @@
Тем не менее, описанный ниже запрос актуален только для **Minecraft 1.7.6+**, когда для загрузки скинов стала использоваться Authlib.
> {#profile-request}**GET /session/profile/\{uuid\}**
### Запрос профиля {#profile-request}
> **GET /session/profile/\{uuid\}**
>
> Запрос на этот URL выполняется клиентом в одиночной игре на локальном сервере (созданном посредством самой игры). В URL передаётся UUID пользователя, с которым был запущен клиент, а в ответ получается информация о текстурах игрока в таком же формате, как и при `hasJoined` запросе.
## Готовые библиотеки authlib {#premade-authlib}
:::tip
Ely.by поддерживает библиотеку authlib-injector. Это наиболее простой и универсальный способ установки системы авторизации в игру и игровые сервера. За подробностями обратитесь в [соответствующий раздел документации](./authlib-injector.md).
@ -255,7 +258,7 @@ Ely.by поддерживает библиотеку authlib-injector. Это н
Прежде чем производить установку, необходимо определить, какой именно файл подлежит модификации:
* **>=1.16**: `libraries/net/minecraft/server/ВЕРСИЯ-ЦИФРЫ/server-ВЕРСИЯ-ЦИФРЫ-extra.jar`.
* **1.13-1.15**: `libraries/net/minecraft/server/ВЕРСИЯ/server-ВЕРСИЯ-extra.jar`.
* **<=1.12**: `minecraft_server.ВЕРСИЯ.jar`.
* **\<=1.12**: `minecraft_server.ВЕРСИЯ.jar`.
Когда необходимый файл найден, выполните для него установку authlib, аналогично [оригинальному серверу](#authlib-server-vanilla).
@ -314,4 +317,4 @@ java -jar cache/patched-ВЕРСИЯ.jar
Ту же самую операцию вам необходимо провести и с сервером, только заменить ссылку на `hasJoined`.
После этих действий вам нужно в настройках включить online-mode=true и сервер станет пускать на себя только тех игроков, которые будут авторизованы через Ely.by.
После этих действий вам нужно в настройках включить `online-mode=true` и сервер станет пускать на себя только тех игроков, которые будут авторизованы через Ely.by.

@ -41,13 +41,13 @@ https://example.com/oauth/ely.php?error=access_denied&error_message=The+resource
| *prompt* | `consent` или `select_account` | Принудительно отобразить запрос прав (`consent`) или принудительно запросить выбор аккаунта (`select_account`). |
| *login_hint* | `erickskrauch` или `erickskrauch@ely.by` | Если у пользователя есть несколько аккаунтов, то указав в этом параметре username или E-mail пользователя, вы автоматически выберете аккаунт за него. Это полезно в случае повторного входа, когда токен истёк. |
### Перечень доступных scopes {#oauth-scopes}
### Перечень доступных scopes {#available-scopes}
| **Scope** | **Описание** |
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **account_info** | Получение информации о пользователе. |
| **account_email** | В ответе на запрос информации о пользователе будет также присутствовать его email. |
| **offline_access** | Вместе с `access_token` вы также получите и `refresh_token`. Смотрите подробнее в [соответствующем разделе](#refresh-token-grant). |
| **offline_access** | Вместе с `access_token` вы также получите и `refresh_token`. Смотрите подробнее в [соответствующем разделе](#refresh-token). |
| **minecraft_server_session** | `access_token` можно будет использовать в качестве сессии для Minecraft. |
## Обмен кода на ключ {#access_key}
@ -91,9 +91,161 @@ if (!is_null($_GET['code'])) {
curl_close($curl);
}
```
Пояснение к коду:
:::info[Пояснения к коду]
Сначала мы объявляем переменную `$oauthParams`, в которую заносим значения, полученные после регистрации приложения.
Затем проверяем, не возникла-ли ошибка. В этом случае сразу же прерываем выполнение.
Формируем POST запрос к форме обмена `code` на `access_token`, передавая необходимые поля.
Выполняем запрос, получаем ответ, переводим его из JSON в ассоциативный массив.
:::
### Ответ сервера {#access_key_result}
В случае успешного запроса в теле ответа будет находиться результат обмена кода авторизации на `access_token`. Данные являются JSON документом и могут быть легко интерпретированы средствами используемого языка программирования.
Тело JSON документа содержит следующие поля:
```json
{
"access_token": "4qlktsEiwgspKEAotazem0APA99Ee7E6jNryVBrZ",
"refresh_token": "m0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze", // Представлен только в случае запроса с правами offline_access
"token_type": "Bearer",
"expires_in": 86400 // Количество секунд, на которое выдан токен
}
```
На этом процедура авторизации закончена. Полученный `access_token` может быть использован для получения информации о пользователе и взаимодействия с нашим API.
## Получение информации о пользователе {#get-user-info}
Если полученный токен имеет scope `account_info`, то вы можете запросить информацию об аккаунте пользователя. Для этого необходимо отправить запрос на URL:
```url
https://account.ely.by/api/account/v1/info
```
Для передачи `access_token` используется заголовок `Authorization` со значением `Bearer {access_token}`.
```php title="Пример реализации получения информации о пользователе на PHP"
<?php
$accessToken = 'some_access_token_value';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/account/v1/info');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $accessToken,
]);
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
```
В ответ вы получите JSON документ со следующим содержимым:
```json
{
"id": 1,
"uuid": "ffc8fdc9-5824-509e-8a57-c99b940fb996",
"username": "ErickSkrauch",
"registeredAt": 1470566470,
"profileLink": "http:\/\/ely.by\/u1",
"preferredLanguage": "be",
"email": "erickskrauch@ely.by"
}
```
## Обновление токена доступа {#refresh-token}
Если при выполнении авторизации вами было запрошено право на получение scope `offline_access`, то вместе с `access_token` вы также получите и `refresh_token`. Данный токен не истекает и может быть использован для получения нового токена доступа, когда он истечёт.
Для выполнения операции обновления токена необходимо отправить **POST** запрос на тот же URL, что использовался и при обмене кода на ключ доступа, но со следующими параметрами:
| **Параметр** | **Описание** |
|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `client_id` | ClientID, полученный при регистрации приложения. |
| `client_secret` | ClientSecret, полученный при регистрации приложения. |
| `scope` | Те же scope, что были запрошены и при получении начального токена доступа. Попытка запросить большее количество прав приведёт к ошибке. |
| `refresh_token` | Непосредственно токен, полученный вместе с начальным токеном доступа. |
```php title="Пример реализации обновления токена доступа на PHP"
<?php
// refresh_token, полученный при завершении авторизации
$refreshToken = 'm0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze';
$requestParams = [
'client_id' => 'ely', // Ваш ClientId, полученный при регистрации
'client_secret' => 'Pk4uCtZw5WVlSUpvteJuTZkVqHXZ6aNtTaLPXa7X', // Ваш ClientSecret, полученный при регистрации
'scope' => 'account_info account_email',
'refresh_token' => $refreshToken,
'grant_type' => 'refresh_token',
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/oauth2/v1/token');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestParams));
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
```
В качестве ответа будет точно такое же тело, какое было получено в результате [обмена кода на ключ доступа](#access_key_result). Поле `refresh_token` будет отсутствовать.
## Готовые библиотеки {#libraries}
Более простым способом будет использовать уже готовую библиотеку, которой будет необходимо передать лишь регистрационные параметры. Ниже перечислены библиотеки для различных языков программирования. Вы можете дополнить этот список своей библиотекой.
* **PHP**:
* [Официальная] https://github.com/elyby/league-oauth2-provider
* **Ruby**:
* [Официальная] https://github.com/elyby/omniauth-ely
## Возможные ошибки {#errors}
Ниже приведены стандартные ошибки, которые вы можете получить в случае неправильной передачи данных на сервер авторизации. Если вы столкнулись с ошибкой, не описанной в этой документации, пожалуйста, сообщите о ней через [форму обратной связи](https://ely.by/site/contact).
### Ошибки при инициализации авторизации {#errors-init-auth}
Этот раздел описывает ошибки, отображаемые при переадресации пользователя с вашего сайта на нашу страницу инициализации авторизации.
```
Invalid request ({parameter} required).
```
Данная ошибка означает, что вы передали не все необходимые параметры. Чтобы решить эту ошибку просто добавьте недостающий параметр.
```
Invalid response type '{invalid_response_type_value}'.
```
Данная ошибка означает, что вы передали неподдерживаемый тип `response_type`. На данный момент поддерживается только значение `code`.
```
Invalid scope '{invalid_scope}'.
```
Ошибка указывает на то, что было запрошено неизвестный `scope`. Убедитесь, что вы запрашиваете [поддерживаемые права](#available-scopes).
```
Can not find application you are trying to authorize.
```
Данная ошибка говорит о том, что переданные параметры не соответствуют ни одному из зарегистрированных приложений. Для решения проблемы исправьте ваши значения `client_id` и `redirect_uri`.
### Ошибки при обмене кода на ключ {#issue-token-errors}
В случае возникновения ошибки вместо ожидаемого ответа с `200` статусом вы получите `40x` код и следующие 2 поля:
```json
{
"error": "invalid_request",
"error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"code\" parameter."
}
```
В поле `error` находится системный идентификатор ошибки, в `error_description` — описание ошибки на английском языке.
#### Возможные значения error
* `invalid_request`: Переданы не все необходимые параметры запроса или значение `code` не было найдено в базе выданных кодов.
* `unsupported_grant_type`: Данная ошибка сигнализирует о том, что вы попытались произвести авторизацию по неизвестному для нашего OAuth2 сервера типу Grant.
* `invalid_client`: Эта ошибка возникает в случае, когда трио значений `client_id`, `client_secret` и `redirect_uri` не совпали ни с одним из зарегистрированных приложений.
### Ошибки при запросе информации о пользователе {#errors-request-user}
Ответ со статусом `401` указывает на то, что заголовок `Authorization` не присутствует в запросе или его значение сформировано неверно. Тело ответа будет следующим:
```json
{
"name": "Unauthorized",
"status": 401,
"message": "Your request was made with invalid credentials."
}
```
Ответ со статусом `403` сигнализирует о том, что переданный в заголовке `Authorization` токен не содержит scope `account_info` или он истёк. Получаемый ответ будет иметь следующий формат:
```json
{
"name": "Forbidden",
"status": 403,
"message": "You are not allowed to perform this action."
}
```
### Ошибки при обновлении токена доступа {#errors-renewing-token}
При выполнении обновления токена доступа вам могут встретиться те же ошибки, что и при [обмене кода на ключ доступа](#issue-token-errors), а также несколько новых:
* `invalid_request`: Переданы не все необходимые параметры запроса или значение `refresh_token` не был найден в базе выданных токенов.
* `invalid_scope`: Были перечислены неподдерживаемые scope или запрошено больше, чем было у изначального токена.

146
docs/skins-system.md Normal file

@ -0,0 +1,146 @@
# Система скинов
На этой странице вы найдёте информацию о доступных запросах к сервису системы скинов Ely.by. Вы можете использовать любой из них как дополнительный или основной источник скинов для своего проекта.
Сервис системы скинов Ely.by обеспечивает [проксирование текстур владельцев лицензии Minecraft](#textures-proxy), что означает, что при использовании этого сервиса игроки будут видеть как скины премиум пользователей Minecraft, так и скины пользователей сервиса Ely.by.
Мы стремимся соответствовать официальной системе скинов и не поддерживаем ушки и HD-скины. Система поддерживает плащи, но не позволяет игрокам самостоятельно их надевать.
Если у вас есть предложения по развитию существующего функционала, пожалуйста, [создайте новый Issue](https://github.com/elyby/chrly/issues/new) в [репозитории проекта Chrly](https://github.com/elyby/chrly).
:::note
Вы можете найти более подробную информацию о реализации сервера системы скинов в [репозитории проекта Chrly](https://github.com/elyby/chrly).
:::
## URL-адреса запросов {#url}
Система скинов размещена на домене `http://skinsystem.ely.by`.
Во всех запросах параметр `nickname` должен быть заменён на ник игрока. Значение не чувствительно к регистру.
### Запрос скина {#skin-request}
> **GET /skins/\{nickname\}.png**
URL для загрузки текстуры скина. Расширение `.png` опционально. Если текстура не будет найдена, сервер вернёт ответ с `404` статусом.
### Запрос плаща {#cape-request}
> **GET /cloaks/\{nickname\}.png**
URL для загрузки текстуры плаща. Расширение `.png` опционально. Если текстура не будет найдена, сервер вернёт ответ с `404` статусом.
### Запрос текстур
> **GET /textures/\{nickname\}**
По этому URL вы можете получить текстуры в формате, указанному в поле `textures` одноимённого property в [ответе на запрос подписанных текстур](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape):
```json
{
"SKIN": {
"url": "http://example.com/skin.png",
"metadata": {
"model": "slim"
}
},
"CAPE": {
"url": "http://example.com/cape.png"
}
}
```
В зависимости от доступных игроку текстур могут отсутствовать поля `SKIN` или `CAPE`. Если модель скина не является `slim`, то поле `metadata` также будет отсутствовать.
Если текстуры не будут найдены, сервер вернёт пустой ответ с `204` статусом.
### Запрос профиля
> **GET /profile/\{nickname\}**
Данный запрос является аналогом запроса [профиля игрока в API Mojang](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape), только вместо идентификации пользователя по UUID используется его ник. Также, как и в API Mojang, вы можете добавить к запросу `?unsigned=false`, чтобы получить текстуры с подписью. В ответе также будет присутствовать дополнительное property с `name` равным ely.
Если у пользователя нет текстур, то они будут запрошены через прокси Mojang, после чего переподписаны с использованием [нашего ключа подписи](#signature-verification-key-request).
```json
{
"id": "ffc8fdc95824509e8a57c99b940fb996",
"name": "ErickSkrauch",
"properties": [
{
"name": "textures",
"signature": "eks3dLJWzod92dLfWH6Z8uc6l3+IvrZtTj3zjwnj0AdVt44ODKoL50N+RabYxf7zF3C7tlJwT1oAtydONrxXUarqUlpVeQzLlfsuqUKBLi0L+/Y9yQLG3AciNqzEWq3hYaOsJrsaJday/hQmKFnpXEFCThTMpSuZhoAZIiH4VG48NhP70U93ejyXF9b1nPYnXP6k7BVB8LYSzcjZfdqY88jQJbbvRzOyX14ZSD0Ma92jceLNKmkTVc2UfRLUNXtQKtVSFUzlAjCXPJW89IIOZTRqLg65qstWwBvn6VuikyUB5EIxM8vuCh7zTkrMOx1v2Q0xIj8YSFcbnBH2bo87SYOIe1bOK57ZEeUJqY6uSgMlWs7dI5D3nmhFptErm72hg55Axdo1xbG4mvnmLYF7SA4yMDSytPPL+kA+sw3pafnvU2IZo38gqJSDOOpkOpdhUoHx85fzRJL8AcLSJiFlCZDl4pSi3cVuKy/xY5ohT/fJ6GEqpbZp3gACymn47zzI42VSh6j1DQnx2wnhqalTv0kE3qpAFpK/htSboQkFCW/bULO3b+vgU87XPlReT7UtH4yGLtixgs5GC8AzBraN8vOMv8TZCX9ab6mBBjOoDJjXa8Tq637TC75GxRHlpAN2jRHYvyp2zJwjUrML3u4eD4osHW+VBfl8D2l3nLJuemQ=",
"value": "eyJ0aW1lc3RhbXAiOjE2MTQ5MzczMjc0MzcsInByb2ZpbGVJZCI6ImZmYzhmZGM5NTgyNDUwOWU4YTU3Yzk5Yjk0MGZiOTk2IiwicHJvZmlsZU5hbWUiOiJFcmlja1NrcmF1Y2giLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly9lbHkuYnkvc3RvcmFnZS9za2lucy82OWM2NzQwZDI5OTNlNWQ2ZjZhN2ZjOTI0MjBlZmMyOS5wbmcifX19"
},
{
"name": "ely",
"value": "but why are you asking?"
}
]
}
```
Если запрошенный никнейм не будет найден ни в локальном хранилище, ни у Mojang, сервер вернёт пустой ответ с `204` статусом.
### Запрос публичного ключа {#signature-verification-key-request}
> **GET /signature-verification-key.der**
Данный запрос возвращает публичный ключ, который может быть использован для проверки подписи текстур. Ключ предоставляется в формате `DER`. Этот формат используется внутри Authlib, поэтому ключ может быть в ней использован без модификации алгоритма проверки подписи.
> **GET /signature-verification-key.pem**
Такой же запрос, что и предыдущий, но возвращает ключ в формате `PEM`.
### Запрос подписанных текстур
> **GET /textures/signed/\{nickname\}**
Этот запрос используется в нашем [плагине серверной системы скинов](https://ely.by/server-skins-system) для загрузки текстур с оригинальной подписью Mojang. Полученные в ответе текстуры могут быть без изменений переданы в немодифицированный игровой клиент. В ответе также будет присутствовать дополнительное property с `name` равным ely.
```json
{
"id": "ffc8fdc95824509e8a57c99b940fb996",
"name": "ErickSkrauch",
"properties": [
{
"name": "textures",
"signature": "QH+1rlQJYk8tW+8WlSJnzxZZUL5RIkeOO33dq84cgNoxwCkzL95Zy5pbPMFhoiMXXablqXeqyNRZDQa+OewgDBSZxm0BmkNmwdTLzCPHgnlNYhwbO4sirg3hKjCZ82ORZ2q7VP2NQIwNvc3befiCakhDlMWUuhjxe7p/HKNtmKA7a/JjzmzwW7BWMv8b88ZaQaMaAc7puFQcu2E54G2Zk2kyv3T1Bm7bV4m7ymbL8McOmQc6Ph7C95/EyqIK1a5gRBUHPEFIEj0I06YKTHsCRFU1U/hJpk98xXHzHuULJobpajqYXuVJ8QEVgF8k8dn9VkS8BMbXcjzfbb6JJ36v7YIV6Rlt75wwTk2wr3C3P0ij55y0iXth1HjwcEKsg54n83d9w8yQbkUCiTpMbOqxTEOOS7G2O0ZDBJDXAKQ4n5qCiCXKZ4febv4+dWVQtgfZHnpGJUD3KdduDKslMePnECOXMjGSAOQou//yze2EkL2rBpJtAAiOtvBlm/aWnDZpij5cQk+pWmeHWZIf0LSSlsYRUWRDk/VKBvUTEAO9fqOxWqmSgQRUY2Ea56u0ZsBb4vEa1UY6mlJj3+PNZaWu5aP2E9Unh0DIawV96eW8eFQgenlNXHMmXd4aOra4sz2eeOnY53JnJP+eVE4cB1hlq8RA2mnwTtcy3lahzZonOWc=",
"value": "eyJ0aW1lc3RhbXAiOjE0ODYzMzcyNTQ4NzIsInByb2ZpbGVJZCI6ImM0ZjFlNTZmNjFkMTQwYTc4YzMyOGQ5MTY2ZWVmOWU3IiwicHJvZmlsZU5hbWUiOiJXaHlZb3VSZWFkVGhpcyIsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83Mzk1NmE4ZTY0ZWU2ZDhlYzY1NmFkYmI0NDA0ZjhlYmZmMzQxMWIwY2I5MGIzMWNiNDc2ZWNiOTk2ZDNiOCJ9fX0="
},
{
"name": "ely",
"value": "but why are you asking?"
}
]
}
```
По умолчанию для этого запроса не применяется проксирование текстур. Чтобы его включить, добавьте дополнительный **GET** параметр `?proxy=true`.
Если текстуры не будут найдены, сервер вернёт пустой ответ с 204 статусом.
### Дополнительные параметры
При совершении любого из вышеописанных запросов вы также можете передать ряд дополнительных **GET** параметров. Они будут использованы для анализа использования сервиса разными версиями игры.
* `version`: Версия протокола, по которому идёт запрос на скины. На данный момент это версия `2` , т.е. вам необходимо указать `version=2`.
* `minecraft_version`: Версия Minecraft, с которой идёт запрос.
* `authlib_version`: Версия используемой Authlib. Этот параметр актуален для версий Minecraft 1.7.6+, где для загрузки скинов стала использоваться отдельная библиотека, а не внутриигровой код.
Пример запроса текстур с передачей вышеописанных параметров:
```url
http://skinsystem.ely.by/textures/erickskrauch?version=2&minecraft_version=1.14.0&authlib_version=1.5.25
```
### Вспомогательные URL
Также запрос скина и плаща можно выполнить, передавая ник через GET параметр. Эта возможность используется для передачи аналитических параметров в версиях игры до 1.5.2, когда ник просто добавлялся в конец строки. Для этого вся строка выстраивается таким образом, чтобы последним параметром шёл name, после добавления ника к которому получался полный запрос на текстуру.
> **GET /skins?name=\{nickname\}.png**
Смотрите [запрос на получение скина](#skin-request).
> **GET /cloaks?name=\{nickname\}.png**
Смотрите [запрос на получение плаща](#cape-request).
```url title="Пример запросов на текстуры с передачей параметров выше"
http://skinsystem.ely.by/skins?version=2&minecraft_version=1.5.2&name=erickskrauch.png
http://skinsystem.ely.by/cloaks?version=2&minecraft_version=1.4.7&name=notch
```
## Проксирование текстур {#textures-proxy}
Сервис системы скинов Ely.by получает текстуры из официальной системы скинов в случае, если в базе данных не было найдено информации о текстурах для запрошенного имени пользователя. Также запрос будет проксирован, если запись о скине будет найдена, но он будет стандартным.
Для улучшения пропускной способности проксирующего алгоритма, информация о текстурах кешируется в 2 стадии:
* Соответствие ника и UUID хранится [в течение 30 дней](https://help.minecraft.net/hc/en-us/articles/360034636712-Minecraft-Usernames#article-container:~:text=How%20often%20can%20I%20change%20my%20username%3F).
* Информация о текстурах обновляется не чаще [раза в минуту](https://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape:~:text=You%20can%20request%20the%20same%20profile%20once%20per%20minute).
Если вы владеете лицензионным аккаунтом Minecraft, но ваш ник занят, пожалуйста, обратитесь в [службу поддержки](https://ely.by/site/contact) и после небольшой проверки мы передадим ник в ваше пользование.
## Готовые реализации
Готовые реализации патчей и инструкции по их установке могут быть найдены в [разделе загрузок на главном сайте Ely.by](https://ely.by/load).

@ -119,8 +119,8 @@ const config: Config = {
'properties',
'json',
'batch',
'url',
'html',
'uri',
'markup',
'php',
],
},

@ -1,6 +1,6 @@
# Ely.by API (Mojang API simulation)
This article contains information about the API compatible with the [Mojang API](http://wiki.vg/Mojang_API) functionality. Please note that this is not a full-fledged API of Ely.by, but only a set of additional requests implemented based on our `[authorization server](./minecraft-auth.md)`.
This article contains information about the API compatible with the [Mojang API](http://wiki.vg/Mojang_API) functionality. Please note that this is not a full-fledged API of Ely.by, but only a set of additional requests implemented based on our `[authorization server](./minecraft-auth)`.
## Requests
:::note
@ -90,7 +90,7 @@ The data is returned in the same order they were requested.
If one of the passed usernames isnt found in the database, no value will be returned for it (it will be skipped). Keep this in mind when parsing the response.
### Profile info by UUID {#profile-by-uuid}
See the `[profile request for the authorization server](./minecraft-auth.md#profile-request)`.
See the `[profile request for the authorization server](./minecraft-auth#profile-request)`.
## Possible errors {#possible-errors}

@ -1,23 +0,0 @@
/**
* CSS files with the .module.css suffix will be treated as CSS modules
* and scoped locally.
*/
.heroBanner {
padding: 4rem 0;
text-align: center;
position: relative;
overflow: hidden;
}
@media screen and (max-width: 996px) {
.heroBanner {
padding: 2rem;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
}

@ -1,43 +0,0 @@
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import HomepageFeatures from '@site/src/components/HomepageFeatures';
import Heading from '@theme/Heading';
import styles from './index.module.css';
function HomepageHeader() {
const {siteConfig} = useDocusaurusContext();
return (
<header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container">
<Heading as="h1" className="hero__title">
{siteConfig.title}
</Heading>
<p className="hero__subtitle">{siteConfig.tagline}</p>
<div className={styles.buttons}>
<Link
className="button button--secondary button--lg"
to="/docs/intro">
Docusaurus Tutorial - 5min
</Link>
</div>
</div>
</header>
);
}
export default function Home(): JSX.Element {
const {siteConfig} = useDocusaurusContext();
return (
<Layout
title={`Hello from ${siteConfig.title}`}
description="Description will go into a meta tag in <head />">
<HomepageHeader />
<main>
<HomepageFeatures />
</main>
</Layout>
);
}

@ -1,7 +0,0 @@
---
title: Markdown page example
---
# Markdown page example
You don't need React to write simple standalone pages.