Как можно автоматически выдавать значок, когда пользователь переходит по ссылке внутри форума Discourse?
Как насчет использования таблицы topic_link_clicks?
Думаю, у меня есть ручной бейдж, который мог бы от этого выиграть.
Подумаю.
Если речь идет о конкретной ссылке, размещенной в конкретном посте, думаю, этот запрос подойдет:
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 ![]()
Красный фон подсказывает, что это не полная ссылка на пост. Если это ссылка на тему, вам нужно добавить /1 в конце:
https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/1
Это сработало!
Предполагаю, что это нужно заменить на URL поста, включая ‘/1’?
Эту часть нужно заменить на ссылку, по которой они кликают внутри поста.
А post_id — это пост, в который вставлена или с которой поделена ссылка.
А, понятно. Значит, нельзя просто выдать бейдж за переход по ссылке на пост?
Я думаю, что так и должно быть, но это был бы другой запрос.
В данном случае выдаётся значок за клик по конкретной ссылке в определённом сообщении форума.
Если вы хотите выдавать значок пользователю за посещение конкретной темы, то, на мой взгляд, запрос должен выглядеть так:
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, на которой основан этот значок, необходимо посетить тему.





