subhub/TZ.md

91 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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