已解决的提醒插件

:discourse2: 摘要 已解决提醒插件(Solved Reminders Plugin)通过为已解决的主题提供额外的提醒功能,扩展了 已解决插件 的功能。
:hammer_and_wrench: 仓库链接 https://github.com/discourse/discourse-solved-reminders-plugin
:open_book: 安装指南 如何在 Discourse 中安装插件

:warning: 请注意,本插件正处于积极开发中,尚未完全完成。

已解决提醒插件通过为需要关闭的主题添加提醒和通知功能,扩展了 Discourse 已解决插件 的功能。该插件不仅通过鼓励用户将主题标记为已解决来帮助用户高效管理主题,还通过祝贺消息让用户参与其中。

功能特性

  • 自动提醒:向用户发送通知,提示他们重新访问并将主题标记为已解决。
  • 互动消息:祝贺成功解决主题的用户,并建议他们可能帮助解决的其他主题。
  • 无缝集成:与 Discourse 已解决插件 协同工作,确保流畅的用户体验。

安装

要安装已解决提醒插件,请按照 Discourse Meta 指南 中描述的一般插件安装流程操作:

  1. 编辑容器配置:在 app.yml 文件的 hooks 部分添加插件的仓库链接。
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/discourse-solved-reminders-plugin.git
  1. 重建 Discourse 容器:通过重建应用程序来应用插件。
./launcher rebuild app

配置

安装后,您可以通过 Discourse 管理面板微调插件设置。考虑调整以下内容:

使用方法

配置完成后,插件将根据管理员设置的配置自动运行。它积极参与确保主题得到解决,通过向相关用户发送提醒和消息。

发送给用户的私信,提醒他们将帖子标记为解决方案

发送给已将帖子标记为解决方案的用户的私信

用户可以在其偏好设置中禁用推荐类似主题作为解决方案的私信:

管理员可以根据社区需求调整配置。

自定义消息文本

发送给用户的提醒消息可以在您网站的「外观 → 站点文本」页面下的 mark_as_solution.message 中找到。

报告与数据分析

本插件不会向 Discourse 添加任何特定的数据库表,但您可以结合使用数据探索插件(Data Explorer)来跟踪和分析提醒消息的有效性。

以下是您可以使用本插件的两个数据探索 SQL 查询示例。

已解决提醒消息计数

此查询提供关于已解决提醒消息的月度聚合统计信息。它:

  • 识别包含文本「您的主题已有回复」的私信
  • 按月份分组数据并计算:
    • 发送的提醒消息数量
    • 收到这些提醒的用户总数
    • 阅读这些提醒的用户数量
    • 阅读率百分比(阅读者/接收者)
  • 结果显示提醒消息活动的月度趋势和有效性
SQL 详情
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-12-31
-- text :reminder_text = %您的主题已有回复%

WITH reminder_pms AS (
  SELECT 
    t.id AS topic_id,
    t.created_at,
    p.id AS post_id,
    p.user_id AS sender_id,
    DATE_TRUNC('month', t.created_at) AS month
  FROM topics t
  JOIN posts p ON p.topic_id = t.id AND p.post_number = 1
  WHERE 
    t.archetype = 'private_message'
    AND t.created_at BETWEEN :start_date AND :end_date
    AND p.raw LIKE :reminder_text
),

recipient_stats AS (
  SELECT
    r.topic_id,
    r.month,
    COUNT(DISTINCT tu.user_id) AS total_recipients,
    COUNT(DISTINCT CASE WHEN tu.last_read_post_number > 0 THEN tu.user_id END) AS read_recipients
  FROM reminder_pms r
  JOIN topic_users tu ON tu.topic_id = r.topic_id AND tu.user_id != r.sender_id
  GROUP BY r.topic_id, r.month
)

SELECT 
  TO_CHAR(month, 'YYYY-MM') AS month,
  COUNT(DISTINCT topic_id) AS reminder_pms_sent,
  SUM(total_recipients) AS total_users_received,
  SUM(read_recipients) AS users_who_read,
  ROUND(100.0 * SUM(read_recipients) / NULLIF(SUM(total_recipients), 0), 2) AS read_rate_percentage
FROM recipient_stats
GROUP BY month
ORDER BY month

已解决提醒个人消息

此查询提供每个收到提醒消息的用户的详细个人级别数据。它:

  • 识别包含文本「您的主题已有回复」的私信
  • 列出每位个人接收者,包括:
    • 用户信息(ID、用户名、姓名、邮箱)
    • 消息详情(标题、链接)
    • 是否已阅读消息(是/否)
    • 阅读时间(如果适用)
    • 查看消息的秒数
  • 结果按发送日期和用户名排序,清晰显示谁收到了并阅读了每条消息
SQL 详情
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-12-31
-- text :reminder_text = %您的主题已有回复%

WITH reminder_pms AS (
  SELECT 
    t.id AS topic_id,
    t.title AS message_title,
    t.slug AS message_slug,
    t.created_at AS sent_at,
    p.id AS post_id,
    p.user_id AS sender_id,
    p.raw AS message_content
  FROM topics t
  JOIN posts p ON p.topic_id = t.id AND p.post_number = 1
  WHERE 
    t.archetype = 'private_message'
    AND t.created_at BETWEEN :start_date AND :end_date
    AND p.raw LIKE :reminder_text
)

SELECT 
  u.id AS user_id,  -- 渲染为用户链接
  u.username,
  u.name,
  ue.email,
  r.topic_id,       -- 渲染为主题链接
  r.message_title,
  -- 消息链接(手动构建以供参考)
  '/t/' || r.message_slug || '/' || r.topic_id AS message_link,
  r.sent_at,
  -- 检查用户是否已阅读消息
  CASE 
    WHEN tu.last_read_post_number > 0 THEN TRUE
    ELSE FALSE
  END AS message_read,
  -- 阅读时间(如果已阅读)
  CASE 
    WHEN tu.last_read_post_number > 0 THEN tu.last_visited_at
    ELSE NULL
  END AS read_at,
  -- 查看时间(秒)
  ROUND(tu.total_msecs_viewed / 1000.0, 1) AS time_viewed_seconds
FROM reminder_pms r
JOIN topic_users tu ON tu.topic_id = r.topic_id
JOIN users u ON u.id = tu.user_id
LEFT JOIN user_emails ue ON ue.user_id = u.id AND ue.primary = TRUE
WHERE 
  -- 从接收者列表中排除发送者(系统/机器人)
  tu.user_id != r.sender_id
ORDER BY 
  r.sent_at DESC,
  u.username
17 个赞

总理能否在其标题中说明主题标题?如果用户一次获得多个解决方案,如果用户不知道总理指的是哪个解决方案,可能会感到困惑。

是否可以设置一个控件,在发送提醒之前发送多少帖子?

4 个赞

为了再次确认两件事:

  1. 它是否只向至少收到一条回复的主题的作者发送消息?
  2. 它是否与每个类别的解决方案插件设置协同工作,这意味着如果您想在某些类别中禁用它,则必须禁用全站解决方案插件开关,而改为在您想使用它的类别中启用它?
3 个赞

建议的主题是随机的未解决主题,还是与原始已解决主题相关的对话?如果它们相关,它们是如何识别的?

1 个赞

2 篇帖子已拆分为新主题:如何将源代码转换为插件

这可能会非常有帮助,尤其是在我们的论坛上,人们往往会忘记在收到回复后将其标记为解决方案,然后我们的团队就必须手动进去提醒他们 :weary:

我还有一些其他问题:

  • 我们可以配置发送提醒私信的人,还是总是默认为 Discobot?
  • 如果我们愿意,我们也可以调整私信的文本吗?

谢谢

1 个赞

感谢这个插件,非常有帮助!

据我所知,这个插件的通知程序每 14 天运行一次。这意味着在 14 天内,无论我(未标记为解决方案的)主题有多少,都会产生私信 + 电子邮件。

我刚在安装插件 5 天后手动运行了一次,收到了 7 条私信(和电子邮件):

这似乎有点过度。我知道我作为管理员,目前积极创建了大量主题,这有点不寻常,但我们有不少用户创建了大量主题(太棒了)。

是否可以构建一个选项,将此通知合并为一条?例如,“将 7 个帖子标记为解决方案”合并为一条消息,而不是每个主题一条消息?

5 个赞