Нужна помощь в ограничении постов пользователей по категории и временному промежутку

Всем привет,

Мне нужна помощь в реализации конкретной функции в Discourse. Я управляю сообществом, где необходимо внедрить правило, запрещающее пользователям создавать новые темы в двух конкретных категориях, если они уже публиковали сообщения в любой из этих категорий за последние 14 дней. Это ограничение должно действовать даже в том случае, если их предыдущая тема была удалена.

После некоторых исследований я наткнулся на плагин discourse-flexible-rate-limits, который, кажется, может стать хорошей отправной точкой. Он позволяет настраивать гибкие лимиты частоты действий в зависимости от групп пользователей и типов действий, но, похоже, фокусируется на краткосрочной частоте (минуты, часы, дни) и не поддерживает напрямую:

  1. Проверку публикаций в нескольких категориях.
  2. Установку временного интервала длительностью до 14 дней.
  3. Учёт удалённых тем при проверке.

Прежде чем приступать к модификации этого плагина или созданию чего-то с нуля, я хотел бы спросить:

  • Знает ли кто-нибудь о существующем плагине или методе, который уже реализует подобную функциональность?
  • Есть ли рекомендуемые подходы к модификации существующего плагина, такого как discourse-flexible-rate-limits, чтобы добавить проверку по нескольким категориям и более длительные ограничения?
  • Любые общие советы по эффективной реализации этого?

Я буду признателен за любые идеи или предложения от этого замечательного сообщества. Если возникнет интерес, я также с радостью поделюсь обновлениями о том, как в итоге реализую эту функцию.

Заранее огромное спасибо за помощь!

Я не уверен, что полностью понимаю, но, кажется, вам нужен плагин, который будет удалять пользователя из группы, когда он публикует сообщение в определённом наборе категорий (используя хук создания темы), а затем ежедневно запускать задачу, чтобы вернуть его в группу через определённое количество дней после его последнего участия в темах этого набора категорий.

Вероятно, это займёт 3–5 часов работы, возможно, чуть больше при наличии качественных спецификаций и тестов.

Привет, @pfaffman, с праздниками и спасибо за ответ!

Я попытался создать блок-схему, чтобы всё стало понятнее:

flowchart TB
    A0(Пользователь пытается создать новую тему в категории A или B) --> A1{Входит ли пользователь в<br>исключённую группу -- Админ, Мод, УД3, УД4, Подписчики?}
    A1 -- Нет --> B1(Проверить последнюю тему пользователя в категориях A, B или C,<br>включая скрытые или удалённые записи)
    A1 -- Да --> Z1(Разрешить публикацию)

    B1 --> B2{Был ли эта последняя тема<br>создана в течение 14 дней?}
    B2 -- Да --> C1(Заблокировать пост + показать ошибку,<br>отобразить время ожидания,<br>ссылку на правила)
    C1 --> E1(Сохранить черновик +<br>отключить кнопку отправки) ---> End(Конец)
    B2 -- Нет --> D1(Разрешить пост)

    D1 --> End(Конец)
    Z1 --> End(Конец)
Я также попытался составить простую спецификацию для уточнения
```mermaid
flowchart TB
    A0(Пользователь пытается создать новую тему в категории A или B) --> A1{Входит ли пользователь в<br>исключённую группу -- Админ, Мод, УД3, УД4, Подписчики?}
    A1 -- Нет --> B1(Проверить последнюю тему пользователя в категориях A, B или C,<br>включая скрытые или удалённые записи)
    A1 -- Да --> Z1(Разрешить публикацию)

    B1 --> B2{Был ли эта последняя тема<br>создана в течение 14 дней?}
    B2 -- Да --> C1(Заблокировать пост + показать ошибку,<br>отобразить время ожидания,<br>ссылку на правила)
    C1 --> E1(Сохранить черновик +<br>отключить кнопку отправки) ---> End(Конец)
    B2 -- Нет --> D1(Разрешить пост)

    D1 --> End(Конец)
    Z1 --> End(Конец)

Объяснение блок-схемы

  1. A0: Пользователь инициирует создание новой темы в категории A или B.

  2. A1: Система проверяет, входит ли пользователь в любую исключённую группу:
    • Администраторы
    • Модераторы
    • Уровень доверия 3 (УД3)
    • Уровень доверия 4 (УД4)
    • Пользовательская группа «Подписчики»
    • Если Да, проверка периода ожидания пропускается, и публикация сразу разрешается (Z1).
    • Если Нет, переход к B1.

  3. B1: Система получает последнюю созданную тему пользователя в категориях A, B или C. Этот поиск должен включать:
    • Мягко удалённые темы (не окончательно удалённые из базы данных).
    • Темы, перемещённые в скрытые или комплаенс-категории (например, категория C).

  4. B2: Система проверяет, была ли дата создания этой последней темы в течение последних 14 дней.
    Да → Переход к C1 (пост блокируется).
    Нет → Переход к D1 (пост разрешается).

  5. C1: Система показывает сообщение об ошибке, информирующее пользователя о том, что он всё ещё находится в периоде ожидания. Сообщение должно включать:
    • Упрощённое заявление о том, что публикация пока невозможна.
    • Оставшееся время в днях и часах (без минут).
    • Ссылку на страницу правил сообщества (приведена ниже).

  6. E1: После показа ошибки содержимое пользователя автоматически сохраняется как черновик, а кнопка «Отправить» или «Создать тему» отключается.

  7. D1: Если с момента создания последней темы пользователя прошло более 14 дней, система разрешает публикацию новой темы.

  8. Z1: Пользователь входит в исключённую группу, поэтому может публиковать без ограничений.

2. Детальная спецификация

2.1 Ограниченные и исключённые группы

Ограниченные группы:
• Все пользователи, не входящие в следующие исключённые группы (обычно УД0, УД1, УД2).
Исключённые группы:

  1. Администраторы
  2. Модераторы
  3. Уровень доверия 3 (УД3)
  4. Уровень доверия 4 (УД4)
  5. Подписчики (пользовательская группа)

Эти исключённые группы полностью пропускают проверку 14-дневного периода.

2.2 Затрагиваемые категории

Попытка создания новой темы:

• Запускается, когда пользователь (из ограниченной группы) пытается создать новую тему в категории A или B.

Проверка последней темы:

• Система проверяет последнюю созданную тему пользователя в категориях A, B или C (где C — «скрытая» или «комплаенс-категория»).

Примечание: Категория C включена для учёта ситуаций, когда тема пользователя была перемещена для удаления/скрытия/комплаенса. Если пользователь создал тему в категории C в течение последних 14 дней, это также учитывается в периоде ожидания.

2.3 Логика 14-дневного периода ожидания

• Если последняя тема пользователя (в A/B/C) была создана в течение 14 дней, создание новой темы в A или B блокируется.

• Если прошло более 14 дней, создание разрешается.

Расчёт времени

• Оставшееся время отображается в днях и часах (например, «Осталось 3 дня 12 часов»).
• Нет необходимости показывать минуты или секунды.

2.4 Блокировка и сохранение черновиков

Поведение при блокировке:
• При блокировке пользователя показывается сообщение об ошибке (C1).
• Система автоматически сохраняет содержимое пользователя как черновик.
• Кнопка «Отправить» отключается, чтобы пользователь не мог продолжить.
Пример сообщения об ошибке (упрощённый):

Извините, вы пока не можете создать новую тему в этой категории.
Ваша последняя тема была опубликована менее 14 дней назад,
и до следующей публикации осталось {X дней и Y часов}.
Для получения дополнительной информации ознакомьтесь с правилами сообщества:
https://community.lezismore.org/t/topic/26/2

2.5 Гибкость в будущем

  1. Дополнительные категории:

• В настоящее время настроены только категории A, B и C.

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

  1. Различные периоды времени:

• Период в 14 дней может быть настраиваемым в параметрах плагина (на случай, если вы захотите установить 7 дней, 30 дней и т. д.).

  1. Динамическое назначение групп:

• Должна поддерживаться возможность добавления или исключения групп (например, если вы добавите «Подписчиков» или уберёте их).

3. Резюме

  1. Ограниченные группы (УД0, УД1, УД2 или любой пользователь, не входящий в исключённую группу) подлежат 14-дневному периоду ожидания перед созданием новой темы в категориях A или B.

  2. Исключённые группы (Админ, Модератор, УД3, УД4, «Подписчики») могут публиковать без ограничений.

  3. Система проверяет создание самой последней темы в категориях A, B или C (включая мягко удалённые или скрытые). Если она была создана в течение 14 дней, новая тема блокируется.

  4. Сообщение об ошибке: Отображает оставшееся время в днях/часах и содержит ссылку на правила сообщества по адресу:

https://community.lezismore.org/t/topic/26/2

  1. Черновик: При блокировке пост пользователя сохраняется как черновик, а кнопка отправки отключается.

  2. Данная спецификация может быть расширена для включения дополнительных категорий или других временных рамок в будущем.

Буду признателен за любые предложения!

Это именно то, о чём я думал. Моё решение — удалять их из группы, разрешающей публикацию в этих категориях, сразу после их попытки. Это сразу становится ясно: они не могут публиковать, и не требуется менять код, отвечающий за работу публикаций.

Ах, теперь я понимаю ваше решение. :folded_hands: Хотя такой подход может показаться простым, меня беспокоят следующие моменты:

  1. Доступ на чтение и на публикацию

• В настоящее время пользователи уровня TL1 (и выше) могут как читать, так и публиковать в категориях A и B.

• Если мы будем удалять пользователя из TL1 при нарушении правила 14 дней, он потеряет и доступ на чтение. Но мы хотим блокировать только публикацию, а не чтение.

  1. Необходимость разделения групп

• Чтобы решить задачу «читать, но не публиковать», нам пришлось бы создать несколько подгрупп:

TL1 ограниченный – может читать и отвечать, но не может создавать темы в A или B.

TL1 полный – может читать, отвечать и создавать темы.

• Если пользователь нарушит правило 14 дней, мы переместили бы его из TL1 полного в TL1 ограниченный. Это кажется более сложным.

  1. Сложность автоматизации

• Даже с отдельными группами нам пришлось бы автоматически перемещать пользователя обратно в группу «полный», как только истечёт период ожидания.

• Это означает, что нам нужно реализовать логику (например, запланированную задачу или пользовательский код), которая вычисляет, когда истекает 14-дневный период, а затем снова назначает пользователя из TL1 ограниченного в TL1 полный.

• Как непрограммист, я не чувствую уверенности в том, что смогу самостоятельно справиться с такой сложной автоматизацией.

Иными словами, хотя удаление пользователей из определённых групп может избежать прямого изменения логики публикации, это создаёт дополнительные группы и сложные правила. Мы хотим ограничить только публикацию на 14 дней, а не доступ к чтению или другие привилегии.

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