Usando reacciones para otorgar insignias

¡Esa suena como una forma interesante de lograr esto, estaría interesado en aprender más si alguna vez quieres compartir más detalles!

3 Me gusta

Por supuesto. :slight_smile:

Básicamente, en su forma más simple, eliges una Reacción que indica ‘Creo que esto merece una insignia’, que tus miembros pueden usar para nominar publicaciones, y la consulta recoge qué publicaciones han recibido esa Reacción. Luego, puedes otorgar la insignia manualmente de la lista que te da la consulta, otorgarla en bloque si confías plenamente en la lista, o incluso configurar el SQL personalizado de la insignia para que el sistema lo haga automáticamente. :magic_wand:

También puedes aplicar algunos criterios adicionales a la consulta para hacerla más específica. Por ejemplo, ‘una publicación necesita x número de esta Reacción’, o ‘solo cuenta esa Reacción dada por TL2+’.

También funciona con emojis personalizados si no había uno actual que consideraras adecuado.

2 Me gusta

¡Gracias! Busqué un poco pero no pude encontrar una consulta que coincidiera exactamente con esto, ¿estarías dispuesto a compartir la consulta? ¡Nunca he creado una yo mismo pero siento que necesito aprender esto!

Tengo uno con el que estuve jugando, aunque lo dejé a un lado para mirarlo con ojos frescos y aún no he vuelto a él, así que puede que necesite algo de trabajo. Se trata de otorgar una insignia basada en obtener al menos 10 publicaciones con la reacción :chefs_kiss: dada por un miembro del grupo ‘data-team’ para publicaciones en la categoría 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

Aunque no me complació usar MIN ya que daba la fecha de concesión incorrecta.

Hay muchos criterios para ello, y es automático, lo que creo que lo empuja hacia el extremo más complicado. Creo que uno más simple podría ser mucho más alcanzable sin demasiado esfuerzo.

1 me gusta

¡Gracias, eso ayudó! Probablemente deberíamos mover esto a un nuevo tema ya que estamos desviándonos. Pero aquí está la consulta que se me ocurrió (con la ayuda de ChatGPT) que simplemente devuelve a los usuarios que dieron/recibieron la reacción, cuántas reacciones, la fecha de la reacción y la URL de la publicación específica. Lo único que no pude hacer fue hacer que la URL de la publicación fuera enlazable, parece que eso está limitado a las URL de los temas.

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 "Usuario que dio la reacción",
  'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS "URL de la publicación",
  rp.reaction_date AS "Fecha de la reacción",
  COUNT(*) AS "Número de reacciones"
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 
  "Número de reacciones" DESC, "Fecha de la reacción" DESC
2 Me gusta

Para que esta parte haga su magia, añades _url al nombre de la columna, así:

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