1# name: shadowban-all-plugin 2# about: Hide posts from all users except those in a specific group 3# version: 0.0.2 4# authors: Modified from Michael Howell (notriddle) 5# url: https://github.com/notriddle/discourse-shadowban 6enabled_site_setting :shadowban_enabled 7 8after_initialize do 9 10 # Méthode helper pour vérifier si un utilisateur est dans le groupe autorisé 11 def self.user_in_allowed_group?(user) 12 return false unless user 13 return true if user.staff? && SiteSetting.shadowban_show_to_staff 14 15 group_name = SiteSetting.shadowban_allowed_group 16 return true if group_name.blank? # Si aucun groupe n'est défini, tous les utilisateurs sont autorisés 17 18 user.groups.where(name: group_name).exists? 19 end 20 21 # Méthode helper pour vérifier si un utilisateur est shadowban 22 def self.user_shadowbanned?(user) 23 return false unless user 24 return false if user.staff? && SiteSetting.shadowban_show_to_staff 25 26 group_name = SiteSetting.shadowban_allowed_group 27 return false if group_name.blank? # Si aucun groupe n'est défini, personne n'est shadowban 28 29 !user.groups.where(name: group_name).exists? 30 end 31 32 module ::DiscourseShadowbanTopicView 33 def filter_post_types(posts) 34 result = super(posts) 35 36 # Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas 37 if SiteSetting.shadowban_show_to_staff && @user&.staff? 38 return result 39 end 40 41 group_name = SiteSetting.shadowban_allowed_group 42 return result if group_name.blank? 43 44 # Exclure les posts des utilisateurs qui ne sont PAS dans le groupe autorisé 45 # sauf si c'est l'utilisateur lui-même qui regarde ses propres posts 46 result.where( 47 'posts.user_id IN ( 48 SELECT gu.user_id FROM group_users gu 49 INNER JOIN groups g ON gu.group_id = g.id 50 WHERE g.name = ? 51 ) OR posts.user_id = ?', 52 group_name, 53 @user&.id || 0 54 ) 55 end 56 end 57 58 class ::TopicView 59 prepend ::DiscourseShadowbanTopicView 60 end 61 62 module ::DiscourseShadowbanTopicQuery 63 def default_results(options = {}) 64 result = super(options) 65 66 # Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas 67 if SiteSetting.shadowban_show_to_staff && @user&.staff? 68 return result 69 end 70 71 group_name = SiteSetting.shadowban_allowed_group 72 return result if group_name.blank? 73 74 # Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé 75 # sauf si c'est l'utilisateur lui-même qui regarde ses propres topics 76 result.where( 77 'topics.user_id IN ( 78 SELECT gu.user_id FROM group_users gu 79 INNER JOIN groups g ON gu.group_id = g.id 80 WHERE g.name = ? 81 ) OR topics.user_id = ?', 82 group_name, 83 @user&.id || 0 84 ) 85 end 86 end 87 88 class ::TopicQuery 89 prepend ::DiscourseShadowbanTopicQuery 90 end 91 92 module ::DiscourseShadowbanPostAlerter 93 def create_notification(user, type, post, opts = {}) 94 # Ne pas créer de notification si l'auteur du post est shadowban 95 # sauf si le destinataire est staff et peut voir les posts shadowban 96 if (SiteSetting.shadowban_show_to_staff && user&.staff?) || 97 !DiscourseShadowbanGroup.user_shadowbanned?(post.user) 98 super(user, type, post, opts) 99 end 100 end 101 end 102 103 class ::PostAlerter 104 prepend ::DiscourseShadowbanPostAlerter 105 end 106 107 module ::DiscourseShadowbanPostCreator 108 def update_topic_stats 109 # Ne pas mettre à jour les statistiques si l'utilisateur est shadowban 110 unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 111 super 112 end 113 end 114 115 def update_user_counts 116 # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban 117 unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 118 super 119 end 120 end 121 end 122 123 class ::PostCreator 124 prepend ::DiscourseShadowbanPostCreator 125 end 126 127 # Créer un module pour les méthodes helper 128 module ::DiscourseShadowbanGroup 129 def self.user_in_allowed_group?(user) 130 return false unless user 131 return true if user.staff? && SiteSetting.shadowban_show_to_staff 132 133 group_name = SiteSetting.shadowban_allowed_group 134 return true if group_name.blank? 135 136 user.groups.where(name: group_name).exists? 137 end 138 139 def self.user_shadowbanned?(user) 140 return false unless user 141 return false if user.staff? && SiteSetting.shadowban_show_to_staff 142 143 group_name = SiteSetting.shadowban_allowed_group 144 return false if group_name.blank? 145 146 !user.groups.where(name: group_name).exists? 147 end 148 end 149end