Obtenir le nombre de signalements récents par catégorie

Salut à tous :grinning:

Je travaille à l’ajout d’un plugin à mon instance Discourse qui détermine si un certain nombre de signalements ont été effectués récemment dans une catégorie. Il retournerait idéalement le nombre de signalements donnés dans une catégorie sur une période donnée (par exemple, le nombre de signalements dans les 20 dernières minutes pour la catégorie avec l’ID X).

Je joue avec le plugin Data Explorer, mais je ne suis pas très familier avec SQL et je ne suis pas sûr si ce que j’essaie de faire est possible. Il semble que je pourrais accomplir cela sur une base par message en utilisant la table post_actions car post_id est stocké pour les actions sur les messages. Idéalement, j’accomplirais cela en une seule requête au lieu de sommer manuellement les comptes de signalements pour les messages individuels dans une catégorie.

Si quelqu’un peut m’aider, je lui serais reconnaissant !

Salut @tpsReports,

Je ne dispose pas d’une instance Discourse très robuste où je peux tester cela en profondeur, mais je pense que cette requête Data Explorer pourrait vous aider à aller dans la bonne direction. (Quelqu’un d’autre pourra probablement intervenir pour l’améliorer !)

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND t.category_id = '4'

Dans cet exemple, j’ai spécifié que le temps depuis la création du signalement est de 20 minutes (ligne 6), comme vous l’avez indiqué dans votre exemple.
À la 7ème ligne, j’ai utilisé l’ID de catégorie 4, mais vous devrez utiliser l’ID de catégorie spécifique de la catégorie que vous souhaitez suivre.

Si vous souhaitez pouvoir faire référence à la catégorie par son nom, vous pourriez ajouter une autre jointure à la requête, elle ressemblerait alors à ceci :

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
JOIN categories c on c.id = t.category_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND c.name = 'General'

Remplacez ensuite General à la ligne 8 par le nom de votre catégorie. Gardez à l’esprit que les noms de catégories sont sensibles à la casse.

Faites-moi savoir si cela vous aide !

4 « J'aime »

@southpaw Bien joué ; j’étais sur le point de poster :smile:

Si ça vous intéresse, j’ai ajouté des champs personnalisés que vous pourriez remplir :

--[params]
-- int_list :category_ids
-- text :interval = 20min

SELECT t.category_id, count(pa.id) count
from post_actions pa
INNER JOIN posts p on p.id = pa.post_id
INNER JOIN topics t on t.id = p.topic_id
WHERE post_action_type_id in (3, 4, 6, 7, 8)
    AND t.category_id in (:category_ids)
    AND pa.created_at >= now() - interval :interval
GROUP BY t.category_id

Vous pouvez entrer plusieurs IDs de catégories et des intervalles personnalisés (tels que 1h, 30 min, 3 mois, etc.)

Remarque : j’ai conservé the post_action_type_id 6, qui je crois est lié à un utilisateur recevant un avertissement ; je ne suis pas sûr si vous voulez aussi le compter ; n’hésitez pas à le supprimer alors.

3 « J'aime »

Juste pour information, mais 6 est ‘Notify User’ (Notifier l’utilisateur), qui est celui pour un message privé utilisateur-utilisateur initié depuis le menu de signalement : :+1:

Bien qu’il soit possible pour un modérateur de le marquer comme un avertissement officiel.

3 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.