+1
-1
config/locales/server.en.yml
+1
-1
config/locales/server.en.yml
···
2
2
en:
3
3
site_settings:
4
4
shadowban_enabled: "Enable shadowban"
5
-
shadowban_approved_group_name: "Group name for approved users (users NOT in this group will be shadowbanned)"
5
+
shadowban_allowed_group: "Group name for approved users (users NOT in this group will be shadowbanned)"
6
6
shadowban_show_to_staff: "Show shadowbanned posts to staff"
+1
-1
config/locales/server.fr.yml
+1
-1
config/locales/server.fr.yml
···
2
2
fr:
3
3
site_settings:
4
4
shadowban_enabled: "Activer le shadowban"
5
-
shadowban_approved_group_name: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)"
5
+
shadowban_allowed_group: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)"
6
6
shadowban_show_to_staff: "Afficher les publications shadowban au staff"
+5
-6
config/settings.yml
+5
-6
config/settings.yml
···
1
1
# config/settings.yml
2
-
shadowban:
2
+
shadowban-all-plugin:
3
3
shadowban_enabled:
4
4
default: false
5
-
client: true
6
-
shadowban_approved_group_name:
7
-
default: "approved_users"
8
-
client: false
5
+
type: bool
6
+
shadowban_allowed_group:
7
+
default: ""
9
8
type: string
10
9
shadowban_show_to_staff:
11
10
default: true
12
-
client: true
11
+
type: bool
+78
-102
plugin.rb
+78
-102
plugin.rb
···
1
-
# name: shadowban
2
-
# about: Hide posts from users NOT in a specific group (whitelist approach)
3
-
# version: 0.2.0
4
-
# authors: Michael Howell (notriddle), Modified for whitelist groups
1
+
# name: shadowban-group
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
5
# url: https://github.com/notriddle/discourse-shadowban
6
6
enabled_site_setting :shadowban_enabled
7
7
8
8
after_initialize do
9
9
10
-
# Méthode helper pour récupérer les IDs des utilisateurs autorisés (non-shadowban)
11
-
def approved_user_ids
12
-
return [] unless SiteSetting.shadowban_approved_group_name.present?
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
13
14
14
-
Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do
15
-
group = Group.find_by(name: SiteSetting.shadowban_approved_group_name)
16
-
return [] unless group
17
-
18
-
# Récupère les IDs des utilisateurs du groupe approuvé
19
-
group.users.pluck(:id)
20
-
end
21
-
end
22
-
23
-
# Méthode pour vérifier si un utilisateur est shadowban (NOT in approved group)
24
-
def user_is_shadowbanned?(user_id)
25
-
return false unless SiteSetting.shadowban_enabled
26
-
return false unless SiteSetting.shadowban_approved_group_name.present?
27
-
return false if user_id.nil?
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
28
17
29
-
# Si l'utilisateur n'est PAS dans le groupe approuvé, il est shadowban
30
-
!approved_user_ids.include?(user_id)
31
-
end
32
-
33
-
# Invalide le cache quand les membres du groupe changent
34
-
DiscourseEvent.on(:user_added_to_group) do |user, group|
35
-
if group.name == SiteSetting.shadowban_approved_group_name
36
-
Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}")
37
-
end
38
-
end
39
-
40
-
DiscourseEvent.on(:user_removed_from_group) do |user, group|
41
-
if group.name == SiteSetting.shadowban_approved_group_name
42
-
Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}")
43
-
end
18
+
user.groups.where(name: group_name).exists?
44
19
end
45
20
46
-
# Invalide le cache quand le nom du groupe change
47
-
DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value|
48
-
if name == :shadowban_approved_group_name
49
-
Rails.cache.delete("approved_user_ids_#{old_value}") if old_value.present?
50
-
end
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?
51
30
end
52
31
53
32
module ::DiscourseShadowbanTopicView
54
33
def filter_post_types(posts)
55
34
result = super(posts)
56
35
57
-
# Le staff peut toujours voir tous les posts
36
+
# Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas
58
37
if SiteSetting.shadowban_show_to_staff && @user&.staff?
59
38
return result
60
39
end
61
-
62
-
# Filtre les posts des utilisateurs shadowban
63
-
if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present?
64
-
approved_ids = approved_user_ids
65
-
if approved_ids.any?
66
-
# Montre seulement les posts des utilisateurs approuvés + les posts de l'utilisateur actuel
67
-
result = result.where(
68
-
'posts.user_id IN (?) OR posts.user_id = ?',
69
-
approved_ids,
70
-
@user&.id || 0
71
-
)
72
-
else
73
-
# Si aucun utilisateur approuvé, montre seulement les posts de l'utilisateur actuel
74
-
result = result.where('posts.user_id = ?', @user&.id || 0)
75
-
end
76
-
end
40
+
41
+
group_name = SiteSetting.shadowban_allowed_group
42
+
return result if group_name.blank?
77
43
78
-
result
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 u.id FROM users u
49
+
INNER JOIN group_users gu ON u.id = gu.user_id
50
+
INNER JOIN groups g ON gu.group_id = g.id
51
+
WHERE g.name = ?
52
+
) OR posts.user_id = ?',
53
+
group_name,
54
+
@user&.id || 0
55
+
)
79
56
end
80
57
end
81
58
···
87
64
def default_results(options = {})
88
65
result = super(options)
89
66
90
-
# Le staff peut toujours voir tous les topics
67
+
# Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas
91
68
if SiteSetting.shadowban_show_to_staff && @user&.staff?
92
69
return result
93
70
end
94
-
95
-
# Filtre les topics des utilisateurs shadowban
96
-
if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present?
97
-
approved_ids = approved_user_ids
98
-
if approved_ids.any?
99
-
# Montre seulement les topics des utilisateurs approuvés + les topics de l'utilisateur actuel
100
-
result = result.where(
101
-
'topics.user_id IN (?) OR topics.user_id = ?',
102
-
approved_ids,
103
-
@user&.id || 0
104
-
)
105
-
else
106
-
# Si aucun utilisateur approuvé, montre seulement les topics de l'utilisateur actuel
107
-
result = result.where('topics.user_id = ?', @user&.id || 0)
108
-
end
109
-
end
71
+
72
+
group_name = SiteSetting.shadowban_allowed_group
73
+
return result if group_name.blank?
110
74
111
-
result
75
+
# Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé
76
+
# sauf si c'est l'utilisateur lui-même qui regarde ses propres topics
77
+
result.where(
78
+
'topics.user_id IN (
79
+
SELECT u.id FROM users u
80
+
INNER JOIN group_users gu ON u.id = gu.user_id
81
+
INNER JOIN groups g ON gu.group_id = g.id
82
+
WHERE g.name = ?
83
+
) OR topics.user_id = ?',
84
+
group_name,
85
+
@user&.id || 0
86
+
)
112
87
end
113
88
end
114
89
···
118
93
119
94
module ::DiscourseShadowbanPostAlerter
120
95
def create_notification(user, type, post, opts = {})
121
-
# Le staff reçoit toujours les notifications
122
-
if SiteSetting.shadowban_show_to_staff && user&.staff?
123
-
return super(user, type, post, opts)
124
-
end
125
-
126
-
# Ne pas envoyer de notification si le post vient d'un utilisateur shadowban
127
-
unless user_is_shadowbanned?(post.user_id)
96
+
# Ne pas créer de notification si l'auteur du post est shadowban
97
+
# sauf si le destinataire est staff et peut voir les posts shadowban
98
+
if (SiteSetting.shadowban_show_to_staff && user&.staff?) ||
99
+
!DiscourseShadowbanGroup.user_shadowbanned?(post.user)
128
100
super(user, type, post, opts)
129
101
end
130
102
end
···
136
108
137
109
module ::DiscourseShadowbanPostCreator
138
110
def update_topic_stats
139
-
# Ne pas mettre à jour les stats si l'utilisateur est shadowban
140
-
unless user_is_shadowbanned?(@post.user_id)
111
+
# Ne pas mettre à jour les statistiques si l'utilisateur est shadowban
112
+
unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user)
141
113
super
142
114
end
143
115
end
144
116
145
117
def update_user_counts
146
118
# Ne pas mettre à jour les compteurs si l'utilisateur est shadowban
147
-
unless user_is_shadowbanned?(@post.user_id)
119
+
unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user)
148
120
super
149
121
end
150
122
end
···
154
126
prepend ::DiscourseShadowbanPostCreator
155
127
end
156
128
157
-
# Ajoute une méthode helper disponible globalement
158
-
def self.approved_user_ids
159
-
return [] unless SiteSetting.shadowban_approved_group_name.present?
160
-
161
-
Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do
162
-
group = Group.find_by(name: SiteSetting.shadowban_approved_group_name)
163
-
return [] unless group
164
-
group.users.pluck(:id)
129
+
# Créer un module pour les méthodes helper
130
+
module ::DiscourseShadowbanGroup
131
+
def self.user_in_allowed_group?(user)
132
+
return false unless user
133
+
return true if user.staff? && SiteSetting.shadowban_show_to_staff
134
+
135
+
group_name = SiteSetting.shadowban_allowed_group
136
+
return true if group_name.blank?
137
+
138
+
user.groups.where(name: group_name).exists?
165
139
end
166
-
end
167
140
168
-
def self.user_is_shadowbanned?(user_id)
169
-
return false unless SiteSetting.shadowban_enabled
170
-
return false unless SiteSetting.shadowban_approved_group_name.present?
171
-
return false if user_id.nil?
172
-
173
-
!approved_user_ids.include?(user_id)
141
+
def self.user_shadowbanned?(user)
142
+
return false unless user
143
+
return false if user.staff? && SiteSetting.shadowban_show_to_staff
144
+
145
+
group_name = SiteSetting.shadowban_allowed_group
146
+
return false if group_name.blank?
147
+
148
+
!user.groups.where(name: group_name).exists?
149
+
end
174
150
end
175
151
end