[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / notifications2 / notifications_pipelines.php
1 <?php
2 /*
3 * Plugin Notifications
4 * (c) 2009-2012 SPIP
5 * Distribue sous licence GPL
6 *
7 */
8
9 if (!defined("_ECRIRE_INC_VERSION")) return;
10
11 /**
12 *
13 * Declarer la tache cron de notification lente (messagerie de l'espace prive)
14 * @param array $taches_generales
15 * @return array
16 */
17 function notifications_taches_generales_cron($taches_generales){
18 $taches_generales['notifications'] = 60*10; // toutes les 10 minutes
19 return $taches_generales;
20 }
21
22 $GLOBALS['notifications_post_edition']['spip_signatures'] = "petitionsignee";
23
24 // Initialise les reglages sous forme de tableau
25 function notifications_go($x){
26 if (!is_array($GLOBALS['notifications'] = @unserialize($GLOBALS['meta']['notifications'])))
27 $GLOBALS['notifications'] = array();
28 return $x;
29 }
30
31
32 /**
33 * Pipeline post-edition
34 * pour permettre de se pluger sur une modification en base non notifiee par defaut
35 *
36 * @param array $x
37 * @return array
38 */
39 function notifications_post_edition($x){
40 #spip_log($x,'notifications');
41 if (isset($x['args']['table'])
42 AND isset($GLOBALS['notifications_post_edition'][$x['args']['table']])
43 AND $quoi = $GLOBALS['notifications_post_edition'][$x['args']['table']]
44 ){
45 // repasser par l'entree principale
46 $notifications = charger_fonction('notifications', 'inc');
47 $notifications($quoi, $x['args']['id_objet'], array());
48 }
49
50 return $x;
51 }
52
53 /**
54 * Ajouter des destinataires dans une notification en lot
55 *
56 * @param array $flux
57 * @return array
58 */
59 function notifications_notifications_destinataires($flux){
60 static $sent = array();
61 $quoi = $flux['args']['quoi'];
62 $options = $flux['args']['options'];
63
64 // proposition d'article prevenir les admins restreints pour le passage de proposé à publié
65 if ($quoi=='instituerarticle' AND $GLOBALS['notifications']['prevenir_admins_restreints']
66 AND $options['statut']=='prop' AND $options['statut_ancien']!='publie' // ligne a commenter si vous voulez prevenir de la publication
67 ){
68
69 $id_article = $flux['args']['id'];
70 include_spip('base/abstract_sql');
71 $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
72 $id_rubrique = $t['id_rubrique'];
73 if ($GLOBALS['notifications']['limiter_rubriques']){
74 $limites = $GLOBALS['notifications']['limiter_rubriques'];
75 $limiter_rubriques = explode(",",$limites);
76 } else {
77 $limiter_rubriques = array($id_rubrique);
78 }
79
80 if (in_array($id_rubrique,$limiter_rubriques))
81 {
82 while ($id_rubrique){
83 $hierarchie[] = $id_rubrique;
84 $res = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
85 if (!$res){ // rubrique inexistante
86 $id_rubrique = 0;
87 break;
88 }
89 $id_parent = $res['id_parent'];
90 $id_rubrique = $id_parent;
91 }
92 spip_log("Prop article > admin restreint de " . join(',', $hierarchie), 'notifications');
93
94 //les admins de la rub et de ses parents
95 $result_email = sql_select(
96 "auteurs.email,auteurs.id_auteur,lien.id_objet as id_rubrique",
97 "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur ",
98 "lien.objet='rubrique' AND ".sql_in('lien.id_objet',sql_quote($hierarchie))." AND auteurs.statut='0minirezo'");
99
100 while ($qui = sql_fetch($result_email)){
101 spip_log($options['statut'] . " article > admin restreint " . $qui['id_auteur'] . " de la rubrique" . $qui['id_rubrique'] . " prevenu", 'notifications');
102 $flux['data'][] = $qui['email'];
103 }
104 }
105
106 }
107
108 // notification d'article pour le passage de proposé à refusé
109 if ($quoi=='instituerarticle' AND $GLOBALS['notifications']['prevenir_auteurs_articles_refus']
110 AND $options['statut']=='refuse' AND in_array($options['statut_ancien'], array('prop','publie')) // ligne a commenter si vous voulez prevenir de la publication
111 ){
112
113 $id_article = $flux['args']['id'];
114 include_spip('base/abstract_sql');
115 $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
116 $id_rubrique = $t['id_rubrique'];
117 if ($GLOBALS['notifications']['limiter_rubriques']){
118 $limites = $GLOBALS['notifications']['limiter_rubriques'];
119 $limiter_rubriques = explode(",",$limites);
120 } else {
121 $limiter_rubriques = array($id_rubrique);
122 }
123
124 if (in_array($id_rubrique,$limiter_rubriques))
125 {
126 while ($id_rubrique){
127 $hierarchie[] = $id_rubrique;
128 $res = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
129 if (!$res){ // rubrique inexistante
130 $id_rubrique = 0;
131 break;
132 }
133 $id_parent = $res['id_parent'];
134 $id_rubrique = $id_parent;
135 }
136 spip_log("Refuse article > admin restreint de " . join(',', $hierarchie), 'notifications');
137
138 //les admins de la rub et de ses parents
139 $result_email = sql_select(
140 "auteurs.email,auteurs.id_auteur,lien.id_objet as id_rubrique",
141 "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur ",
142 "lien.objet='rubrique' AND ".sql_in('lien.id_objet',sql_quote($hierarchie))." AND auteurs.statut='0minirezo'");
143
144 while ($qui = sql_fetch($result_email)){
145 spip_log($options['statut'] . " article > admin restreint " . $qui['id_auteur'] . " de la rubrique" . $qui['id_rubrique'] . " prevenu", 'notifications');
146 $flux['data'][] = $qui['email'];
147 }
148 }
149
150 }
151
152 // publication d'article : prevenir les auteurs
153 if ($quoi=='instituerarticle'
154 AND $GLOBALS['notifications']['prevenir_auteurs_articles']
155 ){
156 $id_article = $flux['args']['id'];
157 include_spip('base/abstract_sql');
158 $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
159 $id_rubrique = $t['id_rubrique'];
160 if ($GLOBALS['notifications']['limiter_rubriques']){
161 $limites = $GLOBALS['notifications']['limiter_rubriques'];
162 $limiter_rubriques = explode(",",$limites);
163 } else {
164 $limiter_rubriques = array($id_rubrique);
165 }
166
167 if (in_array($id_rubrique,$limiter_rubriques))
168 {
169
170 include_spip('base/abstract_sql');
171
172 // Qui va-t-on prevenir en plus ?
173 $result_email = sql_select(
174 array('auteurs.email', 'auteurs.id_auteur'),
175 "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur",
176 "lien.id_objet=".intval($id_article)." AND lien.objet='article'");
177
178 while ($qui = sql_fetch($result_email)){
179 $flux['data'][] = $qui['email'];
180 spip_log($options['statut'] . " article > auteur " . $qui['id_auteur'] . " prevenu", 'notifications');
181 }
182 }
183
184 }
185 //publication d'article : ne pas prévenir l'auteur s'il est le validateur
186 if ($quoi == "instituerarticle" and $GLOBALS['notifications']['pas_prevenir_publieur']){
187 $publieur_email=$GLOBALS["visiteur_session"]["email"];
188 if(($key = array_search($publieur_email,$flux['data'])) !== false){
189 unset($flux['data'][$key]);
190 }
191 }
192 // forum valide ou prive : prevenir les autres contributeurs du thread ou ceux qui ont déjà répondu à l'article
193 if (($quoi=='forumprive' AND $GLOBALS['notifications']['thread_forum_prive'])
194 OR ($quoi=='forumvalide' AND ($GLOBALS['notifications']['thread_forum'] OR $GLOBALS['notifications']['forum'] OR $GLOBALS['notifications']['forum_article']))
195 ){
196
197 $id_forum = $flux['args']['id'];
198 if ($t = $options['forum']
199 OR $t = sql_fetsel("*", "spip_forum", "id_forum=" . intval($id_forum))
200 ){
201
202 // Tous les participants a ce *thread*, abonnes
203 // on prend les emails parmi notification_email (prioritaire si rempli) email_auteur ou email de l'auteur qd id_auteur connu
204 // note : on exclut les forums refusé ou marqué comme spam
205 $s = sql_select("F.email_auteur, F.notification_email, A.email",
206 "spip_forum AS F LEFT JOIN spip_auteurs AS A ON F.id_auteur=A.id_auteur",
207 "notification=1 AND id_thread=" . intval($t['id_thread']) . " AND (email_auteur != '' OR notification_email != '' OR A.email IS NOT NULL) AND F.statut NOT IN ('off','spam')") ;
208 // Eventuellement tout ceux qui ont répondu à cet article
209 if ($GLOBALS['notifications']['forum_article']){
210 $s = sql_select("F.email_auteur, F.notification_email, A.email",
211 "spip_forum AS F LEFT JOIN spip_auteurs AS A ON F.id_auteur=A.id_auteur",
212 "notification=1 AND objet=".sql_quote($t['objet'])." AND id_objet=" . intval($t['id_objet']) . " AND (email_auteur != '' OR notification_email != '' OR A.email IS NOT NULL) AND F.statut NOT IN ('off','spam')");
213 }
214 while ($r = sql_fetch($s)){
215 if ($r['notification_email'])
216 $flux['data'][] = $r['notification_email'];
217 elseif($r['email_auteur'])
218 $flux['data'][] = $r['email_auteur'];
219 elseif($r['email'])
220 $flux['data'][] = $r['email'];
221 }
222
223 }
224 }
225
226 // Les moderateurs de forums public
227 if ($quoi=='forumposte' AND $GLOBALS['notifications']['moderateurs_forum']){
228 foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum']) as $m){
229 $flux['data'][] = $m;
230 }
231 }
232
233 // noter les envois de ce forum pour ne pas doublonner
234 if (in_array($quoi, array('forumposte', 'forumvalide', 'forumprive'))
235 AND $id = $flux['args']['id']
236 ){
237 if (isset($sent[$id])){
238 $flux['data'] = array_diff($flux['data'], $sent[$id]);
239 } else {
240 $sent[$id] = array();
241 }
242 $sent[$id] = array_merge($sent[$id], $flux['data']);
243 }
244
245 return $flux;
246 }
247
248
249 /**
250 * Pipeline notifications_envoyer_mails
251 * appele a chaque envoi de mails
252 * permet de gerer les contributeurs :
253 * - inscription auto si activee
254 * - url de suivi des forums
255 *
256 * @param array $flux
257 * @return array
258 */
259 /*
260 function notifications_notifications_envoyer_mails($flux){
261 if ($GLOBALS['notifications']['suivi']){
262
263 // ajouter un acces a la page de suivi
264 $url = url_absolue(generer_url_public('suivi', 'email=' . $flux['email']));
265 $flux['texte'] .= "\n\n" . _L('Gerer mes abonnements : ') . $url;
266
267 // ajouter les auteurs en base ?
268 // ici ou dans la page de suivi lorsqu'ils essayent vraiment de gerer
269 // leurs abonnements ?
270 // $a = notifications_creer_auteur($email);
271 }
272
273 return $flux;
274 }
275 */
276
277 function notifications_url_suivi($email){
278 if (!$email) return "";
279 include_spip("inc/securiser_action");
280 $key = calculer_cle_action("abonner_notifications $email");
281 $url = url_absolue(generer_url_public('notifications', "email=$email&key=$key"));
282 return $url;
283 }
284
285 /**
286 * Regarder si l'auteur est dans la base de donnees, sinon l'ajouter
287 * comme s'il avait demande a s'inscrire comme visiteur
288 * Pour l'historique il faut retrouver le nom de la personne,
289 * pour ca on va regarder dans les forums existants
290 * Si c'est la personne connectee, c'est plus facile
291 *
292 * @param string $email
293 * @return array|bool
294 */
295 function notifications_creer_auteur($email){
296
297 include_spip('base/abstract_sql');
298 if (!$a = sql_fetsel('*', 'spip_auteurs', 'email=' . sql_quote($email))){
299 if ($GLOBALS['visiteur_session']['session_email']===$email
300 AND isset($GLOBALS['visiteur_session']['session_nom'])
301 ){
302 $nom = $GLOBALS['visiteur_session']['session_nom'];
303 } else {
304 if ($b = sql_fetsel('auteur', 'spip_forum',
305 'email_auteur=' . sql_quote($email) . ' AND auteur!=""',
306 /* groupby */
307 '', /* orderby */
308 array('date_heure DESC'),
309 /* limit */
310 '1')
311 ){
312 $nom = $b['auteur'];
313 } else {
314 $nom = $email;
315 }
316 }
317 // charger message_inscription()
318 if ($traiter = charger_fonction('traiter', 'formulaires/inscription', true)){
319 // "pirater" les globals
320 $_GET['nom_inscription'] = $nom;
321 $_GET['email_inscription'] = $email;
322 $a = $traiter('6forum', null);
323 }
324 if (!is_array($a)){
325 spip_log("erreur sur la creation d'auteur: $a", 'notifications');
326 next;
327 }
328 }
329
330 // lui donner un cookie_oubli s'il n'en a pas deja un
331 if (!isset($a['cookie_oubli'])){
332 include_spip('inc/acces'); # pour creer_uniqid
333 $a['cookie_oubli'] = creer_uniqid();
334 sql_updateq('spip_auteurs',
335 array('cookie_oubli' => $a['cookie_oubli']),
336 'id_auteur=' . $a['id_auteur']
337 );
338 }
339
340 return $a;
341 }
342
343 /**
344 * Pretraiter le mail/sujet quand il est au format html
345 * pour la fonction notifications_envoyer_mails qui ne sait traiter que les mails html
346 *
347 * @param string $email
348 * @param $texte_ou_html
349 */
350 function notifications_envoyer_mails_texte_ou_html($email, $texte_ou_html){
351 $texte_ou_html = trim($texte_ou_html);
352
353 // tester si le mail est deja en html
354 if (substr($texte_ou_html,0,1)=="<"
355 AND substr($texte_ou_html,-1,1)==">"
356 AND stripos($texte_ou_html,"</html>")!==false){
357
358 // dans ce cas on ruse un peu : extraire le sujet du title
359 $sujet = "";
360 if (preg_match(",<title>(.*)</title>,Uims",$texte_ou_html,$m))
361 $sujet = $m[1];
362
363 // et envoyer un content-type pour envoyer_mail
364 return notifications_envoyer_mails($email, $texte_ou_html, $sujet, "","Content-Type: text/html\n");
365 }
366 else
367 // texte brut, on passe
368 return notifications_envoyer_mails($email, $texte_ou_html);
369 }
370
371 /* TODO
372 // Envoyer un message de bienvenue/connexion au posteur du forum,
373 // dans le cas ou il ne s'est pas authentifie
374 // Souci : ne pas notifier comme ca si on est deja present dans le thread
375 // (eviter d'avoir deux notificaitons pour ce message qu'on a, dans 99,99%
376 // des cas, poste nous-memes !)
377 if (strlen(trim($t['email_auteur']))
378 AND email_valide($t['email_auteur'])
379 AND !$GLOBALS['visiteur_session']['id_auteur']) {
380 $msg = Notifications_jeuneposteur($t, $email);
381 if ($t['email_auteur'] == 'fil@rezo.net')
382 notifications_envoyer_mails($t['email_auteur'], $msg['body'],$msg['subject'])
383 }
384 */
385
386
387 /*
388 // Creer un mail pour les forums envoyes par quelqu'un qui n'est pas authentifie
389 // en lui souhaitant la bienvenue et avec un lien suivi&p= de connexion au site
390 function Notifications_jeuneposteur($t, $email) {
391 return array('test', 'coucou');
392 }
393 */
394
395 ?>