Cómo integrar Discourse Gamification con un sistema externo (canjear y otorgar puntos)

Desde que lanzamos Discourse Gamification hace un año, una de las funciones más solicitadas en nuestra hoja de ruta ha sido la capacidad de integrar Discourse Gamification con sistemas de gamificación externos. Los ejemplos son abundantes:

  • Integrar con programas de gamificación existentes en empresas.

  • Capacidad para otorgar puntos por eventos que ocurren fuera de Discourse, como eventos presenciales (IRL) o en otros lugares en línea, como ser un cliente en una comunidad o comprar un producto.

  • La capacidad de permitir que los usuarios canjeen sus puntos por artículos promocionales, productos o beneficios.

Hoy, justo a tiempo para el primer aniversario del plugin, hemos hecho todo lo anterior posible con una API completa para manejar eventos de puntuación personalizados :tada:.

Este nuevo sistema permite a los administradores:

  • Otorgar a los usuarios un evento de puntuación personalizado.

  • Otorgar a los usuarios eventos de puntuación negativa, para acomodar eventos de canje o penalizaciones.

  • Actualizar y listar eventos personalizados creados previamente.

API

\u003e :warning: Los puntos otorgados a través de la API tardarán hasta 1 hora en reflejarse en la puntuación general de un usuario para eventos creados con la fecha actual, y hasta 24 horas para eventos creados en los últimos 10 días. Para eventos creados con una fecha anterior a 10 días, puedes usar el botón Recalcular puntuaciones en la interfaz de administración de gamificación o ejecutar la tarea rake de relleno: rake gamification_scores:backfill_scores_from[AAAA-MM-DD].

Actualmente hay 3 puntos finales de API diferentes.

Listar Eventos

Devuelve hasta 100 eventos. Puedes filtrar por id, user_id y/o date.

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'

También puedes listar eventos específicos de un usuario o fecha:

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'

Crear Evento

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": "Asistente al karaoke de mayo de 2023"
}'

Sintaxis alternativa usando jo:

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

Actualizar Evento

El punto final de actualización requiere id y points. Opcionalmente, puedes actualizar description. Ten en cuenta que user_id y date no se pueden cambiar después de la creación.

curl -L -X PUT 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 '{
  "id": 6,
  "points": 25,
  "description": "Asistente a la conferencia magistral de mayo de 2023"
}'

Sintaxis alternativa usando jo:

jo -p id="11" points="25" description="Asistente al karaoke de mayo de 2023" | curl --json @- -XPUT http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"
29 Me gusta

¿Habrá/hay una forma de hacerlo a través de la interfaz de usuario?

9 Me gusta

Eso es algo que consideraría si un cliente empresarial quisiera patrocinarlo.

10 Me gusta

Esto es increíble. Estamos justo en medio de iniciar y pilotar un programa de embajadores/campeones, y hemos estado usando Airtable para monitorear webhooks de nuestras diferentes fuentes (Discourse, GitHub, Ghost) y agregar nuestro programa de campeones allí. Estoy emocionado de probar esto y ver si podría usarse para que gestionemos/monitoreemos nuestro programa y contribuciones.

Sería genial si pudieras otorgar puntos a un grupo de usuarios en lugar de a un usuario. El caso de uso para nosotros como cliente empresarial sería que esencialmente queremos otorgar puntos a la empresa para la que trabajan los usuarios y agregar sus puntos para cada empresa. ¿Cuál es la viabilidad de algo como esto?

9 Me gusta

Ah, no sé cómo usar esto :cara_sonriente_con_lágrimas:
Estamos usando un plan de negocios.

Ojalá pudiéramos operar esto a través de la interfaz de usuario.

Pero aun así, ¡gracias por crear este equipo! Sigan con el buen trabajo.

5 Me gusta

¿Podría eso ayudar a otorgar puntos únicos dentro de Discourse con el plugin de automatización?

1 me gusta

¿Cómo funciona el canje de puntos? Veo que hay un evento de actualización que podría usarse para restar puntos de eventos individuales, pero eso parece una forma ineficiente de canjear puntos.

Además, al intentar listar eventos en mi instancia de Discourse, obtengo un 404.

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

404 No encontrado
“No se pudo encontrar la URL o el recurso solicitado”.

He habilitado el plugin y puedo configurarlo a través de la interfaz de usuario. ¿Me falta algo para habilitar la API del sistema externo?

1 me gusta

Puede que sea mi década de experiencia trabajando en bancos, pero la forma en que concibo el canje de puntos es emitiendo eventos personalizados de valor negativo.

Por ejemplo, digamos que tienes un usuario que quiere canjear puntos por una camiseta, y esa camiseta cuesta 10k puntos. El flujo en tu sistema de canje sería:

  1. Comprueba si el usuario tiene suficientes puntos:

    curl https://meta.discourse.org/u/falco.json -s | jq . | grep score
        "gamification_score": 89386,
    
  2. Emite un evento de “retiro de puntos”

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

Querrás envolver esto en un semáforo de algún tipo, ya que este es el ejemplo clásico de uso de esos, pero esa es la esencia del flujo de trabajo propuesto.

Esta es una característica muy reciente, así que házmelo saber si el flujo de trabajo propuesto no funciona correctamente.

Me funciona bien, tanto en el navegador como a través de la API. Es un endpoint de administrador, por lo que necesitas ser un administrador conectado a través del navegador o pasar claves de API como se explica en el OP.

3 Me gusta

Ok, eso era lo que me faltaba. No me di cuenta de que se podían emitir puntos negativos. Eso debería funcionar perfectamente entonces.

:man_facepalming: Estaba usando credenciales caducadas. Gracias por confirmarlo de todos modos.

2 Me gusta

@Falco

¿Hay planes para añadir ámbitos a esta API? Parece que la única forma en que puedo crear o actualizar puntuaciones es teniendo una clave de API de administrador que tenga acceso global. Me encantaría tener un ámbito que restrinja una clave solo a la capacidad de actualizar puntuaciones. Esto me daría más confianza al usar esta API en herramientas de automatización, ya que no tendría una clave de administrador que pueda hacer mucho más que actualizar puntuaciones.

3 Me gusta

Es una buena idea, pero personalmente no tengo el ancho de banda para trabajar en esto en el futuro cercano.

Si está interesado en patrocinar esta función, póngase en contacto con nuestro canal de soporte para que podamos proporcionarle un presupuesto.

3 Me gusta

Aquí también tengo el mismo problema:

{"errors":["La URL o el recurso solicitado no se pudo encontrar."],"error_type":"not_found"}

Ese error fue causado por

Así que quieres revisar las tuyas :wink:

1 me gusta

Gracias, también voy a actualizar a la última versión por si acaso.

¡La actualización a la última versión funcionó! Gracias.

1 me gusta

He estado probando esto un poco hoy. Veo los eventos que puedo rastrear, aunque no estoy seguro de si hay una consulta directa para ver solo eventos por ID de usuario. Busco una manera de tener un registro de auditoría o presentar a los usuarios cómo han ganado/perdido puntos.

1 me gusta

¿Hay algo registrado en la interfaz de usuario cuando la llamada a la API tiene éxito al agregar puntos?

¡Genial! Y tengo otra sugerencia, ¿es posible agregar una función que permita a los usuarios canjear puntos por suscripciones en la interfaz de usuario? Y la capacidad de agregar un límite a la cantidad de puntos que un usuario puede ganar por día en un evento (como crear temas).

¡Gracias!

No, la función se basa 100% en la API. Puede llamar al punto final “List Events” para comprobar si hay eventos, como se describe en el OP.

3 Me gusta