xboxstat.ru: присутствие (статус)
Продолжаем изучать структуру моей базы пользователей, и сегодня очередь дошла до Rich Presence, не знаю, как лучше перевести на русский. Речь идёт о текущем статусе пользователей Xbox Live, который выглядит в приложении Xbox App следующим образом:
Работа с этим статусом -- это одна из самых сложных, наверное, частей xboxstat.ru. И дело не только в объёме - 2,1 млрд строк не хрен собачий, но и в том, что запрос на статус возвращает текущее значение, но нет способа узнать, какой был статус пять минут назад или вчера, например. Ну, то есть ачивки я могу собрать когда угодно. Статистику, список игр -- вообще без проблем, даже если человек играл пять лет назад. Но вот статусы доступны только пока работает скрипт по их сбору. Скрипт работает -- таблица заполняется. Скрипт не работает, например, из-за профилактики или сбоя - данных нет и взять их будет неоткуда.
Разработчикам игр не рекомендуется обновлять статус чаще, чем раз в 10 секунд, а у меня получается читать их примерно раз в 40-50 секунд. Чтобы было понятно, опрашиваются 313 тысяч геймертагов, и по каждому активному геймертагу выполняется update в таблице. Порядка тысячи апдейдов в секунду. Вполне тянет на процессинг небольшого банка.
Но бог с ним, в базу я как-то данные складываю (спасибо TimescaleDB), но тут вторая задача -- как это наглядно показать. И сегодня я покажу интерфейс доступа к этой таблице, и заодно спрошу совета, как лучше сделать. Призываю посмотреть на себя и поделиться мнением в комментариях. Ещё важное замечание: если выставить в приложении или на консоли статус "Невидимый", вы у меня пропадёте, будете всегда "Offline". Проверьте, чтобы такого не было.
Прямая ссылка на список юзеров:
Ищете свой геймертаг, кликаете, а там есть раздел "Присутствие игрока". Дальше ссылка "подробности", получится как-то так:
Скрипт по сбору информации был запущен в декабре 2018 года, и сперва его принцип был проще: я собирал и агрегировал информацию в кванты длительностью в один час,это хорошо видно по 2018-2020 году. Начиная с 5 августа 2020 я храню информацию с точностью до секунды, хотя напомню, погрешность составляет 1 минуту. И ещё раз: если вы добавились в базу позавчера, то у меня не будет никаких сведений относительно ваших статусов до этого момента.
Rich Presence возвращает информацию не только об играх, но и о приложениях. Например, TrueAchievements рассказывает, решения к каким ачивкам вы просматриваете в настоящий момент. Фильтр позволяет посмотреть информацию только об играх, а также указать, интересует вас проведённое в тайтлах время или количество разных тайтлов/игр.
При этом надо отметить в целом достаточно пофигистичное отношение разработчиков к корректности данных. Так, для некоторых тайтлов вообще не указано, игра это, или приложение. Ну что ж, бывает и так.
Вторая ценная вещь -- платформа. Я уже писал про новую XboxCoreOS в ежемесячном отчёте за июль, а здесь просто повторю список этих платформ:
Запускаемые по обратке тайтлы работают внутри эмулятора XboxOne, поэтому с точки зрения Presence это будет одновременная работа двух игр.
Четвёртый столбец (с геймпадиком) -- это количество различных статусов. Майки не были бы майками, если бы и тут не организовали головняк, хотя скорее тут разрабы что-то не так поняли. В документации приведён отличный пример хорошего статуса: "Хей, пацаны, я бьюсь с драконом в пятом подземелье, на помощь!". Самые отвратительные статусы у спорт-симов и некоторых игр, которые добавляют, сколько, к примеру, очков уже набрано, типа как в Threes. В результате у меня на каком-то адовом pl/perl написана функция, которая нормализует этот рич-презенс отдельно для каждого из почти сотни особо беспощадных тайтлов с целью уменьшить количество мусора в базе. Тем не менее, в каком-то из Far Cry всё равно получилось больше двух сотен статусов. Да дофига таких игр на самом деле.
Надо также помнить, что время, проведённое в игре, считается не так, как в Xbox Live (MinutesPlayed), и может сильно отличаться в любую сторону. Во-первых, скорее всего Xbox Live считает время более правильно, во-вторых, скрипт может в какие-то моменты времени не работать, как это было несколько дней в марте.
Есть ещё два параметра, которые, впрочем, никак не фигурируют в моих таблицах: Placement и State. State может быть Online, Away, InActive и Offline, а Placement бывает Full, Fill, Snapped и Background. Пояснений требует разве что Snapped, устаревший статус для игр/приложений, которые можно было закрепить сбоку от экрана, типа игры Threes!, я пробовал шпилить в неё, одновременно краем глаза смотря ютуб. Работало, но очень на любителя. Майки убрали эту фичу с переходом от интерфейса Windows 8 к операционке Windows 10 в своих консолях.
Я складываю в базу только игры в статусе Online. То есть, если вы отлучились от геймпада, и экран приглушился, в статусе появилось Away, а мой скрипт перестал вас видеть.
Если кликнуть в тайтл, вы получите полный дамп из базы по этой игре. И вот тут-то я никак не могу придумать, что здесь лучше показать. Сейчас это выглядит предельно уныло:
Что можно придумать? График, фильтр, тепловую карту? Ну капец неудобно же пользоваться. Буду рад советам, но и сам продолжу думать.