Содержание

Игровая API

Игровая API - это API для написания своей версии фронтенда, либо взаимодействия с информацией про игру изнутри игры.

Можно использовать для телеграмм ботов, нативных приложений или браузерных расширений

Точки входа

Все действия производятся через две точки входа

game.php - Авторизация, получение заданий, отправка ответов, разблокировка штрафных подсказок.

game_au.php - Проверка есть ли новые действия от других игроков, которые надо отобразить. Например, кто-то вбил верный ответ.

Во все запросы надо добавлять GET параметр json. Тогда результат будет приходить в формате JSON.

Авторизация

Используется login.php

POST параметры:

user - логин игрока

pass - пароль игрока

Надо сохранить cookie и их все передавать их в последующие запросы.

Если в ответе будет строка с именем login_error - значит авторизация не удалась

Данные задания

Используется game.php

GET параметры:

gid - ID игры.

tid - [Опционально] ID уровня

В ответ приходит JSON в utf-8 c кучей опциональных данных, если возле типа ? значит может отсутствовать.

Имена классов и типы не приходят - они просто для иллюстрации.

class PublicContext {
  int version = 1;                        // Версия протокола
  ?string error   ;                       // Ошибка.
  ?string login_error;                    // Ошибка при логине

  string domain_time_zone;                // Временная зона текущего домена
  ?int game_id;                           // ID игры
  ?int task_id;                           // ID текущего уровня
  ?int user_id;                           // ID залогиненого игрока
  ?string user_name;                      // login игрока
  ?int team_id;                           // ID команды игрока, в одиночных играх может совпадать с ID текущего игрока
  ?int refresh_time_ms;                   // Время последнего обновления страницы unix_time миллисекундах
  ?int refresh_check_limit_ms;            // Промежуток времени в миллисекундах, в течении которого не надо без причины дергать сервер. 

  PublicGame game;                        // Данные об игре
  /*?PublicGamep[]*/ available_games;     // Данные об активных/ближайших играх домена. Доступно, если вызвать без gid
  
  PublicTask task;                        // Данные о текущем задании
  PublicLastAnswers last_answers;         // Мониторинг недавно вбитых ответов
  ?PublicAnswerResult answer_result;      // Результат последнего вбития ответов
  ?PublicAnswerForm answer_form;          // Данные о форме ответов
  /* ?[n => PublicCode] */ codes;         // Данные о кодах
  /* ?PublicHint[] */ hints;              // Подсказки
  ?int n_bonuses;                         // Общее число бонусов, если они есть в задании
  ?int compact_n_bonuses;                 // Общее число бонусов, если автор выбрал компактный режим бонусов
  ?int compact_bonus;                     // Суммарный полученный бонус/штраф, если автор выбрал компактный режим бонусов
  /* ?string[] */ compact_bonus_answers;  // Известные ответы на бонусы, если автор выбрал компактный режим бонусов
  /* ?string[] */ compact_bonus_hints;    // Подсказки на вбитые бонусы, если автор выбрал компактный режим бонусов
  /* ? PublicBonus[] */ bonuses;          // Бонусы
  /* ? PublicBonus[] */ global_bonuses;   // Сквозные бонусы
  /* ?PublicTaskButton[] */ active_tasks; // Доступные сейчас задания
  /* ?PublicTaskButton[] */ closed_tasks; // Уже закрытые задания - только в штурме
}

class PublicGame {
  int id;         // ID игры
  string name;    // Название игры
  int start_time; // Время старта игры в unix_time
  int end_time;   // Время окончания игры в unix_time
  ?int type;      // Тип игры - 0 или отсутсвует - штурмовая последовательность, 1 - линейная последовательность
  ?bool single;   // Одиночная или командная игра
}

class PublicTask {

  int n;                 // Номер задания
  string name;           // Название задания
  ?string task;          // Текст задания
  ?string answer_format; // Формат ответа
  ?int n_codes;          // Сколько всего кодов в задании
  ?int need_n_codes;     // Сколько надо кодов для прохождения задания
  ?int start_time_ms;    // Время начала задания в unix_time миллисекундах 
  ?int time_left_ms;     // Сколько осталось времени в миллисекундах до автоперехода
  ?int delay_left_ms;    // Задержка в миллисекундах до появления задания
  int is_complete;       // Задание уже закончено

}

class PublicLastAnswers {
  /* ?PublicLastAnswer[] */ answers; // Массив с информацией об ответах
  int last_update_ms;                // Время последнего обновления в unix_time миллисекундах
}

class PublicLastAnswer {
  int time_ms;    // Время в unix_time миллисекундах, когда ответ отправлен
  ?string user;   // Кто вбил - в одиночных играх нет
  string answers; // Вбитые ответы через запятую
  string type;    // Одно значени из right, wrong, repeat - правильно, но уже было, nonsubmit - не приняты из-за блокировки
  ?string bonus;  // Полученный бонус или штраф за ответы
}

class PublicAnswerResult {

  int task_id;                             // ID уровня для которого посчитано
  /* ?strings[] */ right_answers = [];     // правильные ответы
  /* ?strings[] */ wrong_answers = [];     // неправильные
  /* ?strings[] */ repeat_answers = [];    // правильные, но повторные
  /* ?strings[] */ nonsubmit_answers = []; // не принятые из-за блокировки
  ?string bonus = '';                      // Бонус полученный за ответы
  ?string penalty = '';                    // Штраф полученный за ответы
}

class PublicAnswerForm {

  public bool show_finish_task = false; // Надо ли показывать кнопку закрывающую задание. Если надо то задание можно закрыть отправив код !finish!
  bool hide_answer_form = false;        // Ответы больше приниматься не будут, можно убрать поле ввода
  ?int block_time_left_ms;              // Сколько осталось до снятия ограничения на ввод. Время в миллисекундах. Если penalty не 0, значит ответы можно вводить, но со штрафом за неправильные.
  ?int limit_n_answers;                 // Ограничение на число неправильных ответов. Константа - как задана автором.
  ?int time_limit;                      // Время в секундах. За какой промежуток времени учитывается ограничение на число ответов limit_n_answers. Если 0, то limit_n_answers - ограничение на весь уровень.
  ?int penalty;                         // Штраф за каждый неправильный ответ сверх допустимого
  ?int n_answers_left;                  // Сколько ответов команда может вбить до того как будет ограничение. Меняется после каждого вбития ответов. Если 0 - значит ограничение активно.

}

class PublicCode {

  ?string name;      // Название кода
  ?string answer;    // Ответ на код
  ?string user_name; // Кто вбил первый
  ?int user_id;      // Кто вбил первый
  ?int answered_ms;  // Когда вбил первый
}

class PublicBonus {

  ?int n;                // Номер бонуса
  ?int bonus;            // Получаемый бонус или штраф, если значение отрицательное. В секундах или баллах
  ?string answer;       // Ответ на бонус
  ?string description;  // Описание бонуса (загадка)
  ?string hint;         // Подсказка, если бонус решен
  ?int time_to_open_ms; // Время в миллисекундах до открытия бонуса
  ?int time_to_close_ms;// Время в миллисекундах секундах до закрытия бонуса 
  ?bool is_closed;      // Время на ввод бонуса истекло - больше для ввода ответов он недоступен
  ?string user_name;    // Кто вбил первый
  ?int user_id;         // Кто вбил первый
  ?int answered_ms;     // Когда вбил первый

}

class PublicHint {

  int n;               // Номер Подсказки
  ?int time_to_open_ms; // Время в миллисекундах до открытия подсказки
  ?int id;             // ID штрафной подсказки - надо для ее использования
  ?string description; // Описание подсказки
  ?string hint;        // Текст подсказки
  ?int penalty;        // Штраф за штрафную подсказку
  ?int any_code;       // Если есть значит подсказка может открыть любой код
  /*int[]*/ codes;     // Список кодов, которые может открыть подсказка

}

Варианты ошибок

в error могут прийти такие ошибки:

Отправка ответов

Используется game.php

GET параметры:

gid - ID игры.

tid - ID уровня в который надо вбить ответ. Если не задавать, то есть риск вбить ответ с прошлого уровня в уровень с ограничением на ввод.

a - Ответы, которые надо вбить, через запятую.

Взятие штрафных подсказок

Используется game.php

GET параметры:

gid - ID игры.

hint_id - ID подсказки, которую надо разблокировать.

hint_code - [Опционально] номер кода, который надо открыть штрафной подсказкой.

Обновление страницы

Используется game_au.php, game.php

Если игра командная, то в ответе на game.php будет приходить refresh_check_limit_ms

Это время в миллисекундах, через которое можно проверять есть ли изменения в движке от действий сокомандников.

Если дергать сервер чаще, то есть риск получить бан по IP на какое-то время.

refresh_check_limit_ms - не константа и может меняться в зависимости от нагрузки на сервер.

Если любой из таймеров в игре заканчивается раньше, чем refresh_check_limit_ms то надо обновить страницу с помощью game.php. При этом refresh_check_limit_ms - можно проигнорировать.

Оптимально

С помощью game_au.php проверяем, надо ли обновлять страницу.

GET параметры:

gid - ID игры.

tid - ID задания.

time - время полученное в refresh_time из ответа game.php.

В ответ придет JSON:

class PublicAutoUpdateResult {
  ?string error;            // Ошибка
  ?bool refresh;            // Надо обновить страницу, кто-то вбил правильный код или взял штрафную подсказку
  ?bool reload;             // Кто-то прошел уровень
  ?bool refersh_monitoring; // Есть новые неправильные ответы в мониторинге. Можно их загрузить, если надо.
  ?int next_check_ms;       // Сколько ждать(в миллисекундах) до следующей проверки - вычисляется сервером в зависимости от нагрузки
}

Если в JSON есть поля refresh, reload или refersh_monitoring, то с помощью game.php обновляем страницу.

Не оптимально

С помощью game.php регулярно загружаем новую версию.

В этом случае период с которым дергаете сервер берите как refresh_check_limit_ms умноженный на 3.