[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / organiseur / inc / messages.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 include_spip('inc/filtres');
18 include_spip('base/abstract_sql');
19
20 if (!defined('_EMAIL_GENERAL')) {
21 define('_EMAIL_GENERAL', 'general');
22 } // permet aux admin d'envoyer un email a tout le monde
23
24 /**
25 * Lister les statuts des auteurs pouvant recevoir un message
26 * c'est tous les auteurs au moins redacteur
27 *
28 * @return array
29 */
30 function messagerie_statuts_destinataires_possibles() {
31 include_spip('inc/filtres_ecrire');
32
33 return pipeline('messagerie_statuts_destinataires_possibles', auteurs_lister_statuts('redacteurs', false));
34 }
35
36 /**
37 * Nettoyer une liste de destinataires
38 *
39 * @param $destinataires
40 * @return array
41 */
42 function messagerie_nettoyer_destinataires($destinataires) {
43 foreach ($destinataires as $k => $id) {
44 // il se peut que l'id recupere l'ancre qui suit avec certains ie ... :(
45 if (preg_match(',^[0-9]+#[a-z_0-9]+,', $id)) {
46 $destinataires[$k] = intval($id);
47 }
48 }
49
50 return $destinataires;
51 }
52
53 /**
54 * Fonction generique de verification des destinataires
55 * lors de l'envoi d'un message ou de recommander
56 * un destinataire peut etre un id_auteur numerique
57 * ou une adresse mail valide, si l'options accepter_email est true
58 *
59 * @param array $destinataires
60 * @param array $options
61 * @return array
62 */
63 function messagerie_verifier_destinataires($destinataires, $options = array('accepter_email' => true)) {
64 $erreurs = array();
65
66 $destinataires = messagerie_nettoyer_destinataires($destinataires);
67 foreach ($destinataires as $id) {
68 if (is_numeric($id)) {
69 if (!$id) {
70 $erreurs[] = _T('organiseur:erreur_destinataire_invalide', array('dest' => entites_html($id)));
71 }
72 } else {
73 if (!$options['accepter_email']
74 or !email_valide($id)
75 ) {
76 $erreurs[] = _T('organiseur:erreur_destinataire_invalide', array('dest' => entites_html($id)));
77 }
78 }
79 }
80
81 return $erreurs;
82 }
83
84 /**
85 * Selectionner les destinataires en distinguant emails et id_auteur
86 *
87 * @param array $dests
88 * @return array
89 */
90 function messagerie_destiner($dests) {
91 // separer les destinataires auteur des destinataires email
92 $auteurs_dest = array();
93 $email_dests = array();
94
95 $dests = messagerie_nettoyer_destinataires($dests);
96 foreach ($dests as $id) {
97 if (is_numeric($id)) {
98 $auteurs_dest[] = $id;
99 } elseif (defined('_MESSAGERIE_EMAIL_GENERAL') and $id != _MESSAGERIE_EMAIL_GENERAL) {
100 $email_dests[] = $id;
101 }
102 }
103 if (count($email_dests)) {
104 // retrouver les id des emails pour ceux qui sont en base
105 $res = sql_select('id_auteur,email', 'spip_auteurs', sql_in('email', $email_dests));
106 $auteurs_dest_found = array();
107 while ($row = sql_fetch($res)) {
108 $auteurs_dest_found[] = $row['id_auteur'];
109 }
110 $auteurs_dest = array_merge($auteurs_dest, $auteurs_dest_found);
111 }
112
113 return array($auteurs_dest, $email_dests);
114 }
115
116 /**
117 * Diffuser un message par la messagerie interne
118 *
119 * @param int $id_message
120 * @param array $auteurs_dest
121 * @return bool|int
122 */
123 function messagerie_diffuser_message($id_message, $auteurs_dest = array()) {
124 $out = false;
125 if ($id_message = intval($id_message)
126 and count($auteurs_dest)
127 ) {
128 include_spip('action/editer_liens');
129 $out = objet_associer(array('auteur' => $auteurs_dest), array('message' => $id_message), array('vu' => 'non'));
130 }
131
132 return $out;
133 }
134
135 /**
136 * Envoyer un message par mail pour les destinataires externes
137 *
138 * @param int $id_message
139 * @param array $emails_dest
140 * @return bool
141 */
142 function messagerie_mailer_message($id_message, $emails_dest = array()) {
143 if ($id_message = intval($id_message)
144 and count($emails_dest)
145 ) {
146 if ($row = sql_fetsel('titre,texte,id_auteur', 'spip_messages', 'id_message=' . intval($id_message))) {
147 $from = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . $row['id_auteur']);
148 foreach ($emails_dest as $email) {
149 job_queue_add(
150 'envoyer_mail',
151 'messagerie mail',
152 array($email, $row['titre'], array('texte' => $row['texte'], 'from' => $from)),
153 'inc/'
154 );
155 }
156
157 return true;
158 }
159 }
160
161 return false;
162 }
163
164 /**
165 * Marquer un message dans l'etat indique par $vu
166 *
167 * @param int $id_auteur
168 * @param array $liste
169 * @param string $vu
170 * @return void
171 */
172 function messagerie_marquer_message($id_auteur, $liste, $vu) {
173 include_spip('action/editer_liens');
174 if (!is_array($liste)) {
175 $liste = array($liste);
176 }
177 // completer les liens qui n'existent pas encore
178 // ex : pour marquer lue une annonce, on ajoute le lien d'abord (n'existe pas)
179 // puis on le marque 'oui'
180 $liens = objet_trouver_liens(array('auteur' => $id_auteur), array('message' => $liste));
181 $l = array();
182 foreach ($liens as $lien) {
183 $l[] = $lien['message'];
184 }
185 objet_associer(array('auteur' => $id_auteur), array('message' => array_diff($liste, $l)), array('vu' => $vu));
186 // puis les marquer tous lus
187 objet_qualifier_liens(array('auteur' => $id_auteur), array('message' => $liste), array('vu' => $vu));
188 include_spip('inc/invalideur');
189 suivre_invalideur('message/' . implode(',', $liste));
190 }
191
192 /**
193 * Marquer un message comme lu
194 *
195 * @param int $id_auteur
196 * @param array $liste_id_message
197 */
198 function messagerie_marquer_lus($id_auteur, $liste_id_message) {
199 messagerie_marquer_message($id_auteur, $liste_id_message, 'oui');
200 }
201
202 /**
203 * Marquer un message comme non lu
204 *
205 * @param int $id_auteur
206 * @param array $liste_id_message
207 */
208 function messagerie_marquer_non_lus($id_auteur, $liste_id_message) {
209 messagerie_marquer_message($id_auteur, $liste_id_message, 'non');
210 }
211
212 /**
213 * Effacer un message recu
214 *
215 * @param int $id_auteur
216 * @param array $liste_id_message
217 */
218 function messagerie_effacer_message_recu($id_auteur, $liste_id_message) {
219 messagerie_marquer_message($id_auteur, $liste_id_message, 'poub');
220 }