如何将 Discourse Gamification 与外部系统集成(兑换和奖励积分)

自一年前我们推出 Discourse Gamification 以来,路线图中被要求最多的功能之一就是能够将 Discourse Gamification 与外部游戏化系统集成。例子有很多:

  • 与公司现有的游戏化计划集成

  • 能够奖励用户在 Discourse 之外发生的事件,例如 IRL(现实生活)活动,或在线其他地方的事件,例如成为社区客户或购买产品。

  • 允许用户用积分兑换商品、产品或福利的能力

今天,恰逢该插件一周年之际,我们通过一个完整的 API 来处理自定义计分事件,使上述所有功能成为可能 :tada:

这个新系统允许管理员:

  • 向用户授予自定义分数事件

  • 向用户授予负分事件,以适应兑换或处罚事件

  • 更新和列出先前创建的自定义事件

API

:warning: 通过 API 授予的积分最多需要 10 分钟才能反映在用户总分中(针对创建日期为当天的事件),对于创建于过去 10 天内的事件,最多需要 24 小时。对于创建日期早于过去 10 天的事件,您需要运行回填(backfill)rake 任务。

目前有 3 个不同的 API 端点。

列出事件

curl https://\u003cexample_url\u003e/admin/plugins/gamification/score_events.json \
-H 'API-Key: \u003capi_key_here\u003e' \
-H 'API-Username: \u003capi_username_here\u003e'

您也可以列出特定用户或日期的事件:

curl https://\u003cexample_url\u003e/admin/plugins/gamification/score_events.json?user_id=1\u0026date=2023-05-01 \
-H 'API-Key: \u003capi_key_here\u003e' \
-H 'API-Username: \u003capi_username_here\u003e'

创建事件

curl -X POST https://\u003cexample_url\u003e/admin/plugins/gamification/score_events.json \
-H 'API-Key: \u003capi_key_here\u003e' \
-H 'API-Username: \u003capi_username_here\u003e' \
-H "Content-Type: application/json" \
-d '{
  "user_id": 13,
  "date": "2023-04-14",
  "points": 15,
  "description": "May 2023 Karaoke attendee"
}'

使用 jo 的替代语法:

jo -p user_id="13" date="2023-04-14" points="15" description="May 2023 Karaoke atendee" | curl --json @- -XPOST http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"

更新事件

curl -L -X PUT https://\u003cexample_url\u003e/admin/plugins/gamification/score_events.json?id=6 \
-H 'API-Key: \u003capi_key_here\u003e' \
-H 'API-Username: \u003capi_username_here\u003e' \
-H "Content-Type: application/json" \
-d '{
  "user_id": 11,
  "date": "2023-04-15",
  "points": 25,
  "description": "May 2023 keynote attendee"
}'

使用 jo 的替代语法:

jo -p id="11" points="25" description="May 2023 Karaoke attendee" | curl --json @- -XPUT http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"
29 个赞

是否/将会有一种方法可以通过用户界面来完成此操作?

9 个赞

如果企业客户想赞助,我会考虑这件事。

10 个赞

这太不可思议了。我们刚刚开始并试行一个大使/冠军计划,我们一直在使用 Airtable 来监控来自不同来源(Discourse、GitHub、Ghost)的网络钩子,并将我们的冠军计划聚合到那里。我很高兴能看看这个,看看它是否可以用于我们管理/监控我们的计划和贡献。

如果我们能够向用户组而不是单个用户授予积分,那就太好了。对我们作为企业客户而言,用例是我们基本上想向用户所在的公司授予积分,并汇总每家公司的积分。这种情况的可行性如何?

9 个赞

哎呀,我不知道该怎么用这个 :smiling_face_with_tear:
我们使用的是商务计划。

我希望我们能通过用户界面来操作这个。

不过,还是感谢你构建了这个团队!继续加油。

5 个赞

这是否可以帮助在 Discourse 中使用 Automation 插件 提供一次性积分?

1 个赞

兑换积分是如何运作的?我看到有一个更新事件可以用来从各个事件中减去积分,但这似乎是一种低效的兑换积分的方式。

另外,在尝试列出我的 discourse 实例中的事件时,我收到了一个 404 错误。

GET https://developer.sailpoint.com/discuss/admin/plugins/gamification/score_events.json

404 Not Found
“找不到请求的 URL 或资源。”

我已经启用了该插件,并且可以通过 UI 进行配置。我是否遗漏了启用外部系统 API 的设置?

1 个赞

也许是我在银行工作的十年的经验,但我设想的积分兑换方式是发出负值的自定义事件。

例如,假设有一个用户想兑换一件 T 恤,而这件 T 恤需要 10k 积分。您的兑换系统的流程将是:

  1. 检查用户是否有足够的积分:

    curl https://meta.discourse.org/u/falco.json -s | jq . | grep score
        "gamification_score": 89386,
    
  2. 发出“积分提现”事件

    jo -p user_id="13" date="2023-04-14" points="-10000" description="T-Shirt Redeem - order #123" | curl --json @- -XPOST http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"
    

您需要用某种信号量将其包装起来,因为这是使用它们的教科书式示例,但这正是提议工作流程的要点。

这是一个非常新的功能,所以如果提议的工作流程不能正常工作,请告诉我。

我在浏览器和 API 中都能正常使用它。这是一个管理员端点,所以您需要通过浏览器登录管理员,或者像 OP 中解释的那样传递 API 密钥。

3 个赞

好的,这就是我遗漏的地方。我没意识到你可以发行负积分。那应该能完美地解决问题。

:man_facepalming: 我使用的是过期的凭证。不过还是谢谢你的确认。

2 个赞

@Falco

此 API 是否有添加范围的计划?看起来我创建或更新分数唯一的方法是使用具有全局访问权限的管理员 API 密钥。我希望能有一个范围,将密钥限制为只能更新分数。这样,在使用此 API 进行自动化工具时,我将更加自信,因为我不会使用一个可以执行除更新分数之外的许多其他操作的管理员密钥。

3 个赞

这是个好主意,但我个人近期没有精力来处理这件事。

如果您有兴趣赞助此功能,请联系我们的支持渠道,我们可以为您报价。

3 个赞

我也遇到了同样的问题:

{"errors":["找不到请求的 URL 或资源。"],"error_type":"not_found"}

那个错误是由此引起的

所以你想检查一下你的 :wink:

1 个赞

好的,我也会更新到最新版本以防万一。

更新到最新版本成功了!谢谢。

1 个赞

我今天测试了一下。我看到了可以跟踪的事件,但不确定是否有直接查询来仅查看用户ID的事件。我正在寻找一种方法来生成审计日志或向用户展示他们如何获得/失去积分。

1 个赞

API 调用成功添加积分时,UI 中是否会记录某些内容?

太棒了!我还有一个建议,是否可以在用户界面中添加一项功能,使用户能够兑换积分以订阅?另外,是否可以为用户在某个活动(例如创建主题)中每天可以获得的积分数量设置一个上限。

谢谢!

不,该功能是 100% 基于 API 的。您可以调用“列出事件”端点来检查事件,如 OP 中所述。

3 个赞