Перейти до основного вмісту
Сервіси навколо гри

Цю сторінку ще не перекладено — показано англійську версію.

Social

Social додає одне поняття — зв’язок двох акторів, який має власний стан та ініціатора. Клан, гільдія чи загін — це група з шаром зв’язків поверх неї, а не ще один різновид об’єктів. Блокування, яке потрібне кільком модулям, теж живе тут, щоб ним володіло лише одне місце.

Коли це потрібно

  • Гравці мають знати одне одного на ім’я: друзі, підписники (follower), списки заблокованих.
  • Кланові чи гільдії потрібні правила вступу: запрошення від групи, запит на вступ від актора й рішення щодо кожного з них.
  • Список друзів має показувати, хто в мережі: присутність (presence) виводять із сесій, а хто може її бачити, визначає предикат, який оголошуєте ви.
  • Іншому модулю треба знати, що когось заблоковано: він читає цей стан звідси, а не зберігає власний.
  • Не використовуйте його, якщо йдеться про множину акторів, а не про пару зі станом. Це група, а група на кожну пару означала б мільйони груп із двох людей, кожна з власним життєвим циклом і правилами вступу.

Хто що робить

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

Модель

Що містить оголошення зв’язку.

ОголошенняЩо це
kindсиметричний — пара потребує згоди обох сторін, і машина станів нижче стосується саме його; або односторонній — коли гравець підписується на іншого, а єдиний стан такого зв’язку — active. Унікальність на пару й ідемпотентність пропозиції діють для обох видів
правило повторного запрошеннящо можна після відмови: заборонено · дозволено після оголошеного строку · дозволено одразу. Правило оголошують, бо «запитати ще раз» — це продуктове рішення
видимість присутностіпредикат: усім · лише взаємно пов’язаним · нікому. Значення за замовчуванням немає
режим вступу (для типу групи)вільний · за запитом із рішенням · лише за запрошенням
зберігання відхилених і розірванихпісля оголошеного строку зв’язок видаляють, і запросити знову можна незалежно від правила повторного запрошення

Стани симетричного зв’язку.

СтанЗначення
proposedініціатор запропонував, а інша сторона ще не відповіла
mutualобидві сторони згодні
declinedінша сторона відмовилася. Платформа зберігає зв’язок, бо правило повторного запрошення має про це знати
brokenодна зі сторін вийшла із взаємного зв’язку
blockedодна сторона заблокувала іншу

Що справджується для кожного зв’язку.

ЗавждиЩо це
одна сутність на паруа не два дзеркальні записи. «A запропонував B» і «B отримав пропозицію від A» — це один факт, який читають із двох боків
ініціатороголошений: відомо, хто запропонував. Це потрібно і для відображення, і для правила повторного запрошення
блокування переважаєз нього немає переходу в proposed чи mutual
блокуваннянесиметричне за керуванням і симетричне за дією: зняти його може лише той, хто встановив, а діє воно в обидва боки
стан блокуванняналежить цьому модулю, а використовують його інші: його читають Messaging та інші модулі, але жоден із них його не змінює й не зберігає копії
присутністьвиводять із сесій, і ніхто її не записує. Предикат видимості застосовують для кожного запитувача окремо, а не один раз для актора
відкладена заявкане займає місця (seat): запрошення чи запит на вступ ніколи не зараховують до місткості групи, тож сотня запитів не вичерпає клан на п’ятдесят осіб
групазавжди має адміністратора: принаймні один актор повинен мати атомарний дозвіл на керування участю, і останній такий актор не може просто піти. Клан, з якого вийшов останній адміністратор, уже ніколи нікого не зміг би прийняти
ролей усередині групи немає«офіцер клану» — це актор з атомарним дозволом, а не звання, записане в списку
імпорт нічого не перезаписуєзв’язки, імпортовані від провайдера входу, лише додаються: той, кого заблокували, не стане другом лише тому, що так вважає провайдер

Помилки

  • Зв’язок уже взаємний — це конфлікт: пропонувати нічого.
  • Пропозиція самому собі — відмова валідації.
  • Якщо одна зі сторін заблокувала іншу, відповідь — not found, а не forbidden: відмова, яка розрізняла б ці випадки, видала б блокування. Повторювати марно.
  • Повторне запрошення до кінця строку — конфлікт; його варто повторити, коли строк мине.
  • Вичерпаний ліміт — зв’язків чи заявок — це конфлікт, а не forbidden: дозвіл є, але місця вже немає. Повторіть, коли щось звільниться або коли за наявними заявками ухвалять рішення.
  • Прострочена заявка — конфлікт: створіть нову, а не повторюйте стару.
  • Вихід останнього адміністратора групи — конфлікт, доки дозвіл не передано іншому.
  • Рішення щодо чужої заявки без дозволу дає forbidden, і повторювати марно.
  • Імпорт від провайдера, який не підключено, дає unavailable: повторюйте зі зростаючою паузою (backoff).

Обмеження

Конкретні числа з’являться разом із розділом про ліміти платформи, а що відбувається на кожній стелі, визначено вже зараз.

  • Взаємні зв’язки на актора: пропозицію відхиляють як конфлікт; наявні зв’язки ніколи не розривають, щоб звільнити місце.
  • Односторонні зв’язки на актора: новий відхиляють, наявні лишаються.
  • Вихідні пропозиції: нову відхиляють, і витіснення немає: витіснене запрошення виглядало б як відхилене.
  • Блокування на актора: нове відхиляють як конфлікт, а старі блокування не витісняють, тож нікого не розблокують мовчки.
  • Строк дії заявки: expired, з подією (event).
  • Частота пропозицій на актора: обмеження частоти з часом, після якого можна повторити.
  • Частота змін присутності в потоці даних (stream): її обмежує частота оновлень, а не відкидання змін.
  • Зберігання відхилених і розірваних зв’язків: їх видаляють після оголошеного строку.