# name: shadowban-all-plugin # about: Hide posts from all users except those in a specific group # version: 0.0.2 # authors: Modified from Michael Howell (notriddle) # url: https://github.com/notriddle/discourse-shadowban enabled_site_setting :shadowban_enabled after_initialize do # Méthode helper pour vérifier si un utilisateur est dans le groupe autorisé def self.user_in_allowed_group?(user) return false unless user return true if user.staff? && SiteSetting.shadowban_show_to_staff group_name = SiteSetting.shadowban_allowed_group return true if group_name.blank? # Si aucun groupe n'est défini, tous les utilisateurs sont autorisés user.groups.where(name: group_name).exists? end # Méthode helper pour vérifier si un utilisateur est shadowban def self.user_shadowbanned?(user) return false unless user return false if user.staff? && SiteSetting.shadowban_show_to_staff group_name = SiteSetting.shadowban_allowed_group return false if group_name.blank? # Si aucun groupe n'est défini, personne n'est shadowban !user.groups.where(name: group_name).exists? end module ::DiscourseShadowbanTopicView def filter_post_types(posts) result = super(posts) # Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas if SiteSetting.shadowban_show_to_staff && @user&.staff? return result end group_name = SiteSetting.shadowban_allowed_group return result if group_name.blank? # Exclure les posts des utilisateurs qui ne sont PAS dans le groupe autorisé # sauf si c'est l'utilisateur lui-même qui regarde ses propres posts result.where( 'posts.user_id IN ( SELECT gu.user_id FROM group_users gu INNER JOIN groups g ON gu.group_id = g.id WHERE g.name = ? ) OR posts.user_id = ?', group_name, @user&.id || 0 ) end end class ::TopicView prepend ::DiscourseShadowbanTopicView end module ::DiscourseShadowbanTopicQuery def default_results(options = {}) result = super(options) # Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas if SiteSetting.shadowban_show_to_staff && @user&.staff? return result end group_name = SiteSetting.shadowban_allowed_group return result if group_name.blank? # Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé # sauf si c'est l'utilisateur lui-même qui regarde ses propres topics result.where( 'topics.user_id IN ( SELECT gu.user_id FROM group_users gu INNER JOIN groups g ON gu.group_id = g.id WHERE g.name = ? ) OR topics.user_id = ?', group_name, @user&.id || 0 ) end end class ::TopicQuery prepend ::DiscourseShadowbanTopicQuery end module ::DiscourseShadowbanPostAlerter def create_notification(user, type, post, opts = {}) # Ne pas créer de notification si l'auteur du post est shadowban # sauf si le destinataire est staff et peut voir les posts shadowban if (SiteSetting.shadowban_show_to_staff && user&.staff?) || !DiscourseShadowbanGroup.user_shadowbanned?(post.user) super(user, type, post, opts) end end end class ::PostAlerter prepend ::DiscourseShadowbanPostAlerter end module ::DiscourseShadowbanPostCreator def update_topic_stats # Ne pas mettre à jour les statistiques si l'utilisateur est shadowban unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) super end end def update_user_counts # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) super end end end class ::PostCreator prepend ::DiscourseShadowbanPostCreator end # Créer un module pour les méthodes helper module ::DiscourseShadowbanGroup def self.user_in_allowed_group?(user) return false unless user return true if user.staff? && SiteSetting.shadowban_show_to_staff group_name = SiteSetting.shadowban_allowed_group return true if group_name.blank? user.groups.where(name: group_name).exists? end def self.user_shadowbanned?(user) return false unless user return false if user.staff? && SiteSetting.shadowban_show_to_staff group_name = SiteSetting.shadowban_allowed_group return false if group_name.blank? !user.groups.where(name: group_name).exists? end end end