1
|
|
|
<?php |
2
|
|
|
/* |
3
|
|
|
* Name: alertmailer.php |
4
|
|
|
* Description: Mailer for email alerts |
5
|
|
|
* $Id: alertmailer.php,v 1.34 2009-06-23 10:11:10 matthew Exp $ |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
function mlog($message) { |
9
|
|
|
print $message; |
10
|
|
|
} |
11
|
|
|
|
12
|
|
|
include_once '../www/includes/easyparliament/init.php'; |
13
|
|
|
ini_set('memory_limit', -1); |
14
|
|
|
include_once INCLUDESPATH . 'easyparliament/member.php'; |
15
|
|
|
|
16
|
|
|
$global_start = getmicrotime(); |
17
|
|
|
$db = new ParlDB; |
18
|
|
|
|
19
|
|
|
# Get current value of latest batch |
20
|
|
|
$q = $db->query('SELECT max(indexbatch_id) as max_batch_id FROM indexbatch')->first(); |
21
|
|
|
$max_batch_id = $q['max_batch_id']; |
22
|
|
|
mlog("max_batch_id: " . $max_batch_id . "\n"); |
23
|
|
|
|
24
|
|
|
# Last sent is timestamp of last alerts gone out. |
25
|
|
|
# Last batch is the search index batch number last alert went out to. |
26
|
|
|
if (is_file('alerts-lastsent')) { |
27
|
|
|
$lastsent = file('alerts-lastsent'); |
28
|
|
|
} else { |
29
|
|
|
$lastsent = array('', 0); |
30
|
|
|
} |
31
|
|
|
|
32
|
|
|
$lastupdated = trim($lastsent[0]); |
33
|
|
|
if (!$lastupdated) { |
34
|
|
|
$lastupdated = strtotime('00:00 today'); |
35
|
|
|
} |
36
|
|
|
$lastbatch = trim($lastsent[1]); |
37
|
|
|
if (!$lastbatch) { |
38
|
|
|
$lastbatch = 0; |
39
|
|
|
} |
40
|
|
|
mlog("lastupdated: $lastupdated lastbatch: $lastbatch\n"); |
41
|
|
|
|
42
|
|
|
# Construct query fragment to select search index batches which |
43
|
|
|
# have been made since last time we ran |
44
|
|
|
$batch_query_fragment = ""; |
45
|
|
|
for ($i = $lastbatch + 1; $i <= $max_batch_id; $i++) { |
46
|
|
|
$batch_query_fragment .= "batch:$i "; |
47
|
|
|
} |
48
|
|
|
$batch_query_fragment = trim($batch_query_fragment); |
49
|
|
|
mlog("batch_query_fragment: " . $batch_query_fragment . "\n"); |
50
|
|
|
|
51
|
|
|
if (!$batch_query_fragment) { |
52
|
|
|
mlog("No new batches since last run - nothing to run over!"); |
53
|
|
|
exit; |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
# For testing purposes, specify nomail on command line to not send out emails |
57
|
|
|
$nomail = false; |
58
|
|
|
$onlyemail = ''; |
59
|
|
|
$fromemail = ''; |
60
|
|
|
$fromflag = false; |
61
|
|
|
$toemail = ''; |
62
|
|
|
$template = 'alert_mailout'; |
63
|
|
|
for ($k = 1; $k < $argc; $k++) { |
64
|
|
|
if ($argv[$k] == '--nomail') { |
65
|
|
|
$nomail = true; |
66
|
|
|
} |
67
|
|
|
if (preg_match('#^--only=(.*)$#', $argv[$k], $m)) { |
68
|
|
|
$onlyemail = $m[1]; |
69
|
|
|
} |
70
|
|
|
if (preg_match('#^--from=(.*)$#', $argv[$k], $m)) { |
71
|
|
|
$fromemail = $m[1]; |
72
|
|
|
} |
73
|
|
|
if (preg_match('#^--to=(.*)$#', $argv[$k], $m)) { |
74
|
|
|
$toemail = $m[1]; |
75
|
|
|
} |
76
|
|
|
if (preg_match('#^--template=(.*)$#', $argv[$k], $m)) { |
77
|
|
|
$template = $m[1]; |
78
|
|
|
# Tee hee |
79
|
|
|
$template = "../../../../../../../../../../home/twfy-live/email-alert-templates/alert_mailout_$template"; |
80
|
|
|
} |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
if (DEVSITE) { |
84
|
|
|
$nomail = true; |
85
|
|
|
} |
86
|
|
|
|
87
|
|
|
if ($nomail) { |
88
|
|
|
mlog("NOT SENDING EMAIL\n"); |
89
|
|
|
} |
90
|
|
|
if (($fromemail && $onlyemail) || ($toemail && $onlyemail)) { |
91
|
|
|
mlog("Can't have both from/to and only!\n"); |
92
|
|
|
exit; |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
$active = 0; |
96
|
|
|
$queries = 0; |
97
|
|
|
$unregistered = 0; |
98
|
|
|
$registered = 0; |
99
|
|
|
$sentemails = 0; |
100
|
|
|
|
101
|
|
|
$LIVEALERTS = new ALERT; |
102
|
|
|
|
103
|
|
|
$current = array('email' => '', 'token' => '', 'lang' => ''); |
104
|
|
|
$email_text = ''; |
105
|
|
|
$html_text = ''; |
106
|
|
|
$globalsuccess = 1; |
107
|
|
|
|
108
|
|
|
# Fetch all confirmed, non-deleted alerts |
109
|
|
|
$confirmed = 1; $deleted = 0; |
110
|
|
|
$alertdata = $LIVEALERTS->fetch($confirmed, $deleted); |
111
|
|
|
$alertdata = $alertdata['data']; |
112
|
|
|
|
113
|
|
|
$DEBATELIST = new DEBATELIST; # Nothing debate specific, but has to be one of them |
114
|
|
|
|
115
|
|
|
$sects = array( |
116
|
|
|
1 => gettext('Commons debate'), |
117
|
|
|
2 => gettext('Westminster Hall debate'), |
118
|
|
|
3 => gettext('Written Answer'), |
119
|
|
|
4 => gettext('Written Ministerial Statement'), |
120
|
|
|
5 => gettext('Northern Ireland Assembly debate'), |
121
|
|
|
6 => gettext('Public Bill committee'), |
122
|
|
|
7 => gettext('Scottish Parliament debate'), |
123
|
|
|
8 => gettext('Scottish Parliament written answer'), |
124
|
|
|
9 => gettext('London Mayoral question'), |
125
|
|
|
10 => gettext('Senedd debate'), |
126
|
|
|
11 => gettext('Senedd debate'), |
127
|
|
|
101 => gettext('Lords debate'), |
128
|
|
|
'F' => gettext('event'), |
129
|
|
|
'V' => gettext('vote'), |
130
|
|
|
); |
131
|
|
|
$sects_plural = array( |
132
|
|
|
1 => gettext('Commons debates'), |
133
|
|
|
2 => gettext('Westminster Hall debates'), |
134
|
|
|
3 => gettext('Written Answers'), |
135
|
|
|
4 => gettext('Written Ministerial Statements'), |
136
|
|
|
5 => gettext('Northern Ireland Assembly debates'), |
137
|
|
|
6 => gettext('Public Bill committees'), |
138
|
|
|
7 => gettext('Scottish Parliament debates'), |
139
|
|
|
8 => gettext('Scottish Parliament written answers'), |
140
|
|
|
9 => gettext('London Mayoral questions'), |
141
|
|
|
10 => gettext('Senedd debates'), |
142
|
|
|
11 => gettext('Senedd debates'), |
143
|
|
|
101 => gettext('Lords debate'), |
144
|
|
|
'F' => gettext('event'), |
145
|
|
|
'V' => gettext('vote'), |
146
|
|
|
); |
147
|
|
|
$sects_gid = array( |
148
|
|
|
1 => 'debate', |
149
|
|
|
2 => 'westminhall', |
150
|
|
|
3 => 'wrans', |
151
|
|
|
4 => 'wms', |
152
|
|
|
5 => 'ni', |
153
|
|
|
6 => 'pbc', |
154
|
|
|
7 => 'sp', |
155
|
|
|
8 => 'spwa', |
156
|
|
|
9 => 'london-mayors-questions', |
157
|
|
|
10 => 'senedd/en', |
158
|
|
|
11 => 'senedd/cy', |
159
|
|
|
101 => 'lords', |
160
|
|
|
'F' => 'calendar', |
161
|
|
|
); |
162
|
|
|
$sects_search = array( |
163
|
|
|
1 => 'debate', |
164
|
|
|
2 => 'westminhall', |
165
|
|
|
3 => 'wrans', |
166
|
|
|
4 => 'wms', |
167
|
|
|
5 => 'ni', |
168
|
|
|
6 => 'pbc', |
169
|
|
|
7 => 'sp', |
170
|
|
|
8 => 'spwrans', |
171
|
|
|
9 => 'lmqs', |
172
|
|
|
10 => 'wales', |
173
|
|
|
11 => 'wales', |
174
|
|
|
101 => 'lords', |
175
|
|
|
'F' => 'future', |
176
|
|
|
); |
177
|
|
|
|
178
|
|
|
$domain = ''; |
179
|
|
|
$outof = count($alertdata); |
180
|
|
|
$start_time = time(); |
181
|
|
|
foreach ($alertdata as $alertitem) { |
182
|
|
|
$active++; |
183
|
|
|
$email = $alertitem['email']; |
184
|
|
|
if ($onlyemail && $email != $onlyemail) { |
185
|
|
|
continue; |
186
|
|
|
} |
187
|
|
|
if ($fromemail && strcasecmp($email, $fromemail) > 0) { |
188
|
|
|
$fromflag = true; |
189
|
|
|
} |
190
|
|
|
if ($fromemail && !$fromflag) { |
191
|
|
|
continue; |
192
|
|
|
} |
193
|
|
|
if ($toemail && strcasecmp($email, $toemail) > 0) { |
194
|
|
|
continue; |
195
|
|
|
} |
196
|
|
|
$criteria_raw = $alertitem['criteria']; |
197
|
|
|
if (preg_match('#\bOR\b#', $criteria_raw)) { |
198
|
|
|
$criteria_raw = "($criteria_raw)"; |
199
|
|
|
} |
200
|
|
|
$criteria_batch = $criteria_raw . " " . $batch_query_fragment; |
201
|
|
|
|
202
|
|
|
$lang = $alertitem['lang']; |
203
|
|
|
if (!$domain) { |
204
|
|
|
if ($lang == 'cy') { |
205
|
|
|
$domain = 'cy.theyworkforyou.com'; |
206
|
|
|
} else { |
207
|
|
|
$domain = 'www.theyworkforyou.com'; |
208
|
|
|
} |
209
|
|
|
} |
210
|
|
|
|
211
|
|
|
if ($email != $current['email']) { |
212
|
|
|
if ($email_text) { |
213
|
|
|
write_and_send_email($current, $email_text, $html_text, $template); |
214
|
|
|
} |
215
|
|
|
$current['email'] = $email; |
216
|
|
|
$current['token'] = $alertitem['alert_id'] . '-' . $alertitem['registrationtoken']; |
217
|
|
|
$current['lang'] = $lang; |
218
|
|
|
$email_text = ''; |
219
|
|
|
$html_text = ''; |
220
|
|
|
$q = $db->query('SELECT user_id FROM users WHERE email = :email', array( |
221
|
|
|
':email' => $email |
222
|
|
|
))->first(); |
223
|
|
|
if ($q) { |
224
|
|
|
$user_id = $q['user_id']; |
225
|
|
|
$registered++; |
226
|
|
|
} else { |
227
|
|
|
$user_id = 0; |
228
|
|
|
$unregistered++; |
229
|
|
|
} |
230
|
|
|
mlog("\nEMAIL: $email, uid $user_id; memory usage : " . memory_get_usage() . "\n"); |
231
|
|
|
} |
232
|
|
|
|
233
|
|
|
mlog(" ALERT $active/$outof QUERY $queries : Xapian query '$criteria_batch'"); |
234
|
|
|
$start = getmicrotime(); |
235
|
|
|
$SEARCHENGINE = new SEARCHENGINE($criteria_batch, $lang); |
236
|
|
|
#mlog("query_remade: " . $SEARCHENGINE->query_remade() . "\n"); |
237
|
|
|
$args = array( |
238
|
|
|
's' => $criteria_raw, # Note: use raw here for URLs, whereas search engine has batch |
239
|
|
|
'threshold' => $lastupdated, # Return everything added since last time this script was run |
240
|
|
|
'o' => 'c', |
241
|
|
|
'num' => 1000, // this is limited to 1000 in hansardlist.php anyway |
242
|
|
|
'pop' => 1, |
243
|
|
|
'e' => 1 # Don't escape ampersands |
244
|
|
|
); |
245
|
|
|
$data = $DEBATELIST->_get_data_by_search($args); |
246
|
|
|
$total_results = $data['info']['total_results']; |
247
|
|
|
$queries++; |
248
|
|
|
mlog(", hits " . $total_results . ", time " . (getmicrotime()-$start) . "\n"); |
249
|
|
|
|
250
|
|
|
# Divisions |
251
|
|
|
if (preg_match('#^speaker:(\d+)$#', $criteria_raw, $m)) { |
252
|
|
|
$pid = $m[1]; |
253
|
|
|
$q = $db->query('SELECT * FROM persondivisionvotes pdv JOIN divisions USING(division_id) |
254
|
|
|
WHERE person_id=:person_id AND pdv.lastupdate >= :time', array( |
255
|
|
|
'person_id' => $pid, |
256
|
|
|
':time' => date('Y-m-d H:i:s', $lastupdated), |
|
|
|
|
257
|
|
|
)); |
258
|
|
|
foreach ($q as $row) { |
259
|
|
|
# Skip other-language divisions if needed, set locale |
260
|
|
|
if (strpos($row['division_id'], '-cy-')) { |
261
|
|
|
if ($lang == 'en') { |
262
|
|
|
continue; |
263
|
|
|
} |
264
|
|
|
change_locale('cy'); |
265
|
|
|
} elseif (strpos($row['division_id'], '-en-')) { |
266
|
|
|
if ($lang == 'cy') { |
267
|
|
|
continue; |
268
|
|
|
} |
269
|
|
|
change_locale('en'); |
270
|
|
|
} else { |
271
|
|
|
change_locale('en'); |
272
|
|
|
} |
273
|
|
|
|
274
|
|
|
$vote = $row['vote']; |
275
|
|
|
$num = $row['division_number']; |
276
|
|
|
$teller = ''; |
277
|
|
|
if (strpos($vote, 'tell') !== false) { |
278
|
|
|
$teller = ', ' . gettext('as a teller'); |
279
|
|
|
$vote = str_replace('tell', '', $vote); |
280
|
|
|
} |
281
|
|
|
if ($vote == 'absent') { |
282
|
|
|
continue; |
283
|
|
|
} |
284
|
|
|
if ($vote == 'aye' && $row['yes_text']) { |
285
|
|
|
$text = "Voted ($vote$teller) " . $row['yes_text']; |
286
|
|
|
} elseif ($vote == 'no' && $row['no_text']) { |
287
|
|
|
$text = "Voted ($vote$teller) " . $row['no_text']; |
288
|
|
|
} elseif ($vote == 'aye') { |
289
|
|
|
$text = gettext("Voted aye") . $teller; |
290
|
|
|
} elseif ($vote == 'no') { |
291
|
|
|
$text = gettext("Voted no") . $teller; |
292
|
|
|
} elseif ($vote == 'both') { |
293
|
|
|
$text = gettext("Voted abstain") . $teller; |
294
|
|
|
} else { |
295
|
|
|
$text = sprintf(gettext("Voted %s"), $vote) . $teller; |
296
|
|
|
} |
297
|
|
|
$text .= " " . sprintf(gettext("(division #%s; result was <b>%s</b> aye, <b>%s</b> no)"), $num, $row['yes_total'], $row['no_total']); |
298
|
|
|
$data['rows'][] = [ |
299
|
|
|
'parent' => [ |
300
|
|
|
'body' => $row['division_title'], |
301
|
|
|
], |
302
|
|
|
'extract' => $text, |
303
|
|
|
'listurl' => '/divisions/' . $row['division_id'], |
304
|
|
|
'major' => 'V', |
305
|
|
|
'hdate' => $row['division_date'], |
306
|
|
|
'hpos' => $row['division_number'], |
307
|
|
|
]; |
308
|
|
|
} |
309
|
|
|
} |
310
|
|
|
|
311
|
|
|
if (isset($data['rows']) && count($data['rows']) > 0) { |
312
|
|
|
usort($data['rows'], 'sort_by_stuff'); # Sort results into order, by major, then date, then hpos |
313
|
|
|
$o = array(); $major = 0; $count = array(); $total = 0; |
314
|
|
|
$any_content = false; |
315
|
|
|
foreach ($data['rows'] as $row) { |
316
|
|
|
if ($major !== $row['major']) { |
317
|
|
|
$count[$major] = $total; $total = 0; |
318
|
|
|
$major = $row['major']; |
319
|
|
|
$o[$major] = ['text' => '', 'html' => '']; |
320
|
|
|
$k = 3; |
321
|
|
|
} |
322
|
|
|
#mlog($row['major'] . " " . $row['gid'] ."\n"); |
323
|
|
|
|
324
|
|
|
if (isset($sects_gid[$major])) { |
325
|
|
|
$q = $db->query('SELECT gid_from FROM gidredirect WHERE gid_to = :gid_to', array( |
326
|
|
|
':gid_to' => 'uk.org.publicwhip/' . $sects_gid[$major] . '/' . $row['gid'] |
327
|
|
|
)); |
328
|
|
|
if ($q->rows() > 0) { |
329
|
|
|
continue; |
330
|
|
|
} |
331
|
|
|
} |
332
|
|
|
|
333
|
|
|
if ($major == 11) { |
334
|
|
|
change_locale('cy'); |
335
|
|
|
} else { |
336
|
|
|
change_locale('en'); |
337
|
|
|
} |
338
|
|
|
|
339
|
|
|
--$k; |
340
|
|
|
if ($major == 'V' || $k >= 0) { |
341
|
|
|
$any_content = true; |
342
|
|
|
$parentbody = text_html_to_email($row['parent']['body']); |
343
|
|
|
$body_text = text_html_to_email($row['extract']); |
344
|
|
|
$body_html = $row['extract']; |
345
|
|
|
if (isset($row['speaker']) && count($row['speaker'])) { |
346
|
|
|
$body_text = $row['speaker']['name'] . ': ' . $body_text; |
347
|
|
|
$body_html = '<strong style="font-weight: 900;">' . $row['speaker']['name'] . '</strong>: ' . $body_html; |
348
|
|
|
} |
349
|
|
|
$body_html = '<p style="font-size: 16px;">' . $body_html . '</p>'; |
350
|
|
|
|
351
|
|
|
$body_text = wordwrap($body_text, 72); |
352
|
|
|
$o[$major]['text'] .= $parentbody . ' (' . format_date($row['hdate'], SHORTDATEFORMAT) . ")\nhttps://$domain" . $row['listurl'] . "\n"; |
353
|
|
|
$o[$major]['text'] .= $body_text . "\n\n"; |
354
|
|
|
$o[$major]['html'] .= '<a href="https://' . $domain . $row['listurl'] . '"><h2 style="line-height: 1.2; font-size: 17px; font-weight: 900;">' . $parentbody . '</h2></a> <span style="margin: 16px 0 0 0; display: block; font-size: 16px;">' . format_date($row['hdate'], SHORTDATEFORMAT) . '</span>'; |
355
|
|
|
$o[$major]['html'] .= $body_html . "\n\n"; |
356
|
|
|
} |
357
|
|
|
$total++; |
358
|
|
|
} |
359
|
|
|
$count[$major] = $total; |
360
|
|
|
|
361
|
|
|
if ($any_content) { |
362
|
|
|
# Add data to email_text/html_text |
363
|
|
|
$desc = trim(html_entity_decode($data['searchdescription'])); |
364
|
|
|
$desc = trim(preg_replace(['#\(B\d+( OR B\d+)*\)#', '#B\d+( OR B\d+)*#'], '', $desc)); |
365
|
|
|
foreach ($o as $major => $body) { |
366
|
|
|
if ($body['text']) { |
367
|
|
|
$heading_text = $desc . ' : ' . $count[$major] . ' ' . ngettext($sects[$major], $sects_plural[$major], $count[$major]); |
368
|
|
|
$heading_html = $desc . ' : <strong>' . $count[$major] . '</strong> ' . ngettext($sects[$major], $sects_plural[$major], $count[$major]); |
369
|
|
|
|
370
|
|
|
$email_text .= "$heading_text\n" . str_repeat('=', strlen($heading_text)) . "\n\n"; |
371
|
|
|
if ($count[$major] > 3 && $major != 'V') { |
372
|
|
|
$url = "https://$domain/search/?s=" . urlencode($criteria_raw) . "+section:" . $sects_search[$major] . "&o=d"; |
373
|
|
|
$email_text .= gettext('There are more results than we have shown here.') . ' ' . gettext('See more') . ":\n$url\n\n"; |
374
|
|
|
} |
375
|
|
|
$email_text .= $body['text']; |
376
|
|
|
|
377
|
|
|
$html_text .= '<hr style="height:2px;border-width:0; background-color: #f7f6f5; margin: 30px 0;">'; |
378
|
|
|
$html_text .= '<p style="font-size:16px;">' . $heading_html . '</p>'; |
379
|
|
|
if ($count[$major] > 3 && $major != 'V') { |
380
|
|
|
$html_text .= '<p style="font-size:16px;">' . gettext('There are more results than we have shown here.') . ' <a href="' . $url . '">' . gettext('See more') . '</a></p>'; |
381
|
|
|
} |
382
|
|
|
$html_text .= $body['html']; |
383
|
|
|
} |
384
|
|
|
} |
385
|
|
|
} |
386
|
|
|
} |
387
|
|
|
} |
388
|
|
|
if ($email_text) { |
389
|
|
|
write_and_send_email($current, $email_text, $html_text, $template); |
390
|
|
|
} |
391
|
|
|
|
392
|
|
|
mlog("\n"); |
393
|
|
|
|
394
|
|
|
$sss = "Active alerts: $active\nEmail lookups: $registered registered, $unregistered unregistered\nQuery lookups: $queries\nSent emails: $sentemails\n"; |
395
|
|
|
if ($globalsuccess) { |
396
|
|
|
$sss .= 'Everything went swimmingly, in '; |
397
|
|
|
} else { |
398
|
|
|
$sss .= 'Something went wrong! Total time: '; |
399
|
|
|
} |
400
|
|
|
$sss .= (getmicrotime() - $global_start) . "\n\n"; |
401
|
|
|
mlog($sss); |
402
|
|
|
if (!$nomail && !$onlyemail) { |
403
|
|
|
$fp = fopen('alerts-lastsent', 'w'); |
404
|
|
|
fwrite($fp, time() . "\n"); |
405
|
|
|
fwrite($fp, $max_batch_id); |
406
|
|
|
fclose($fp); |
407
|
|
|
mail(ALERT_STATS_EMAILS, 'Email alert statistics', $sss, 'From: Email Alerts <[email protected]>'); |
408
|
|
|
} |
409
|
|
|
mlog(date('r') . "\n"); |
410
|
|
|
|
411
|
|
|
function _sort($a, $b) { |
412
|
|
|
if ($a > $b) { |
413
|
|
|
return 1; |
414
|
|
|
} elseif ($a < $b) { |
415
|
|
|
return -1; |
416
|
|
|
} |
417
|
|
|
return 0; |
418
|
|
|
} |
419
|
|
|
|
420
|
|
|
function sort_by_stuff($a, $b) { |
421
|
|
|
# Always have votes first. |
422
|
|
|
if ($a['major'] == 'V' && $b['major'] != 'V') { |
423
|
|
|
return -1; |
424
|
|
|
} elseif ($b['major'] == 'V' && $a['major'] != 'V') { |
425
|
|
|
return 1; |
426
|
|
|
} |
427
|
|
|
|
428
|
|
|
# Always have future business second.. |
429
|
|
|
if ($a['major'] == 'F' && $b['major'] != 'F') { |
430
|
|
|
return -1; |
431
|
|
|
} elseif ($b['major'] == 'F' && $a['major'] != 'F') { |
432
|
|
|
return 1; |
433
|
|
|
} |
434
|
|
|
|
435
|
|
|
# Otherwise sort firstly by major number (so Commons before NI before SP before Lords) |
436
|
|
|
if ($ret = _sort($a['major'], $b['major'])) { |
437
|
|
|
return $ret; |
438
|
|
|
} |
439
|
|
|
|
440
|
|
|
# Then by date (most recent first for everything except future, which is the opposite) |
441
|
|
|
if ($a['major'] == 'F') { |
442
|
|
|
if ($ret = _sort($a['hdate'], $b['hdate'])) { |
443
|
|
|
return $ret; |
444
|
|
|
} |
445
|
|
|
} else { |
446
|
|
|
if ($ret = _sort($b['hdate'], $a['hdate'])) { |
447
|
|
|
return $ret; |
448
|
|
|
} |
449
|
|
|
} |
450
|
|
|
|
451
|
|
|
# Lastly by speech position within a debate. |
452
|
|
|
if ($a['hpos'] == $b['hpos']) { |
453
|
|
|
return 0; |
454
|
|
|
} |
455
|
|
|
return ($a['hpos'] > $b['hpos']) ? 1 : -1; |
456
|
|
|
} |
457
|
|
|
|
458
|
|
|
function write_and_send_email($current, $text, $html, $template) { |
459
|
|
|
global $globalsuccess, $sentemails, $nomail, $start_time, $domain; |
460
|
|
|
|
461
|
|
|
$text .= '===================='; |
462
|
|
|
$sentemails++; |
463
|
|
|
mlog("SEND $sentemails : Sending email to $current[email] ... "); |
464
|
|
|
$d = array('to' => $current['email'], 'template' => $template); |
465
|
|
|
$m = array( |
466
|
|
|
'DATA' => $text, |
467
|
|
|
'_HTML_' => $html, |
468
|
|
|
'MANAGE' => "https://$domain/D/" . $current['token'], |
469
|
|
|
); |
470
|
|
|
if (!$nomail) { |
471
|
|
|
$success = send_template_email($d, $m, true, true, $current['lang']); # true = "Precedence: bulk", want bounces |
472
|
|
|
mlog("sent ... "); |
473
|
|
|
# sleep if time between sending mails is less than a certain number of seconds on average |
474
|
|
|
# 0.25 is number of seconds per mail not to be quicker than |
475
|
|
|
if (((time() - $start_time) / $sentemails) < 0.25) { |
476
|
|
|
mlog("pausing ... "); |
477
|
|
|
sleep(1); |
478
|
|
|
} |
479
|
|
|
} else { |
480
|
|
|
mlog($text); |
481
|
|
|
$success = 1; |
482
|
|
|
} |
483
|
|
|
mlog("done\n"); |
484
|
|
|
if (!$success) { |
485
|
|
|
$globalsuccess = 0; |
486
|
|
|
} |
487
|
|
|
} |
488
|
|
|
|
489
|
|
|
function text_html_to_email($s) { |
490
|
|
|
$s = preg_replace('#</?(i|b|small)>#', '', $s); |
491
|
|
|
$s = preg_replace('#</?span[^>]*>#', '*', $s); |
492
|
|
|
$s = str_replace( |
493
|
|
|
array('£', '–', '—', '’', '<br>'), |
494
|
|
|
array("\xa3", '-', '-', "'", "\n"), |
495
|
|
|
$s |
496
|
|
|
); |
497
|
|
|
return $s; |
498
|
|
|
} |
499
|
|
|
|
500
|
|
|
# Switch the language to that of the data/alert |
501
|
|
|
function change_locale($lang) { |
502
|
|
|
if ($lang == 'cy') { |
503
|
|
|
setlocale(LC_ALL, 'cy_GB.UTF-8'); |
504
|
|
|
putenv('LC_ALL=cy_GB.UTF-8'); |
505
|
|
|
} else { |
506
|
|
|
setlocale(LC_ALL, 'en_GB.UTF-8'); |
507
|
|
|
putenv('LC_ALL=en_GB.UTF-8'); |
508
|
|
|
} |
509
|
|
|
} |
510
|
|
|
|