Assegna Badge quando l'utente visita un link

Come posso concedere automaticamente un badge quando l’utente visita un link all’interno del forum Discourse?

es: https://myforum.example.com?special_access=true

Che ne dici di usare la tabella topic_link_clicks?

Penso di avere un badge manuale che potrebbe trarne beneficio. :thinking: Ci penserò.

1 Mi Piace

Se si tratta di un link specifico condiviso in un post specifico, penso che questo sarebbe sufficiente:

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

Dovresti recuperare il post_id del tuo post specifico dal suo JSON (o eseguire una ricerca tramite il data explorer)

2 Mi Piace

Penso che questo potrebbe funzionare.

Voglio concedere questo badge solo ai membri del nostro corso.
C’è un modo per nascondere un argomento al pubblico generale e renderlo disponibile solo a coloro che ci cliccano sopra tramite un link?

In secondo luogo, come si può fare usando il plugin Dfata explorer?

Non sono sicuro al 100% di seguire il metodo che stai usando per questo? Potresti voler verificare di non complicare eccessivamente l’impostazione.

Se controllare il json non fa per te, una query di ricerca post_id sarebbe qualcosa del genere:

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

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

Quindi puoi usare l’URL del post per estrarre l’ID dell’argomento e il numero del post da inserire nelle caselle dei parametri. ad esempio: https://meta.discourse.org/t/grant-badge-when-user-visits-link/276700/4 (vale la pena notare che l’OP è sempre il post_number 1, anche se non è nel link dell’argomento)


In realtà, c’è un parametro magico che potrebbe rendere la ricerca di un post_id usando il data explorer ancora più facile…

-- [params]
-- post_id :url

SELECT id
FROM posts
WHERE id = :url

Incolla l’URL pertinente per il post nella casella del parametro, et voila - estrae il post_id :slight_smile:

1 Mi Piace

Ho appena provato questo ma non restituisce alcun ID. È vuoto:

Lo sfondo rosso mi fa pensare che non sia un URL di post completo. Se si tratta di un URL di argomento, è necessario aggiungere /1 alla fine:

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

1 Mi Piace

Ha funzionato!

Presumo che questo debba essere sostituito con l’URL del post che include ‘/1’?

Quel pezzo deve essere sostituito con il link su cui stanno cliccando all’interno del post.

E il post_id è il post in cui il link viene incollato/condiviso.

Capisco, quindi non c’è modo di assegnare semplicemente il badge facendogli visitare il link del post?

Penso che dovrebbe esserci, ma sarebbe una query diversa. :slight_smile: Questa assegna un badge per aver cliccato su un link specifico in un post di un forum specifico.

Se vuoi assegnare un badge per la visita di un utente a un particolare argomento, penso che sarebbe:

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

(Sostituendo ‘728’ con il topic_id pertinente)

1 Mi Piace

Ok, ecco come l’ho configurato:

Ma quando visito il post in questione (come amministratore), non ricevo il badge. Sto facendo qualcosa di sbagliato?

Poiché necessita del trigger giornaliero di aggiornamento, gli verrà concesso la prossima volta che verrà eseguita l’attività di assegnazione badge giornaliera. È possibile attivare manualmente Jobs::BadgeGrant dalla pagina /sidekiq/scheduler se si desidera velocizzare il controllo.

1 Mi Piace

Come posso farlo aggiornare istantaneamente?

Gli unici trigger disponibili sono:

  • Aggiorna giornalmente
  • Quando un utente modifica o crea un post
  • Quando un utente viene modificato o creato
  • Quando un utente agisce su un post
  • Quando un utente viene modificato o creato
  • Quando un utente cambia il livello di fiducia

Per ottenere un badge più istantaneo, dovresti lavorare all’interno di quelle azioni. Puoi leggere di più in questo argomento - Creating triggered custom badge queries

2 Mi Piace

Ho fatto questo ma non mi è ancora stato concesso.

Per quanto mi riguarda, funziona.

L’hai abilitato? E ti sei assicurato di aver impostato il numero di argomento corretto?

Sì, è abilitato. Provo su un altro profilo. Forse è perché sono l’amministratore.

In secondo luogo, stai semplicemente incollando il link dell’argomento nel tuo browser?

Essere admin non fa differenza per questo.

Dovresti visitare l’argomento affinché venga registrato nella tabella topic_views su cui si basa questo badge.