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