source: spip-zone/_plugins_/notifications/notifications.php @ 31715

Last change on this file since 31715 was 31715, checked in by cedric@…, 12 years ago

un bug et evitons le test de doublonnage sur la tache qui de toute facon n'existait pas sur envoyer_mail()

File size: 16.2 KB
Line 
1<?php
2
3
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6// Initialise les reglages sous forme de tableau
7function Notifications_go($x) {
8        if (!is_array($GLOBALS['notifications']
9        = @unserialize($GLOBALS['meta']['notifications'])))
10                $GLOBALS['notifications'] = array();
11        return $x;
12}
13
14function Notifications_taches_generales_cron($taches_generales){
15        $taches_generales['notifications'] = 60 * 20; // 20 minutes
16        return $taches_generales;
17}
18
19function Notifications_pre_edition($x) {
20        spip_log($x);
21
22        if (isset($x['args']['table'])) {
23                $notif = 'Notifications_'.$x['args']['table'];
24                if (function_exists($notif)) {
25                        $x = $notif($x);
26                }
27        }
28
29        return $x;
30}
31
32function notifications_instituerarticle($quoi, $id_article, $options) {
33
34        // ne devrait jamais se produire
35        if ($options['statut'] == $options['statut_ancien']) {
36                spip_log("statut inchange");
37                return;
38        }
39
40        include_spip('inc/texte');
41
42        if ($options['statut'] == 'publie') {
43                notifier_publication_article($id_article);
44                notifier_publication_auteurs_article($id_article);
45                }
46               
47        if ($options['statut'] == 'prop' AND $options['statut_ancien'] != 'publie')
48                notifier_proposition_article($id_article);
49}
50
51function notifier_publication_auteurs_article($id_article) {
52        include_spip('base/abstract_sql');
53        $nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]);
54        $suivi_edito = $GLOBALS['meta']["suivi_edito"];
55       
56        if ($GLOBALS['notifications']['prevenir_auteurs_articles']) {
57                $row = sql_fetsel("*", "spip_articles", "id_article = $id_article");
58                if ($row) {
59
60                        $l = lang_select($row['lang']);
61
62                        // URL de l'article
63                        if (function_exists('generer_url_entite_absolue')) {
64                                $url = generer_url_entite_absolue($id_article, 'article'); 
65                        } else {
66                                charger_generer_url(false);
67                                $url = url_absolue(suivre_lien(_DIR_RACINE,generer_url_article($id_article, '','', 'publie')));
68                        }
69
70                        $titre = nettoyer_titre_email($row['titre']);
71
72                        $sujet = _T('info_publie_1', array('nom_site_spip' => $nom_site_spip, 'titre' => $titre));
73                        $courr = _T('info_publie_2')."\n\n";
74
75                        $nom = $GLOBALS['visiteur_session']['nom'];
76                        $nom = trim(supprimer_tags(typo($nom)));
77                        $courr .= _T('info_publie_01', array('titre' => $titre, 'connect_nom' => $nom))
78                                . "\n\n"
79                                . "-> " . $url
80                                . "\n";
81                               
82                // Qui va-t-on prevenir ?
83                        $tous = array();
84                       
85                        $result_email = sql_select("auteurs.email", "spip_auteurs AS auteurs, spip_auteurs_articles AS lien", "lien.id_article=$id_article AND auteurs.id_auteur=lien.id_auteur");
86
87                        while ($qui = sql_fetch($result_email)) {
88                                $tous[] = $qui['email'];
89                        }
90
91                        // Nettoyer le tableau
92                        // Ne pas ecrire au posteur du message !
93                        $destinataires = array();
94                        foreach ($tous as $m) {
95                                if ($m = email_valide($m))
96                                        $destinataires[$m]++;
97                        }
98
99                        //
100                        // Envoyer les emails
101                        //
102                        $envoyer_mail = charger_fonction('envoyer_mail','inc');
103                        foreach (array_keys($destinataires) as $email) {
104                                if (!function_exists('job_queue_add'))
105                                        $envoyer_mail($email, $sujet, $courr);
106                                else
107                                        job_queue_add('envoyer_mail',">$email : $sujet",array($email,$sujet,$courr),'inc/');
108                        }
109
110                        if ($l) lang_select();
111                }
112        }
113}
114
115// Regarder si l'auteur est dans la base de donnees, sinon l'ajouter
116// comme s'il avait demande a s'inscrire comme visiteur
117// Pour l'historique il faut retrouver le nom de la personne,
118// pour ca on va regarder dans les forums existants
119// Si c'est la personne connectee, c'est plus facile
120function Notifications_creer_auteur($email) {
121        include_spip('base/abstract_sql');
122        if (!$a = sql_fetsel('*', 'spip_auteurs', 'email='.sql_quote($email))) {
123                if ($GLOBALS['visiteur_session']['session_email'] === $email
124                AND isset($GLOBALS['visiteur_session']['session_nom'])) {
125                        $nom = $GLOBALS['visiteur_session']['session_nom'];
126                } else {
127                        if ($b = sql_fetsel('auteur', 'spip_forum',
128                                'email_auteur='.sql_quote($email).' AND auteur!=""',
129                                /* groupby */'', /* orderby */ array('date_heure DESC'),
130                                /* limit */ '1')
131                        ) {
132                                $nom = $b['auteur'];
133                        } else {
134                                $nom = $email;
135                        }
136                }
137                // charger message_inscription()
138                include_spip('balise/formulaire_inscription'); # pour SPIP 1.9.2
139                include_spip('formulaires/inscription'); # pour SPIP 2.0
140                if (function_exists('message_inscription')) {
141                        $a = message_inscription($email, $nom, '6forum');
142                } else if (function_exists('formulaires_inscription_traiter_dist')) {
143                        // "pirater" les globals
144                        $_GET['nom_inscription'] = $nom;
145                        $_GET['email_inscription'] = $email;
146                        $a = formulaires_inscription_traiter_dist('6forum', null);
147                }
148                if (!is_array($a)) {
149                        spip_log("erreur sur la creation d'auteur: $a");
150                        next;
151                }
152        }
153
154        // lui donner un cookie_oubli s'il n'en a pas deja un
155        if (!isset($a['cookie_oubli'])) {
156                include_spip('inc/acces'); # pour creer_uniqid
157                $a['cookie_oubli'] = creer_uniqid();
158                sql_updateq('spip_auteurs',
159                        array('cookie_oubli' => $a['cookie_oubli']),
160                        'id_auteur='.$a['id_auteur']
161                );
162        }
163
164        return $a;
165}
166
167
168// Envoi des notifications
169function Notifications_envoi($emails, $subject, $body) {
170        $envoyer_mail = charger_fonction('envoyer_mail','inc');
171        include_spip('inc/filtres'); # pour email_valide()
172
173        // Attention $email peut etre une liste d'adresses, et on verifie qu'elle n'a pas de doublon
174        $emails = array_unique(array_filter(array_map('email_valide',array_map('trim', explode(',',$emails)))));
175        foreach ($emails as $email) {
176                $bodyc = $body;
177                if ($GLOBALS['notifications']['suivi']) {
178                        $a = Notifications_creer_auteur($email);
179                        if (is_array($a)
180                        AND isset($a['id_auteur']))
181                                $url = url_absolue(generer_url_public('suivi'));
182
183                        $bodyc .= "\n\n$url\n";
184                }
185                if (!function_exists('job_queue_add'))
186                        $envoyer_mail($email, $subject, $bodyc);
187                else
188                        job_queue_add('envoyer_mail',"->$email : $subject",array($email, $subject, $bodyc),'inc/');
189        }
190}
191
192// insertion d'une nouvelle signature => mail aux moderateurs
193// definis par la constante _SPIP_MODERATEURS_PETITION
194function Notifications_spip_signatures($x) {
195        include_spip('base/abstract_sql');
196        if (!$GLOBALS['notifications']['moderateurs_signatures'])
197                return $x;
198
199        $id_signature = $x['args']['id_objet'];
200
201        $s = sql_select("*","spip_signatures","id_signature=".intval($id_signature));
202
203        if ($t = sql_fetch($s)) {
204
205                $a = sql_fetsel("titre,lang","spip_articles","id_article=".intval($t['id_article']));
206                lang_select($a['lang']);
207
208                if (function_exists('generer_url_entite')) {
209                        $url = url_absolue(generer_url_entite($t['id_article'], 'article'));
210                } else {
211                        charger_generer_url(false);
212                        $url = url_absolue(suivre_lien(_DIR_RACINE,generer_url_article($t['id_article'], '','', 'publie')));
213                }
214
215
216                // creer la cle de suppression de la signature
217                include_spip('inc/securiser_action');
218                $cle = _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere');
219                $url_suppr =
220                        parametre_url(
221                        parametre_url($url,
222                                'var_confirm', $t['id_signature'], '&'),
223                                'refus', $cle, '&').'#sp'.$t['id_article'];
224
225                $sujet = _L("Nouvelle signature pour la petition ").typo(supprimer_numero($a['titre']));
226
227                $texte = $sujet
228                        . "\n\n** "
229                        . url_absolue($url)
230                        . "\n"
231                        . "\nNom: ". $x['data']['nom_email']
232                        . "\nemail: ". $x['data']['ad_email']
233                        . "\nmessage: ". $x['data']['message']
234                        . "\n\nnom_site: ". $x['data']['nom_site']
235                        . "\nurl_site: ". $x['data']['url_site']
236                        . "\n\n"
237                        . "Cette signature n'a pas encore ete validee ;"
238                        . "\nsi vous souhaitez la supprimer directement :"
239                        . "\n"
240                        . url_absolue($url_suppr)
241                        ;
242
243                Notifications_envoi($GLOBALS['notifications']['moderateurs_signatures'],
244                        $sujet, $texte);
245
246                lang_dselect();
247
248        }
249
250        return $x;
251}
252
253
254
255
256function notifications_forumprive($quoi, $id_forum) {
257        include_spip('base/abstract_sql');
258        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
259        if (!$t = sql_fetch($s))
260                return;
261
262        include_spip('inc/texte');
263        include_spip('inc/filtres');
264        include_spip('inc/autoriser');
265
266
267        // Qui va-t-on prevenir ?
268        $tous = array();
269
270        // 1. Prevenir les auteurs
271        if ($GLOBALS['notifications']['prevenir_auteurs_prive']) {
272
273                // 1.1. Les auteurs du message (si c'est un message)
274                if ($t['id_message']) {
275                        $result = sql_select("auteurs.email","spip_auteurs AS auteurs, spip_auteurs_messages AS lien","lien.id_message=".intval($t['id_message'])." AND auteurs.id_auteur=lien.id_auteur");
276       
277                        while ($qui = sql_fetch($result))
278                                $tous[] = $qui['email'];
279       
280                        if (function_exists('generer_url_entite')) {
281                                $url = url_absolue(generer_url_entite($id_message, 'message'));
282                        } else {
283                                charger_generer_url(false);
284                                $url = generer_url_ecrire('message', 'id_message='.$t['id_message']) .'#id'.$t['id_forum'];
285                        }
286                        $t['texte'] .= "\n\n"._T('forum_ne_repondez_pas')."\n<html>$url</html>";
287                }
288       
289                // 1.2. Les auteurs de l'article (si c'est un article)
290                elseif ($t['id_article']) {
291                        $result = sql_select("auteurs.email","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
292       
293                        while ($qui = sql_fetch($result))
294                                $tous[] = $qui['email'];
295                }
296        }
297
298        // 2. Les moderateurs
299        if ($GLOBALS['notifications']['moderateurs_forum_prive'])
300        foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum_prive']) as $m) {
301                $tous[] = trim($m);
302        }
303
304        // 2. Tous les participants a ce *thread* (desactive pour l'instant)
305        // TODO: proposer une case a cocher ou un lien dans le message
306        // pour se retirer d'un troll (hack: replacer @ par % dans l'email)
307        if ($GLOBALS['notifications']['thread_forum_prive']) {
308                $s = sql_select("DISTINCT(email_auteur)","spip_forum","id_thread=".intval($t['id_thread'])." AND email_auteur != ''");
309                while ($r = sql_fetch($s))
310                        $tous[] = $r['email_auteur'];
311        }
312
313/*
314        // 3. Tous les auteurs des messages qui precedent (desactive egalement)
315        // (possibilite exclusive de la possibilite precedente)
316        // TODO: est-ce utile, par rapport au thread ?
317        else if (defined('_SUIVI_FORUMS_REPONSES')
318        AND _SUIVI_FORUMS_REPONSES) {
319                $id_parent = $id_forum;
320                while ($r = spip_fetch_array(spip_query("SELECT email_auteur, id_parent FROM spip_forum WHERE id_forum=$id_parent AND statut='publie'"))) {
321                        $tous[] = $r['email_auteur'];
322                        $id_parent = $r['id_parent'];
323                }
324        }
325*/
326
327
328        // Nettoyer le tableau
329        // Ne pas ecrire au posteur du message !
330        $destinataires = array();
331        foreach ($tous as $m) {
332                if ($m = email_valide($m)
333                AND $m != trim($t['email_auteur']))
334                        $destinataires[$m]++;
335        }
336
337        //
338        // Envoyer les emails
339        //
340        foreach (array_keys($destinataires) as $email) {
341                $msg = email_notification_forum($t, $email);
342                Notifications_envoi($email, $msg['subject'], $msg['body']);
343        }
344}
345
346
347// cette notification s'execute quand on valide un message 'prop'ose,
348// dans ecrire/inc/forum_insert.php ; ici on va notifier ceux qui ne l'ont
349// pas ete a la notification forumposte (sachant que les deux peuvent se
350// suivre si le forum est valide directement ('pos' ou 'abo')
351function notifications_forumvalide($quoi, $id_forum) {
352        include_spip('base/abstract_sql');
353        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
354        if (!$t = sql_fetch($s))
355                return;
356
357        // forum sur un message prive : pas de notification ici (cron)
358        if ($t['statut'] == 'perso')
359                return;
360
361        include_spip('inc/texte');
362        include_spip('inc/filtres');
363        include_spip('inc/autoriser');
364
365
366        // Qui va-t-on prevenir ?
367        $tous = array();
368        $pasmoi = array();
369
370        // 1. Les auteurs de l'article ; si c'est un article, ceux qui n'ont
371        // pas le droit de le moderer (les autres l'ont recu plus tot)
372        if ($t['id_article']
373        AND $GLOBALS['notifications']['prevenir_auteurs']) {
374                $result = sql_select("auteurs.*","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
375
376                while ($qui = sql_fetch($result)) {
377                        if (!autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
378                                $tous[] = $qui['email'];
379                        else
380                                $pasmoi[] = $qui['email'];
381
382                }
383        }
384
385        // 2. Tous les participants a ce *thread* (desactive pour l'instant)
386        // TODO: proposer une case a cocher ou un lien dans le message
387        // pour se retirer d'un troll (hack: replacer @ par % dans l'email)
388        if ($GLOBALS['notifications']['thread_forum']) {
389                $s = sql_select("DISTINCT(email_auteur)","spip_forum","id_thread=".intval($t['id_thread'])." AND email_auteur != ''");
390                while ($r = sql_fetch($s))
391                        $tous[] = $r['email_auteur'];
392        }
393
394/*
395        // 3. Tous les auteurs des messages qui precedent (desactive egalement)
396        // (possibilite exclusive de la possibilite precedente)
397        // TODO: est-ce utile, par rapport au thread ?
398        else if (defined('_SUIVI_FORUMS_REPONSES')
399        AND _SUIVI_FORUMS_REPONSES
400        AND $t['statut'] == 'publie') {
401                $id_parent = $id_forum;
402                while ($r = spip_fetch_array(spip_query("SELECT email_auteur, id_parent FROM spip_forum WHERE id_forum=$id_parent AND statut='publie'"))) {
403                        $tous[] = $r['email_auteur'];
404                        $id_parent = $r['id_parent'];
405                }
406        }
407*/
408
409        // Nettoyer le tableau
410        // Ne pas ecrire au posteur du message, ni au moderateur qui active le mail,
411        // ni aux auteurs deja notifies precedemment
412        $destinataires = array();
413        foreach ($tous as $m) {
414                if ($m = email_valide($m)
415                AND $m != trim($t['email_auteur'])
416                AND $m != $GLOBALS['auteur_session']['email']
417                AND !in_array($m, $pasmoi))
418                        $destinataires[$m]++;
419        }
420
421        //
422        // Envoyer les emails
423        //
424        foreach (array_keys($destinataires) as $email) {
425                $msg = email_notification_forum($t, $email);
426                Notifications_envoi($email, $msg['subject'], $msg['body']);
427        }
428}
429
430
431
432function notifications_forumposte($quoi, $id_forum) {
433        include_spip('base/abstract_sql');
434        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
435        if (!$t = sql_fetch($s))
436                return;
437
438        include_spip('inc/texte');
439        include_spip('inc/filtres');
440        include_spip('inc/autoriser');
441
442
443        // Qui va-t-on prevenir ?
444        $tous = array();
445
446        // 1. Les auteurs de l'article (si c'est un article), mais
447        // seulement s'ils ont le droit de le moderer (les autres seront
448        // avertis par la notifications_forumvalide).
449        if ($t['id_article']
450        AND $GLOBALS['notifications']['prevenir_auteurs']) {
451                $result = sql_select("auteurs.*","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
452
453                while ($qui = sql_fetch($result)) {
454                        if (autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
455                                $tous[] = $qui['email'];
456                }
457        }
458
459        // 2. Les moderateurs definis par mes_options
460        if ($GLOBALS['notifications']['moderateurs_forum'])
461        foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum']) as $m) {
462                $tous[] = $m;
463        }
464
465
466        // Nettoyer le tableau
467        // Ne pas ecrire au posteur du message !
468        $destinataires = array();
469        foreach ($tous as $m) {
470                if ($m = email_valide($m)
471                AND $m != trim($t['email_auteur']))
472                        $destinataires[$m]++;
473        }
474
475        //
476        // Envoyer les emails
477        //
478        foreach (array_keys($destinataires) as $email) {
479                $msg = email_notification_forum($t, $email);
480                Notifications_envoi($email, $msg['subject'], $msg['body']);
481        }
482
483        // Notifier les autres si le forum est valide
484        if ($t['statut'] == 'publie') {
485                $notifications = charger_fonction('notifications', 'inc');
486                $notifications('forumvalide', $id_forum);
487        }
488
489/* TODO
490        // Envoyer un message de bienvenue/connexion au posteur du forum,
491        // dans le cas ou il ne s'est pas authentifie
492        // Souci : ne pas notifier comme ca si on est deja present dans le thread
493        // (eviter d'avoir deux notificaitons pour ce message qu'on a, dans 99,99%
494        // des cas, poste nous-memes !)
495        if (strlen(trim($t['email_auteur']))
496        AND email_valide($t['email_auteur'])
497        AND !$GLOBALS['visiteur_session']['id_auteur']) {
498                $msg = Notifications_jeuneposteur($t, $email);
499                if ($t['email_auteur'] == 'fil@rezo.net')
500                        Notifications_envoi($t['email_auteur'], $msg['subject'], $msg['body']);
501        }
502*/
503
504}
505
506/*
507// Creer un mail pour les forums envoyes par quelqu'un qui n'est pas authentifie
508// en lui souhaitant la bienvenue et avec un lien suivi&p= de connexion au site
509function Notifications_jeuneposteur($t, $email) {
510        return array('test', 'coucou');
511}
512*/
513
514?>
Note: See TracBrowser for help on using the repository browser.