# 每日 Discourse 挑战

**URL:** https://meta.discourse.org/t/discourse-daily-challenges/398980
**Category:** Plugin
**Created:** [2026年三月21日 19:48 UTC](https://meta.discourse.org/t/discourse-daily-challenges/398980 "2026-03-21T19:48:47Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![R23D\_Printing](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/r23d_printing/32/544902_2.png) [@R23D\_Printing](https://meta.discourse.org/u/R23D_Printing)
#### Post date: [2026年三月21日 19:48 UTC](https://meta.discourse.org/t/discourse-daily-challenges/398980/1 "2026-03-21T19:48:47Z")

</div>

| | | |
| --- | --- | --- |
| ℹ | **摘要** | 运行带排行榜、自动帖子和徽章奖励的限时挑战。 |
| 🛠 | **仓库链接** | [GitHub - R23DPrinting/discourse-daily-challenge · GitHub](https://github.com/R23DPrinting/discourse-daily-challenge) |
| 📖 | **安装指南** | [如何在 Discourse 中安装插件](https://meta.discourse.org/t/install-plugins-in-discourse/19157) |

  

**当前版本：** 1.3.0（更新于 2026 年 3 月 27 日）  
**许可证：** MIT

* * *

## 故事背景

我运营着一个健康和健身社区，最近从 Discord 迁移到了 Discourse。在 Discord 上，我构建了一个自定义机器人来运行月度健身挑战——成员会发布每日锻炼内容，机器人跟踪签到情况，发布每周排行榜，并在每月结束时宣布获胜者。这是我们要最受欢迎的功能之一。

迁移到 Discourse 后，成员们开始要求恢复挑战功能。我寻找现有的插件但一无所获，于是我自己开发了一个。

最初只是一个快速解决方案，结果却变成了一个功能齐全的挑战系统，实际上比原来的 Discord 机器人更好用。既然它可能对其他社区也有用，我在这里分享出来。

* * *

## 功能概述

**discourse-daily-challenge** 允许您直接在 Discourse 中运行结构化的限时挑战。成员通过在指定主题中使用标签或照片进行签到。该插件会自动跟踪所有数据。

### 核心功能

**✅ 灵活的签到方式**  
成员通过在挑战主题中发布带有配置好的标签或照片附件的帖子来进行签到。挑战可配置为每日或每周签到模式。签到窗口会根据挑战配置的时区进行评估，因此全球社区也能正常工作。

**📊 实时排行榜与连续签到**  
管理员仪表板显示实时排名，包括每位参与者的总签到数、当前连续签到次数和完成百分比。连续签到标签会自动反映挑战间隔（“连续签到天数”或“连续签到周数”）。

**🤖 自动排行榜帖子**  
设置每周自动发布排行榜的日期和时间，直接发布到挑战主题中。挑战结束后的第二天，也会自动生成最终结果帖子。

**🏅 自定义徽章**  
定义完成挑战所需的最低签到次数。符合条件的参与者在挑战结束时会自动获得自定义 Discourse 徽章。徽章名称会自动从主题标题中填充。

**🗂 同时运行多个挑战**  
您可以同时运行任意数量的挑战。每个挑战都有独立的主题、时间表、时区、徽章和排行榜。

**📁 已归档的挑战**  
已完成的挑战会保留在仪表板的归档手风琴视图中，方便您回顾历史结果。

**🛠 管理员签到管理**  
管理员可以手动添加或移除签到记录——适用于补录遗漏的帖子或解决争议。

**📌 手动触发排行榜**  
“立即发布排行榜”按钮允许管理员在预定时间之外按需发布排行榜更新。

**👮 版主权限**  
全站版主可以通过专用的侧边栏部分创建、编辑和管理挑战。可通过站点设置启用或禁用此功能。

**🗂 分类版主权限**  
分类版主可以通过专用 `/challenges` 路由管理其指定分类范围内的挑战——无需管理员权限。可通过站点设置独立启用或禁用此功能。

* * *

## 安装

在 `containers/app.yml` 的 `hooks > after_code > exec > cmd` 下添加以下内容：

```yaml
- git clone https://github.com/R23DPrinting/discourse-daily-challenge.git

```

然后重新构建：

```bash
cd /var/discourse && ./launcher rebuild app

```

初始安装后，除非在变更日志中另有说明，未来的更新可以通过面板内的“更新”按钮应用。

* * *

## 配置

### 创建挑战

导航至 **管理员 → 插件 → 挑战 → Discourse 挑战** 并点击 **新建挑战** 。

| 字段 | 说明 |
| --- | --- |
| **主题 ID** | 成员将进行签到的 Discourse 主题。主题标题将自动填充到徽章名称字段。 |
| **标签触发器** | 签到所需的标签（不含 `#`，例如 `workout`） |
| **签到间隔** | 每日或每周签到模式 |
| **周起始日** | 针对每周挑战：一周从哪一天开始（星期日、星期一或星期六） |
| **开始日期** | 挑战的第一天（含） |
| **结束日期** | 挑战的最后一天（含） |
| **挑战时区** | 用于评估签到窗口的时区（可选，默认为 UTC） |
| **所需签到次数** | 获得完成徽章所需的最低签到次数 |
| **描述** | 挑战的可选描述 |
| **启用每周排行榜帖子** | 切换是否自动发布每周排行榜 |
| **发布星期几** | 自动发布排行榜的星期几 |
| **发布小时** | 自动发布排行榜的小时（0–23，使用挑战时区） |
| **颁发完成徽章** | 切换是否在挑战结束时自动颁发徽章 |
| **徽章名称** | 要创建和颁发的徽章名称——自动从主题标题填充 |

### 站点设置

| 设置 | 默认值 | 说明 |
| --- | --- | --- |
| `daily_challenge_enabled` | `true` | 全局启用或禁用插件 |
| `daily_challenge_mod_access_enabled` | `true` | 允许全站版主管理挑战 |
| `daily_challenge_category_mod_access_enabled` | `true` | 允许分类版主管理其指定分类中的挑战 |

* * *

## 签到机制

1. 成员回复挑战主题
2. 帖子必须包含配置的标签或照片附件
3. 插件检查该成员在当前周期（根据挑战间隔为每日或每周）是否已经签到
4. 如果未签到，则记录签到并更新排行榜
5. 每个成员每个周期只允许签到一次

管理员可以从管理员仪表板查看和管理所有签到记录。

* * *

## 版主与分类版主权限

如果启用了 `daily_challenge_mod_access_enabled`，全站版主可以通过主侧边栏中的 **CHALLENGES** 部分访问挑战管理功能。

分类版主可以通过 `/challenges/dashboard` 和 `/challenges/challenges` 访问受限版本——他们只能查看和管理与其指定分类中主题相关的挑战。这需要启用 `daily_challenge_category_mod_access_enabled`，并且用户必须通过 **管理员 → 分类 → [分类] → moderation** 被指定为分类版主。

* * *

## 自动帖子

### 每周排行榜

插件运行每小时后台任务，检查是否到了发布每周排行榜的时间。当到达配置的日期和时间（使用挑战时区）时，它会在挑战主题中创建格式化的帖子，显示当前排名。

### 最终结果帖子

挑战结束后的第二天，会自动发布最终结果帖子。该帖子列出所有参与者、他们的总签到数、完成状态，并祝贺获得徽章的人。

* * *

## 数据库表

- `daily_challenges` — 挑战定义
- `daily_check_ins` — 每个用户每个挑战每个周期的单独签到记录

* * *

## 兼容性

- Discourse 3.x+
- 已在自托管安装中测试
- Ruby 3.x, Rails 7.x+

* * *

## 路线图 (v1.4.0)

- @ChallengeBot **提及命令** — 成员可以在挑战主题中提及机器人账号 @ChallengeBot，通过私信获取个人统计信息（`status`、`leaderboard`、`streak`、`help`）
- **签到确认私信** — 每次成功签到后自动发送包含当前连续签到信息的私信
- **提醒私信** — 可选的每挑战设置；每日挑战在错过 2 天以上后发送提醒，每周挑战在当周最后一天如果尚未签到则发送提醒

* * *

## 变更日志

### v1.3.0

- **分类版主权限** — 分类版主可以通过 `/challenges/dashboard` 和 `/challenges/challenges` 创建、编辑、删除和管理其指定分类中的挑战签到——无需管理员权限
- **徽章名称自动填充** — 输入主题 ID 时，徽章名称字段会自动从主题标题填充
- **徽章名称验证** — 启用“颁发完成徽章”时，徽章名称为必填项；返回正确的错误而不是 500 错误
- **独立的版主/分类版主开关** — `daily_challenge_mod_access_enabled` 和 `daily_challenge_category_mod_access_enabled` 可以独立切换

### v1.2.0

- **可配置的签到间隔** — 运行每日或每周挑战
- **周起始日设置** — 对于每周挑战，可选择一周从星期日、星期一还是星期六开始
- **感知间隔的连续签到** — 连续签到标签和计算现在反映挑战间隔
- **版主权限** — 全站版主可以通过专用侧边栏部分管理挑战
- **在管理员 UI 中重命名为“Discourse 挑战”**

### v1.1.1

- 显示所有活跃挑战的多挑战仪表板
- 显示历史结果的已归档挑战手风琴视图

### v1.1.0

- 每个挑战的时区支持
- 每周发布时间表现在按挑战配置（日期、小时、启用/禁用开关）

### v1.0.0

- 初始发布

* * *

## 反馈与贡献

本插件是为解决我们社区的实际需求而开发的，如果它也能帮助您的社区，我很乐意分享。欢迎在 GitHub 上提交问题、PR 和功能请求。

如果您运营着一个重视责任感和一致性的社区——如健身、语言学习、写作、创意习惯等——每日挑战可以成为一种真正强大的参与工具。我希望这个插件能让您的 Discourse 社区更容易实现这一功能。

🔗 [GitHub - R23DPrinting/discourse-daily-challenge · GitHub](https://github.com/R23DPrinting/discourse-daily-challenge)

---

_[View the full topic](https://meta.discourse.org/t/discourse-daily-challenges/398980)._
