Использование реакций для выдачи значков

Звучит как интересный способ решения этой задачи. Мне было бы интересно узнать больше, если вы захотите поделиться подробностями!

Конечно. :slight_smile:

В самой простой форме вы выбираете реакцию, которая означает «Я считаю, что это заслуживает значка». Участники могут использовать её для номинации постов, а запрос отслеживает посты, получившие эту реакцию. Затем вы можете вручную выдать значок из списка, предоставленного запросом, выдать его массово, если полностью доверяете списку, или даже настроить пользовательский SQL для значка, чтобы система делала это автоматически. :magic_wand:

Вы также можете добавить дополнительные критерии в запрос, чтобы сделать его более точным. Например, «пост должен получить x количество этой реакции» или «учитывается только эта реакция, данная пользователями уровня TL2 и выше».

Это также работает с пользовательскими эмодзи, если вам не подошёл ни один из существующих.

Спасибо! Я немного поискал, но не смог найти запрос, который полностью соответствовал бы этому. Не могли бы вы поделиться им? Я сам никогда не создавал такие запросы, но чувствую, что мне нужно научиться этому!

У меня есть один вариант, над которым я работал, но отложил его, чтобы позже взглянуть свежим взглядом, и пока ещё не вернулся к нему, так что, возможно, его нужно доработать. Цель — выдать бейдж за наличие хотя бы 10 постов с реакцией :chefs_kiss:, поставленной участником из группы ‘data-team’ в категории #data-reporting:

SELECT p.user_id, MIN(p.created_at) granted_at
FROM badge_posts p
  JOIN topic_tags tt ON tt.topic_id = p.topic_id
WHERE tt.tag_id = 615
  AND EXISTS (
         SELECT 1
            FROM discourse_reactions_reactions dr 
             JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
             JOIN group_users gu ON gu.user_id = dru.user_id
            WHERE dr.post_id = p.id
              AND dr.reaction_value = 'chefs_kiss'
              AND gu.group_id = 175
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 10

Хотя меня не устраивало использование MIN, так как оно выдавало неверную дату вручения.

В этом варианте много критериев, и он автоматический, что, на мой взгляд, относит его к более сложным. Думаю, более простой вариант можно реализовать гораздо легче и без особых усилий.

Спасибо, это помогло! Вероятно, эту тему стоит перенести в отдельный тред, так как мы уходим от основной темы. Но вот запрос, который я составил (с помощью ChatGPT): он просто возвращает пользователей, поставивших или получивших реакцию, количество реакций, дату реакции и ссылку на конкретный пост. Единственное, что мне не удалось сделать — сделать ссылку на пост кликабельной; похоже, это ограничение касается только ссылок на темы.

WITH reaction_pairs AS (
    SELECT 
      p.user_id AS received_reaction_user_id, 
      dru.user_id AS gave_reaction_user_id, 
      dr.post_id,
      t.id AS topic_id,
      t.slug AS topic_slug,
      p.post_number,
      dru.created_at AS reaction_date
    FROM 
      discourse_reactions_reactions dr
      JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
      JOIN posts p ON dr.post_id = p.id
      JOIN topics t ON p.topic_id = t.id
    WHERE 
      dr.reaction_value = 'Your_Specific_Reaction_Here'
)
SELECT 
  ur1.id AS user_id, 
  ur2.username AS "User Who Gave Reaction",
  'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS "Post URL",
  rp.reaction_date AS "Reaction Date",
  COUNT(*) AS "Number of Reactions"
FROM 
  reaction_pairs rp
  JOIN users ur1 ON rp.received_reaction_user_id = ur1.id
  JOIN users ur2 ON rp.gave_reaction_user_id = ur2.id
GROUP BY 
  ur1.id, 
  ur2.username, 
  rp.topic_slug, 
  rp.topic_id, 
  rp.post_number, 
  rp.reaction_date
ORDER BY 
  "Number of Reactions" DESC, "Reaction Date" DESC

Чтобы этот фрагмент заработал как надо, добавьте _url к имени столбца, то есть:

'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS post_url