Ограничить публикацию в категории, пока они не «лайкнут» тему

Добрый день. У меня на сайте есть категория «Покупка/Продажа/Обмен», и я хотел бы ограничить возможность публикации в ней до тех пор, пока участник не поставит «лайк» теме с правилами. Я обратился к AI-боту, и он дал мне некоторые инструкции. Однако, похоже, что для этого требуется функционал автоматизации Discourse, который доступен только на хостинговых тарифах.

Есть ли способ реализовать это на моей самостоятельно размещённой платформе?

Привет, на самом деле это бесплатно включено в Community Edition. Вы можете включить его на вкладке «Плагины».

Неважно. Я понял, что могу вручную добавить плагин Discord Automation…

Хм, возможно, с помощью Discourse Policy и разрешений для групп?

  • add-users-to-group: принимает в качестве входных данных одну группу; пользователи, принявшие политику, будут автоматически добавлены в эту группу (если политика будет отозвана вручную или если версия политики будет обновлена, пользователь(и) будет удалён(ы) из группы)

Я разобрался (с помощью ask.discourse.org).

Мне нужно было включить SQL для бейджей, а затем создать бейдж, который присваивается, когда кто-то ставит лайк конкретному сообщению. После этого я создал группу, которую Discord Automation автоматически назначает пользователям, имеющим этот бейдж. Я установил для группы «everyone» только права на чтение в категории, чтобы они могли только реагировать. А для пользовательской группы я предоставил полный доступ.

Отлично — спасибо, что поделился подробностями!
Теперь ты можешь отметить свой пост как решение. :grin:

Я напишу небольшой отчёт о том, что именно я сделал, как только вернусь домой, на случай, если кому-то ещё будет интересно. После этого я отмечу это как решение.

На случай, если кому-то ещё будет интересно это сделать, вот краткое описание того, что я сделал:

  1. Сначала вам нужно включить Badge SQL через CLI вашего сервера Discourse:
./launcher enter app
rails c
SiteSetting.enable_badge_sql = true
  1. Далее найдите ID темы, с которой участники должны взаимодействовать, чтобы получить значок. В моём случае ID темы — 117.

Screenshot 2026-02-27 113204

  1. Создайте свой пользовательский значок:
    1. Администрирование → Значки → Новый
    2. Дайте значку любое название (например, «Читатель правил B/S/T»)
    3. Выберите тип значка, иконку и добавьте описание
    4. Если вы выполнили шаг 1, вы увидите поле запроса, где можно ввести SQL-запрос. Вставьте этот запрос (замените p.topic_id = 117 на ваш ID темы):
      1. SELECT DISTINCT ON (pa.user_id)
          pa.user_id,
          pa.post_id,
          pa.created_at granted_at
        FROM post_actions pa
        JOIN posts p ON pa.post_id = p.id AND p.post_number = 1
        WHERE pa.post_action_type_id = 2
          AND p.topic_id = 117
          AND (:backfill OR pa.post_id IN (:post_ids))
        
    5. Убедитесь, что отмечены опции Запускать запрос на отзыв ежедневно и Запрос нацелен на сообщения.
    6. Триггер должен быть установлен на Когда пользователь действует над сообщением.
  2. Теперь создайте автоматизацию:
    1. Сначала создайте новую группу, в которую будут добавляться участники. Я назвал её bst_rules_agreed, и настройки сделаны так, что членство могут видеть только владельцы группы и модераторы. Никаких эффектов уровня доверия не требуется.
    2. Далее перейдите в Плагины → Автоматизация
      1. Добавьте новую автоматизацию
        1. Выберите Членство в группе пользователей через значок
        2. Триггер: Повторяющийся
          1. Периодичность: у меня установлено каждый час. Выберите подходящий для вас вариант.
          2. Выберите дату начала
        3. Параметры скрипта:
          1. Значок: выберите созданный вами значок
          2. Группа: выберите созданную вами группу

Вот и всё. Теперь у вас должна быть система, которая гарантирует, что участники согласились с правилами категории, прежде чем смогут публиковать сообщения в ней.

Следующий шаг, который я планирую исследовать, — это возможность скрыть все темы, кроме правил, от всех, кто не входит в эту группу. Но пока этой базовой системы достаточно.

В теме плагина для приватных тем было предложено альтернативное решение. Я переношу его сюда.

Спасибо за этот плагин! Я искал способ внедрить простую систему тикетов в нашем сообществе.

Также я думаю использовать его в категории «Покупка/Продажа/Обмен». Сейчас у меня настроено так, что все могут читать темы, но отвечать и создавать их могут только участники определённой группы. Текущий рабочий процесс: участник подтверждает, что прочитал правила, поставив лайк под постом. Как только он лайкает пост, ему выдаётся специальная значок. Плагин Discourse Automate добавляет его в группу на основе этого значка.

Это предотвращает публикацию в категории теми, кто ещё не принял правила. Однако они всё ещё могут видеть и читать все сообщения.

Так что, сработает ли, если я удалю всех из категории и оставлю только эту специальную группу во вкладке «Безопасность»? Если я настрою так, чтобы посты от группы Администраторы всегда были видны, смогут ли люди, не входящие в эту специальную группу, видеть и лайкать правила? Затем, после того как они поставят лайк и будут добавлены в группу, всё для них откроется?

Это не то, для чего предназначен этот плагин.

Ваш случай использования можно реализовать без этого плагина, используя плагин Discourse Policy, который позволяет добавлять пользователей, принявших политику, в группу.

Я изучил плагин Policy, прежде чем углубиться в способ, которым я в итоге назначил членство в группе. Причина, по которой мне не нравится Policy для этой задачи, заключается в том, что его необходимо применять к группе. Мне пришлось бы применить его к чему-то вроде trust_level_1, чтобы убедиться, что каждый, кто хочет участвовать в B/S/T, увидит это. Но не все хотят участвовать в B/S/T. Я не хочу надоедать им ещё одним элементом, на который нужно нажать (даже если это быстро), если они не заинтересованы в этом.

  • создать группу «Заявители BST» и группу «Участники BST»
  • сделать группу «Заявители BST» группой, к которой можно присоединиться свободно
  • создать политику, применяемую к «Заявителям BST» и добавляющую их в «Участников BST»
  • предоставить «Участникам BST» доступ к категории

Люди будут присоединяться к «Заявителям BST», принимать политику и становиться участниками «Участников BST». Сложно, но менее запутанно, чем запускать целую машину Руба Голдберга, просто лайкая пост.

Это тоже может сработать. Я изучу этот вопрос. Спасибо!! Я совсем новичок в Discourse, поэтому пока осваиваю все тонкости.