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