this repo has no description
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