Автоматизированная система розыгрыша игровых предметов на платформе Steam. Юдин Д.Г. 1. Описание сервиса Steam Steam — сервис цифрового распространения компьютерных игр и программ. Выполняет функции службы активации, загрузки через Интернет, автоматических обновлений и новостей для игр. В частности для системы розыгрыша используется Steam инвентарь, который используется для просмотра и обмена игровых предметов непосредственно через сайт Steam. 2. Используемые технологии: Node.js JavaScript CoffeeScript JavaScript — прототипно-ориентированный сценарный язык программирования. Node.js — программная платформа, основанная на программном модуле V8(транслирующем JavaScript в машинный код). Node.js применяется преимущественно на сервере, выполняя роль веб-сервера. В основе Node.js лежит событийно-ориентированное и асинхронное программирование. CoffeeScript — язык программирования, транслируемый в JavaScript. Используется для того, чтобы улучшить читаемость кода и уменьшить его размер. Паттерн Promise. Так как Node.js подразумевает под собой работу с асинхронными запросами, был использован паттерн Promise в JavaScript. Использование promise предоставляет удобный способ организации асинхронного кода. Promise - это специальный объект, который содержит своё состояние. Вначале pending (“ожидание”), затем — одно из: fullfilled(resolve) (“выполнено успешно”) или rejected (“выполнено с ошибкой”). Рисунок 1. Структура объекта promise. Способ использования, в общих чертах, такой: 1. Код, которому надо сделать что-то асинхронно, создаёт объект promise и возвращает его; 2. Внешний код, получив promise, записывает на него функции-обработчики; 3. По завершении процесса асинхронный код переводит promise в состояние fulfilled(resolve) с результатом или rejected (с ошибкой). При этом автоматически вызываются соответствующие обработчики во внешнем коде; Универсальный метод для записи функций-обработчиков: promise.then(onFulfilled, onRejected) onFulfilled — функция, которая будет вызвана с результатом при resolve. onRejected — функция, которая будет вызвана с ошибкой при reject. 3. Работа системы розыгрыша Работа данной системы организована следующим образом. Создается специальный пользователь (бот) в системе Steam. У пользователей системы steam есть свои игровые предметы, которые имеют свой денежный эквивалент. Желающие поучаствовать в розыгрыше переходят на сайт, где используется данный бот. На сайте создан розыгрыш и в него пользователи добавляют свои предметы. Добавление предметов в системе Steam осуществляется посредством создания “предложения”(trade offer).В системе steam пользователь создает trade offer к другому пользователю. В один trade offer пользователь может добавить сразу несколько предметов. В конечном итоге пользователи (участники розыгрыша) создают trade offer к боту, который принимает данные предложения от участников розыгрыша и в конечном итоге разыграет победителя. После розыгрыша победителя создастся новый розыгрыш. Особенность в том, что чем на большую сумму в денежном эквиваленте добавит конкретный пользователь (участник розыгрыша), тем больше вероятность того, что он выиграет этот розыгрыш. Выиграет розыгрыш это значит, что он получит все предметы участвующие в данном розыгрыше, за исключением комиссии, которую бот забирает себе. Также есть специальные типы розыгрышей: Дорогой розыгрыш; (сумма денежного эквивалента предметов в одном trade offer должна быть не менее 100 рублей) Средний розыгрыш; (сумма денежного эквивалента предметов в одном trade offer должна быть не менее 10 рублей) Дешевый розыгрыш; (сумма денежного эквивалента предметов в одном trade offer должна быть не более 1 рубля) Рисунок 2. Структура работы системы розыгрыша 4. Программная реализация, архитектура приложения Node.js был выбран по причине необходимости работать с параллельными процессами и асинхронными запросами в работе системы розыгрыша. К примеру несколько пользователей могут в один момент отправить trade offer , и это все нужно успевать обрабатывать, что как раз позволяет делать Node.js, потому что в основе Node.js лежит событийноориентированное и асинхронное (или реактивное) программирование. В свою очередь благодаря поддержке многопоточности в целом работа системы написанная на Node.js будет работать очень быстро, без задержек и выдерживать значительные нагрузки. Паттерн промисов, позволил настроить работу с асинхронными запросами. Рисунок 3. Архитектура приложения Raffle – инициирующий объект, который инициирует создание объектов RoundManager и ItemCostManager; ItemCostManager – класс отвечающий за загрузку цен предметов с сервера Steam; RoundManager – класс, который управляет раундами(розыгрышами). Налаживает работу смены раундов и смены ботов. После определения победителя розыгрыша, создается новый розыгрыш, а старый удаляется; Round – класс, который управляет работой в раунде(розыгрыше), тайминг, выбор победителя; TradeOfferManager – отвечает за отправку предложений(trade offer), налаживает взаимодействие со Steam API, хранит в себе все предложения текущего раунда; TradeOffer – класс описывающий предложение (trade offer), отвечает за валидацию предложения при принятии предложения в раунд, выполняет работу с БД; InventoryAsset – класс описывающий игровой предмет, отвечает за валидацию при добавлении предмета в предложение; Список литературы: 1. Теория JavaScript: [электронный ресурс]: – Режим доступа: https://learn.javascript.ru/promise (дата обращения: 15.11.2015) 2. Асинхронное программирование на JavaScrpt: [электронный ресурс]: - Режим доступа: http://habrahabr.ru/post/111634/ (дата обращения: 10.11.2015) 3. Марк Бейтс. CoffeeScript. Второе дыхание JavaScript - ДМК Пресс, 2012.