Discourse-Math 徽章

有人能想到一种方法,可以自动为使用 discourse-math 插件渲染公式的帖子授予自定义徽章吗?

我完全不知道从哪里开始。

5 个赞

你好 @agf1997

同意 Discourse 数学插件做得很好,是网站的绝佳补充。

一种方法是聘请 Discourse 插件开发者为你修改数学插件,以便在论坛成员使用该插件时更新数据库中的自定义字段。

然后,你可以在徽章管理区域创建一个简单的数据库查询来颁发徽章。

希望这能帮到你。

3 个赞

这显然不是一个关键任务功能。我只是想找一个简单的方法,利用数学排版功能来突出显示某些人,从而鼓励其他人也使用它。

1 个赞

你好 @agf1997

正如我所提到的,你需要为此编写插件代码。

这意味着你有两个选择:

  1. 自行修改或扩展数学插件
  2. 聘请他人为你修改或扩展数学插件

无论你决定朝哪个方向发展,都需要修改或扩展数学插件,以便在论坛成员使用该插件时更新数据库中的自定义字段。

希望这能帮到你。

2 个赞

是的,您可以为成功的数学帖子授予徽章,而无需修改插件。

首先,您需要在网站上启用 默认情况下无法再编辑徽章 SQL

之后,创建一个新的徽章,触发条件为以下查询:

SELECT user_id, MIN(id) AS post_id, current_timestamp AS granted_at 
FROM badge_posts
WHERE cooked LIKE '%<span class="math">%' AND (:backfill OR id IN (:post_ids) )
GROUP BY user_id
7 个赞

@Falco

这是一个非常棒的徽章查询。

问题:

您是否有所有可在徽章查询中用于触发条件的 Discourse :symbols 的完整列表?

我之所以这么问,是因为我看到您使用了 :backfill:post_id,而当我查看这个链接时,发现还使用了其他 Ruby :symbols:

是否有简洁的参考文档,列出可在徽章查询中使用的 Discourse Ruby symbols?

我找到了这篇与徽章触发相关的文章(在您上面的帖子之后),非常有帮助:

在该 Discourse 文章中,提到了以下触发辅助符:

  • :user_ids
  • :post_ids
  • :backfill

这三个是“全部”了吗?

非常感谢您的帮助!

3 个赞

@Falco 太棒了!快速问个问题……这应该适用于之前的帖子吗?当我点击“预览已授予的徽章”时,显示“没有可分配的徽章”。

点击“使用查询计划预览”则显示:

GroupAggregate  (cost=2021.68..2021.70 rows=1 width=16)
  Group Key: p.user_id
  ->  Sort  (cost=2021.68..2021.68 rows=1 width=8)
        Sort Key: p.user_id
        ->  Nested Loop  (cost=0.28..2021.67 rows=1 width=8)
              Join Filter: (t.category_id = c.id)
              ->  Nested Loop  (cost=0.28..2017.97 rows=1 width=12)
                    ->  Seq Scan on posts p  (cost=0.00..2009.66 rows=1 width=12)
                          Filter: ((deleted_at IS NULL) AND (cooked ~~ '%<span class="math">%'::text) AND (post_type = ANY ('{1,2,3}'::integer[])))
                    ->  Index Scan using topics_pkey on topics t  (cost=0.28..8.30 rows=1 width=8)
                          Index Cond: (id = p.topic_id)
                          Filter: ((deleted_at IS NULL) AND visible)
              ->  Seq Scan on categories c  (cost=0.00..3.35 rows=28 width=4)
                    Filter: (allow_badges AND (NOT read_restricted))