subhub/TZ.md

13 KiB
Raw Permalink Blame History

Описание компонентов движка

Бэкенд

Работает в виде демона, реализующего 3 вида API:

  1. Activitypub для межсерверного взаимодействия
  2. Публичный API для доступа к тредам (будет использоваться фронтендом для показа тредов обсуждения на публичной странице сообщества)
  3. API администрирования (будет использоваться административной частью фронтенда, в которую будут логиниться пользователи-модераторы групп и администратор сервера)

Основные сущности, которые таким образом реализует бэкенд:

Акторы - согласно понятию актора из Устава, механизм публикации и подписки в рамках Fediverse. Имеют адрес вида who@where.tld. В нашем случае, акторы имеют тип "Group", и в терминолгогии проекта называются "хабами" Хаб - специальный актор, осуществляющий групповое общение пользователей Fediverse. Аккаунт модератора - рядовой аккаунт в системе SubHub, который дает право создавать группы и управлять ими. Аккаунт администратора - административный аккаунт в системе SubHub, который дает право производить административные действия над сервером и аккаунтами модераторов.

Общий алгоритм работы сервера:

  1. Сервер получает оповещение об упоминании актора одного из акторов на нем;
  2. Если упоминаемый актор действительно существует, идет прверка свойств хаба (см. раздел о возможных видах хабов). Здесь рассмотрим случай, где члены хаба = подписчики;
  3. Проверяем сообщение, в котором упоминается актор. Если сообщение первое в треде (у него не имеется, in-reply-to), записываем его в БД как новый тред, и объявляем активность Announce относительно этого сообщения. Таким образом, все подписчики хаба получат оригинальное сообщение, на которое можно будет отвечать и реагировать;
  4. Если сообщение с упоминанием не первое в треде, проверяем (рекурсивно), не принадлежит ли оно к какому-нибудь треду, уже присутствующему на сервере. Если принадлежит, присоединяем его и все предыдущие сообщения к треду в базе данных;
  5. Если сообщение с упоминанием не первое в треде, и не принадлежит к ни одному существующему на сервере треду, то проверяем, разрешено ли "прикалывание" (?) тредов пользователям. Если да, то забираем это сообщение, и рекурсивно все предыдущие вплоть до первого. Первое сообщение обозначаем в базе как начало треда, с информацией о том,от кого было "прикалывающее сообщение";
  6. За существующими тредами продолжаем наблюдать на предмет появления новых сообщений, и записываем в базу если таковые находятся;
  7. Клиентскому фронтенду по запросу на API отдаем информацию о группе, список ее тредов, и, собственно, сами треды для просмотра в браузере.
  8. Административному фронтенду позволяем авторизовываться как модератор или администратор, и предоставляем в зависимости от этого управление сервером целиком или управление только своими группами.
  9. Производим регулярную проверку хотя бы первых сообщений в тредах, на предмет новых реакций - обновляем счетчики реакций соответственно.

Таким образом, общий алгоритм использования следующий:

  • Администратор устанавливает сервер. Допустим, subhub.com
  • Модератор регистрируется на сервере и создает группу (или несколько). Выбирает группе аватар, фон, возможно CSS-тему, и т.д. Допустим, группа rf@subhub.com
  • Пользователи присоединяются к группе, путем подписки на нее.
  • Пользователь alisa@mastodon.social, подписчица rf@subhub.com, создает сообщение, первое в треде, с упомининием rf@subhub.com
  • Сервер subhub.com замечает это, записывает сообщение-топикстартер в базу, и дает Announce всем подписчикам rf@subhub.com
  • Все последующие сообщения в треде сервер будет записывать в базу, где-то получая их по упоминаниям, а где-то где упоминание потеряли, захватывать их самостоятельно (если это позволено модератором и администратором) "Прикалывание" тредов:
  • Пользователь pazan@mastodon.ml наткнулся на интересное обсуждение в Fediverse, и решил обнародовать этот тред для членов группы rf@subhub.com, в которой разрешено прикалывание;
  • Для этого он создает сообщение-ответ в треде, в которм упоминает rf@subhub.com. Shubub.com получает активность упоминания;
  • Subhub.com ищет по цепочке in-reply-to первое сообщение в треде, записывает его в базу и издает Announce в отношении него, с пометкой о том, что данный тред был приколот pazan@mastodon.ml, а также берет весь тред в базу целиком, со всеми существующими ветвями.
  • Все последующие сообщения в треде сервер будет записывать в базу, где-то получая их по упоминаниям, а где-то где упоминание потеряли, захватывать их самостоятельно (если это позволено модератором и администратором)

Виды хабов:

  • Доска объявлений: Тред может создать кто угодно, членство не обязательно;
  • Группа: Тред может создать только подписчик;
  • Клуб: Тред может создать только подписчик, при этом подписчиков необходимо подтверждать модератору;
  • Канал: Тред может создать лишь строго ограниченный список лиц, заданный модератором.

Прикалывание сообщений и принудительный захват тредов - опции, определяемые модератором. Администратор может запрещать эти опции.

Фронтенд

Фронтенд делится на две части: публичный и административный

Публичный фронтенд

Шлет запросы на публичный API с целью получения данных о хабах и тредах. Таким образом, осуществляет просмотр архива обсуждений на хабах. Имеет интерфейс, похожий на Reddit, позволяет осуществлять сортировку по дате добавления, дате последнего сообщения, по популярности, и т.д. Имеет два основных вида:

  • Страница хаба. На ней находится название хаба, аватар и фон хаба, адрес хаба, количество подписчиков, адрес модератора для связи (задается на странице модератора, принимает на вход адрес актора - в другом соцдвижке, не-Subhub), описание хаба (задается модератором хаба), его тип. Помимо всей информации о хабе, имеет список тредов, который можно сортировать, и осуществлять поиск.
  • Страница треда. На ней находится главным образом та же самая информация, что на странице хаба, однако вместо списка тредов на странице находится обсуждение, в виде reddit-овского дерева. Каждое сообщение в треде (помимо обычной информации вроде тела сообщения и количества реакций) имеет ссылку на оригинал, на сервере человека, его написавшего.

Для его просмотра не требуется авторизация.

Административный фронтенд

Авторизует пользователя, и шлет запросы на административный API, который позволяет:

Модераторам -

  • Определить личный параметры (вроде адреса своего актора для связи)
  • Создавать хабы
  • Редактировать параметры хаба (аватар, фон, описание, тип, функции прикалывания и захвата тредов)
  • Редактировать список подписчиков (иногда нужно отписать или заблокировать какого-нибудь хулигана, или даже заблокировать домен)
  • Редактировать список тредов хаба и сами треды (иногда нужно удалить тред или сообщение)
  • В случае, если хаб - канал, определять список доступа к созданию тредов
  • Закрывать/удалять хабы

Администраторам -

  • Все, что можно модераторам
  • Определять параметры сервера (его описание, правила, оформление, технические опции, например, возможность использовать захват тредов и прикалывание)
  • Просматирвать и редактировать список модераторов на сервере
  • Блокировка доменов и пользователей по всему серверу

В итоге получаем работающий форум на отдельном движке в Fediverse:

  • Модераторы создают хабы;
  • Пользователи других серверовы пишут в хабы
  • За обсуждением можно наблюдать, даже не находясь в Fediverse. Вот значимая часть, с описанием архитектуры проги. Жуткий сумбур, и это явно не ТЗ, но пока то, что есть.