···22en:
33 site_settings:
44 shadowban_enabled: "Enable shadowban"
55- shadowban_approved_group_name: "Group name for approved users (users NOT in this group will be shadowbanned)"
55+ shadowban_allowed_group: "Group name for approved users (users NOT in this group will be shadowbanned)"
66 shadowban_show_to_staff: "Show shadowbanned posts to staff"
+1-1
config/locales/server.fr.yml
···22fr:
33 site_settings:
44 shadowban_enabled: "Activer le shadowban"
55- shadowban_approved_group_name: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)"
55+ shadowban_allowed_group: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)"
66 shadowban_show_to_staff: "Afficher les publications shadowban au staff"
···11-# name: shadowban
22-# about: Hide posts from users NOT in a specific group (whitelist approach)
33-# version: 0.2.0
44-# authors: Michael Howell (notriddle), Modified for whitelist groups
11+# name: shadowban-group
22+# about: Hide posts from all users except those in a specific group
33+# version: 0.0.2
44+# authors: Modified from Michael Howell (notriddle)
55# url: https://github.com/notriddle/discourse-shadowban
66enabled_site_setting :shadowban_enabled
7788after_initialize do
991010- # Méthode helper pour récupérer les IDs des utilisateurs autorisés (non-shadowban)
1111- def approved_user_ids
1212- return [] unless SiteSetting.shadowban_approved_group_name.present?
1010+ # Méthode helper pour vérifier si un utilisateur est dans le groupe autorisé
1111+ def self.user_in_allowed_group?(user)
1212+ return false unless user
1313+ return true if user.staff? && SiteSetting.shadowban_show_to_staff
13141414- Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do
1515- group = Group.find_by(name: SiteSetting.shadowban_approved_group_name)
1616- return [] unless group
1717-1818- # Récupère les IDs des utilisateurs du groupe approuvé
1919- group.users.pluck(:id)
2020- end
2121- end
2222-2323- # Méthode pour vérifier si un utilisateur est shadowban (NOT in approved group)
2424- def user_is_shadowbanned?(user_id)
2525- return false unless SiteSetting.shadowban_enabled
2626- return false unless SiteSetting.shadowban_approved_group_name.present?
2727- return false if user_id.nil?
1515+ group_name = SiteSetting.shadowban_allowed_group
1616+ return true if group_name.blank? # Si aucun groupe n'est défini, tous les utilisateurs sont autorisés
28172929- # Si l'utilisateur n'est PAS dans le groupe approuvé, il est shadowban
3030- !approved_user_ids.include?(user_id)
3131- end
3232-3333- # Invalide le cache quand les membres du groupe changent
3434- DiscourseEvent.on(:user_added_to_group) do |user, group|
3535- if group.name == SiteSetting.shadowban_approved_group_name
3636- Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}")
3737- end
3838- end
3939-4040- DiscourseEvent.on(:user_removed_from_group) do |user, group|
4141- if group.name == SiteSetting.shadowban_approved_group_name
4242- Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}")
4343- end
1818+ user.groups.where(name: group_name).exists?
4419 end
45204646- # Invalide le cache quand le nom du groupe change
4747- DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value|
4848- if name == :shadowban_approved_group_name
4949- Rails.cache.delete("approved_user_ids_#{old_value}") if old_value.present?
5050- end
2121+ # Méthode helper pour vérifier si un utilisateur est shadowban
2222+ def self.user_shadowbanned?(user)
2323+ return false unless user
2424+ return false if user.staff? && SiteSetting.shadowban_show_to_staff
2525+2626+ group_name = SiteSetting.shadowban_allowed_group
2727+ return false if group_name.blank? # Si aucun groupe n'est défini, personne n'est shadowban
2828+2929+ !user.groups.where(name: group_name).exists?
5130 end
52315332 module ::DiscourseShadowbanTopicView
5433 def filter_post_types(posts)
5534 result = super(posts)
56355757- # Le staff peut toujours voir tous les posts
3636+ # Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas
5837 if SiteSetting.shadowban_show_to_staff && @user&.staff?
5938 return result
6039 end
6161-6262- # Filtre les posts des utilisateurs shadowban
6363- if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present?
6464- approved_ids = approved_user_ids
6565- if approved_ids.any?
6666- # Montre seulement les posts des utilisateurs approuvés + les posts de l'utilisateur actuel
6767- result = result.where(
6868- 'posts.user_id IN (?) OR posts.user_id = ?',
6969- approved_ids,
7070- @user&.id || 0
7171- )
7272- else
7373- # Si aucun utilisateur approuvé, montre seulement les posts de l'utilisateur actuel
7474- result = result.where('posts.user_id = ?', @user&.id || 0)
7575- end
7676- end
4040+4141+ group_name = SiteSetting.shadowban_allowed_group
4242+ return result if group_name.blank?
77437878- result
4444+ # Exclure les posts des utilisateurs qui ne sont PAS dans le groupe autorisé
4545+ # sauf si c'est l'utilisateur lui-même qui regarde ses propres posts
4646+ result.where(
4747+ 'posts.user_id IN (
4848+ SELECT u.id FROM users u
4949+ INNER JOIN group_users gu ON u.id = gu.user_id
5050+ INNER JOIN groups g ON gu.group_id = g.id
5151+ WHERE g.name = ?
5252+ ) OR posts.user_id = ?',
5353+ group_name,
5454+ @user&.id || 0
5555+ )
7956 end
8057 end
8158···8764 def default_results(options = {})
8865 result = super(options)
89669090- # Le staff peut toujours voir tous les topics
6767+ # Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas
9168 if SiteSetting.shadowban_show_to_staff && @user&.staff?
9269 return result
9370 end
9494-9595- # Filtre les topics des utilisateurs shadowban
9696- if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present?
9797- approved_ids = approved_user_ids
9898- if approved_ids.any?
9999- # Montre seulement les topics des utilisateurs approuvés + les topics de l'utilisateur actuel
100100- result = result.where(
101101- 'topics.user_id IN (?) OR topics.user_id = ?',
102102- approved_ids,
103103- @user&.id || 0
104104- )
105105- else
106106- # Si aucun utilisateur approuvé, montre seulement les topics de l'utilisateur actuel
107107- result = result.where('topics.user_id = ?', @user&.id || 0)
108108- end
109109- end
7171+7272+ group_name = SiteSetting.shadowban_allowed_group
7373+ return result if group_name.blank?
11074111111- result
7575+ # Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé
7676+ # sauf si c'est l'utilisateur lui-même qui regarde ses propres topics
7777+ result.where(
7878+ 'topics.user_id IN (
7979+ SELECT u.id FROM users u
8080+ INNER JOIN group_users gu ON u.id = gu.user_id
8181+ INNER JOIN groups g ON gu.group_id = g.id
8282+ WHERE g.name = ?
8383+ ) OR topics.user_id = ?',
8484+ group_name,
8585+ @user&.id || 0
8686+ )
11287 end
11388 end
11489···1189311994 module ::DiscourseShadowbanPostAlerter
12095 def create_notification(user, type, post, opts = {})
121121- # Le staff reçoit toujours les notifications
122122- if SiteSetting.shadowban_show_to_staff && user&.staff?
123123- return super(user, type, post, opts)
124124- end
125125-126126- # Ne pas envoyer de notification si le post vient d'un utilisateur shadowban
127127- unless user_is_shadowbanned?(post.user_id)
9696+ # Ne pas créer de notification si l'auteur du post est shadowban
9797+ # sauf si le destinataire est staff et peut voir les posts shadowban
9898+ if (SiteSetting.shadowban_show_to_staff && user&.staff?) ||
9999+ !DiscourseShadowbanGroup.user_shadowbanned?(post.user)
128100 super(user, type, post, opts)
129101 end
130102 end
···136108137109 module ::DiscourseShadowbanPostCreator
138110 def update_topic_stats
139139- # Ne pas mettre à jour les stats si l'utilisateur est shadowban
140140- unless user_is_shadowbanned?(@post.user_id)
111111+ # Ne pas mettre à jour les statistiques si l'utilisateur est shadowban
112112+ unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user)
141113 super
142114 end
143115 end
144116145117 def update_user_counts
146118 # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban
147147- unless user_is_shadowbanned?(@post.user_id)
119119+ unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user)
148120 super
149121 end
150122 end
···154126 prepend ::DiscourseShadowbanPostCreator
155127 end
156128157157- # Ajoute une méthode helper disponible globalement
158158- def self.approved_user_ids
159159- return [] unless SiteSetting.shadowban_approved_group_name.present?
160160-161161- Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do
162162- group = Group.find_by(name: SiteSetting.shadowban_approved_group_name)
163163- return [] unless group
164164- group.users.pluck(:id)
129129+ # Créer un module pour les méthodes helper
130130+ module ::DiscourseShadowbanGroup
131131+ def self.user_in_allowed_group?(user)
132132+ return false unless user
133133+ return true if user.staff? && SiteSetting.shadowban_show_to_staff
134134+135135+ group_name = SiteSetting.shadowban_allowed_group
136136+ return true if group_name.blank?
137137+138138+ user.groups.where(name: group_name).exists?
165139 end
166166- end
167140168168- def self.user_is_shadowbanned?(user_id)
169169- return false unless SiteSetting.shadowban_enabled
170170- return false unless SiteSetting.shadowban_approved_group_name.present?
171171- return false if user_id.nil?
172172-173173- !approved_user_ids.include?(user_id)
141141+ def self.user_shadowbanned?(user)
142142+ return false unless user
143143+ return false if user.staff? && SiteSetting.shadowban_show_to_staff
144144+145145+ group_name = SiteSetting.shadowban_allowed_group
146146+ return false if group_name.blank?
147147+148148+ !user.groups.where(name: group_name).exists?
149149+ end
174150 end
175151end