Как интегрировать систему геймификации Discourse с внешней системой (обмен и начисление очков)

Поскольку год назад мы запустили Discourse Gamification, одной из самых востребованных функций в нашем плане развития стала возможность интеграции системы геймификации Discourse с внешними системами геймификации. Примеров множество:

  • Интеграция с существующими программами геймификации в компаниях

  • Возможность начисления баллов за события, происходящие вне Discourse, например, офлайн-мероприятия или события в интернете, такие как участие в сообществе в качестве клиента или покупка товара.

  • Возможность для пользователей обменивать свои баллы на сувенирную продукцию, товары или привилегии

Сегодня, ровно в день первой годовщины плагина, мы сделали всё вышеперечисленное возможным благодаря полноценному API для обработки пользовательских событий начисления очков :tada:.

Эта новая система позволяет администраторам:

  • Начислять пользователям пользовательские события начисления очков

  • Начислять пользователям события с отрицательными очками для обработки операций обмена или штрафов

  • Обновлять и просматривать список ранее созданных пользовательских событий

API

:warning: Очки, начисленные через API, могут отображаться в общем рейтинге пользователя до 1 часа для событий, созданных с текущей датой, и до 24 часов для событий, созданных в последние 10 дней. Для событий, созданных с датой старше 10 дней, вы можете использовать кнопку Пересчитать баллы в интерфейсе администратора геймификации или запустить задачу rake для заполнения данных: rake gamification_scores:backfill_scores_from[YYYY-MM-DD].

В настоящее время доступно три различных конечных точки API.

Список событий

Возвращает до 100 событий. Вы можете фильтровать по id, user_id и/или date.

curl https://<example_url>/admin/plugins/gamification/score_events.json \
-H 'API-Key: <api_key_here>' \
-H 'API-Username: <api_username_here>'

Вы также можете получить список событий для конкретного пользователя или даты:

curl https://<example_url>/admin/plugins/gamification/score_events.json?user_id=1&date=2023-05-01 \
-H 'API-Key: <api_key_here>' \
-H 'API-Username: <api_username_here>'

Создание события

curl -X POST https://<example_url>/admin/plugins/gamification/score_events.json \
-H 'API-Key: <api_key_here>' \
-H 'API-Username: <api_username_here>' \
-H "Content-Type: application/json" \
-d '{
  "user_id": 13,
  "date": "2023-04-14",
  "points": 15,
  "description": "Участник караоке-вечера, май 2023"
}'

Альтернативный синтаксис с использованием jo:

jo -p user_id="13" date="2023-04-14" points="15" description="Участник караоке-вечера, май 2023" | curl --json @- -XPOST http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"

Обновление события

Конечная точка обновления требует указания id и points. Вы также можете обновить description. Обратите внимание, что user_id и date нельзя изменить после создания события.

curl -L -X PUT https://<example_url>/admin/plugins/gamification/score_events.json \
-H 'API-Key: <api_key_here>' \
-H 'API-Username: <api_username_here>' \
-H "Content-Type: application/json" \
-d '{
  "id": 6,
  "points": 25,
  "description": "Участник keynote-выступления, май 2023"
}'

Альтернативный синтаксис с использованием jo:

jo -p id="11" points="25" description="Участник караоке-вечера, май 2023" | curl --json @- -XPUT http://example/admin/plugins/gamification/score_events -H "Api-Key: apikeyhere" -H "Api-Username: system"
29 лайков

Будет ли возможность сделать это через интерфейс?

9 лайков

Я бы рассмотрел такой вариант, если корпоративный клиент захочет это спонсировать.

10 лайков

Это невероятно. Мы только начали запускать и тестировать программу амбассадоров/чемпионов и используем Airtable для отслеживания вебхуков из разных источников (Discourse, GitHub, Ghost) и агрегации данных о нашей программе чемпионов. Я с нетерпением жду возможности проверить это и посмотреть, можно ли использовать решение для управления и мониторинга нашей программы и вкладов.

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

9 лайков

Ах, я не знаю, как этим пользоваться :smiling_face_with_tear:
Мы используем бизнес-план.

Хотелось бы, чтобы мы могли управлять этим через интерфейс.

Но всё же спасибо за создание этой команды! Так держать!

5 лайков

Это может помочь выдать разовые очки в Discourse с помощью плагина автоматизации?

1 лайк

Как работает списание баллов? Я вижу событие обновления, которое можно использовать для вычитания баллов из отдельных событий, но это кажется неэффективным способом их списания.

Кроме того, при попытке получить список событий в моем экземпляре Discourse я получаю ошибку 404.

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

404 Not Found
«Запрошенный URL-адрес или ресурс не найден».

Я включил плагин и могу настроить его через интерфейс. Не упускаю ли я что-то для включения API внешней системы?

1 лайк

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

Например, предположим, что у вас есть пользователь, который хочет выкупить баллы за футболку, и эта футболка стоит 10 000 баллов. Процесс в вашей системе выкупа будет следующим:

  1. Проверьте, есть ли у пользователя достаточно баллов:

    curl https://meta.discourse.org/u/falco.json -s | jq . | grep score
        "gamification_score": 89386,
    
  2. Создайте событие «списание баллов»:

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

Вам следует обернуть это в какой-то семафор, так как это классический пример их использования, но в этом суть предлагаемого рабочего процесса.

Это очень новая функция, поэтому сообщите, если предложенный рабочий процесс не работает корректно.

У меня всё работает отлично, как в браузере, так и через API. Это административная конечная точка, поэтому вам нужно быть авторизованным администратором в браузере или передать ключи API, как объясняется в первом сообщении.

3 лайка

Понятно, вот чего мне не хватало. Я не знал, что можно выпускать баллы с отрицательным значением. Тогда это должно сработать идеально.

:man_facepalming: Я использовал устаревшие учётные данные. Спасибо за подтверждение в любом случае.

2 лайка

@Falco

Есть ли планы добавить области действия (scopes) к этому API? Похоже, что единственный способ создавать или обновлять оценки — это использование ключа API администратора с глобальным доступом. Мне бы хотелось иметь область действия, которая ограничивает ключ только возможностью обновления оценок. Это повысило бы мою уверенность в использовании этого API в инструментах автоматизации, так как у меня не будет ключа администратора, способного выполнять действия, выходящие за рамки обновления оценок.

3 лайка

Отличная идея, но лично у меня в ближайшее время нет времени на работу над этим.

Если вы заинтересованы в спонсировании этой функции, пожалуйста, свяжитесь с нашей службой поддержки, чтобы мы могли предоставить вам смету.

3 лайка

Я столкнулся с той же проблемой:

{"errors":["Запрашиваемый URL или ресурс не найден."],"error_type":"not_found"}

Эта ошибка была вызвана

Так что вам стоит проверить свои :wink:

1 лайк

Спасибо, я тоже обновлюсь до последней версии на всякий случай

Обновление до последней версии помогло! Спасибо!

1 лайк

Я немного протестировал это сегодня. Я вижу события, которые могу отслеживать, но не уверен, есть ли прямой запрос для просмотра событий только по ID пользователя. Ищу способ, возможно, вести журнал аудита или показывать пользователям, как они набирали или теряли очки.

1 лайк

В интерфейсе отображается запись, когда API-запрос успешно завершается и начисляются баллы?

Отлично! И у меня есть ещё одно предложение: можно ли добавить функцию, позволяющую пользователям обменивать баллы на подписки в интерфейсе? А также возможность установить лимит на количество баллов, которое пользователь может заработать в день за событие (например, создание тем).

Нет, функция полностью основана на API. Вы можете вызвать endpoint «Список событий» (List Events), чтобы проверить события, как описано в первом посте темы.

3 лайка