12 сентября 2013 12.09.13 7 4094

Во что поиграть с друзьяшками в мульт? (или сказ о том как я творил)

+29

Пост о том, как меня букавльно недавно утомило в который раз пробегать по своему стим-листу игр и искать во что же мне можно поиграть с другом или с парочкой друзей. Как мне пришлось разведовать, анализировать и манипулировать с различного рода информацией, прежде чем я более менее успокоился и написал этот пост :).

UPD2 по какой-то непонятной случайности сбоит работа под Firefox'ом, что есть печально. Вебкитобразные браузеры (chrome, yandex browser, safari) работают как надо. Оперой не тыкал, я пока не знаю в чем проблема, но уже работаю над исправлением :(. вот

UPD3 добавлен блок приготовления перед началом (см ниже)

После того как я решился на это написание мне пришлось решать несколько задач:
1. Достать информацию о играх, друзьях, играх друзьях
2. Правильно ее обработать и представить в нужном виде

С технологиями я более менее определился вооружившись питоном (python) и жэ-эсиком (он же javascript или его реализация ecmascript 5), а также более другими страшными штуками, речь о которых не столь важна.

Первое с чем я действительно серьезно столкнулся, это с тем фактом, что steam'овский webapi хоть и вполне пригоден для такого рода задачи как моя, но теряет в деталях. А именно информация о типах игр, а также дополнительная информация например такая, как поддержка ачивок, трейдинг-карт, контроллера, vac, лидербордов и т.д.
Решение правда было найдено, не самое изящное, но такая уж фрагментируемая база у стим, что пришлось использовать чуть ли не три метода получения данных.

После всех этих изысканий я таки сел за код, в качестве базы данных выбрал сразу NoSQL, так как очень уж не хотелось еще и заниматься парсингом api'шных вызовов стима к реляционным (табличным) базам данных. Получилось довольно таки интересно, а самое главное быстро.

Всего за 2.5 рабочих дня (за 4 физических дня) я успел склепать работающий релиз, который уже умел проводить совпадения между мной (активным юзером) и любым другом.
Конечно это был далеко не так называемый продакшн =), но успех есть успех.

Всю следующую неделю я занялся улучшением существующей архитектуры, допиливанием различных модулей, после своей основной работы садился и писал-писал-писал.
К концу недели уже был готово 80% всего необходимого, в том числе и матчинг между выбранными друзьями. За неделю успел еще раскидать информацию друзьям, чтобы те потыкали и сказали что нужно, чего им не хватает, да и баги бы поотловить (хотя их было не много).

На выходных уехал на дачу, пить шашлык, есть текилу. Не знаю как так получилось, но интересную мысль о том, что не плохо было бы показывать полный список игр вместе с друзьями у кого эти игры присутствуют в наличие я взял с собой. И вооружившись интернетом 3г (который в итоге был 2г), ноутбуком своей девушки (которая уехала на дачу раньше меня и тоже там работала), а также блокнотиком я в перерыве между тостами «ПЬЕЕЕМ» изображал занятого человека ;). В итоге конечно удавалось больше пить, чем писать, но на следующий день все получилось. Спокойно прочитав часть необходимой документации и изобразив нужный процесс агрегации данных я уехал с дачи сытым и довольным.

За оставшуюся часть выходного я таки успел дописать нужную часть кода. Осталось все причесать, избавиться от лишних артефактов и запилить всю информашку на что и ушло середина этой недели.

Вот и весь сказ (=, который можно было пропустить

1. Чо-ваще?
Итак начну с краткой истории, которая прояснит и ответит на вопрос в головах тех, кто еще не понял о чем идет речь.
Вопрос: «Во что поиграем?», — мне начали задавать куда чаще, чем я мог запомнить и выписать на бумажку все игры с коопаративом, мультиплеером всех друзей (и не только их ;), которые мне его задавали. Продираться через свой список (сейчас количество игр на моем аккаунте в стиме достигло скромной отметки 299), а потом еще через список друга/друзей, мне с каждым разом хотелось все меньше и меньше, пока я понял, что я так больше не хочу и хватит это терпеть.

После этого я решил побродить по гуглу в поисках ответа на мой вопрос — как мне быстро узнать во что я могу поиграть с другом, не особо тратя время на переизучения своего списка игр и списка друга/друзей. К своему огорчению я нашел ничего. Возможно конечно я слишком рано сдался с поисками, но возвращаться к тому, от чего ушел тоже не хотелось.

«Хорошо, — подумал я, — я же все таки умею писать код, да и с web'ом давно дружу, почему бы не написать свое собственное решение». И я сел за работу, честно сказать что пришлось прочитать много всего и поковырять много всего прежде чем я нашел удовлетворение в том, что получилось.
Раздав друзьям доступ в первую версию мне тут же накидали пару интересных идей, а также дали одобрительные отзывы, что штука хорошая, кто-то даже забукмаркал :). И я решил довести проект до вменяемого состояния, чтобы и самому пользоваться и другим дать погонять.

Вот я и подошел к сути.

То что у меня получилось в скриншотах, ибо лучше один раз увидеть, чем читать много буков:

Быть может быть в доту? ;)

Коммандос? O_O" вы меня разыгрываете

Или в Магику?

Их есть у меня

МКашечка!

2. Я также хочу!

Для тех кто внезапно захотел также оставлю небольшое руководство со скриншотиками что нужно делать

Upd: перед тем как выполнить нижеследующие шаги необходимо открыть свой профиль для чтения, иначе данные не смогут быть импортированы => процесс импортирования не сможет закончиться удачно. Если у вас есть друзья, которые скрыли свой профиль, то они будут успешно импортированы на половинку, то есть без информации о принадлежащим им играм и будут помечены как неактивные + с ними нельзя будет составлять списка совпадений и они не смогут участвовать в мульти-совпадении :).

2.1 Приготовления перед началом
Прежде чем ринуться выполнять шаги 1-4 необходимо удостоверится, что ваш стим профиль читабельный для CoOpme, сделать это можно посмотрев какой режим приватности установлен в вашем профиле, если кто-то из вас уже регистрировался на gameminer, tf2outpost или поднобных ресурсах, то скорее всего ваш профиль уже настроен в правильном ключе. Если вы впервые об этом слышите, то смотрите маленькую инструкцию под спойлером.

Зайдите в свой профиль, далее перейдите по кнопке редактирования профиля:

Выберете пункт настройки приватности:

Установите профиль как «Открытый» и нажмите сохранить:

Шаг 1.

Необходимо залогинится в steam (https://store.steampowered.com/login/)

до логина:

после:

Шаг 2.

Зайти на coopme.ugame.pw
и нажать на зеленую кнопку Sign in through STEAM, после чего внимательно прочитать что написано на экране входа steam, перед тем как нажмете на кнопку Войти. (пожалуйста, перед тем как нажать на Войти прочитайте действия Шага 3.)

Зеленая кнопка вверху справа ;)

Дело не в сложности, а скорее в том, что первое общение с ресурсом показало то, что не все люди доверяют различным сайтам с логином через различные социальные сети, особенно если пользователь не авторизован в стиме через сайт в своем браузере.

Пользователь думает, что его данные пытаются угнать. При предварительном логине вся необходимая информация по безопасности предоставляется пользователю сразу.

Шаг 3.
После того как вы нажмете кнопку Вход будет запущен процесс синхронизации ваших steam данных, таких как список друзей, список ваших игр, список игр ваших друзей (пока больше ничего не синхронизирует помимо указанного).
Вы увидите информацию о импортировании данных

Начало импортирования

Завершение импортирования

данный процесс запускается только один раз, он может занять какое-то время в зависимости от того насколько большой ваш список друзей, игр и игр ваших друзей. Вся дополнительная информация будет подгружена в фоне. Значит это, что после успешного импорта какое-то время может пройти перед тем как все данные будут закешированы на сервер для последующей работы с ними.

Шаг 4.

Ну собственно и все, обновляем и тыкаем.

Друзьяшки

Локальный кооп

Списочек

Собственно и весь мануал.

В — Какова стоимость всего для меня как конечного пользователя?
О — если внезапно сервер не ляжет, то 0. Если ляжет :) то пользоваться какое-то время будет нечем. В любом случае никаких платных киллер-фич нет.

В — Добавил друга/игру, а их нет в списке, что делать?
О — жать на облачко синхронизации, только после синхронизации все необходимые данные появятся. В случае с другом синхронизация займет больше времени

В — Есть ли информация об апдейтах?
О — да можно набежать на официальный твитор, CoopMyGames, какое-то время некоторая информация будет появляться и здесь.

В — У меня есть безумная идея!
О — Безумные (разумеется в меру) и интересные идеи можете смело оставлять, думаю они не пропадут без должного внимания к ним в будущем.

На этом все и всем :) позитиватор:


Лучшие комментарии

«хорошие новости народ» в стиме реализована подобная фитча, немного иначе но все-же реализована, для этого нужно:
зайти в профиль друга, перейти в список его игоръ, нажать на «Все игры», и поставить галочку [V]показать игры, которые есть у вас обоих
Данные по специальным тегам он тащит из магазина — ага =), других мест просто не существует. Даже в depots (используя steamkit2, pysteamkit) их нет, поэтому пришлось делать вот такой вот финт ушами.
;) а мы все таки дальше от стима ушли, хотя как минимум показать все совпадения по друзьям прямо в стиме — это уже хорошо. Тем не менее заточка coopme показывает:
1. по всем друзьям сразу
2. показывает между несколькими друзьями совпадения (любыми выбранными)
3. показывает только онлайновые игры, то есть singleplayer туда не попадает
+ бонус с фильтрацией :P
однако плюсую за проделанную работу
а кстати, данные берет из магазина кооп\не кооп, или из какой-то иной бд?
Нашел небольшой баг, процесс импортирования у людей с закрытым профилем падал не давая никаких внятных сообщений об ошибках.
Обновил руководство с пометкой о том, что необходимо сделать, если ваш профиль скрыт.

приношу свои извинения пострадавшим от столь суровой несправедливости :)
Читай также