Encounter API
Encounter API. Авторизация.
Авторизация на сайте
Энкаутера осуществляется путем отправки следующего запроса на сервер:
POST <имя сайта>/login/signin?json=1
------------------------------------
POST параметры:
<Login> =
имя пользователя
<Password> = пароль
[ddlNetwork] = id игровой сети (1 – Encounter, 2 – QustUa; по умолчанию 1)
[MagicNumbers] = цифры
из каптчи (см. секцию “Ошибка авторизации”, ошибка 1)
Ответом сервера будет JSON объект, который имеет следующую структуру:
{
"Error":0, // Код ошибки
"Message":"",
// Локализованное сообщение об ошибке
"IpUnblockUrl":null, //
URL страницы
разблокировки IP адреса
"BruteForceUnblockUrl":null, // URL страницы страницы
разблокировки при подозрении на брутфорс
"ConfirmEmailUrl":null, // URL страницы подтверждения E-Mail
"CaptchaUrl":null, // URL к картинке каптчи
"AdminWhoCanActivate":null //
Администраторы которые могут активировать аккаунт
}
Также, в своем HTTP-ответе сервер вернет
коллекцию кукис, в которой следует обратить внимание на:
GUID = 29e408d5%2D0061%2D4d1c%2Da145%2D2a07e6993c0f
stoken = cwxi0ylkexg2mv4i1vx30hvd
atoken = uid%3d40481%26iss%3d0%26iscd%3d1%26tkn%3d1da114767482dcb2c3505820d8c84444dc62f8
Для удержания сессии
(авторизации) и целей безопасности, необходимо обеспечить передачу этих
значений обратно на сервер, в каждом последующем запросе, в котором необходимо выполнение
в контексте залогиненного пользователя.
Успешная авторизация
В случае, если
авторизация прошла успешно, свойство JSON-объекта Error будет равно 0,
на этом авториация закончена и больше никаких действий предринимать не нужно.
Ошибка авторизации
Если в процессе
авторизации произошла ошибка, то свойство Error будет принимать
следующие значения:
1 - Превышено
количество неправильных попыток
авторизации
свойство CaptchaUrl будет содержать ссылку на картинку каптчи, для загрузке картинки капчи
необходимо передать header параметр Referer=/login, для повторной авторизации на сервере к POST запросу нужно добавить параметр MagicNumbers c цифрами полученными из картинки каптчи.
2 - Неправильный
логин или пароль
3 - Пользователь или
в Cибири, или в черном списке, или на домене нельзя авторизовываться с других
доменов
4 - У пользователя
в профиле включена блокировака по IP, текущий IP не входит в список
разрешенных
свойство IpUnblockUrl будет
инициализированно ссылкой на страницу разблокировки ограничения по IP.
5 - В процессе
авторизации произошла ошибка на сервере
6 - Не используется в JSON запросах
7 - Пользователь
заблокирован администратором
8 - Новый пользователь
не активирован
свойство
AdminWhoCanActivate будет проинициализированно массивом администраторов,
которые могут активировать аккаунт.
9 - Действия
пользователя расценены как брутфорс
свойство BruteForceUnblockUrl будет инициализированно ссылкой на страницу разблокировки.
10 - Пользователь не подтвердил E-Mail
свойство ConfirmEmailUrl будет инициализированно ссылкой на страницу подтверждения E-Mail.
Описание
Game Engine API Схватки, Точек и Мозгового штурма.
1. Начало
работы с API
Для начала работы с API необходимо
выполнить следующие шаги:
- Авторизация на
сайте.
- Посылка
запроса на получение JSON объекта GameEngineModel
- Оценить
текущее состояние игры
2.
Посылка запроса для получения GameEngineModel
HTTPVERB
|
GET
|
URL
|
/GameEngines/Encounter/Play/{ID
Игры}?json=1
|
Пример
|
/GameEngines/Encounter/Play/2020?json=1
|
Params
|
level = {номер уровня} (передается при штурмовой последовательности)
|
Реакцией сервера на данный запрос будет один из следующих ответов:
- JSON объект (GameEngineModel), представляющий собой текущее состояние игры
- Редирект на
страницу логина (пользователь не залогинен или разрушена сессия)
- Редирект на
страницу защиты от DDOS (если посылается слишком много запросов от IP)
- Редирект на
страницу ошибки (если произошла ошибка на сервере)
3.
Оценка текущего состояния игры
После отправки вышеуказанного запроса, если не произошло ошибок, то в ответ
будет возвращен JSON объект:
Event (int)
|
Отражает в каком состоянии находится игра
|
GameId (int)
|
ID игры
|
GameNumber (int)
|
номер игры
|
GameTitle (string)
|
название игры
|
LevelSequence (int)
|
тип последовательнсти: 0 – линейная, 1 –указанная,
2 – случайная, 3 – штурмовая, 4 – динам. случайная
|
UserId (int)
|
ID игрока
|
TeamId (int)
|
ID команды игрока
|
EngineAction (object)
|
информация о результате последнего запроса
игрока
|
Level (object)
|
информация о текущем уровне
|
Levels (object array)
|
список всех уровней
|
GameDateTimeStart (string)
|
время старта игры в UTC
|
Login (string)
|
логин игрока |
TeamName (string)
|
имя команды |
После каждого запроса необходимо проверять какое значение содержит свойство Event, которое может принимать следующие значения:
Код
|
Описание
|
0
|
Игра в
нормальном состоянии
|
2
|
Игра с указанным ID не существует
|
3
|
Запрошенная игра не соответствует запрошенному Engine
|
4
|
Игрок не залогинен на сайте
|
5
|
Игра не началась
|
6
|
Игра закончилась
|
7
|
Не подана заявка (игроком)
|
8
|
Не подана заявка (командой)
|
9
|
Игрок еще не принят в игру
|
10
|
У игрока нет команды (в командной игре)
|
11
|
Игрок не активен в команде (в командной игре)
|
12
|
В игре нет уровней
|
13
|
Превышено количество участников в команде (в
командной игре)
|
16
|
Уровень снят
|
17
|
Игра закончена
|
18
|
Уровень снят
|
19
|
Уровень пройден автопереходом
|
20
|
Все сектора отгаданы
|
21
|
Уровень снят
|
22
|
Таймаут уровня
|
Варианты действий в зависимости от текущего значения свойства Event
Код
(ы)
|
Необходимое
действие
|
0
|
Игра
в нормальном состоянии,
можно продолжать посылать запросы
|
16, 18, 19, 20, 21, 22
|
Текущий
уровень изменился, необходимо послать запрос на сервер еще раз
|
все остальные коды
|
Вывести сообщение игроку соответствующее коду
ошибки
|
4.
Оценка текущего состояния уровня
В случае если игра активна, и допускает участие игрока (model.Event = 0), перед отправкой ответов игрока на сервер, необходимо удостовериться, что
ввод ответов на данном уровне разрешен, для этого требуется проверить объект model.Level, который
содержит информацию о текущем уровне и имеет следующие свойства:
LevelId (int)
|
ID Уровня
|
Name (string)
|
Имя уровня
|
Number (string)
|
Номер уровня
|
Timeout (int)
|
время (в секундах) срабатывания автоперехода, 0 – если нет
|
TimeoutAward (int)
|
штраф за автопереход (в секундах), 0 – если нет
|
TimeoutSecondsRemain (int)
|
осталось времени до срабатывания автоперехода (в
секундах)
|
IsPassed (bool)
|
уровень пройден
|
Dismissed (bool)
|
уровень снят администратором
|
StartTime (datetime)
|
время начала уровня для игрока
|
HasAnswerBlockRule (bool)
|
есть ли на уровне блокировка ответов
|
BlockDuration (int)
|
осталось секунду блокировки; 0 – не активна
|
BlockTargetId (int)
|
блокировка установлена для: 0,1 – для игрока; 2
– для команды
|
AttemtsNumber (int)
|
количество попыток разрешенных в рамках AttemtsPeriod
|
AttemtsPeriod (int)
|
период срабатывания блокировки (в секундах)
|
RequiredSectorsCount (int)
|
Количество секторов, которые необходимо отгадать
|
PassedSectorsCount (int)
|
Количество отгаданных секторов
|
SectorsLeftToClose (int)
|
Количество неотгаданных секторов
|
MixedActions (object array)
|
История введенных ответов
|
Messages (object array)
|
Сообщения администратора
|
Task (object)
|
Текст задания
|
Sectors (object array)
|
Сектора
|
Helps (object array)
|
Подсказки
|
PenaltyHelps (object array)
|
Штрафные подсказки
|
Bonuses (object array)
|
Бонусные задания
|
Перед отправкой ответов проверяем:
- model.Level.IsPassed == false уровень не пройден
- model.Level.Dismissed == false уровень не снят
- model.Level.HasAnswerBlockRule == false || model.Level.BlockDuration <= 0 – активна блокировка воода ответов на задание (не
действует для бонусных ответов)
Если вышеперечисленные условия справедливы, то можно посылать ответы на
проверку
5.
Отправка ответов на задание уровня и бонусные
задания если блокировка ответов не настроена
В случае если на уровне не настроена блокировка ответов, то при отправке
ответа к уровню, одновременно проверяются ответы и к неотгадданным бонусным
заданиям
HTTPVERB
|
POST
|
URL
|
/GameEngines/Encounter/Play/{ID
Игры}?json=1
|
Params
|
LevelId = {id уровня} (берем из model.Level.LevelID)
LevelNumber = {номер уровня} (берем из model.Level.Number)
LevelAction.Answer {текст ответа}
|
Пример:
HTTPVERB
|
POST
|
URL
|
/GameEngines/Encounter/Play/222?json=1
|
Params
|
LevelId = 1356 (берем из model.Level.LevelID)
LevelNumber = 2 {номер уровня} (берем из model.Level.Number)
LevelAction.Answer = ответ
|
После получения ответа в виде JSON объекта, необходимо проверить корректность состояния игры (п 3)
Результат последнего действия игрока хранится в объекте model.EngineAction, который имеет след свойства
GameId (int)
|
ID игры
|
LevelId (int)
|
ID уровня
|
LevelNumber (int)
|
Номер уровня на который был введен ответ
|
LevelAction (object)
|
инфо о результате отправки ответа на уровень и
бонус;
|
BonusAction (object)
|
инфо о результате отправки ответа на бонус;
|
Для того что бы узнать, был ли введенный ответ правильным, необходимо проверить
свойство model.EngineAction.LevelAction:
Answer (string)
|
Введенный ответ
|
IsCorrectAnswer (bool)
|
null – ответа не
было, false – неправильный ответ; true – правильный ответ;
|
Таким образом, вначале проверяем, был ли введен ответ model.EngineAction.LevelAction.IsCorrect != null и только потом смотрим
остальные свойства.
6.
Отправка бонусных ответов на уровень на сервер если
на уровне настроена блокировка ответов
Если на уровне настроена блокирока ответов, то ответы на уровень и ответы
на бонусные задания отправляются отдельными запросами, для уровня формат
запроса тот же что и в п 5, для бонусных заданий запрос имеет следующий формат:
HTTPVERB
|
POST
|
URL
|
/GameEngines/Encounter/Play/{ID
Игры}?json=1
|
Params
|
LevelId = {id уровня} (берем из model.Level.LevelID)
LevelNumber = {номер уровня} (берем из model.Level.Number)
BonusAction.Answer {текст ответа на бонусное задание}
|
Пример:
HTTPVERB
|
POST
|
URL
|
/GameEngines/Encounter/Play/222?json=1
|
Params
|
LevelId = 1356 (берем из model.Level.LevelID)
LevelNumber = 2 {номер уровня} (берем из model.Level.Number)
BonusAction.Answer = ответ
|
После получения ответа в виде JSON объекта, необходимо проверить корректность состояния игры (п 3)
Для того что бы узнать, был ли введенный ответ к бонусному заданию
правильным, необходимо проверить свойство model.EngineAction.BonusAction:
Answer (string)
|
Введенный ответ
|
IsCorrectAnswer (bool)
|
null – ответа не
было, false – неправильный ответ; true – правильный ответ;
|
Таким образом, вначале проверяем, был ли введен ответ model.EngineAction. BonusAction.IsCorrect != null и только потом смотрим
остальные свойства.
7.
Отправка запроса на открытие штрафной подсказки
Информация о имеющихся штрафных подсказка хранится в масиве объектов model.Level. PenaltyHelps, каждый из которых имеет следующую cтруктуру:
HelpId (int)
|
ID подсказки
|
Number (int)
|
Номер пп
|
HelpText (string)
|
Текст подсказки
|
IsPenalty (bool)
|
Штрафная/Обычная
|
Penalty (int)
|
Штраф в секундах
|
PenaltyComment (string)
|
Описание подсказки
|
RequestConfirm (bool)
|
Требует дополнительного подтверждения
|
PenaltyHelpState (int)
|
Состояние, 0 - не открыта; 2 - открыта
|
RemainSeconds (int)
|
осталось секуд до того как подскзка будет
доступна для игрока
|
Перед отправкой запроса на отрытие подсказки необходимо проверить, требует ли
данная подсказка дополнительного подтверждения (penalty. RequestConfirm), в этом случае в вашей реализации UI, игрока нужно
предупредить о том что он получит штраф и запросить его подтверждение на
открытие подсказки.
Формат запроса на открытие подсказки:
HTTPVERB
|
GET
|
URL
|
/GameEngines/Encounter/Play/{ID
Игры}?json=1&pid={ ID подсказки}&pact=1
|
Пример:
HTTPVERB
|
GET
|
URL
|
/GameEngines/Encounter/Play/222?json=1&pid=9645pact=1
|
8.
Описание остальных объектов GameEngineModel
8.1. История
введенных ответов
model.Level.MixedActions
ActionId (int)
|
|
LevelId (int)
|
ID уровня к которому был
введен ответ
|
LevelNumber (int)
|
Номер уровня к которому был введен ответ
|
UserId (int)
|
ID игрока который ввел
ответ
|
Kind (int)
|
1 – ответ к уровню, 2 – ответ к бонусу
|
Login (string)
|
Логин игрока который ввел ответ
|
Answer (string)
|
Текст ответа
|
AnswForm (string)
|
Текст ответа с подсветкой русских букв
|
EnterDateTime (datetime)
|
Время ввода ответа (UTC+0)
|
LocDateTime (string)
|
Локализованное время ввода ответа
|
IsCorrect (bool)
|
Верен/неверен
|
8.2. Сообщения
администратора
model.Level.Messages
OwnerId (int)
|
ID Администратора
|
OwnerLogin (string)
|
Логин администратора
|
MessageId (int)
|
ID Сообщения
|
MessageText (string)
|
Оригинальный текст сообщения
|
WrappedText (string)
|
Отформатированный текст сообщения с учетом ReplaceNl2Br
|
ReplaceNl2Br (bool)
|
Заменять ли \n на <BR>
|
8.3. Задание
к уровню
model.Level.Tasks
TaskText (string)
|
Оригинальный текст задания
|
TaskTextFormatted
|
Отформатированный текст задания с учетом ReplaceNlToBr
|
ReplaceNlToBr
|
Заменять ли \n на <BR>
|
8.4. Сектора
model.Level.Sectors
SectorId (int)
|
ID сектора
|
Order (int)
|
№ пп
|
Name (string)
|
Название зектора
|
Answer (string)
|
Отгаданный ответ
|
IsAnswered (bool)
|
отгадан / не отгадан
|
8.5. Подсказки
и штрафные подсказки
model.Level.Helps,
model.Level.PenaltyHelps
HelpId (int)
|
ID подсказки
|
Number (int)
|
Номер пп
|
HelpText (string)
|
Текст подсказки
|
IsPenalty (bool)
|
Штрафная/Обычная
|
Penalty (int)
|
Штраф в секундах (для штрафной)
|
PenaltyComment (string)
|
Описание подсказки (для штрафной)
|
RequestConfirm (bool)
|
Требует дополнительного подтверждения (для
штрафной)
|
PenaltyHelpState (int)
|
Состояние, 0 - не открыта; 2 - открыта (для штрафной)
|
RemainSeconds (int)
|
осталось секуд до того как подскзка будет
доступна для игрока
|
8.6 Бонусы
model.Level.Bonuses
BonusId (int)
|
ID Бонуса
|
Name (string)
|
Название
|
Number (int)
|
Номер пп
|
Task (string)
|
Задание
|
Help (string)
|
Бонусная подсказка
|
IsAnswered (bool)
|
Разгадан / не
разгадан
|
Expired (bool)
|
Время на выполнение
истекло
|
SecondsToStart (int)
|
Будет доступен через
|
SecondsLeft (int)
|
Будет еще доступен
|
AwardTime (int)
|
Начисленный бонус в
секндах
|
Negative(bool)
|
"Отрицательность" начисляемого времени |
9. Прочее
Список игр домена можно вытащить вот так - https://domain.en.cx/home/?json=1
|