Разговор больше чем двух людей в Korat происходит в группах, потому что личная переписка — только между двумя. У него две формы. Основная — посты: пост в группе — обычная строка в таблице постов с идентификатором сообщества, поэтому комментарии, упоминания, уведомления и поиск работают на нём без изменений, а не строятся параллельно. Рядом с этим у группы могут быть комнаты: текстовые каналы в духе Discord, перечисленные внутри группы, со своими правами и своим статусом прочтения. Комнаты намеренно тонкие, и врезка ниже говорит, насколько именно.
Пост группы — это пост ленты с адресом
Это самое важное, что стоит понять про группы Korat. Публикуя в группу, вы создаёте ровно тот же объект, что и в своей ленте: те же реакции, те же ветки комментариев, те же упоминания, ведущие к настоящим людям, та же правка и удаление, та же машинерия уведомлений. Нет второсортной системы комментариев для групп, которой недостаёт чего-то из ленты.
Идентификатор группы меняет только одно — где пост появляется. Посты групп отфильтровываются из основной ленты ровно в одной точке кода, поэтому они остаются внутри группы, а не протекают в хронику всех, кто дружит с кем-то из участников. Один фильтр в одном месте — это ещё и причина, по которой поведение стабильно: нет второго правила исключения где-то ещё, которое могло бы разойтись с первым.
Практический выигрыш в том, что группа в Korat сразу так же богата, как лента, и улучшения приходят в обе одновременно. Цена честно названа ниже: комнаты группы — не мессенджер.
Комнаты группы — не мессенджер. Личная переписка идёт между двумя людьми и не превращается в групповую. Комнаты группы несут чистый текст, который можно отправить и удалить: без редактирования, без ответа на конкретное сообщение, без реакций, без фотографий, файлов и голосовых сообщений и без звонков.
Если вам нужно, чтобы пятеро быстро перекидывались репликами с голосовыми, реакциями и звонком сверху, Korat сегодня этого не умеет. Что он умеет — прочную доску, доступную поиску, с комментариями, настоящими ролями и настоящим вступлением, плюс простые текстовые каналы рядом.
Открытая и закрытая — и что значит закрытая
При создании группы задаются название, описание, категория, приватность — открытая или закрытая — и текст правил. Поле правил не украшение: у группы без написанных правил правила всё равно появятся, придуманные на ходу тем, кто сегодня модерирует, а участники узнают о них, нарушив.
Закрытая группа работает через заявки. Человек просится, владелец или администратор принимает либо отклоняет; заявку можно отозвать, а не застревать в ожидании решения, которого не будет. Уведомляются обе стороны: управляющие — о новой заявке, заявитель — об одобрении. Заявка, пропавшая в тишине, — самый частый сбой любой системы групп, и уведомление об одобрении лечит его дешевле всего.
Состояние группы видно до нажатия, а не после. У закрытой группы на карточке замок, поэтому разница между «вступить» и «попроситься» очевидна, пока вы ещё выбираете: кнопка не должна обещать того, в чём откажет следующий экран.
Четыре списка вместо одного со значками
Экран групп разбит на озаглавленные разделы со счётчиками, а не сделан одним списком, где отношение передаёт мелкий значок: группы, которыми я управляю, группы, где я состою, отправленные заявки и найти новые, плюс поиск по всем сразу.
Начиналось это с единственного списка «мои группы» и было переделано, потому что четыре строки означают четыре разные вещи. У группы, которой вы владеете, есть настройки и очередь заявок, ждущая вас. У группы, куда вы только попросились, пока нет ничего. Разложенные по озаглавленным разделам со счётчиками, они отвечают на вопрос «есть ли что-то, чем надо заняться» с одного взгляда — чего значок на строке в третьем десятке не делает.
Роли и передача группы
Ролей три — владелец, администратор и участник, — и они показаны значками рядом с именем. Владелец и администратор могут сменить роль участника, исключить его, изменить настройки или удалить группу. Есть и передача владения, и она важнее, чем звучит: группа, чей владелец перестал заходить и не может отдать ключи, медленно умирает с заблокированным экраном настроек.
Правило Korat: действие, в котором сервер откажет, не нужно предлагать вовсе. Владелец не видит пункта «покинуть группу», потому что уход осиротил бы её; путь для владельца, который хочет уйти, — сначала передать владение. Разрушительные действия — удаление группы, исключение участника — стоят за подтверждением, где написано и то, чего *не* произойдёт, ведь колеблются люди в основном потому, что предполагают худшее.
Уведомления, соответствующие решениям
Группы шлют четыре вида уведомлений, и каждый привязан к моменту, о котором кому-то надо знать: новый пост в группе, где вы состоите, заявка на вступление для управляющих, одобрение вашей заявки и смена вашей роли.
Первого поначалу не было, и группа выглядела заброшенной просто потому, что участники не узнавали о новых постах. Позже тот же сбой повторился с заказами в магазинах. Функция, которая производит контент, о котором никому не говорят, — не тихая функция, а сломанная.
Как поделиться группой наружу
Группой делятся через ту же систему непрозрачных ссылок, что и всем остальным в Korat: адрес koratland.com/s/<token> с 14-символьным случайным токеном, который раскрывается в приложении. Функция разрешения возвращает только тип объекта и сам объект и никогда не сообщает, кто создал ссылку и сколько раз её открывали. Так что публично выложенная ссылка-приглашение не несёт никакой информации о том, кто её выложил — это функция SECURITY DEFINER, описанная на странице безопасности.
Два полезных соседа. Тренировочная группа, привязанная к одному виду спорта, — отдельный модуль с рейтингом и лентой активности: спортивные клубы. А заведение, которое обращается к своим клиентам, публикует не в группе, а со своей страницы, которой управляет консоль заведения.