16cd99fb |
1 | <?php |
2 | /*************************************************************************** |
3 | * Copyright (C) 2003-2007 Polytechnique.org * |
4 | * http://opensource.polytechnique.org/ * |
5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * |
10 | * * |
11 | * This program is distributed in the hope that it will be useful, * |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
14 | * GNU General Public License for more details. * |
15 | * * |
16 | * You should have received a copy of the GNU General Public License * |
17 | * along with this program; if not, write to the Free Software * |
18 | * Foundation, Inc., * |
19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
20 | ***************************************************************************/ |
21 | |
22 | require_once("xorg.misc.inc.php"); |
23 | |
24 | // {{{ class MassMailer |
25 | |
26 | abstract class MassMailer |
27 | { |
28 | private $_tpl; |
29 | private $_css; |
30 | private $_prefix; |
31 | |
32 | public $_id; |
33 | public $_shortname; |
34 | public $_title; |
35 | public $_title_mail; |
36 | |
37 | public $_head; |
38 | |
fc9d9368 |
39 | protected $_table; |
40 | protected $_subscriptionTable; |
41 | |
42 | function __construct($tpl, $css, $prefix, $tbl, $stbl) |
16cd99fb |
43 | { |
44 | $this->_tpl = $tpl; |
45 | $this->_css = $css; |
46 | $this->_prefix = $prefix; |
fc9d9368 |
47 | $this->_table = $tbl; |
48 | $this->_subscriptionTable = $stbl; |
16cd99fb |
49 | } |
50 | |
51 | public function id() |
52 | { |
53 | return is_null($this->_shortname) ? $this->_id : $this->_shortname; |
54 | } |
55 | |
fc9d9368 |
56 | private function selectId($where) |
57 | { |
58 | $res = XDB::query("SELECT IF (n.short_name IS NULL, n.id, n.short_name) |
59 | FROM {$this->_table} AS n |
60 | WHERE n.bits != 'new' AND {$where} |
eaf30d86 |
61 | LIMIT 1"); |
fc9d9368 |
62 | if ($res->numRows() != 1) { |
63 | return null; |
64 | } |
65 | return $res->fetchOneCell(); |
66 | } |
67 | |
68 | public function prev() |
69 | { |
70 | static $val; |
71 | if (!isset($val)) { |
72 | $val = $this->selectId("n.id < {$this->_id} ORDER BY n.id DESC"); |
73 | } |
74 | return $val; |
75 | } |
76 | |
77 | public function next() |
78 | { |
79 | static $val; |
80 | if (!isset($val)) { |
81 | $val = $this->selectId("n.id > {$this->_id} ORDER BY n.id"); |
82 | } |
83 | return $val; |
84 | } |
85 | |
86 | public function last() |
87 | { |
88 | static $val; |
89 | if (!isset($val)) { |
90 | $res = XDB::query("SELECT MAX(n.id) |
91 | FROM {$this->_table} AS n |
92 | WHERE n.bits != 'new' AND n.id > {?}", |
93 | $this->_id); |
94 | if ($res->numRows() != 1) { |
95 | $val = null; |
96 | } else { |
97 | $val = $res->fetchOneCell(); |
98 | } |
99 | } |
100 | return $val; |
101 | } |
102 | |
16cd99fb |
103 | public function title($mail = false) |
104 | { |
105 | return $mail ? $this->_title_mail : $this->_title; |
106 | } |
107 | |
108 | public function head($prenom = null, $nom = null, $sexe = null, $type = 'text') |
109 | { |
110 | if (is_null($prenom)) { |
eaf30d86 |
111 | return $this->_head; |
16cd99fb |
112 | } else { |
113 | $head = $this->_head; |
a7de4ef7 |
114 | $head = str_replace('<cher>', $sexe ? 'Chère' : 'Cher', $head); |
16cd99fb |
115 | $head = str_replace('<prenom>', $prenom, $head); |
116 | $head = str_replace('<nom>', $nom, $head); |
8da0d3c1 |
117 | return format_text($head, $type, 2, 64); |
16cd99fb |
118 | } |
119 | } |
120 | |
121 | public function css(&$page = null) |
122 | { |
123 | if (!is_null($page)) { |
124 | $page->addCssLink($this->_css); |
125 | return true; |
126 | } else { |
127 | $css = file_get_contents(dirname(__FILE__) . '/../htdocs/css/' . $this->_css); |
a14159bf |
128 | return preg_replace('@/\*.*?\*/@us', '', $css); |
16cd99fb |
129 | } |
130 | } |
131 | |
132 | public function toText(&$page, $prenom, $nom, $sexe) |
133 | { |
134 | $this->css($page); |
135 | $page->assign('is_mail', false); |
3ad44e08 |
136 | $page->assign('mail_part', 'text'); |
16cd99fb |
137 | $page->assign('prenom', $prenom); |
138 | $page->assign('nom', $nom); |
139 | $page->assign('sexe', $sexe); |
140 | $this->assignData($page); |
141 | } |
142 | |
143 | public function toHtml(&$page, $prenom, $nom, $sexe) |
144 | { |
145 | $this->css($page); |
146 | $page->assign('prefix', $this->_prefix . '/' . $this->id()); |
147 | $page->assign('is_mail', false); |
3ad44e08 |
148 | $page->assign('mail_part', 'html'); |
16cd99fb |
149 | $page->assign('prenom', $prenom); |
150 | $page->assign('nom', $nom); |
151 | $page->assign('sexe', $sexe); |
152 | $this->assignData($page); |
153 | } |
154 | |
a0f05027 |
155 | public function sendTo($prenom, $nom, $login, $sexe, $html, $hash = 0) |
16cd99fb |
156 | { |
157 | global $globals; |
a0f05027 |
158 | if (strpos($login, '@') === false) { |
159 | $login = "$login@{$globals->mail->domain}"; |
160 | } |
16cd99fb |
161 | |
162 | $mailer = new PlMailer($this->_tpl); |
163 | $this->assignData($mailer); |
164 | $mailer->assign('is_mail', true); |
165 | $mailer->assign('prenom', $prenom); |
166 | $mailer->assign('nom', $nom); |
167 | $mailer->assign('sexe', $sexe); |
168 | $mailer->assign('prefix', null); |
a0f05027 |
169 | $mailer->assign('hash', $hash); |
170 | $mailer->addTo("\"$prenom $nom\" <$login>"); |
16cd99fb |
171 | $mailer->send($html); |
172 | } |
173 | |
a0f05027 |
174 | protected function getAllRecipients() |
175 | { |
b2192733 |
176 | global $globals; |
177 | return "SELECT u.user_id, CONCAT(a.alias, '@{$globals->mail->domain}'), |
a0f05027 |
178 | u.prenom, IF(u.nom_usage='', u.nom, u.nom_usage), |
179 | FIND_IN_SET('femme', u.flags), |
180 | q.core_mail_fmt AS pref, 0 AS hash |
fc9d9368 |
181 | FROM {$this->_subscriptionTable} AS ni |
a0f05027 |
182 | INNER JOIN auth_user_md5 AS u USING(user_id) |
183 | INNER JOIN auth_user_quick AS q ON(q.user_id = u.user_id) |
184 | INNER JOIN aliases AS a ON(u.user_id=a.id AND FIND_IN_SET('bestalias',a.flags)) |
185 | LEFT JOIN emails AS e ON(e.uid=u.user_id AND e.flags='active') |
186 | WHERE ni.last < {?} AND ({$this->subscriptionWhere()}) AND e.email IS NOT NULL |
187 | GROUP BY u.user_id"; |
188 | } |
189 | |
16cd99fb |
190 | public function sendToAll() |
191 | { |
192 | $this->setSent(); |
a0f05027 |
193 | $query = $this->getAllRecipients() . " LIMIT {?}"; |
16cd99fb |
194 | while (true) { |
a0f05027 |
195 | $res = XDB::iterRow($query, $this->_id, 60); |
16cd99fb |
196 | if (!$res->total()) { |
4e25428d |
197 | return; |
16cd99fb |
198 | } |
199 | $sent = array(); |
a0f05027 |
200 | while (list($uid, $bestalias, $prenom, $nom, $sexe, $fmt, $hash) = $res->next()) { |
201 | $sent[] = "(user_id='$uid'" . (!$uid ? " AND email='$bestalias')": ')'); |
202 | $this->sendTo($prenom, $nom, $bestalias, $sexe, $fmt=='html', $hash); |
16cd99fb |
203 | } |
fc9d9368 |
204 | XDB::execute("UPDATE {$this->_subscriptionTable} |
16cd99fb |
205 | SET last = {?} |
206 | WHERE " . implode(' OR ', $sent), $this->_id); |
eaf30d86 |
207 | |
16cd99fb |
208 | sleep(60); |
209 | } |
210 | } |
211 | |
212 | abstract protected function assignData(&$smarty); |
213 | abstract protected function setSent(); |
214 | |
16cd99fb |
215 | abstract protected function subscriptionWhere(); |
216 | } |
217 | |
218 | // }}} |
219 | // {{{ Functions |
220 | |
8da0d3c1 |
221 | function format_text($input, $format, $indent = 0, $width = 68) |
222 | { |
223 | if ($format == 'text') { |
02fdd1c8 |
224 | return MiniWiki::WikiToText($input, true, $indent, $width, "title"); |
8da0d3c1 |
225 | } |
02fdd1c8 |
226 | return MiniWiki::WikiToHTML($input, "title"); |
8da0d3c1 |
227 | } |
228 | |
02fdd1c8 |
229 | // function enriched_to_text($input,$html=false,$just=false,$indent=0,$width=68) |
16cd99fb |
230 | |
231 | // }}} |
232 | |
a7de4ef7 |
233 | // vim:set et sw=4 sts=4 sws=4 enc=utf-8: |
16cd99fb |
234 | ?> |