Эта страница ещё не переведена — показана английская версия.
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). - Частота предложений от актора: ограничение частоты со сроком повтора.
- Частота изменений присутствия в потоке данных: её ограничивает частота обновлений, а изменения не отбрасываются.
- Хранение отклонённых и разорванных связей: удаление по истечении объявленного срока.