Перейти к основному содержимому
Сервисы вокруг игры

Эта страница ещё не переведена — показана английская версия.

Social

Social добавляет одно понятие — связь двух акторов, у которой есть своё состояние и инициатор. Клан, гильдия или отряд — это группа со слоем связей поверх неё, а не новый вид объектов. Блокировка нужна нескольким модулям, поэтому она живёт здесь: так ею владеет только одно место.

Когда это нужно

  • Игрокам (player) нужно находить друг друга по имени: друзья, подписчики, списки заблокированных.
  • Клану или гильдии нужны правила вступления: приглашение от группы (group), запрос на вступление от актора и решение по каждому из них.
  • Список друзей должен показывать, кто в сети. Присутствие (presence) выводится из сессий, а кто его видит, решает объявленный вами предикат.
  • Другому модулю нужно знать, что кто-то заблокирован. Он читает это состояние отсюда, а не хранит своё.
  • Не нужен, если речь о множестве акторов, а не о паре с состоянием. Это группа, а группа на каждую пару означала бы миллионы групп из двух человек, и у каждой свой жизненный цикл и свои правила вступления.

Кто что делает

АкторМожетНе может
playerпредложить связь (relationship) или подписаться на игрока; принять, отклонить или отозвать предложение; разорвать взаимную связь; заблокировать и разблокировать; читать свои связи и присутствие связанных акторов; подписаться на изменения; подать запрос на вступлениечитать чужой список связей — какая бы связь его с владельцем списка ни объединяла
moderatorпринимать решения по приглашениям и запросам на вступление там, где у него есть атомарное разрешение (permission atom) на управление участникамирешать по заявке (intent), на которую у него нет разрешения, — ответ будет forbidden

Модель

Что содержит объявление связи.

ОбъявлениеЧто это
kindсимметричная связь требует согласия обеих сторон, и к ней относится машина состояний ниже. Односторонняя — когда один игрок подписывается (follow) на другого, и у неё единственное состояние active. Уникальность пары и идемпотентность предложения действуют для обоих видов
правило повторного приглашениячто можно после отказа: запрещено · разрешено через объявленный срок · разрешено сразу. Правило объявляется, потому что «спросить ещё раз» — продуктовое решение
видимость присутствияпредикат: всем · только взаимно связанным · никому. Значения по умолчанию нет
режим вступления (у типа группы)свободное · по запросу с решением · только по приглашению
хранение отклонённых и разорванныхчерез объявленный срок связь удаляется, и пригласить снова можно независимо от правила повторного приглашения

Состояния симметричной связи.

СостояниеЗначение
proposedинициатор предложил связь, другая сторона ещё не ответила
mutualобе стороны согласны
declinedдругая сторона отказалась. Связь сохраняется: без неё правило повторного приглашения не сработает
brokenодна из сторон вышла из взаимной связи
blockedодна сторона заблокировала другую

Что верно для любой связи.

ВсегдаЧто это
одна сущность на паруа не две зеркальные записи. «A предложил B» и «B получил предложение от A» — один факт, прочитанный с двух сторон
инициаторобъявлен: известно, кто предложил. Это нужно и для отображения, и для правила повторного приглашения
блокировка главнееиз состояния blocked нет перехода в proposed или mutual
блокировканесимметрична по управлению и симметрична по действию: снять блокировку может только тот, кто её поставил, а действует она в обе стороны
состояние блокировкипринадлежит этому модулю, а используют его другие: Messaging и остальные читают его, но никто не меняет и не хранит копию
присутствиевыводится из сессий, и никто его не записывает. Предикат видимости применяется для каждого запрашивающего, а не один раз на актора
отложенная заявкане занимает место (seat): приглашение или запрос на вступление не засчитываются во вместимость группы, поэтому сотня заявок не заполнит клан на пятьдесят человек
группавсегда сохраняет администратора. Хотя бы у одного актора должно быть атомарное разрешение на управление участниками, и последний такой актор не может просто уйти: клан, из которого ушёл последний администратор, больше никогда никого не примет
ролей внутри группы нет«офицер клана» — это актор с атомарным разрешением, а не звание, записанное в списке
импорт ничего не перезаписываетсвязи, импортированные от провайдера входа, только добавляются: заблокированный не станет другом лишь потому, что так сказал провайдер

Ошибки

  • Связь уже взаимная — конфликт: предлагать нечего.
  • Предложение самому себе — отказ валидации.
  • Если одна из сторон заблокировала другую, ответ — not found, а не forbidden: отказ, который различал бы эти случаи, выдал бы блокировку. Повторять бессмысленно.
  • Повторное приглашение раньше срока — конфликт. Повторить имеет смысл, когда срок пройдёт.
  • Исчерпан предел числа связей или заявок — это конфликт, а не forbidden: разрешение есть, но места не осталось. Повторите, когда что-то освободится или когда по текущим заявкам примут решение.
  • Истёкшая заявка — конфликт: создайте новую, а не повторяйте старую.
  • Уход последнего администратора группы — конфликт, пока разрешение не передано другому.
  • Решение по чужой заявке без разрешения — ответ forbidden, повторять бессмысленно.
  • Импорт от неподключённого провайдера — ответ unavailable: повторяйте с нарастающей задержкой.

Ограничения

Конкретные числа появятся вместе с главой об ограничениях платформы, а поведение на каждой границе уже определено.

  • Взаимные связи на актора: новое предложение отклоняется как конфликт, а существующие связи ради места никогда не разрываются.
  • Односторонние связи на актора: новая отклоняется, существующие остаются.
  • Исходящие предложения: новое отклоняется, и вытеснения нет — вытесненное приглашение выглядело бы как отклонённое.
  • Блокировки на актора: новая отклоняется как конфликт, а старые не вытесняются, так что никого не разблокируют молча.
  • Время жизни заявки: expired, с событием (event).
  • Частота предложений от актора: ограничение частоты со сроком повтора.
  • Частота изменений присутствия в потоке данных: её ограничивает частота обновлений, а изменения не отбрасываются.
  • Хранение отклонённых и разорванных связей: удаление по истечении объявленного срока.