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