Port marketing.
[platal.git] / include / marketing.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2009 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 class Marketing
23 {
24 static private $engines = array(
25 //user name => array(class name, require data)
26 'annuaire' => array('AnnuaireMarketing', false),
27 'groupe' => array('GroupMarketing', true),
28 'liste' => array('ListMarketing', true),
29 );
30
31 private $engine;
32 public $sender_mail;
33 public $user;
34
35 private $type;
36 private $data;
37 private $from;
38 private $sender;
39
40 private $hash = '';
41
42 public function __construct($uid, $email, $type, $data, $from, $sender = null)
43 {
44 $this->user = $this->getUser($uid, $email);
45 $this->sender_mail = $this->getFrom($from, $sender);
46 $this->engine =& $this->getEngine($type, $data, $from == 'user' ? $sender : null);
47
48 $this->type = $type;
49 $this->data = $data;
50 $this->from = $from;
51 $this->sender = $sender;
52 }
53
54 private function getUser($uid, $email)
55 {
56 $user = User::getSilent($uid);
57 if (!$user) {
58 return null;
59 }
60
61 global $globals;
62 return array(
63 'user' => $user,
64 'id' => $user->id(),
65 'sexe' => $user->isFemale(),
66 'mail' => $email,
67 'to' => '"' . $user->fullName() . '" <' . $email . '>',
68 'forlife_email' => $user->login() . '@' . $globals->mail->domain,
69 'forlife_email2' => $user->login() . '@' . $globals->mail->domain2,
70 );
71 }
72
73 private function getFrom($from, $sender)
74 {
75 global $globals;
76
77 if ($from == 'staff' || !($user = User::getSilent($sender))) {
78 return '"L\'équipe de Polytechnique.org" <register@' . $globals->mail->domain . '>';
79 }
80 return '"' . $user->fullName() . '" <' . $user->bestEmail() . '>';
81 }
82
83 private function &getEngine($type, $data, $from)
84 {
85 $class = $type . 'Marketing';
86 if (!class_exists($class, false)) {
87 $class= 'DefaultMarketing';
88 }
89 $engine = new $class($data, $from);
90 if (!$engine instanceof MarketingEngine) {
91 $engine = null;
92 }
93 return $engine;
94 }
95
96 public function getTitle()
97 {
98 return $this->engine->getTitle();
99 }
100
101 public function getText()
102 {
103 return $this->engine->getText($this->user);
104 }
105
106 public function send($title = null, $text = null)
107 {
108 $this->hash = rand_url_id(12);
109 if (!$title) {
110 $title = $this->engine->getTitle();
111 }
112 if (!$text) {
113 $text = $this->engine->getText($this->user);
114 }
115 $sender = substr($this->sender_mail, 1, strpos($this->sender_mail, '"', 2)-1);
116 $text = str_replace(array("%%hash%%", "%%sender%%"),
117 array($this->hash, $this->sender_mail),
118 $text);
119 $mailer = new PlMailer();
120 $mailer->setFrom($this->sender_mail);
121 $mailer->addTo($this->user['mail']);
122 $mailer->setSubject($title);
123 $mailer->setTxtBody($text);
124 $mailer->send();
125 $this->incr();
126 }
127
128 public function add($valid = true)
129 {
130 XDB::execute('INSERT IGNORE INTO register_marketing
131 (uid, sender, email, date, last, nb, type, hash, message, message_data)
132 VALUES ({?}, {?}, {?}, NOW(), 0, 0, {?}, {?}, {?}, {?})',
133 $this->user['id'], $this->sender, $this->user['mail'], $this->from, $this->hash,
134 $this->type, $this->data);
135 $this->engine->process($this->user);
136 if ($valid) {
137 require_once 'validations.inc.php';
138 $valid = new MarkReq(User::getSilent($this->sender), $this->user['user'], $this->user['mail'],
139 $this->from == 'user', $this->type, $this->data);
140 $valid->submit();
141 }
142 return true;
143 }
144
145 private function incr()
146 {
147 XDB::execute('UPDATE register_marketing
148 SET nb=nb+1, hash={?}, last=NOW()
149 WHERE uid={?} AND email={?}',
150 $this->hash, $this->user['id'], $this->user['mail']);
151 }
152
153 static public function getEngineList($exclude_data = true)
154 {
155 $array = array();
156 foreach (Marketing::$engines as $e => $d) {
157 if (!$d[1] || !$exclude_data) {
158 $array[] = $e;
159 }
160 }
161 return $array;
162 }
163
164 static public function get($uid, $email, $recentOnly = false)
165 {
166 $res = XDB::query("SELECT uid, email, message, message_data, type, sender
167 FROM register_marketing
168 WHERE uid = {?}
169 AND email = {?}".(
170 $recentOnly ? ' AND DATEDIFF(NOW(), last) < 30' : ''), $uid, $email);
171
172 if ($res->numRows() == 0) {
173 return null;
174 }
175 list ($uid, $email, $type, $data, $from, $sender) = $res->fetchOneRow();
176 return new Marketing($uid, $email, $type, $data, $from, $sender);
177 }
178
179 static public function clear($uid, $email = null)
180 {
181 if (!$email) {
182 XDB::execute("DELETE FROM register_marketing WHERE uid = {?}", $uid);
183 } else {
184 XDB::execute("DELETE FROM register_marketing WHERE uid = {?} AND email = {?}", $uid, $email);
185 }
186 }
187
188 static public function getAliveUsersCount()
189 {
190 return new UserFilter(new UFC_Not(new UFC_Dead()))->getTotalCount();
191 }
192
193 static public function relance(PlUser &$user, $nbx = -1)
194 {
195 global $globals;
196
197 if ($nbx < 0) {
198 $nbx = self::getAliveUsersCount();
199 }
200
201 $res = XDB:i:fetchOneCell('SELECT r.date, r.email, r.bestalias
202 FROM register_pending
203 WHERE r.hash = \'INSCRIT\' AND uid = {?}',
204 $user->id());
205 if (!$res) {
206 return false;
207 } else {
208 list($date, $email, $alias) = $res;
209 }
210
211 $hash = rand_url_id(12);
212 $pass = rand_pass();
213 $pass_encrypted = sha1($pass);
214 $fdate = strftime('%d %B %Y', strtotime($date));
215
216 $mymail = new PlMailer('marketing/relance.mail.tpl');
217 $mymail->assign('nbdix', $nbx);
218 $mymail->assign('fdate', $fdate);
219 $mymail->assign('lusername', $alias);
220 $mymail->assign('nveau_pass', $pass);
221 $mymail->assign('baseurl', $globals->baseurl);
222 $mymail->assign('lins_id', $hash);
223 $mymail->assign('lemail', $email);
224 $mymail->assign('subj', $alias.'@'.$globals->mail->domain);
225 $mymail->send();
226 XDB::execute('UPDATE register_pending
227 SET hash={?}, password={?}, relance=NOW()
228 WHERE uid={?}', $hash, $pass_encrypted, $user->id());
229 return $user->fullName();
230 }
231 }
232
233 interface MarketingEngine
234 {
235 public function __construct($data, $from);
236 public function getTitle();
237 public function getText(array $user);
238 public function process(array $user);
239 }
240
241 //
242 class AnnuaireMarketing implements MarketingEngine
243 {
244 protected $titre;
245 protected $intro;
246 protected $signature;
247
248 public function __construct($data, $from)
249 {
250 $this->titre = "Rejoins la communauté polytechnicienne sur Internet";
251 $this->intro = " Tu n'as pas de fiche dans l'annuaire des polytechniciens sur Internet. "
252 . "Pour y figurer, il te suffit de visiter cette page ou de copier cette adresse "
253 . "dans la barre de ton navigateur :";
254 if ($from === null) {
255 $this->signature = "L'équipe de Polytechnique.org,\n"
256 . "Le portail des élèves & anciens élèves de l'École polytechnique";
257 } else {
258 $this->signature = "%%sender%%";
259 }
260 }
261
262 public function getTitle()
263 {
264 return $this->titre;
265 }
266
267 private function getIntro()
268 {
269 return $this->intro;
270 }
271
272 public function getSignature()
273 {
274 return $this->signature;
275 }
276
277 protected function prepareText(PlPage &$page, array $user)
278 {
279 $page->assign('intro', $this->getIntro());
280 $page->assign('u', $user);
281 $page->assign('sign', $this->getSignature());
282 $page->assign('num_users', self::getAliveUsersCount());
283 }
284
285 public function getText(array $user)
286 {
287 $page = new XorgPage();
288 $page->changeTpl('marketing/marketing.mail.tpl', NO_SKIN);
289 $this->prepareText($page, $user);
290 return $page->raw();
291 }
292
293 public function process(array $user)
294 {
295 }
296 }
297
298 class ListMarketing extends AnnuaireMarketing
299 {
300 private $name;
301 private $domain;
302 public function __construct($data, $from)
303 {
304 list($this->name, $this->domain) = explode('@', $data);
305 if ($from && ($user = User::getSilent($from))) {
306 $from = $user->fullName();
307 } else {
308 $from = "Je";
309 }
310 $this->titre = "Un camarade solicite ton inscription à $data";
311 $this->intro = "Polytechnique.org, l'annuaire des polytechniciens sur internet, "
312 . "fournit de nombreux services aux groupes X, ainsi que des listes "
313 . "de diffusion pour les X en faisant la demande.\n\n"
314 . "$from solicite ton inscription à la liste <$data>. "
315 . "Cependant, seuls les X inscrits sur Polytechnique.org peuvent "
316 . "profiter de l'ensemble de nos services, c'est pourquoi nous te "
317 . "proposons auparavant de t'inscrire sur notre site. Pour cela, il "
318 . "te suffit de visiter cette page ou de copier cette adresse dans "
319 . "la barre de ton navigateur :";
320 }
321
322 public function process(array $user)
323 {
324 return XDB::execute("REPLACE INTO register_subs (uid, type, sub, domain)
325 VALUES ({?}, 'list', {?}, {?})",
326 $user['id'], $this->name, $this->domain);
327 }
328 }
329
330 class GroupMarketing extends AnnuaireMarketing
331 {
332 private $group;
333 public function __construct($data, $from)
334 {
335 $this->group = $data;
336 if ($from && ($user = User::getSilent($from))) {
337 $from = $user->fullName() . " vient";
338 } else {
339 $from = "Je viens";
340 }
341 $this->titre = "Profite de ton inscription au groupe \"$data\" pour découvrir Polytechnique.org";
342 $this->intro = "Polytechnique.org, l'annuaire des polytechniciens sur internet, fournit "
343 . "de nombreux services aux groupes X ( listes de diffusion, paiement en "
344 . "ligne, sites internet...), en particulier pour le groupe \"$data\"\n\n"
345 . "$from de t'inscrire dans l'annuaire du groupe \"$data\". "
346 . "Cependant, seuls les X inscrits sur Polytechnique.org peuvent profiter "
347 . "de l'ensemble de nos services, c'est pourquoi nous te proposons de "
348 . "t'inscrire sur notre site . Pour cela, il te suffit de visiter cette page "
349 . "ou de copier cette adresse dans la barre de ton navigateur :";
350 }
351
352 public function process(array $user)
353 {
354 return XDB::execute("REPLACE INTO register_subs (uid, type, sub, domain)
355 VALUES ({?}, 'group', {?}, '')",
356 $user['id'], $this->group);
357 }
358 }
359
360 /// Make AnnuaireMarketing to be the default message
361 class DefaultMarketing extends AnnuaireMarketing
362 {
363 }
364
365 // vim:set et sw=4 sts=4 sws=4 enc=utf-8:
366 ?>