需要帮助限制用户按类别和时间段发布的帖子

大家好,

我正在寻找关于在 Discourse 中实现特定功能的指导。我正在管理一个社区,需要在用户在过去 14 天内在两个特定类别中发帖后,阻止他们在这两个类别中创建新主题。即使他们之前的主题被删除,也应强制执行此限制。

经过一些研究,我发现了 discourse-flexible-rate-limits 插件,它看起来可能是一个不错的起点。它允许基于用户组和操作进行灵活的速率限制,但它似乎侧重于短期频率(分钟、小时、天),并且不支持:

  1. 检查多个类别中的帖子。
  2. 强制执行长达 14 天的时间范围。
  3. 在检查中包含已删除的主题。

在深入定制此插件或从头开始创建某些内容之前,我想问一下:

  • 有没有人知道可能已经处理过此类功能的现有插件或方法?
  • 有没有推荐的方法来修改现有的插件,如 discourse-flexible-rate-limits,以包含跨类别和长期限制?
  • 有没有关于如何有效实施此功能的通用建议?

我将非常感谢这个社区的任何见解或建议。如果大家感兴趣,我也很乐意分享我最终如何实现此功能的更新。

提前非常感谢您的帮助!

我不确定我是否完全理解,但我想您需要一个插件,该插件将在用户在特定类别中发帖时将其从组中移除(使用主题创建钩子),然后每天运行一个作业,在用户自上次在这些类别中发帖以来经过一定天数后将其重新添加到组中。

这可能需要 3-5 小时的工作量,如果规格/测试完善,可能会稍长一些。

2 个赞

您好,@pfaffman,节日快乐,感谢您的回复!

我尝试创建一个流程图来使其更清晰:

flowchart TB
    A0(用户尝试在 A 或 B 类中创建新主题) -- --> A1{用户是否属于<br>豁免组--管理员、版主、TL3、TL4、订阅者?}
    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>豁免组--管理员、版主、TL3、TL4、订阅者?}
    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: 用户尝试在AB类别中创建新主题。

  2. A1: 系统检查用户是否属于任何豁免组

    • 管理员
    • 版主
    • 信任等级 3 (TL3)
    • 信任等级 4 (TL4)
    • 自定义“订阅者”组
    • 如果,则跳过冷却检查并立即允许发帖 (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 受限组 vs. 豁免组

  • 受限组
    • 不属于以下豁免组的任何用户(通常是 TL0、TL1、TL2)。
  • 豁免组
    1. 管理员
    2. 版主
    3. 信任等级 3 (TL3)
    4. 信任等级 4 (TL4)
    5. 订阅者(自定义组)

这些豁免组将完全跳过 14 天检查。

2.2 涉及的类别

  • 新主题尝试

    • 当用户(在受限组中)尝试在A 或 B 类别中创建新主题时触发。
  • 最后一个主题检查

    • 系统会检查用户在A、B 或 C 类别中创建的最后一个主题(其中 C 是“隐藏”或“合规”类别)。

注意:包含 C 类别是为了捕获用户主题被移动以进行删除/隐藏/合规的情况。如果用户在过去 14 天内创建了 C 类别的帖子,这也将计入冷却时间。

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。
    • 如果将来需要在此冷却中添加或删除类别,请确保系统或插件可以在不进行重大代码更改的情况下进行扩展。
  2. 不同的时间段

    • 14 天的期限可以在插件设置中配置(如果您想要 7 天、30 天等)。
  3. 动态组分配

    • 应支持添加或删除豁免组(例如,如果您添加“订阅者”或将其删除)。

3. 摘要

  1. 受限组(TL0、TL1、TL2,或任何不属于豁免组的用户)在创建 A 或 B 类别的另一个主题之前,需要经过14 天的冷却期

  2. 豁免组(管理员、版主、TL3、TL4、“订阅者”)可以不受限制地发帖。

  3. 系统会检查最近A、B 或 C 类别中创建的主题(包括软删除或隐藏的主题)。如果是在14 天内创建的,则新主题将被阻止。

  4. 错误消息:显示剩余的天/小时时间,并链接到社区规则:

  5. 草稿:被阻止时,用户的帖子将保存为草稿,提交按钮将被禁用。

  6. 此规范将来可以扩展到其他类别或不同的时间范围。

感谢任何建议!

1 个赞

这基本上就是我所想的。我的解决方案是,当他们发帖时,将他们从允许在那些类别中发帖的群组中移除。这样可以立即清楚地表明他们不能发帖,并且不需要任何特殊的代码更改发帖方式。

3 个赞

我现在明白了你的解决方案。:folded_hands: 虽然这个方法看起来很简单,但我担心以下几点:

  1. 读取权限 vs. 发帖权限

    • 目前,TL1(或以上)的用户可以在 A 和 B 类别中进行读取发帖
    • 如果我们因为用户违反 14 天规则而将其从 TL1 移除,他们将同时失去读取权限。但我们只想阻止他们发帖,而不是读取
  2. 需要拆分用户组

    • 为了解决“可以读取但不能发帖”的场景,我们需要创建多个子用户组:
    • TL1 limited – 可以读取和回复,但不能在 A 或 B 中创建主题
    • TL1 full – 可以读取、回复和创建主题。
    • 如果用户违反 14 天规则,我们将把他们从TL1 full移动到TL1 limited。这似乎更复杂。
  3. 自动化复杂性

    • 即使有单独的用户组,我们也必须在他们的冷却期结束后自动将用户移回“full”用户组。
    • 这意味着我们必须实现逻辑(例如,计划任务或自定义代码),计算 14 天的期限何时结束,然后将用户从 TL1 limited 重新分配回 TL1 full。
    • 作为一个非程序员,我没有信心独自处理这种复杂的自动化。

换句话说,虽然从某些用户组中移除用户可以避免直接修改发帖逻辑,但这会创建额外的用户组和复杂的规则。我们只想限制发帖 14 天,而不是读取权限或其他特权。

非常感谢任何建议或想法。我尝试通过 Discourse API 和 n8n 中的 webhook 来集成,但鉴于我有限的编程背景,这对我来说相当具有挑战性。