13 KiB
Описание компонентов движка
Бэкенд
Работает в виде демона, реализующего 3 вида API:
- Activitypub для межсерверного взаимодействия
- Публичный API для доступа к тредам (будет использоваться фронтендом для показа тредов обсуждения на публичной странице сообщества)
- API администрирования (будет использоваться административной частью фронтенда, в которую будут логиниться пользователи-модераторы групп и администратор сервера)
Основные сущности, которые таким образом реализует бэкенд:
Акторы - согласно понятию актора из Устава, механизм публикации и подписки в рамках Fediverse. Имеют адрес вида who@where.tld. В нашем случае, акторы имеют тип "Group", и в терминолгогии проекта называются "хабами" Хаб - специальный актор, осуществляющий групповое общение пользователей Fediverse. Аккаунт модератора - рядовой аккаунт в системе SubHub, который дает право создавать группы и управлять ими. Аккаунт администратора - административный аккаунт в системе SubHub, который дает право производить административные действия над сервером и аккаунтами модераторов.
Общий алгоритм работы сервера:
- Сервер получает оповещение об упоминании актора одного из акторов на нем;
- Если упоминаемый актор действительно существует, идет прверка свойств хаба (см. раздел о возможных видах хабов). Здесь рассмотрим случай, где члены хаба = подписчики;
- Проверяем сообщение, в котором упоминается актор. Если сообщение первое в треде (у него не имеется, in-reply-to), записываем его в БД как новый тред, и объявляем активность Announce относительно этого сообщения. Таким образом, все подписчики хаба получат оригинальное сообщение, на которое можно будет отвечать и реагировать;
- Если сообщение с упоминанием не первое в треде, проверяем (рекурсивно), не принадлежит ли оно к какому-нибудь треду, уже присутствующему на сервере. Если принадлежит, присоединяем его и все предыдущие сообщения к треду в базе данных;
- Если сообщение с упоминанием не первое в треде, и не принадлежит к ни одному существующему на сервере треду, то проверяем, разрешено ли "прикалывание" (?) тредов пользователям. Если да, то забираем это сообщение, и рекурсивно все предыдущие вплоть до первого. Первое сообщение обозначаем в базе как начало треда, с информацией о том,от кого было "прикалывающее сообщение";
- За существующими тредами продолжаем наблюдать на предмет появления новых сообщений, и записываем в базу если таковые находятся;
- Клиентскому фронтенду по запросу на API отдаем информацию о группе, список ее тредов, и, собственно, сами треды для просмотра в браузере.
- Административному фронтенду позволяем авторизовываться как модератор или администратор, и предоставляем в зависимости от этого управление сервером целиком или управление только своими группами.
- Производим регулярную проверку хотя бы первых сообщений в тредах, на предмет новых реакций - обновляем счетчики реакций соответственно.
Таким образом, общий алгоритм использования следующий:
- Администратор устанавливает сервер. Допустим, 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. Вот значимая часть, с описанием архитектуры проги. Жуткий сумбур, и это явно не ТЗ, но пока то, что есть.