Выдать значок при посещении пользователем ссылки

Как можно автоматически выдавать значок, когда пользователь переходит по ссылке внутри форума Discourse?

например: https://myforum.example.com?special_access=true

Как насчет использования таблицы topic_link_clicks?

Думаю, у меня есть ручной бейдж, который мог бы от этого выиграть. :thinking: Подумаю.

Если речь идет о конкретной ссылке, размещенной в конкретном посте, думаю, этот запрос подойдет:

SELECT DISTINCT tlc.user_id, MIN(tlc.created_at) granted_at
FROM badge_posts p
  LEFT JOIN topic_links tl ON tl.post_id = p.id
  LEFT JOIN topic_link_clicks tlc ON tlc.topic_link_id = tl.id
WHERE tl.post_id = 1246
  AND tl.url = 'https://meta.discourse.org/'
  AND tlc.user_id IS NOT NULL
GROUP BY tlc.user_id

Вам нужно будет получить post_id вашего конкретного поста из его JSON-данных (или выполнить поиск через Data Explorer).

Я думаю, это может сработать.

Я хочу выдавать эту значку только участникам нашего курса.
Есть ли способ скрыть тему от публики и сделать её доступной только тем, кто перейдёт по ссылке?

Во-вторых, как это можно сделать с помощью плагина Data Explorer?

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

Если работа с JSON вам не по душе, то запрос для поиска post_id может выглядеть так:

-- [params]
-- topic_id :topic_id
-- int :post_number

SELECT id
FROM posts 
WHERE topic_id = :topic_id
  AND post_number = :post_number

Затем вы можете использовать URL сообщения, чтобы извлечь идентификатор темы и номер сообщения и ввести их в поля параметров. Например: https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/4 (стоит отметить, что первое сообщение (OP) всегда имеет номер сообщения 1, даже если это не указано в ссылке на тему).


На самом деле, существует специальный параметр, который может ещё больше упростить поиск post_id через Data Explorer

-- [params]
-- post_id :url

SELECT id 
FROM posts
WHERE id = :url

Вставьте соответствующий URL сообщения в поле параметров, и вуаля — вы получите post_id :slight_smile:

Я только что попробовал это, но ID не выводится. Просто пусто:

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

https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/1

Это сработало!

Предполагаю, что это нужно заменить на URL поста, включая ‘/1’?

Эту часть нужно заменить на ссылку, по которой они кликают внутри поста.

А post_id — это пост, в который вставлена или с которой поделена ссылка.

А, понятно. Значит, нельзя просто выдать бейдж за переход по ссылке на пост?

Я думаю, что так и должно быть, но это был бы другой запрос. :slight_smile: В данном случае выдаётся значок за клик по конкретной ссылке в определённом сообщении форума.

Если вы хотите выдавать значок пользователю за посещение конкретной темы, то, на мой взгляд, запрос должен выглядеть так:

SELECT DISTINCT tv.user_id, MIN(tv.viewed_at) AS granted_at
FROM topic_views tv
WHERE tv.topic_id = 728
GROUP BY tv.user_id

(Замените «728» на соответствующий topic_id).

Ладно, я настроил это вот так:

Но когда я захожу на соответствующий пост (как администратор), значок не появляется. Я что-то делаю не так?

Поскольку для этого требуется триггер «Обновлять ежедневно», соответствующие права будут предоставлены при следующем запуске задания по выдаче ежедневных наград. Вы можете вручную запустить Jobs::BadgeGrant со страницы /sidekiq/scheduler, если хотите ускорить проверку.

Как можно заставить его обновляться мгновенно?

Доступны только следующие триггеры:

  • Ежедневное обновление
  • При редактировании или создании поста пользователем
  • При редактировании или создании пользователя
  • При действии пользователя над постом
  • При редактировании или создании пользователя
  • При изменении уровня доверия пользователя

Чтобы выдавать значки более оперативно, необходимо работать в рамках указанных действий. Подробнее об этом можно прочитать в этой теме — Creating triggered custom badge queries

Я сделал это, но значок всё ещё не выдан.

Кстати, у меня это работает.

Вы его включили? И убедились, что установлен правильный номер темы?

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

Во-вторых, вы просто вставляете ссылку на тему в браузер?

Статус администратора в данном случае не имеет значения.

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