Автоматизированная система розыгрыша игровых предметов на

advertisement
Автоматизированная система розыгрыша игровых предметов на
платформе 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.
Download