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

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

utiliser la queue, et sql_

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/',true);
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                foreach (array_keys($destinataires) as $email) {
186                        if (!function_exists('job_queue_add'))
187                                $envoyer_mail($email, $subject, $bodyc);
188                        else
189                                job_queue_add('envoyer_mail',"->$email : $subject",array($email, $subject, $bodyc),'inc/',true);
190                }
191        }
192}
193
194// insertion d'une nouvelle signature => mail aux moderateurs
195// definis par la constante _SPIP_MODERATEURS_PETITION
196function Notifications_spip_signatures($x) {
197        include_spip('base/abstract_sql');
198        if (!$GLOBALS['notifications']['moderateurs_signatures'])
199                return $x;
200
201        $id_signature = $x['args']['id_objet'];
202
203        $s = sql_select("*","spip_signatures","id_signature=".intval($id_signature));
204
205        if ($t = sql_fetch($s)) {
206
207                $a = sql_fetsel("titre,lang","spip_articles","id_article=".intval($t['id_article']));
208                lang_select($a['lang']);
209
210                if (function_exists('generer_url_entite')) {
211                        $url = url_absolue(generer_url_entite($t['id_article'], 'article'));
212                } else {
213                        charger_generer_url(false);
214                        $url = url_absolue(suivre_lien(_DIR_RACINE,generer_url_article($t['id_article'], '','', 'publie')));
215                }
216
217
218                // creer la cle de suppression de la signature
219                include_spip('inc/securiser_action');
220                $cle = _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere');
221                $url_suppr =
222                        parametre_url(
223                        parametre_url($url,
224                                'var_confirm', $t['id_signature'], '&'),
225                                'refus', $cle, '&').'#sp'.$t['id_article'];
226
227                $sujet = _L("Nouvelle signature pour la petition ").typo(supprimer_numero($a['titre']));
228
229                $texte = $sujet
230                        . "\n\n** "
231                        . url_absolue($url)
232                        . "\n"
233                        . "\nNom: ". $x['data']['nom_email']
234                        . "\nemail: ". $x['data']['ad_email']
235                        . "\nmessage: ". $x['data']['message']
236                        . "\n\nnom_site: ". $x['data']['nom_site']
237                        . "\nurl_site: ". $x['data']['url_site']
238                        . "\n\n"
239                        . "Cette signature n'a pas encore ete validee ;"
240                        . "\nsi vous souhaitez la supprimer directement :"
241                        . "\n"
242                        . url_absolue($url_suppr)
243                        ;
244
245                Notifications_envoi($GLOBALS['notifications']['moderateurs_signatures'],
246                        $sujet, $texte);
247
248                lang_dselect();
249
250        }
251
252        return $x;
253}
254
255
256
257
258function notifications_forumprive($quoi, $id_forum) {
259        include_spip('base/abstract_sql');
260        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
261        if (!$t = sql_fetch($s))
262                return;
263
264        include_spip('inc/texte');
265        include_spip('inc/filtres');
266        include_spip('inc/autoriser');
267
268
269        // Qui va-t-on prevenir ?
270        $tous = array();
271
272        // 1. Prevenir les auteurs
273        if ($GLOBALS['notifications']['prevenir_auteurs_prive']) {
274
275                // 1.1. Les auteurs du message (si c'est un message)
276                if ($t['id_message']) {
277                        $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");
278       
279                        while ($qui = sql_fetch($result))
280                                $tous[] = $qui['email'];
281       
282                        if (function_exists('generer_url_entite')) {
283                                $url = url_absolue(generer_url_entite($id_message, 'message'));
284                        } else {
285                                charger_generer_url(false);
286                                $url = generer_url_ecrire('message', 'id_message='.$t['id_message']) .'#id'.$t['id_forum'];
287                        }
288                        $t['texte'] .= "\n\n"._T('forum_ne_repondez_pas')."\n<html>$url</html>";
289                }
290       
291                // 1.2. Les auteurs de l'article (si c'est un article)
292                elseif ($t['id_article']) {
293                        $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");
294       
295                        while ($qui = sql_fetch($result))
296                                $tous[] = $qui['email'];
297                }
298        }
299
300        // 2. Les moderateurs
301        if ($GLOBALS['notifications']['moderateurs_forum_prive'])
302        foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum_prive']) as $m) {
303                $tous[] = trim($m);
304        }
305
306        // 2. Tous les participants a ce *thread* (desactive pour l'instant)
307        // TODO: proposer une case a cocher ou un lien dans le message
308        // pour se retirer d'un troll (hack: replacer @ par % dans l'email)
309        if ($GLOBALS['notifications']['thread_forum_prive']) {
310                $s = sql_select("DISTINCT(email_auteur)","spip_forum","id_thread=".intval($t['id_thread'])." AND email_auteur != ''");
311                while ($r = sql_fetch($s))
312                        $tous[] = $r['email_auteur'];
313        }
314
315/*
316        // 3. Tous les auteurs des messages qui precedent (desactive egalement)
317        // (possibilite exclusive de la possibilite precedente)
318        // TODO: est-ce utile, par rapport au thread ?
319        else if (defined('_SUIVI_FORUMS_REPONSES')
320        AND _SUIVI_FORUMS_REPONSES) {
321                $id_parent = $id_forum;
322                while ($r = spip_fetch_array(spip_query("SELECT email_auteur, id_parent FROM spip_forum WHERE id_forum=$id_parent AND statut='publie'"))) {
323                        $tous[] = $r['email_auteur'];
324                        $id_parent = $r['id_parent'];
325                }
326        }
327*/
328
329
330        // Nettoyer le tableau
331        // Ne pas ecrire au posteur du message !
332        $destinataires = array();
333        foreach ($tous as $m) {
334                if ($m = email_valide($m)
335                AND $m != trim($t['email_auteur']))
336                        $destinataires[$m]++;
337        }
338
339        //
340        // Envoyer les emails
341        //
342        foreach (array_keys($destinataires) as $email) {
343                $msg = email_notification_forum($t, $email);
344                Notifications_envoi($email, $msg['subject'], $msg['body']);
345        }
346}
347
348
349// cette notification s'execute quand on valide un message 'prop'ose,
350// dans ecrire/inc/forum_insert.php ; ici on va notifier ceux qui ne l'ont
351// pas ete a la notification forumposte (sachant que les deux peuvent se
352// suivre si le forum est valide directement ('pos' ou 'abo')
353function notifications_forumvalide($quoi, $id_forum) {
354        include_spip('base/abstract_sql');
355        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
356        if (!$t = sql_fetch($s))
357                return;
358
359        // forum sur un message prive : pas de notification ici (cron)
360        if ($t['statut'] == 'perso')
361                return;
362
363        include_spip('inc/texte');
364        include_spip('inc/filtres');
365        include_spip('inc/autoriser');
366
367
368        // Qui va-t-on prevenir ?
369        $tous = array();
370        $pasmoi = array();
371
372        // 1. Les auteurs de l'article ; si c'est un article, ceux qui n'ont
373        // pas le droit de le moderer (les autres l'ont recu plus tot)
374        if ($t['id_article']
375        AND $GLOBALS['notifications']['prevenir_auteurs']) {
376                $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");
377
378                while ($qui = sql_fetch($result)) {
379                        if (!autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
380                                $tous[] = $qui['email'];
381                        else
382                                $pasmoi[] = $qui['email'];
383
384                }
385        }
386
387        // 2. Tous les participants a ce *thread* (desactive pour l'instant)
388        // TODO: proposer une case a cocher ou un lien dans le message
389        // pour se retirer d'un troll (hack: replacer @ par % dans l'email)
390        if ($GLOBALS['notifications']['thread_forum']) {
391                $s = sql_select("DISTINCT(email_auteur)","spip_forum","id_thread=".intval($t['id_thread'])." AND email_auteur != ''");
392                while ($r = sql_fetch($s))
393                        $tous[] = $r['email_auteur'];
394        }
395
396/*
397        // 3. Tous les auteurs des messages qui precedent (desactive egalement)
398        // (possibilite exclusive de la possibilite precedente)
399        // TODO: est-ce utile, par rapport au thread ?
400        else if (defined('_SUIVI_FORUMS_REPONSES')
401        AND _SUIVI_FORUMS_REPONSES
402        AND $t['statut'] == 'publie') {
403                $id_parent = $id_forum;
404                while ($r = spip_fetch_array(spip_query("SELECT email_auteur, id_parent FROM spip_forum WHERE id_forum=$id_parent AND statut='publie'"))) {
405                        $tous[] = $r['email_auteur'];
406                        $id_parent = $r['id_parent'];
407                }
408        }
409*/
410
411        // Nettoyer le tableau
412        // Ne pas ecrire au posteur du message, ni au moderateur qui active le mail,
413        // ni aux auteurs deja notifies precedemment
414        $destinataires = array();
415        foreach ($tous as $m) {
416                if ($m = email_valide($m)
417                AND $m != trim($t['email_auteur'])
418                AND $m != $GLOBALS['auteur_session']['email']
419                AND !in_array($m, $pasmoi))
420                        $destinataires[$m]++;
421        }
422
423        //
424        // Envoyer les emails
425        //
426        foreach (array_keys($destinataires) as $email) {
427                $msg = email_notification_forum($t, $email);
428                Notifications_envoi($email, $msg['subject'], $msg['body']);
429        }
430}
431
432
433
434function notifications_forumposte($quoi, $id_forum) {
435        include_spip('base/abstract_sql');
436        $s = sql_select("*","spip_forum","id_forum=".intval($id_forum));
437        if (!$t = sql_fetch($s))
438                return;
439
440        include_spip('inc/texte');
441        include_spip('inc/filtres');
442        include_spip('inc/autoriser');
443
444
445        // Qui va-t-on prevenir ?
446        $tous = array();
447
448        // 1. Les auteurs de l'article (si c'est un article), mais
449        // seulement s'ils ont le droit de le moderer (les autres seront
450        // avertis par la notifications_forumvalide).
451        if ($t['id_article']
452        AND $GLOBALS['notifications']['prevenir_auteurs']) {
453                $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");
454
455                while ($qui = sql_fetch($result)) {
456                        if (autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
457                                $tous[] = $qui['email'];
458                }
459        }
460
461        // 2. Les moderateurs definis par mes_options
462        if ($GLOBALS['notifications']['moderateurs_forum'])
463        foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum']) as $m) {
464                $tous[] = $m;
465        }
466
467
468        // Nettoyer le tableau
469        // Ne pas ecrire au posteur du message !
470        $destinataires = array();
471        foreach ($tous as $m) {
472                if ($m = email_valide($m)
473                AND $m != trim($t['email_auteur']))
474                        $destinataires[$m]++;
475        }
476
477        //
478        // Envoyer les emails
479        //
480        foreach (array_keys($destinataires) as $email) {
481                $msg = email_notification_forum($t, $email);
482                Notifications_envoi($email, $msg['subject'], $msg['body']);
483        }
484
485        // Notifier les autres si le forum est valide
486        if ($t['statut'] == 'publie') {
487                $notifications = charger_fonction('notifications', 'inc');
488                $notifications('forumvalide', $id_forum);
489        }
490
491/* TODO
492        // Envoyer un message de bienvenue/connexion au posteur du forum,
493        // dans le cas ou il ne s'est pas authentifie
494        // Souci : ne pas notifier comme ca si on est deja present dans le thread
495        // (eviter d'avoir deux notificaitons pour ce message qu'on a, dans 99,99%
496        // des cas, poste nous-memes !)
497        if (strlen(trim($t['email_auteur']))
498        AND email_valide($t['email_auteur'])
499        AND !$GLOBALS['visiteur_session']['id_auteur']) {
500                $msg = Notifications_jeuneposteur($t, $email);
501                if ($t['email_auteur'] == 'fil@rezo.net')
502                        Notifications_envoi($t['email_auteur'], $msg['subject'], $msg['body']);
503        }
504*/
505
506}
507
508/*
509// Creer un mail pour les forums envoyes par quelqu'un qui n'est pas authentifie
510// en lui souhaitant la bienvenue et avec un lien suivi&p= de connexion au site
511function Notifications_jeuneposteur($t, $email) {
512        return array('test', 'coucou');
513}
514*/
515
516?>
Note: See TracBrowser for help on using the repository browser.