## Описание компонентов движка ### Бэкенд Работает в виде демона, реализующего 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. Вот значимая часть, с описанием архитектуры проги. Жуткий сумбур, и это явно не ТЗ, но пока то, что есть.