Таблицы лидеров
Рейтинги результатов с автоматическим сбросом, архивом прошлых периодов и серверной защитой от читов.
Комментарии в коде и имена API оставлены на английском, чтобы совпадать с SDK.
Создание таблицы лидеров#
Создавайте таблицы лидеров на странице Таблицы лидеров вашего проекта и используйте их слаг в коде.
| Параметр | Варианты |
|---|---|
| Слаг | Идентификатор из строчных букв для кода, например coins. |
| Сортировка | DESC (сначала наибольший) или ASC (сначала наименьший, например время заезда). |
| Учёт результата | BEST хранит лучший результат каждого игрока; LATEST всегда заменяет его новым. |
| Сброс | NONE, DAILY, WEEKLY или MONTHLY. |
| Минимальный / максимальный результат | Минимальный и максимальный допустимый результат (необязательно). |
| Пауза между отправками | Минимум секунд между двумя отправками одного игрока (необязательно). |
Отправка результата#
Имя игрока берётся из аккаунта, поэтому клиент не может отправить результат за другого игрока.
var submit = await Majacloud.Leaderboards.SubmitScoreAsync("coins", 340);
if (submit.Ok && submit.Value.Accepted)
Debug.Log("New rank #" + submit.Value.Entry.Rank);var submit := await Majacloud.leaderboards.submit_score("coins", 340)
if submit.ok and submit.value.accepted:
print("New rank #", submit.value.entry.rank)const submit = await mc.leaderboards.submitScore('coins', 340);
if (submit.ok && submit.value.accepted) console.log('New rank #' + submit.value.entry.rank);curl -X POST https://majacloud.majanite.com/v1/leaderboards/coins/scores -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"score": 340}'Чтение рейтинга#
Для лучших записей вход не нужен; собственное место игрока и записи рядом с ним доступны только вошедшему игроку.
var top = await Majacloud.Leaderboards.GetTopAsync("coins", limit: 10);
var me = await Majacloud.Leaderboards.GetMyRankAsync("coins");
var around = await Majacloud.Leaderboards.GetAroundMeAsync("coins", radius: 3);
if (me.Ok && me.Value.Entry != null) Debug.Log("You are #" + me.Value.Entry.Rank + " of " + me.Value.Total);var top := await Majacloud.leaderboards.get_top("coins", 10)
var me := await Majacloud.leaderboards.get_my_rank("coins")
var around := await Majacloud.leaderboards.get_around_me("coins", 3)
if me.ok and me.value.entry != null:
print("You are #%d of %d" % [me.value.entry.rank, me.value.total])const top = await mc.leaderboards.getTop('coins', { limit: 10 });
const me = await mc.leaderboards.getMyRank('coins');
const around = await mc.leaderboards.getAroundMe('coins', { radius: 3 });
if (me.ok && me.value.entry) console.log(`You are #${me.value.entry.rank} of ${me.value.total}`);curl "https://majacloud.majanite.com/v1/leaderboards/coins/entries?limit=10" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
curl https://majacloud.majanite.com/v1/leaderboards/coins/me -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN"
curl "https://majacloud.majanite.com/v1/leaderboards/coins/around-me?radius=3" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN"Сбросы и прошлые периоды#
Ежедневные, еженедельные (с понедельника) и ежемесячные таблицы лидеров сбрасываются в 00:00 UTC. Завершённый период архивируется; прочитать его можно, указав период previous:
var yesterday = await Majacloud.Leaderboards.GetTopAsync("coins", 10, 0, MajacloudLeaderboardPeriod.Previous);var yesterday := await Majacloud.leaderboards.get_top("coins", 10, 0, "previous")const yesterday = await mc.leaderboards.getTop('coins', { limit: 10, period: 'previous' });curl "https://majacloud.majanite.com/v1/leaderboards/coins/entries?period=previous" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"Защита от читов#
- Результаты меньше минимума или больше максимума отклоняются с ошибкой
validation. - Отправка чаще, чем позволяет пауза, возвращает
rate_limited. - Клиенты могут отправлять результаты только за вошедшего игрока.
- В соревновательных играх пусть результат определяет ваш сервер и отправляет его с секретным ключом.
Отправка с сервера#
С секретным ключом передайте player_id и результат. Игрок должен существовать.
// Node.js with secretKey: submit after your server validated the match
await admin.server.submitScore('coins', 'player_3f9c…', 980);curl -X POST https://majacloud.majanite.com/v1/leaderboards/coins/scores \
-H "X-Project-ID: $PROJECT_ID" -H "X-Secret-Key: $SECRET_KEY" \
-H "Content-Type: application/json" -d '{"player_id": "player_3f9c…", "score": 980}'