Discourse-Mathバッジ

discourse-math プラグインを使って数式を描画する投稿を作成した人に、自動的にカスタムバッジを付与する方法をご存知の方はいませんか?

どこから手をつければよいのか見当もつきません。

「いいね!」 5

@agf1997 さん、こんにちは

Discourse の数式プラグインはよくできており、サイトにとって素晴らしい追加機能だと同意します。

一つのアプローチとして、Discourse プラグイン開発者に依頼して、数式プラグインを修正し、フォーラムメンバーがプラグインを使用した際に DB のカスタムフィールドを更新させる方法があります。

その後、バッジ管理画面で簡単な DB クエリを作成してバッジを付与することができます。

お役に立てれば幸いです。

「いいね!」 3

これは確かにミッションクリティカルな機能ではありません。単に、数式レンダリング機能を使って人々を強調表示し、他の人にもその機能を使うよう促す簡単な方法を探していただけです。

「いいね!」 1

@agf1997 さん、こんにちは

前述の通り、そのためにはプラグインコードが必要です。

つまり、以下の2つの選択肢があります。

  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 シンボルに関する簡潔なリファレンスはありますか?

あなたの投稿の後に、バッジトリガーに関連する以下の記事を見つけました。非常に役立ちました:

その Discourse の記事では、以下のトリガーヘルパーが言及されています:

  • :user_ids
  • :post_ids
  • :backfill

これら 3 つが「すべて」でしょうか?

ご支援いただき、本当にありがとうございます!

「いいね!」 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))