443
by dcoles
Added Forum application along with unmodifed version of phpBB3 "Olympus" 3.0.0 |
1 |
<?php
|
2 |
/**
|
|
3 |
*
|
|
4 |
* @package phpBB3
|
|
5 |
* @version $Id: functions_privmsgs.php,v 1.85 2007/11/07 10:45:38 acydburn Exp $
|
|
6 |
* @copyright (c) 2005 phpBB Group
|
|
7 |
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
|
8 |
*
|
|
9 |
*/
|
|
10 |
||
11 |
/**
|
|
12 |
*/
|
|
13 |
if (!defined('IN_PHPBB')) |
|
14 |
{
|
|
15 |
exit; |
|
16 |
}
|
|
17 |
||
18 |
/*
|
|
19 |
Ability to simply add own rules by doing three things:
|
|
20 |
1) Add an appropriate constant
|
|
21 |
2) Add a new check array to the global_privmsgs_rules variable and the condition array (if one is required)
|
|
22 |
3) Add a new language variable to ucp.php
|
|
23 |
||
24 |
The user is then able to select the new rule. It will be checked against and handled as specified.
|
|
25 |
To add new actions (yes, checks can be added here too) to the rule management, the core code has to be modified.
|
|
26 |
*/
|
|
27 |
||
28 |
define('RULE_IS_LIKE', 1); // Is Like |
|
29 |
define('RULE_IS_NOT_LIKE', 2); // Is Not Like |
|
30 |
define('RULE_IS', 3); // Is |
|
31 |
define('RULE_IS_NOT', 4); // Is Not |
|
32 |
define('RULE_BEGINS_WITH', 5); // Begins with |
|
33 |
define('RULE_ENDS_WITH', 6); // Ends with |
|
34 |
define('RULE_IS_FRIEND', 7); // Is Friend |
|
35 |
define('RULE_IS_FOE', 8); // Is Foe |
|
36 |
define('RULE_IS_USER', 9); // Is User |
|
37 |
define('RULE_IS_GROUP', 10); // Is In Usergroup |
|
38 |
define('RULE_ANSWERED', 11); // Answered |
|
39 |
define('RULE_FORWARDED', 12); // Forwarded |
|
40 |
define('RULE_TO_GROUP', 14); // Usergroup |
|
41 |
define('RULE_TO_ME', 15); // Me |
|
42 |
||
43 |
define('ACTION_PLACE_INTO_FOLDER', 1); |
|
44 |
define('ACTION_MARK_AS_READ', 2); |
|
45 |
define('ACTION_MARK_AS_IMPORTANT', 3); |
|
46 |
define('ACTION_DELETE_MESSAGE', 4); |
|
47 |
||
48 |
define('CHECK_SUBJECT', 1); |
|
49 |
define('CHECK_SENDER', 2); |
|
50 |
define('CHECK_MESSAGE', 3); |
|
51 |
define('CHECK_STATUS', 4); |
|
52 |
define('CHECK_TO', 5); |
|
53 |
||
54 |
/**
|
|
55 |
* Global private message rules
|
|
56 |
* These rules define what to do if a rule is hit
|
|
57 |
*/
|
|
58 |
$global_privmsgs_rules = array( |
|
59 |
CHECK_SUBJECT => array( |
|
60 |
RULE_IS_LIKE => array('check0' => 'message_subject', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'), |
|
61 |
RULE_IS_NOT_LIKE => array('check0' => 'message_subject', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'), |
|
62 |
RULE_IS => array('check0' => 'message_subject', 'function' => '{CHECK0} == {STRING}'), |
|
63 |
RULE_IS_NOT => array('check0' => 'message_subject', 'function' => '{CHECK0} != {STRING}'), |
|
64 |
RULE_BEGINS_WITH => array('check0' => 'message_subject', 'function' => 'preg_match("/^" . preg_quote({STRING}, "/") . "/i", {CHECK0})'), |
|
65 |
RULE_ENDS_WITH => array('check0' => 'message_subject', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "$/i", {CHECK0})'), |
|
66 |
),
|
|
67 |
||
68 |
CHECK_SENDER => array( |
|
69 |
RULE_IS_LIKE => array('check0' => 'username', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'), |
|
70 |
RULE_IS_NOT_LIKE => array('check0' => 'username', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'), |
|
71 |
RULE_IS => array('check0' => 'username', 'function' => '{CHECK0} == {STRING}'), |
|
72 |
RULE_IS_NOT => array('check0' => 'username', 'function' => '{CHECK0} != {STRING}'), |
|
73 |
RULE_BEGINS_WITH => array('check0' => 'username', 'function' => 'preg_match("/^" . preg_quote({STRING}, "/") . "/i", {CHECK0})'), |
|
74 |
RULE_ENDS_WITH => array('check0' => 'username', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "$/i", {CHECK0})'), |
|
75 |
RULE_IS_FRIEND => array('check0' => 'friend', 'function' => '{CHECK0} == 1'), |
|
76 |
RULE_IS_FOE => array('check0' => 'foe', 'function' => '{CHECK0} == 1'), |
|
77 |
RULE_IS_USER => array('check0' => 'author_id', 'function' => '{CHECK0} == {USER_ID}'), |
|
78 |
RULE_IS_GROUP => array('check0' => 'author_in_group', 'function' => 'in_array({GROUP_ID}, {CHECK0})'), |
|
79 |
),
|
|
80 |
||
81 |
CHECK_MESSAGE => array( |
|
82 |
RULE_IS_LIKE => array('check0' => 'message_text', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'), |
|
83 |
RULE_IS_NOT_LIKE => array('check0' => 'message_text', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'), |
|
84 |
RULE_IS => array('check0' => 'message_text', 'function' => '{CHECK0} == {STRING}'), |
|
85 |
RULE_IS_NOT => array('check0' => 'message_text', 'function' => '{CHECK0} != {STRING}'), |
|
86 |
),
|
|
87 |
||
88 |
CHECK_STATUS => array( |
|
89 |
RULE_ANSWERED => array('check0' => 'pm_replied', 'function' => '{CHECK0} == 1'), |
|
90 |
RULE_FORWARDED => array('check0' => 'pm_forwarded', 'function' => '{CHECK0} == 1'), |
|
91 |
),
|
|
92 |
||
93 |
CHECK_TO => array( |
|
94 |
RULE_TO_GROUP => array('check0' => 'to', 'check1' => 'bcc', 'check2' => 'user_in_group', 'function' => 'in_array("g_" . {CHECK2}, {CHECK0}) || in_array("g_" . {CHECK2}, {CHECK1})'), |
|
95 |
RULE_TO_ME => array('check0' => 'to', 'check1' => 'bcc', 'function' => 'in_array("u_" . $user_id, {CHECK0}) || in_array("u_" . $user_id, {CHECK1})'), |
|
96 |
)
|
|
97 |
);
|
|
98 |
||
99 |
/**
|
|
100 |
* This is for defining which condition fields to show for which Rule
|
|
101 |
*/
|
|
102 |
$global_rule_conditions = array( |
|
103 |
RULE_IS_LIKE => 'text', |
|
104 |
RULE_IS_NOT_LIKE => 'text', |
|
105 |
RULE_IS => 'text', |
|
106 |
RULE_IS_NOT => 'text', |
|
107 |
RULE_BEGINS_WITH => 'text', |
|
108 |
RULE_ENDS_WITH => 'text', |
|
109 |
RULE_IS_USER => 'user', |
|
110 |
RULE_IS_GROUP => 'group' |
|
111 |
);
|
|
112 |
||
113 |
/**
|
|
114 |
* Get all folder
|
|
115 |
*/
|
|
116 |
function get_folder($user_id, $folder_id = false) |
|
117 |
{
|
|
118 |
global $db, $user, $template; |
|
119 |
global $phpbb_root_path, $phpEx; |
|
120 |
||
121 |
$folder = array(); |
|
122 |
||
123 |
// Get folder information
|
|
124 |
$sql = 'SELECT folder_id, COUNT(msg_id) as num_messages, SUM(pm_unread) as num_unread |
|
125 |
FROM ' . PRIVMSGS_TO_TABLE . " |
|
126 |
WHERE user_id = $user_id |
|
127 |
AND folder_id <> " . PRIVMSGS_NO_BOX . ' |
|
128 |
GROUP BY folder_id'; |
|
129 |
$result = $db->sql_query($sql); |
|
130 |
||
131 |
$num_messages = $num_unread = array(); |
|
132 |
while ($row = $db->sql_fetchrow($result)) |
|
133 |
{
|
|
134 |
$num_messages[(int) $row['folder_id']] = $row['num_messages']; |
|
135 |
$num_unread[(int) $row['folder_id']] = $row['num_unread']; |
|
136 |
}
|
|
137 |
$db->sql_freeresult($result); |
|
138 |
||
139 |
// Make sure the default boxes are defined
|
|
140 |
$available_folder = array(PRIVMSGS_INBOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX); |
|
141 |
||
142 |
foreach ($available_folder as $default_folder) |
|
143 |
{
|
|
144 |
if (!isset($num_messages[$default_folder])) |
|
145 |
{
|
|
146 |
$num_messages[$default_folder] = 0; |
|
147 |
}
|
|
148 |
||
149 |
if (!isset($num_unread[$default_folder])) |
|
150 |
{
|
|
151 |
$num_unread[$default_folder] = 0; |
|
152 |
}
|
|
153 |
}
|
|
154 |
||
155 |
// Adjust unread status for outbox
|
|
156 |
$num_unread[PRIVMSGS_OUTBOX] = $num_messages[PRIVMSGS_OUTBOX]; |
|
157 |
||
158 |
$folder[PRIVMSGS_INBOX] = array( |
|
159 |
'folder_name' => $user->lang['PM_INBOX'], |
|
160 |
'num_messages' => $num_messages[PRIVMSGS_INBOX], |
|
161 |
'unread_messages' => $num_unread[PRIVMSGS_INBOX] |
|
162 |
);
|
|
163 |
||
164 |
// Custom Folder
|
|
165 |
$sql = 'SELECT folder_id, folder_name, pm_count |
|
166 |
FROM ' . PRIVMSGS_FOLDER_TABLE . " |
|
167 |
WHERE user_id = $user_id"; |
|
168 |
$result = $db->sql_query($sql); |
|
169 |
||
170 |
while ($row = $db->sql_fetchrow($result)) |
|
171 |
{
|
|
172 |
$folder[$row['folder_id']] = array( |
|
173 |
'folder_name' => $row['folder_name'], |
|
174 |
'num_messages' => $row['pm_count'], |
|
175 |
'unread_messages' => ((isset($num_unread[$row['folder_id']])) ? $num_unread[$row['folder_id']] : 0) |
|
176 |
);
|
|
177 |
}
|
|
178 |
$db->sql_freeresult($result); |
|
179 |
||
180 |
$folder[PRIVMSGS_OUTBOX] = array( |
|
181 |
'folder_name' => $user->lang['PM_OUTBOX'], |
|
182 |
'num_messages' => $num_messages[PRIVMSGS_OUTBOX], |
|
183 |
'unread_messages' => $num_unread[PRIVMSGS_OUTBOX] |
|
184 |
);
|
|
185 |
||
186 |
$folder[PRIVMSGS_SENTBOX] = array( |
|
187 |
'folder_name' => $user->lang['PM_SENTBOX'], |
|
188 |
'num_messages' => $num_messages[PRIVMSGS_SENTBOX], |
|
189 |
'unread_messages' => $num_unread[PRIVMSGS_SENTBOX] |
|
190 |
);
|
|
191 |
||
192 |
// Define Folder Array for template designers (and for making custom folders usable by the template too)
|
|
193 |
foreach ($folder as $f_id => $folder_ary) |
|
194 |
{
|
|
195 |
$folder_id_name = ($f_id == PRIVMSGS_INBOX) ? 'inbox' : (($f_id == PRIVMSGS_OUTBOX) ? 'outbox' : 'sentbox'); |
|
196 |
||
197 |
$template->assign_block_vars('folder', array( |
|
198 |
'FOLDER_ID' => $f_id, |
|
199 |
'FOLDER_NAME' => $folder_ary['folder_name'], |
|
200 |
'NUM_MESSAGES' => $folder_ary['num_messages'], |
|
201 |
'UNREAD_MESSAGES' => $folder_ary['unread_messages'], |
|
202 |
||
203 |
'U_FOLDER' => ($f_id > 0) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=' . $f_id) : append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=' . $folder_id_name), |
|
204 |
||
205 |
'S_CUR_FOLDER' => ($f_id === $folder_id) ? true : false, |
|
206 |
'S_UNREAD_MESSAGES' => ($folder_ary['unread_messages']) ? true : false, |
|
207 |
'S_CUSTOM_FOLDER' => ($f_id > 0) ? true : false) |
|
208 |
);
|
|
209 |
}
|
|
210 |
||
211 |
return $folder; |
|
212 |
}
|
|
213 |
||
214 |
/**
|
|
215 |
* Delete Messages From Sentbox
|
|
216 |
* we are doing this here because this saves us a bunch of checks and queries
|
|
217 |
*/
|
|
218 |
function clean_sentbox($num_sentbox_messages) |
|
219 |
{
|
|
220 |
global $db, $user, $config; |
|
221 |
||
222 |
// Check Message Limit
|
|
223 |
if ($user->data['message_limit'] && $num_sentbox_messages > $user->data['message_limit']) |
|
224 |
{
|
|
225 |
// Delete old messages
|
|
226 |
$sql = 'SELECT t.msg_id |
|
227 |
FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p |
|
228 |
WHERE t.msg_id = p.msg_id
|
|
229 |
AND t.user_id = ' . $user->data['user_id'] . ' |
|
230 |
AND t.folder_id = ' . PRIVMSGS_SENTBOX . ' |
|
231 |
ORDER BY p.message_time ASC'; |
|
232 |
$result = $db->sql_query_limit($sql, ($num_sentbox_messages - $user->data['message_limit'])); |
|
233 |
||
234 |
$delete_ids = array(); |
|
235 |
while ($row = $db->sql_fetchrow($result)) |
|
236 |
{
|
|
237 |
$delete_ids[] = $row['msg_id']; |
|
238 |
}
|
|
239 |
$db->sql_freeresult($result); |
|
240 |
delete_pm($user->data['user_id'], $delete_ids, PRIVMSGS_SENTBOX); |
|
241 |
}
|
|
242 |
}
|
|
243 |
||
244 |
/**
|
|
245 |
* Check Rule against Message Information
|
|
246 |
*/
|
|
247 |
function check_rule(&$rules, &$rule_row, &$message_row, $user_id) |
|
248 |
{
|
|
249 |
global $user, $config; |
|
250 |
||
251 |
if (!isset($rules[$rule_row['rule_check']][$rule_row['rule_connection']])) |
|
252 |
{
|
|
253 |
return false; |
|
254 |
}
|
|
255 |
||
256 |
$check_ary = $rules[$rule_row['rule_check']][$rule_row['rule_connection']]; |
|
257 |
||
258 |
// Replace Check Literals
|
|
259 |
$evaluate = $check_ary['function']; |
|
260 |
$evaluate = preg_replace('/{(CHECK[0-9])}/', '$message_row[$check_ary[strtolower("\1")]]', $evaluate); |
|
261 |
||
262 |
// Replace Rule Literals
|
|
263 |
$evaluate = preg_replace('/{(STRING|USER_ID|GROUP_ID)}/', '$rule_row["rule_" . strtolower("\1")]', $evaluate); |
|
264 |
||
265 |
// Evil Statement
|
|
266 |
$result = false; |
|
267 |
eval('$result = (' . $evaluate . ') ? true : false;'); |
|
268 |
||
269 |
if (!$result) |
|
270 |
{
|
|
271 |
return false; |
|
272 |
}
|
|
273 |
||
274 |
switch ($rule_row['rule_action']) |
|
275 |
{
|
|
276 |
case ACTION_PLACE_INTO_FOLDER: |
|
277 |
return array('action' => $rule_row['rule_action'], 'folder_id' => $rule_row['rule_folder_id']); |
|
278 |
break; |
|
279 |
||
280 |
case ACTION_MARK_AS_READ: |
|
281 |
case ACTION_MARK_AS_IMPORTANT: |
|
282 |
return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']); |
|
283 |
break; |
|
284 |
||
285 |
case ACTION_DELETE_MESSAGE: |
|
286 |
global $db, $auth; |
|
287 |
||
288 |
// Check for admins/mods - users are not allowed to remove those messages...
|
|
289 |
// We do the check here to make sure the data we use is consistent
|
|
290 |
$sql = 'SELECT user_id, user_type, user_permissions |
|
291 |
FROM ' . USERS_TABLE . ' |
|
292 |
WHERE user_id = ' . (int) $message_row['author_id']; |
|
293 |
$result = $db->sql_query($sql); |
|
294 |
$userdata = $db->sql_fetchrow($result); |
|
295 |
$db->sql_freeresult($result); |
|
296 |
||
297 |
$auth2 = new auth(); |
|
298 |
$auth2->acl($userdata); |
|
299 |
||
300 |
if (!$auth2->acl_get('a_') && !$auth2->acl_get('m_') && !$auth2->acl_getf_global('m_')) |
|
301 |
{
|
|
302 |
return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']); |
|
303 |
}
|
|
304 |
||
305 |
return false; |
|
306 |
break; |
|
307 |
||
308 |
default: |
|
309 |
return false; |
|
310 |
}
|
|
311 |
||
312 |
return false; |
|
313 |
}
|
|
314 |
||
315 |
/**
|
|
316 |
* Update user PM count
|
|
317 |
*/
|
|
318 |
function update_pm_counts() |
|
319 |
{
|
|
320 |
global $user, $db; |
|
321 |
||
322 |
// Update unread count
|
|
323 |
$sql = 'SELECT COUNT(msg_id) as num_messages |
|
324 |
FROM ' . PRIVMSGS_TO_TABLE . ' |
|
325 |
WHERE pm_unread = 1
|
|
326 |
AND folder_id <> ' . PRIVMSGS_OUTBOX . ' |
|
327 |
AND user_id = ' . $user->data['user_id']; |
|
328 |
$result = $db->sql_query($sql); |
|
329 |
$user->data['user_unread_privmsg'] = (int) $db->sql_fetchfield('num_messages'); |
|
330 |
$db->sql_freeresult($result); |
|
331 |
||
332 |
// Update new pm count
|
|
333 |
$sql = 'SELECT COUNT(msg_id) as num_messages |
|
334 |
FROM ' . PRIVMSGS_TO_TABLE . ' |
|
335 |
WHERE pm_new = 1
|
|
336 |
AND folder_id IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ') |
|
337 |
AND user_id = ' . $user->data['user_id']; |
|
338 |
$result = $db->sql_query($sql); |
|
339 |
$user->data['user_new_privmsg'] = (int) $db->sql_fetchfield('num_messages'); |
|
340 |
$db->sql_freeresult($result); |
|
341 |
||
342 |
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array( |
|
343 |
'user_unread_privmsg' => (int) $user->data['user_unread_privmsg'], |
|
344 |
'user_new_privmsg' => (int) $user->data['user_new_privmsg'], |
|
345 |
)) . ' WHERE user_id = ' . $user->data['user_id']); |
|
346 |
||
347 |
// Ok, here we need to repair something, other boxes than privmsgs_no_box and privmsgs_hold_box should not carry the pm_new flag.
|
|
348 |
if (!$user->data['user_new_privmsg']) |
|
349 |
{
|
|
350 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
351 |
SET pm_new = 0
|
|
352 |
WHERE pm_new = 1
|
|
353 |
AND folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ') |
|
354 |
AND user_id = ' . $user->data['user_id']; |
|
355 |
$db->sql_query($sql); |
|
356 |
}
|
|
357 |
}
|
|
358 |
||
359 |
/**
|
|
360 |
* Place new messages into appropriate folder
|
|
361 |
*/
|
|
362 |
function place_pm_into_folder(&$global_privmsgs_rules, $release = false) |
|
363 |
{
|
|
364 |
global $db, $user, $config; |
|
365 |
||
366 |
if (!$user->data['user_new_privmsg']) |
|
367 |
{
|
|
368 |
return array('not_moved' => 0, 'removed' => 0); |
|
369 |
}
|
|
370 |
||
371 |
$user_message_rules = (int) $user->data['user_message_rules']; |
|
372 |
$user_id = (int) $user->data['user_id']; |
|
373 |
||
374 |
$action_ary = $move_into_folder = array(); |
|
375 |
$num_removed = 0; |
|
376 |
||
377 |
// Newly processing on-hold messages
|
|
378 |
if ($release) |
|
379 |
{
|
|
380 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
381 |
SET folder_id = ' . PRIVMSGS_NO_BOX . ' |
|
382 |
WHERE folder_id = ' . PRIVMSGS_HOLD_BOX . " |
|
383 |
AND user_id = $user_id"; |
|
384 |
$db->sql_query($sql); |
|
385 |
}
|
|
386 |
||
387 |
// Get those messages not yet placed into any box
|
|
388 |
$retrieve_sql = 'SELECT t.*, p.*, u.username, u.user_id, u.group_id |
|
389 |
FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . " u |
|
390 |
WHERE t.user_id = $user_id |
|
391 |
AND p.author_id = u.user_id
|
|
392 |
AND t.folder_id = " . PRIVMSGS_NO_BOX . ' |
|
393 |
AND t.msg_id = p.msg_id'; |
|
394 |
||
395 |
// Just place into the appropriate arrays if no rules need to be checked
|
|
396 |
if (!$user_message_rules) |
|
397 |
{
|
|
398 |
$result = $db->sql_query($retrieve_sql); |
|
399 |
||
400 |
while ($row = $db->sql_fetchrow($result)) |
|
401 |
{
|
|
402 |
$action_ary[$row['msg_id']][] = array('action' => false); |
|
403 |
}
|
|
404 |
$db->sql_freeresult($result); |
|
405 |
}
|
|
406 |
else
|
|
407 |
{
|
|
408 |
$user_rules = $zebra = $check_rows = array(); |
|
409 |
$user_ids = $memberships = array(); |
|
410 |
||
411 |
// First of all, grab all rules and retrieve friends/foes
|
|
412 |
$sql = 'SELECT * |
|
413 |
FROM ' . PRIVMSGS_RULES_TABLE . " |
|
414 |
WHERE user_id = $user_id"; |
|
415 |
$result = $db->sql_query($sql); |
|
416 |
$user_rules = $db->sql_fetchrowset($result); |
|
417 |
$db->sql_freeresult($result); |
|
418 |
||
419 |
if (sizeof($user_rules)) |
|
420 |
{
|
|
421 |
$sql = 'SELECT zebra_id, friend, foe |
|
422 |
FROM ' . ZEBRA_TABLE . " |
|
423 |
WHERE user_id = $user_id"; |
|
424 |
$result = $db->sql_query($sql); |
|
425 |
||
426 |
while ($row = $db->sql_fetchrow($result)) |
|
427 |
{
|
|
428 |
$zebra[$row['zebra_id']] = $row; |
|
429 |
}
|
|
430 |
$db->sql_freeresult($result); |
|
431 |
}
|
|
432 |
||
433 |
// Now build a bare-bone check_row array
|
|
434 |
$result = $db->sql_query($retrieve_sql); |
|
435 |
||
436 |
while ($row = $db->sql_fetchrow($result)) |
|
437 |
{
|
|
438 |
$check_rows[] = array_merge($row, array( |
|
439 |
'to' => explode(':', $row['to_address']), |
|
440 |
'bcc' => explode(':', $row['bcc_address']), |
|
441 |
'friend' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['friend'] : 0, |
|
442 |
'foe' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['foe'] : 0, |
|
443 |
'user_in_group' => array($user->data['group_id']), |
|
444 |
'author_in_group' => array()) |
|
445 |
);
|
|
446 |
||
447 |
$user_ids[] = $row['user_id']; |
|
448 |
}
|
|
449 |
$db->sql_freeresult($result); |
|
450 |
||
451 |
// Retrieve user memberships
|
|
452 |
if (sizeof($user_ids)) |
|
453 |
{
|
|
454 |
$sql = 'SELECT * |
|
455 |
FROM ' . USER_GROUP_TABLE . ' |
|
456 |
WHERE ' . $db->sql_in_set('user_id', $user_ids) . ' |
|
457 |
AND user_pending = 0'; |
|
458 |
$result = $db->sql_query($sql); |
|
459 |
||
460 |
while ($row = $db->sql_fetchrow($result)) |
|
461 |
{
|
|
462 |
$memberships[$row['user_id']][] = $row['group_id']; |
|
463 |
}
|
|
464 |
$db->sql_freeresult($result); |
|
465 |
}
|
|
466 |
||
467 |
// Now place into the appropriate folder
|
|
468 |
foreach ($check_rows as $row) |
|
469 |
{
|
|
470 |
// Add membership if set
|
|
471 |
if (isset($memberships[$row['author_id']])) |
|
472 |
{
|
|
473 |
$row['author_in_group'] = $memberships[$row['user_id']]; |
|
474 |
}
|
|
475 |
||
476 |
// Check Rule - this should be very quick since we have all information we need
|
|
477 |
$is_match = false; |
|
478 |
foreach ($user_rules as $rule_row) |
|
479 |
{
|
|
480 |
if (($action = check_rule($global_privmsgs_rules, $rule_row, $row, $user_id)) !== false) |
|
481 |
{
|
|
482 |
$is_match = true; |
|
483 |
$action_ary[$row['msg_id']][] = $action; |
|
484 |
}
|
|
485 |
}
|
|
486 |
||
487 |
if (!$is_match) |
|
488 |
{
|
|
489 |
$action_ary[$row['msg_id']][] = array('action' => false); |
|
490 |
}
|
|
491 |
}
|
|
492 |
||
493 |
unset($user_rules, $zebra, $check_rows, $user_ids, $memberships); |
|
494 |
}
|
|
495 |
||
496 |
// We place actions into arrays, to save queries.
|
|
497 |
$sql = $unread_ids = $delete_ids = $important_ids = array(); |
|
498 |
||
499 |
foreach ($action_ary as $msg_id => $msg_ary) |
|
500 |
{
|
|
501 |
// It is allowed to execute actions more than once, except placing messages into folder
|
|
502 |
$folder_action = $message_removed = false; |
|
503 |
||
504 |
foreach ($msg_ary as $pos => $rule_ary) |
|
505 |
{
|
|
506 |
if ($folder_action && $rule_ary['action'] == ACTION_PLACE_INTO_FOLDER) |
|
507 |
{
|
|
508 |
continue; |
|
509 |
}
|
|
510 |
||
511 |
switch ($rule_ary['action']) |
|
512 |
{
|
|
513 |
case ACTION_PLACE_INTO_FOLDER: |
|
514 |
// Folder actions have precedence, so we will remove any other ones
|
|
515 |
$folder_action = true; |
|
516 |
$move_into_folder[(int) $rule_ary['folder_id']][] = $msg_id; |
|
517 |
break; |
|
518 |
||
519 |
case ACTION_MARK_AS_READ: |
|
520 |
if ($rule_ary['pm_unread']) |
|
521 |
{
|
|
522 |
$unread_ids[] = $msg_id; |
|
523 |
}
|
|
524 |
break; |
|
525 |
||
526 |
case ACTION_DELETE_MESSAGE: |
|
527 |
$delete_ids[] = $msg_id; |
|
528 |
$message_removed = true; |
|
529 |
break; |
|
530 |
||
531 |
case ACTION_MARK_AS_IMPORTANT: |
|
532 |
if (!$rule_ary['pm_marked']) |
|
533 |
{
|
|
534 |
$important_ids[] = $msg_id; |
|
535 |
}
|
|
536 |
break; |
|
537 |
}
|
|
538 |
}
|
|
539 |
||
540 |
// We place this here because it could happen that the messages are doubled if a rule marks a message and then moves it into a specific
|
|
541 |
// folder. Here we simply move the message into the INBOX if it gets not removed and also not put into a custom folder.
|
|
542 |
if (!$folder_action && !$message_removed) |
|
543 |
{
|
|
544 |
$move_into_folder[PRIVMSGS_INBOX][] = $msg_id; |
|
545 |
}
|
|
546 |
}
|
|
547 |
||
548 |
// Do not change the order of processing
|
|
549 |
// The number of queries needed to be executed here highly depends on the defined rules and are
|
|
550 |
// only gone through if new messages arrive.
|
|
551 |
||
552 |
// Delete messages
|
|
553 |
if (sizeof($delete_ids)) |
|
554 |
{
|
|
555 |
$num_removed += sizeof($delete_ids); |
|
556 |
delete_pm($user_id, $delete_ids, PRIVMSGS_NO_BOX); |
|
557 |
}
|
|
558 |
||
559 |
// Set messages to Unread
|
|
560 |
if (sizeof($unread_ids)) |
|
561 |
{
|
|
562 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
563 |
SET pm_unread = 0
|
|
564 |
WHERE ' . $db->sql_in_set('msg_id', $unread_ids) . " |
|
565 |
AND user_id = $user_id |
|
566 |
AND folder_id = " . PRIVMSGS_NO_BOX; |
|
567 |
$db->sql_query($sql); |
|
568 |
}
|
|
569 |
||
570 |
// mark messages as important
|
|
571 |
if (sizeof($important_ids)) |
|
572 |
{
|
|
573 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
574 |
SET pm_marked = 1 - pm_marked
|
|
575 |
WHERE folder_id = ' . PRIVMSGS_NO_BOX . " |
|
576 |
AND user_id = $user_id |
|
577 |
AND " . $db->sql_in_set('msg_id', $important_ids); |
|
578 |
$db->sql_query($sql); |
|
579 |
}
|
|
580 |
||
581 |
// Move into folder
|
|
582 |
$folder = array(); |
|
583 |
||
584 |
if (sizeof($move_into_folder)) |
|
585 |
{
|
|
586 |
// Determine Full Folder Action - we need the move to folder id later eventually
|
|
587 |
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder']; |
|
588 |
||
589 |
$sql_folder = array_keys($move_into_folder); |
|
590 |
if ($full_folder_action >= 0) |
|
591 |
{
|
|
592 |
$sql_folder[] = $full_folder_action; |
|
593 |
}
|
|
594 |
||
595 |
$sql = 'SELECT folder_id, pm_count |
|
596 |
FROM ' . PRIVMSGS_FOLDER_TABLE . ' |
|
597 |
WHERE ' . $db->sql_in_set('folder_id', $sql_folder) . " |
|
598 |
AND user_id = $user_id"; |
|
599 |
$result = $db->sql_query($sql); |
|
600 |
||
601 |
while ($row = $db->sql_fetchrow($result)) |
|
602 |
{
|
|
603 |
$folder[(int) $row['folder_id']] = (int) $row['pm_count']; |
|
604 |
}
|
|
605 |
$db->sql_freeresult($result); |
|
606 |
||
607 |
unset($sql_folder); |
|
608 |
||
609 |
if (in_array(PRIVMSGS_INBOX, array_keys($move_into_folder))) |
|
610 |
{
|
|
611 |
$sql = 'SELECT COUNT(msg_id) as num_messages |
|
612 |
FROM ' . PRIVMSGS_TO_TABLE . " |
|
613 |
WHERE user_id = $user_id |
|
614 |
AND folder_id = " . PRIVMSGS_INBOX; |
|
615 |
$result = $db->sql_query($sql); |
|
616 |
$folder[PRIVMSGS_INBOX] = (int) $db->sql_fetchfield('num_messages'); |
|
617 |
$db->sql_freeresult($result); |
|
618 |
}
|
|
619 |
}
|
|
620 |
||
621 |
// Here we have ideally only one folder to move into
|
|
622 |
foreach ($move_into_folder as $folder_id => $msg_ary) |
|
623 |
{
|
|
624 |
$dest_folder = $folder_id; |
|
625 |
$full_folder_action = FULL_FOLDER_NONE; |
|
626 |
||
627 |
// Check Message Limit - we calculate with the complete array, most of the time it is one message
|
|
628 |
// But we are making sure that the other way around works too (more messages in queue than allowed to be stored)
|
|
629 |
if ($user->data['message_limit'] && $folder[$folder_id] && ($folder[$folder_id] + sizeof($msg_ary)) > $user->data['message_limit']) |
|
630 |
{
|
|
631 |
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder']; |
|
632 |
||
633 |
// If destination folder itself is full...
|
|
634 |
if ($full_folder_action >= 0 && ($folder[$full_folder_action] + sizeof($msg_ary)) > $user->data['message_limit']) |
|
635 |
{
|
|
636 |
$full_folder_action = $config['full_folder_action'] - (FULL_FOLDER_NONE*(-1)); |
|
637 |
}
|
|
638 |
||
639 |
// If Full Folder Action is to move to another folder, we simply adjust the destination folder
|
|
640 |
if ($full_folder_action >= 0) |
|
641 |
{
|
|
642 |
$dest_folder = $full_folder_action; |
|
643 |
}
|
|
644 |
else if ($full_folder_action == FULL_FOLDER_DELETE) |
|
645 |
{
|
|
646 |
// Delete some messages. NOTE: Ordered by msg_id here instead of message_time!
|
|
647 |
$sql = 'SELECT msg_id |
|
648 |
FROM ' . PRIVMSGS_TO_TABLE . " |
|
649 |
WHERE user_id = $user_id |
|
650 |
AND folder_id = $dest_folder |
|
651 |
ORDER BY msg_id ASC"; |
|
652 |
$result = $db->sql_query_limit($sql, (($folder[$dest_folder] + sizeof($msg_ary)) - $user->data['message_limit'])); |
|
653 |
||
654 |
$delete_ids = array(); |
|
655 |
while ($row = $db->sql_fetchrow($result)) |
|
656 |
{
|
|
657 |
$delete_ids[] = $row['msg_id']; |
|
658 |
}
|
|
659 |
$db->sql_freeresult($result); |
|
660 |
||
661 |
$num_removed += sizeof($delete_ids); |
|
662 |
delete_pm($user_id, $delete_ids, $dest_folder); |
|
663 |
}
|
|
664 |
}
|
|
665 |
||
666 |
//
|
|
667 |
if ($full_folder_action == FULL_FOLDER_HOLD) |
|
668 |
{
|
|
669 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
670 |
SET folder_id = ' . PRIVMSGS_HOLD_BOX . ' |
|
671 |
WHERE folder_id = ' . PRIVMSGS_NO_BOX . " |
|
672 |
AND user_id = $user_id |
|
673 |
AND " . $db->sql_in_set('msg_id', $msg_ary); |
|
674 |
$db->sql_query($sql); |
|
675 |
}
|
|
676 |
else
|
|
677 |
{
|
|
678 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . " |
|
679 |
SET folder_id = $dest_folder, pm_new = 0 |
|
680 |
WHERE folder_id = " . PRIVMSGS_NO_BOX . " |
|
681 |
AND user_id = $user_id |
|
682 |
AND pm_new = 1
|
|
683 |
AND " . $db->sql_in_set('msg_id', $msg_ary); |
|
684 |
$db->sql_query($sql); |
|
685 |
||
686 |
if ($dest_folder != PRIVMSGS_INBOX) |
|
687 |
{
|
|
688 |
$sql = 'UPDATE ' . PRIVMSGS_FOLDER_TABLE . ' |
|
689 |
SET pm_count = pm_count + ' . (int) $db->sql_affectedrows() . " |
|
690 |
WHERE folder_id = $dest_folder |
|
691 |
AND user_id = $user_id"; |
|
692 |
$db->sql_query($sql); |
|
693 |
}
|
|
694 |
}
|
|
695 |
}
|
|
696 |
||
697 |
if (sizeof($action_ary)) |
|
698 |
{
|
|
699 |
// Move from OUTBOX to SENTBOX
|
|
700 |
// We are not checking any full folder status here... SENTBOX is a special treatment (old messages get deleted)
|
|
701 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
702 |
SET folder_id = ' . PRIVMSGS_SENTBOX . ' |
|
703 |
WHERE folder_id = ' . PRIVMSGS_OUTBOX . ' |
|
704 |
AND ' . $db->sql_in_set('msg_id', array_keys($action_ary)); |
|
705 |
$db->sql_query($sql); |
|
706 |
}
|
|
707 |
||
708 |
// Update new/unread count
|
|
709 |
update_pm_counts(); |
|
710 |
||
711 |
// Now check how many messages got not moved...
|
|
712 |
$sql = 'SELECT COUNT(msg_id) as num_messages |
|
713 |
FROM ' . PRIVMSGS_TO_TABLE . " |
|
714 |
WHERE user_id = $user_id |
|
715 |
AND folder_id = " . PRIVMSGS_HOLD_BOX; |
|
716 |
$result = $db->sql_query($sql); |
|
717 |
$num_not_moved = (int) $db->sql_fetchfield('num_messages'); |
|
718 |
$db->sql_freeresult($result); |
|
719 |
||
720 |
return array('not_moved' => $num_not_moved, 'removed' => $num_removed); |
|
721 |
}
|
|
722 |
||
723 |
/**
|
|
724 |
* Move PM from one to another folder
|
|
725 |
*/
|
|
726 |
function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_folder_id) |
|
727 |
{
|
|
728 |
global $db, $user; |
|
729 |
global $phpbb_root_path, $phpEx; |
|
730 |
||
731 |
$num_moved = 0; |
|
732 |
||
733 |
if (!is_array($move_msg_ids)) |
|
734 |
{
|
|
735 |
$move_msg_ids = array($move_msg_ids); |
|
736 |
}
|
|
737 |
||
738 |
if (sizeof($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) && |
|
739 |
!in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)) && $cur_folder_id != $dest_folder) |
|
740 |
{
|
|
741 |
// We have to check the destination folder ;)
|
|
742 |
if ($dest_folder != PRIVMSGS_INBOX) |
|
743 |
{
|
|
744 |
$sql = 'SELECT folder_id, folder_name, pm_count |
|
745 |
FROM ' . PRIVMSGS_FOLDER_TABLE . " |
|
746 |
WHERE folder_id = $dest_folder |
|
747 |
AND user_id = $user_id"; |
|
748 |
$result = $db->sql_query($sql); |
|
749 |
$row = $db->sql_fetchrow($result); |
|
750 |
$db->sql_freeresult($result); |
|
751 |
||
752 |
if (!$row) |
|
753 |
{
|
|
754 |
trigger_error('NOT_AUTHORISED'); |
|
755 |
}
|
|
756 |
||
757 |
if ($message_limit && $row['pm_count'] + sizeof($move_msg_ids) > $message_limit) |
|
758 |
{
|
|
759 |
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $row['folder_name']) . '<br /><br />'; |
|
760 |
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=' . $row['folder_id']) . '">', '</a>', $row['folder_name']); |
|
761 |
trigger_error($message); |
|
762 |
}
|
|
763 |
}
|
|
764 |
else
|
|
765 |
{
|
|
766 |
$sql = 'SELECT COUNT(msg_id) as num_messages |
|
767 |
FROM ' . PRIVMSGS_TO_TABLE . ' |
|
768 |
WHERE folder_id = ' . PRIVMSGS_INBOX . " |
|
769 |
AND user_id = $user_id"; |
|
770 |
$result = $db->sql_query($sql); |
|
771 |
$num_messages = (int) $db->sql_fetchfield('num_messages'); |
|
772 |
$db->sql_freeresult($result); |
|
773 |
||
774 |
if ($message_limit && $num_messages + sizeof($move_msg_ids) > $message_limit) |
|
775 |
{
|
|
776 |
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $user->lang['PM_INBOX']) . '<br /><br />'; |
|
777 |
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=inbox') . '">', '</a>', $user->lang['PM_INBOX']); |
|
778 |
trigger_error($message); |
|
779 |
}
|
|
780 |
}
|
|
781 |
||
782 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . " |
|
783 |
SET folder_id = $dest_folder |
|
784 |
WHERE folder_id = $cur_folder_id |
|
785 |
AND user_id = $user_id |
|
786 |
AND " . $db->sql_in_set('msg_id', $move_msg_ids); |
|
787 |
$db->sql_query($sql); |
|
788 |
$num_moved = $db->sql_affectedrows(); |
|
789 |
||
790 |
// Update pm counts
|
|
791 |
if ($num_moved) |
|
792 |
{
|
|
793 |
if (!in_array($cur_folder_id, array(PRIVMSGS_INBOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX))) |
|
794 |
{
|
|
795 |
$sql = 'UPDATE ' . PRIVMSGS_FOLDER_TABLE . " |
|
796 |
SET pm_count = pm_count - $num_moved |
|
797 |
WHERE folder_id = $cur_folder_id |
|
798 |
AND user_id = $user_id"; |
|
799 |
$db->sql_query($sql); |
|
800 |
}
|
|
801 |
||
802 |
if ($dest_folder != PRIVMSGS_INBOX) |
|
803 |
{
|
|
804 |
$sql = 'UPDATE ' . PRIVMSGS_FOLDER_TABLE . " |
|
805 |
SET pm_count = pm_count + $num_moved |
|
806 |
WHERE folder_id = $dest_folder |
|
807 |
AND user_id = $user_id"; |
|
808 |
$db->sql_query($sql); |
|
809 |
}
|
|
810 |
}
|
|
811 |
}
|
|
812 |
else if (in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX))) |
|
813 |
{
|
|
814 |
trigger_error('CANNOT_MOVE_SPECIAL'); |
|
815 |
}
|
|
816 |
||
817 |
return $num_moved; |
|
818 |
}
|
|
819 |
||
820 |
/**
|
|
821 |
* Update unread message status
|
|
822 |
*/
|
|
823 |
function update_unread_status($unread, $msg_id, $user_id, $folder_id) |
|
824 |
{
|
|
825 |
if (!$unread) |
|
826 |
{
|
|
827 |
return; |
|
828 |
}
|
|
829 |
||
830 |
global $db, $user; |
|
831 |
||
832 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . " |
|
833 |
SET pm_unread = 0
|
|
834 |
WHERE msg_id = $msg_id |
|
835 |
AND user_id = $user_id |
|
836 |
AND folder_id = $folder_id"; |
|
837 |
$db->sql_query($sql); |
|
838 |
||
839 |
$sql = 'UPDATE ' . USERS_TABLE . " |
|
840 |
SET user_unread_privmsg = user_unread_privmsg - 1
|
|
841 |
WHERE user_id = $user_id"; |
|
842 |
$db->sql_query($sql); |
|
843 |
||
844 |
if ($user->data['user_id'] == $user_id) |
|
845 |
{
|
|
846 |
$user->data['user_unread_privmsg']--; |
|
847 |
||
848 |
// Try to cope with previous wrong conversions...
|
|
849 |
if ($user->data['user_unread_privmsg'] < 0) |
|
850 |
{
|
|
851 |
$sql = 'UPDATE ' . USERS_TABLE . " |
|
852 |
SET user_unread_privmsg = 0
|
|
853 |
WHERE user_id = $user_id"; |
|
854 |
$db->sql_query($sql); |
|
855 |
||
856 |
$user->data['user_unread_privmsg'] = 0; |
|
857 |
}
|
|
858 |
}
|
|
859 |
}
|
|
860 |
||
861 |
/**
|
|
862 |
* Handle all actions possible with marked messages
|
|
863 |
*/
|
|
864 |
function handle_mark_actions($user_id, $mark_action) |
|
865 |
{
|
|
866 |
global $db, $user, $phpbb_root_path, $phpEx; |
|
867 |
||
868 |
$msg_ids = request_var('marked_msg_id', array(0)); |
|
869 |
$cur_folder_id = request_var('cur_folder_id', PRIVMSGS_NO_BOX); |
|
870 |
$confirm = (isset($_POST['confirm'])) ? true : false; |
|
871 |
||
872 |
if (!sizeof($msg_ids)) |
|
873 |
{
|
|
874 |
return false; |
|
875 |
}
|
|
876 |
||
877 |
switch ($mark_action) |
|
878 |
{
|
|
879 |
case 'mark_important': |
|
880 |
||
881 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . " |
|
882 |
SET pm_marked = 1 - pm_marked
|
|
883 |
WHERE folder_id = $cur_folder_id |
|
884 |
AND user_id = $user_id |
|
885 |
AND " . $db->sql_in_set('msg_id', $msg_ids); |
|
886 |
$db->sql_query($sql); |
|
887 |
||
888 |
break; |
|
889 |
||
890 |
case 'delete_marked': |
|
891 |
||
892 |
if (confirm_box(true)) |
|
893 |
{
|
|
894 |
delete_pm($user_id, $msg_ids, $cur_folder_id); |
|
895 |
||
896 |
$success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED'; |
|
897 |
$redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&folder=' . $cur_folder_id); |
|
898 |
||
899 |
meta_refresh(3, $redirect); |
|
900 |
trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_FOLDER'], '<a href="' . $redirect . '">', '</a>')); |
|
901 |
}
|
|
902 |
else
|
|
903 |
{
|
|
904 |
$s_hidden_fields = array( |
|
905 |
'cur_folder_id' => $cur_folder_id, |
|
906 |
'mark_option' => 'delete_marked', |
|
907 |
'submit_mark' => true, |
|
908 |
'marked_msg_id' => $msg_ids |
|
909 |
);
|
|
910 |
||
911 |
confirm_box(false, 'DELETE_MARKED_PM', build_hidden_fields($s_hidden_fields)); |
|
912 |
}
|
|
913 |
||
914 |
break; |
|
915 |
||
916 |
default: |
|
917 |
return false; |
|
918 |
}
|
|
919 |
||
920 |
return true; |
|
921 |
}
|
|
922 |
||
923 |
/**
|
|
924 |
* Delete PM(s)
|
|
925 |
*/
|
|
926 |
function delete_pm($user_id, $msg_ids, $folder_id) |
|
927 |
{
|
|
928 |
global $db, $user; |
|
929 |
||
930 |
$user_id = (int) $user_id; |
|
931 |
$folder_id = (int) $folder_id; |
|
932 |
||
933 |
if (!$user_id) |
|
934 |
{
|
|
935 |
return false; |
|
936 |
}
|
|
937 |
||
938 |
if (!is_array($msg_ids)) |
|
939 |
{
|
|
940 |
if (!$msg_ids) |
|
941 |
{
|
|
942 |
return false; |
|
943 |
}
|
|
944 |
$msg_ids = array($msg_ids); |
|
945 |
}
|
|
946 |
||
947 |
if (!sizeof($msg_ids)) |
|
948 |
{
|
|
949 |
return false; |
|
950 |
}
|
|
951 |
||
952 |
// Get PM Information for later deleting
|
|
953 |
$sql = 'SELECT msg_id, pm_unread, pm_new |
|
954 |
FROM ' . PRIVMSGS_TO_TABLE . ' |
|
955 |
WHERE ' . $db->sql_in_set('msg_id', array_map('intval', $msg_ids)) . " |
|
956 |
AND folder_id = $folder_id |
|
957 |
AND user_id = $user_id"; |
|
958 |
$result = $db->sql_query($sql); |
|
959 |
||
960 |
$delete_rows = array(); |
|
961 |
$num_unread = $num_new = $num_deleted = 0; |
|
962 |
while ($row = $db->sql_fetchrow($result)) |
|
963 |
{
|
|
964 |
$num_unread += (int) $row['pm_unread']; |
|
965 |
$num_new += (int) $row['pm_new']; |
|
966 |
||
967 |
$delete_rows[$row['msg_id']] = 1; |
|
968 |
}
|
|
969 |
$db->sql_freeresult($result); |
|
970 |
unset($msg_ids); |
|
971 |
||
972 |
if (!sizeof($delete_rows)) |
|
973 |
{
|
|
974 |
return false; |
|
975 |
}
|
|
976 |
||
977 |
// if no one has read the message yet (meaning it is in users outbox)
|
|
978 |
// then mark the message as deleted...
|
|
979 |
if ($folder_id == PRIVMSGS_OUTBOX) |
|
980 |
{
|
|
981 |
// Remove PM from Outbox
|
|
982 |
$sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " |
|
983 |
WHERE user_id = $user_id AND folder_id = " . PRIVMSGS_OUTBOX . ' |
|
984 |
AND ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); |
|
985 |
$db->sql_query($sql); |
|
986 |
||
987 |
// Update PM Information for safety
|
|
988 |
$sql = 'UPDATE ' . PRIVMSGS_TABLE . " SET message_text = '' |
|
989 |
WHERE " . $db->sql_in_set('msg_id', array_keys($delete_rows)); |
|
990 |
$db->sql_query($sql); |
|
991 |
||
992 |
// Set delete flag for those intended to receive the PM
|
|
993 |
// We do not remove the message actually, to retain some basic information (sent time for example)
|
|
994 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
995 |
SET pm_deleted = 1
|
|
996 |
WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); |
|
997 |
$db->sql_query($sql); |
|
998 |
||
999 |
$num_deleted = $db->sql_affectedrows(); |
|
1000 |
}
|
|
1001 |
else
|
|
1002 |
{
|
|
1003 |
// Delete private message data
|
|
1004 |
$sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " |
|
1005 |
WHERE user_id = $user_id |
|
1006 |
AND folder_id = $folder_id |
|
1007 |
AND " . $db->sql_in_set('msg_id', array_keys($delete_rows)); |
|
1008 |
$db->sql_query($sql); |
|
1009 |
$num_deleted = $db->sql_affectedrows(); |
|
1010 |
}
|
|
1011 |
||
1012 |
// if folder id is user defined folder then decrease pm_count
|
|
1013 |
if (!in_array($folder_id, array(PRIVMSGS_INBOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX, PRIVMSGS_NO_BOX))) |
|
1014 |
{
|
|
1015 |
$sql = 'UPDATE ' . PRIVMSGS_FOLDER_TABLE . " |
|
1016 |
SET pm_count = pm_count - $num_deleted |
|
1017 |
WHERE folder_id = $folder_id"; |
|
1018 |
$db->sql_query($sql); |
|
1019 |
}
|
|
1020 |
||
1021 |
// Update unread and new status field
|
|
1022 |
if ($num_unread || $num_new) |
|
1023 |
{
|
|
1024 |
$set_sql = ($num_unread) ? 'user_unread_privmsg = user_unread_privmsg - ' . $num_unread : ''; |
|
1025 |
||
1026 |
if ($num_new) |
|
1027 |
{
|
|
1028 |
$set_sql .= ($set_sql != '') ? ', ' : ''; |
|
1029 |
$set_sql .= 'user_new_privmsg = user_new_privmsg - ' . $num_new; |
|
1030 |
}
|
|
1031 |
||
1032 |
$db->sql_query('UPDATE ' . USERS_TABLE . " SET $set_sql WHERE user_id = $user_id"); |
|
1033 |
||
1034 |
$user->data['user_new_privmsg'] -= $num_new; |
|
1035 |
$user->data['user_unread_privmsg'] -= $num_unread; |
|
1036 |
}
|
|
1037 |
||
1038 |
// Now we have to check which messages we can delete completely
|
|
1039 |
$sql = 'SELECT msg_id |
|
1040 |
FROM ' . PRIVMSGS_TO_TABLE . ' |
|
1041 |
WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); |
|
1042 |
$result = $db->sql_query($sql); |
|
1043 |
||
1044 |
while ($row = $db->sql_fetchrow($result)) |
|
1045 |
{
|
|
1046 |
unset($delete_rows[$row['msg_id']]); |
|
1047 |
}
|
|
1048 |
$db->sql_freeresult($result); |
|
1049 |
||
1050 |
$delete_ids = array_keys($delete_rows); |
|
1051 |
||
1052 |
if (sizeof($delete_ids)) |
|
1053 |
{
|
|
1054 |
$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' |
|
1055 |
WHERE ' . $db->sql_in_set('msg_id', $delete_ids); |
|
1056 |
$db->sql_query($sql); |
|
1057 |
}
|
|
1058 |
||
1059 |
return true; |
|
1060 |
}
|
|
1061 |
||
1062 |
/**
|
|
1063 |
* Rebuild message header
|
|
1064 |
*/
|
|
1065 |
function rebuild_header($check_ary) |
|
1066 |
{
|
|
1067 |
global $db; |
|
1068 |
||
1069 |
$address = array(); |
|
1070 |
||
1071 |
foreach ($check_ary as $check_type => $address_field) |
|
1072 |
{
|
|
1073 |
// Split Addresses into users and groups
|
|
1074 |
preg_match_all('/:?(u|g)_([0-9]+):?/', $address_field, $match); |
|
1075 |
||
1076 |
$u = $g = array(); |
|
1077 |
foreach ($match[1] as $id => $type) |
|
1078 |
{
|
|
1079 |
${$type}[] = (int) $match[2][$id]; |
|
1080 |
}
|
|
1081 |
||
1082 |
$_types = array('u', 'g'); |
|
1083 |
foreach ($_types as $type) |
|
1084 |
{
|
|
1085 |
if (sizeof($$type)) |
|
1086 |
{
|
|
1087 |
foreach ($$type as $id) |
|
1088 |
{
|
|
1089 |
$address[$type][$id] = $check_type; |
|
1090 |
}
|
|
1091 |
}
|
|
1092 |
}
|
|
1093 |
}
|
|
1094 |
||
1095 |
return $address; |
|
1096 |
}
|
|
1097 |
||
1098 |
/**
|
|
1099 |
* Print out/assign recipient information
|
|
1100 |
*/
|
|
1101 |
function write_pm_addresses($check_ary, $author_id, $plaintext = false) |
|
1102 |
{
|
|
1103 |
global $db, $user, $template, $phpbb_root_path, $phpEx; |
|
1104 |
||
1105 |
$addresses = array(); |
|
1106 |
||
1107 |
foreach ($check_ary as $check_type => $address_field) |
|
1108 |
{
|
|
1109 |
if (!is_array($address_field)) |
|
1110 |
{
|
|
1111 |
// Split Addresses into users and groups
|
|
1112 |
preg_match_all('/:?(u|g)_([0-9]+):?/', $address_field, $match); |
|
1113 |
||
1114 |
$u = $g = array(); |
|
1115 |
foreach ($match[1] as $id => $type) |
|
1116 |
{
|
|
1117 |
${$type}[] = (int) $match[2][$id]; |
|
1118 |
}
|
|
1119 |
}
|
|
1120 |
else
|
|
1121 |
{
|
|
1122 |
$u = $address_field['u']; |
|
1123 |
$g = $address_field['g']; |
|
1124 |
}
|
|
1125 |
||
1126 |
$address = array(); |
|
1127 |
if (sizeof($u)) |
|
1128 |
{
|
|
1129 |
$sql = 'SELECT user_id, username, user_colour |
|
1130 |
FROM ' . USERS_TABLE . ' |
|
1131 |
WHERE ' . $db->sql_in_set('user_id', $u) . ' |
|
1132 |
AND user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')'; |
|
1133 |
$result = $db->sql_query($sql); |
|
1134 |
||
1135 |
while ($row = $db->sql_fetchrow($result)) |
|
1136 |
{
|
|
1137 |
if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id']) |
|
1138 |
{
|
|
1139 |
if ($plaintext) |
|
1140 |
{
|
|
1141 |
$address[] = $row['username']; |
|
1142 |
}
|
|
1143 |
else
|
|
1144 |
{
|
|
1145 |
$address['user'][$row['user_id']] = array('name' => $row['username'], 'colour' => $row['user_colour']); |
|
1146 |
}
|
|
1147 |
}
|
|
1148 |
}
|
|
1149 |
$db->sql_freeresult($result); |
|
1150 |
}
|
|
1151 |
||
1152 |
if (sizeof($g)) |
|
1153 |
{
|
|
1154 |
if ($plaintext) |
|
1155 |
{
|
|
1156 |
$sql = 'SELECT group_name, group_type |
|
1157 |
FROM ' . GROUPS_TABLE . ' |
|
1158 |
WHERE ' . $db->sql_in_set('group_id', $g); |
|
1159 |
$result = $db->sql_query($sql); |
|
1160 |
||
1161 |
while ($row = $db->sql_fetchrow($result)) |
|
1162 |
{
|
|
1163 |
if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id']) |
|
1164 |
{
|
|
1165 |
$address[] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; |
|
1166 |
}
|
|
1167 |
}
|
|
1168 |
$db->sql_freeresult($result); |
|
1169 |
}
|
|
1170 |
else
|
|
1171 |
{
|
|
1172 |
$sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type, ug.user_id |
|
1173 |
FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug |
|
1174 |
WHERE ' . $db->sql_in_set('g.group_id', $g) . ' |
|
1175 |
AND g.group_id = ug.group_id
|
|
1176 |
AND ug.user_pending = 0'; |
|
1177 |
$result = $db->sql_query($sql); |
|
1178 |
||
1179 |
while ($row = $db->sql_fetchrow($result)) |
|
1180 |
{
|
|
1181 |
if (!isset($address['group'][$row['group_id']])) |
|
1182 |
{
|
|
1183 |
if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id']) |
|
1184 |
{
|
|
1185 |
$row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; |
|
1186 |
$address['group'][$row['group_id']] = array('name' => $row['group_name'], 'colour' => $row['group_colour']); |
|
1187 |
}
|
|
1188 |
}
|
|
1189 |
||
1190 |
if (isset($address['user'][$row['user_id']])) |
|
1191 |
{
|
|
1192 |
$address['user'][$row['user_id']]['in_group'] = $row['group_id']; |
|
1193 |
}
|
|
1194 |
}
|
|
1195 |
$db->sql_freeresult($result); |
|
1196 |
}
|
|
1197 |
}
|
|
1198 |
||
1199 |
if (sizeof($address) && !$plaintext) |
|
1200 |
{
|
|
1201 |
$template->assign_var('S_' . strtoupper($check_type) . '_RECIPIENT', true); |
|
1202 |
||
1203 |
foreach ($address as $type => $adr_ary) |
|
1204 |
{
|
|
1205 |
foreach ($adr_ary as $id => $row) |
|
1206 |
{
|
|
1207 |
$tpl_ary = array( |
|
1208 |
'IS_GROUP' => ($type == 'group') ? true : false, |
|
1209 |
'IS_USER' => ($type == 'user') ? true : false, |
|
1210 |
'UG_ID' => $id, |
|
1211 |
'NAME' => $row['name'], |
|
1212 |
'COLOUR' => ($row['colour']) ? '#' . $row['colour'] : '', |
|
1213 |
'TYPE' => $type, |
|
1214 |
);
|
|
1215 |
||
1216 |
if ($type == 'user') |
|
1217 |
{
|
|
1218 |
$tpl_ary = array_merge($tpl_ary, array( |
|
1219 |
'U_VIEW' => get_username_string('profile', $id, $row['name'], $row['colour']), |
|
1220 |
'NAME_FULL' => get_username_string('full', $id, $row['name'], $row['colour']), |
|
1221 |
));
|
|
1222 |
}
|
|
1223 |
else
|
|
1224 |
{
|
|
1225 |
$tpl_ary = array_merge($tpl_ary, array( |
|
1226 |
'U_VIEW' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&g=' . $id), |
|
1227 |
));
|
|
1228 |
}
|
|
1229 |
||
1230 |
$template->assign_block_vars($check_type . '_recipient', $tpl_ary); |
|
1231 |
}
|
|
1232 |
}
|
|
1233 |
}
|
|
1234 |
||
1235 |
$addresses[$check_type] = $address; |
|
1236 |
}
|
|
1237 |
||
1238 |
return $addresses; |
|
1239 |
}
|
|
1240 |
||
1241 |
/**
|
|
1242 |
* Get folder status
|
|
1243 |
*/
|
|
1244 |
function get_folder_status($folder_id, $folder) |
|
1245 |
{
|
|
1246 |
global $db, $user, $config; |
|
1247 |
||
1248 |
if (isset($folder[$folder_id])) |
|
1249 |
{
|
|
1250 |
$folder = $folder[$folder_id]; |
|
1251 |
}
|
|
1252 |
else
|
|
1253 |
{
|
|
1254 |
return false; |
|
1255 |
}
|
|
1256 |
||
1257 |
$return = array( |
|
1258 |
'folder_name' => $folder['folder_name'], |
|
1259 |
'cur' => $folder['num_messages'], |
|
1260 |
'remaining' => ($user->data['message_limit']) ? $user->data['message_limit'] - $folder['num_messages'] : 0, |
|
1261 |
'max' => $user->data['message_limit'], |
|
1262 |
'percent' => ($user->data['message_limit']) ? (($user->data['message_limit'] > 0) ? round(($folder['num_messages'] / $user->data['message_limit']) * 100) : 100) : 0, |
|
1263 |
);
|
|
1264 |
||
1265 |
$return['message'] = sprintf($user->lang['FOLDER_STATUS_MSG'], $return['percent'], $return['cur'], $return['max']); |
|
1266 |
||
1267 |
return $return; |
|
1268 |
}
|
|
1269 |
||
1270 |
//
|
|
1271 |
// COMPOSE MESSAGES
|
|
1272 |
//
|
|
1273 |
||
1274 |
/**
|
|
1275 |
* Submit PM
|
|
1276 |
*/
|
|
1277 |
function submit_pm($mode, $subject, &$data, $put_in_outbox = true) |
|
1278 |
{
|
|
1279 |
global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path; |
|
1280 |
||
1281 |
// We do not handle erasing pms here
|
|
1282 |
if ($mode == 'delete') |
|
1283 |
{
|
|
1284 |
return false; |
|
1285 |
}
|
|
1286 |
||
1287 |
$current_time = time(); |
|
1288 |
||
1289 |
// Collect some basic information about which tables and which rows to update/insert
|
|
1290 |
$sql_data = array(); |
|
1291 |
$root_level = 0; |
|
1292 |
||
1293 |
// Recipient Information
|
|
1294 |
$recipients = $to = $bcc = array(); |
|
1295 |
||
1296 |
if ($mode != 'edit') |
|
1297 |
{
|
|
1298 |
// Build Recipient List
|
|
1299 |
// u|g => array($user_id => 'to'|'bcc')
|
|
1300 |
$_types = array('u', 'g'); |
|
1301 |
foreach ($_types as $ug_type) |
|
1302 |
{
|
|
1303 |
if (isset($data['address_list'][$ug_type]) && sizeof($data['address_list'][$ug_type])) |
|
1304 |
{
|
|
1305 |
foreach ($data['address_list'][$ug_type] as $id => $field) |
|
1306 |
{
|
|
1307 |
$id = (int) $id; |
|
1308 |
||
1309 |
// Do not rely on the address list being "valid"
|
|
1310 |
if (!$id || ($ug_type == 'u' && $id == ANONYMOUS)) |
|
1311 |
{
|
|
1312 |
continue; |
|
1313 |
}
|
|
1314 |
||
1315 |
$field = ($field == 'to') ? 'to' : 'bcc'; |
|
1316 |
if ($ug_type == 'u') |
|
1317 |
{
|
|
1318 |
$recipients[$id] = $field; |
|
1319 |
}
|
|
1320 |
${$field}[] = $ug_type . '_' . $id; |
|
1321 |
}
|
|
1322 |
}
|
|
1323 |
}
|
|
1324 |
||
1325 |
if (isset($data['address_list']['g']) && sizeof($data['address_list']['g'])) |
|
1326 |
{
|
|
1327 |
$sql = 'SELECT u.user_type, ug.group_id, ug.user_id |
|
1328 |
FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . ' ug |
|
1329 |
WHERE ' . $db->sql_in_set('ug.group_id', array_keys($data['address_list']['g'])) . ' |
|
1330 |
AND ug.user_pending = 0
|
|
1331 |
AND u.user_id = ug.user_id
|
|
1332 |
AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')'; |
|
1333 |
$result = $db->sql_query($sql); |
|
1334 |
||
1335 |
while ($row = $db->sql_fetchrow($result)) |
|
1336 |
{
|
|
1337 |
$field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc'; |
|
1338 |
$recipients[$row['user_id']] = $field; |
|
1339 |
}
|
|
1340 |
$db->sql_freeresult($result); |
|
1341 |
}
|
|
1342 |
||
1343 |
if (!sizeof($recipients)) |
|
1344 |
{
|
|
1345 |
trigger_error('NO_RECIPIENT'); |
|
1346 |
}
|
|
1347 |
}
|
|
1348 |
||
1349 |
$db->sql_transaction('begin'); |
|
1350 |
||
1351 |
$sql = ''; |
|
1352 |
||
1353 |
switch ($mode) |
|
1354 |
{
|
|
1355 |
case 'reply': |
|
1356 |
case 'quote': |
|
1357 |
$root_level = ($data['reply_from_root_level']) ? $data['reply_from_root_level'] : $data['reply_from_msg_id']; |
|
1358 |
||
1359 |
// Set message_replied switch for this user
|
|
1360 |
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' |
|
1361 |
SET pm_replied = 1
|
|
1362 |
WHERE user_id = ' . $data['from_user_id'] . ' |
|
1363 |
AND msg_id = ' . $data['reply_from_msg_id']; |
|
1364 |
||
1365 |
// no break
|
|
1366 |
||
1367 |
case 'forward': |
|
1368 |
case 'post': |
|
1369 |
case 'quotepost': |
|
1370 |
$sql_data = array( |
|
1371 |
'root_level' => $root_level, |
|
1372 |
'author_id' => $data['from_user_id'], |
|
1373 |
'icon_id' => $data['icon_id'], |
|
1374 |
'author_ip' => $data['from_user_ip'], |
|
1375 |
'message_time' => $current_time, |
|
1376 |
'enable_bbcode' => $data['enable_bbcode'], |
|
1377 |
'enable_smilies' => $data['enable_smilies'], |
|
1378 |
'enable_magic_url' => $data['enable_urls'], |
|
1379 |
'enable_sig' => $data['enable_sig'], |
|
1380 |
'message_subject' => $subject, |
|
1381 |
'message_text' => $data['message'], |
|
1382 |
'message_attachment'=> (!empty($data['attachment_data'])) ? 1 : 0, |
|
1383 |
'bbcode_bitfield' => $data['bbcode_bitfield'], |
|
1384 |
'bbcode_uid' => $data['bbcode_uid'], |
|
1385 |
'to_address' => implode(':', $to), |
|
1386 |
'bcc_address' => implode(':', $bcc) |
|
1387 |
);
|
|
1388 |
break; |
|
1389 |
||
1390 |
case 'edit': |
|
1391 |
$sql_data = array( |
|
1392 |
'icon_id' => $data['icon_id'], |
|
1393 |
'message_edit_time' => $current_time, |
|
1394 |
'enable_bbcode' => $data['enable_bbcode'], |
|
1395 |
'enable_smilies' => $data['enable_smilies'], |
|
1396 |
'enable_magic_url' => $data['enable_urls'], |
|
1397 |
'enable_sig' => $data['enable_sig'], |
|
1398 |
'message_subject' => $subject, |
|
1399 |
'message_text' => $data['message'], |
|
1400 |
'message_attachment'=> (!empty($data['attachment_data'])) ? 1 : 0, |
|
1401 |
'bbcode_bitfield' => $data['bbcode_bitfield'], |
|
1402 |
'bbcode_uid' => $data['bbcode_uid'] |
|
1403 |
);
|
|
1404 |
break; |
|
1405 |
}
|
|
1406 |
||
1407 |
if (sizeof($sql_data)) |
|
1408 |
{
|
|
1409 |
$query = ''; |
|
1410 |
||
1411 |
if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward') |
|
1412 |
{
|
|
1413 |
$db->sql_query('INSERT INTO ' . PRIVMSGS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data)); |
|
1414 |
$data['msg_id'] = $db->sql_nextid(); |
|
1415 |
}
|
|
1416 |
else if ($mode == 'edit') |
|
1417 |
{
|
|
1418 |
$sql = 'UPDATE ' . PRIVMSGS_TABLE . ' |
|
1419 |
SET message_edit_count = message_edit_count + 1, ' . $db->sql_build_array('UPDATE', $sql_data) . ' |
|
1420 |
WHERE msg_id = ' . $data['msg_id']; |
|
1421 |
$db->sql_query($sql); |
|
1422 |
}
|
|
1423 |
}
|
|
1424 |
||
1425 |
if ($mode != 'edit') |
|
1426 |
{
|
|
1427 |
if ($sql) |
|
1428 |
{
|
|
1429 |
$db->sql_query($sql); |
|
1430 |
}
|
|
1431 |
unset($sql); |
|
1432 |
||
1433 |
$sql_ary = array(); |
|
1434 |
foreach ($recipients as $user_id => $type) |
|
1435 |
{
|
|
1436 |
$sql_ary[] = array( |
|
1437 |
'msg_id' => (int) $data['msg_id'], |
|
1438 |
'user_id' => (int) $user_id, |
|
1439 |
'author_id' => (int) $data['from_user_id'], |
|
1440 |
'folder_id' => PRIVMSGS_NO_BOX, |
|
1441 |
'pm_new' => 1, |
|
1442 |
'pm_unread' => 1, |
|
1443 |
'pm_forwarded' => ($mode == 'forward') ? 1 : 0 |
|
1444 |
);
|
|
1445 |
}
|
|
1446 |
||
1447 |
$db->sql_multi_insert(PRIVMSGS_TO_TABLE, $sql_ary); |
|
1448 |
||
1449 |
$sql = 'UPDATE ' . USERS_TABLE . ' |
|
1450 |
SET user_new_privmsg = user_new_privmsg + 1, user_unread_privmsg = user_unread_privmsg + 1, user_last_privmsg = ' . time() . ' |
|
1451 |
WHERE ' . $db->sql_in_set('user_id', array_keys($recipients)); |
|
1452 |
$db->sql_query($sql); |
|
1453 |
||
1454 |
// Put PM into outbox
|
|
1455 |
if ($put_in_outbox) |
|
1456 |
{
|
|
1457 |
$db->sql_query('INSERT INTO ' . PRIVMSGS_TO_TABLE . ' ' . $db->sql_build_array('INSERT', array( |
|
1458 |
'msg_id' => (int) $data['msg_id'], |
|
1459 |
'user_id' => (int) $data['from_user_id'], |
|
1460 |
'author_id' => (int) $data['from_user_id'], |
|
1461 |
'folder_id' => PRIVMSGS_OUTBOX, |
|
1462 |
'pm_new' => 0, |
|
1463 |
'pm_unread' => 0, |
|
1464 |
'pm_forwarded' => ($mode == 'forward') ? 1 : 0)) |
|
1465 |
);
|
|
1466 |
}
|
|
1467 |
}
|
|
1468 |
||
1469 |
// Set user last post time
|
|
1470 |
if ($mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward' || $mode == 'post') |
|
1471 |
{
|
|
1472 |
$sql = 'UPDATE ' . USERS_TABLE . " |
|
1473 |
SET user_lastpost_time = $current_time |
|
1474 |
WHERE user_id = " . $data['from_user_id']; |
|
1475 |
$db->sql_query($sql); |
|
1476 |
}
|
|
1477 |
||
1478 |
// Submit Attachments
|
|
1479 |
if (!empty($data['attachment_data']) && $data['msg_id'] && in_array($mode, array('post', 'reply', 'quote', 'quotepost', 'edit', 'forward'))) |
|
1480 |
{
|
|
1481 |
$space_taken = $files_added = 0; |
|
1482 |
$orphan_rows = array(); |
|
1483 |
||
1484 |
foreach ($data['attachment_data'] as $pos => $attach_row) |
|
1485 |
{
|
|
1486 |
$orphan_rows[(int) $attach_row['attach_id']] = array(); |
|
1487 |
}
|
|
1488 |
||
1489 |
if (sizeof($orphan_rows)) |
|
1490 |
{
|
|
1491 |
$sql = 'SELECT attach_id, filesize, physical_filename |
|
1492 |
FROM ' . ATTACHMENTS_TABLE . ' |
|
1493 |
WHERE ' . $db->sql_in_set('attach_id', array_keys($orphan_rows)) . ' |
|
1494 |
AND in_message = 1
|
|
1495 |
AND is_orphan = 1
|
|
1496 |
AND poster_id = ' . $user->data['user_id']; |
|
1497 |
$result = $db->sql_query($sql); |
|
1498 |
||
1499 |
$orphan_rows = array(); |
|
1500 |
while ($row = $db->sql_fetchrow($result)) |
|
1501 |
{
|
|
1502 |
$orphan_rows[$row['attach_id']] = $row; |
|
1503 |
}
|
|
1504 |
$db->sql_freeresult($result); |
|
1505 |
}
|
|
1506 |
||
1507 |
foreach ($data['attachment_data'] as $pos => $attach_row) |
|
1508 |
{
|
|
1509 |
if ($attach_row['is_orphan'] && !in_array($attach_row['attach_id'], array_keys($orphan_rows))) |
|
1510 |
{
|
|
1511 |
continue; |
|
1512 |
}
|
|
1513 |
||
1514 |
if (!$attach_row['is_orphan']) |
|
1515 |
{
|
|
1516 |
// update entry in db if attachment already stored in db and filespace
|
|
1517 |
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . " |
|
1518 |
SET attach_comment = '" . $db->sql_escape($attach_row['attach_comment']) . "' |
|
1519 |
WHERE attach_id = " . (int) $attach_row['attach_id'] . ' |
|
1520 |
AND is_orphan = 0'; |
|
1521 |
$db->sql_query($sql); |
|
1522 |
}
|
|
1523 |
else
|
|
1524 |
{
|
|
1525 |
// insert attachment into db
|
|
1526 |
if (!@file_exists($phpbb_root_path . $config['upload_path'] . '/' . basename($orphan_rows[$attach_row['attach_id']]['physical_filename']))) |
|
1527 |
{
|
|
1528 |
continue; |
|
1529 |
}
|
|
1530 |
||
1531 |
$space_taken += $orphan_rows[$attach_row['attach_id']]['filesize']; |
|
1532 |
$files_added++; |
|
1533 |
||
1534 |
$attach_sql = array( |
|
1535 |
'post_msg_id' => $data['msg_id'], |
|
1536 |
'topic_id' => 0, |
|
1537 |
'is_orphan' => 0, |
|
1538 |
'poster_id' => $data['from_user_id'], |
|
1539 |
'attach_comment' => $attach_row['attach_comment'], |
|
1540 |
);
|
|
1541 |
||
1542 |
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $attach_sql) . ' |
|
1543 |
WHERE attach_id = ' . $attach_row['attach_id'] . ' |
|
1544 |
AND is_orphan = 1
|
|
1545 |
AND poster_id = ' . $user->data['user_id']; |
|
1546 |
$db->sql_query($sql); |
|
1547 |
}
|
|
1548 |
}
|
|
1549 |
||
1550 |
if ($space_taken && $files_added) |
|
1551 |
{
|
|
1552 |
set_config('upload_dir_size', $config['upload_dir_size'] + $space_taken, true); |
|
1553 |
set_config('num_files', $config['num_files'] + $files_added, true); |
|
1554 |
}
|
|
1555 |
}
|
|
1556 |
||
1557 |
// Delete draft if post was loaded...
|
|
1558 |
$draft_id = request_var('draft_loaded', 0); |
|
1559 |
if ($draft_id) |
|
1560 |
{
|
|
1561 |
$sql = 'DELETE FROM ' . DRAFTS_TABLE . " |
|
1562 |
WHERE draft_id = $draft_id |
|
1563 |
AND user_id = " . $data['from_user_id']; |
|
1564 |
$db->sql_query($sql); |
|
1565 |
}
|
|
1566 |
||
1567 |
$db->sql_transaction('commit'); |
|
1568 |
||
1569 |
// Send Notifications
|
|
1570 |
if ($mode != 'edit') |
|
1571 |
{
|
|
1572 |
pm_notification($mode, $data['from_username'], $recipients, $subject, $data['message']); |
|
1573 |
}
|
|
1574 |
||
1575 |
return $data['msg_id']; |
|
1576 |
}
|
|
1577 |
||
1578 |
/**
|
|
1579 |
* PM Notification
|
|
1580 |
*/
|
|
1581 |
function pm_notification($mode, $author, $recipients, $subject, $message) |
|
1582 |
{
|
|
1583 |
global $db, $user, $config, $phpbb_root_path, $phpEx, $auth; |
|
1584 |
||
1585 |
$subject = censor_text($subject); |
|
1586 |
||
1587 |
unset($recipients[ANONYMOUS], $recipients[$user->data['user_id']]); |
|
1588 |
||
1589 |
if (!sizeof($recipients)) |
|
1590 |
{
|
|
1591 |
return; |
|
1592 |
}
|
|
1593 |
||
1594 |
// Get banned User ID's
|
|
1595 |
$sql = 'SELECT ban_userid |
|
1596 |
FROM ' . BANLIST_TABLE . ' |
|
1597 |
WHERE ' . $db->sql_in_set('ban_userid', array_map('intval', array_keys($recipients))) . ' |
|
1598 |
AND ban_exclude = 0'; |
|
1599 |
$result = $db->sql_query($sql); |
|
1600 |
||
1601 |
while ($row = $db->sql_fetchrow($result)) |
|
1602 |
{
|
|
1603 |
unset($recipients[$row['ban_userid']]); |
|
1604 |
}
|
|
1605 |
$db->sql_freeresult($result); |
|
1606 |
||
1607 |
if (!sizeof($recipients)) |
|
1608 |
{
|
|
1609 |
return; |
|
1610 |
}
|
|
1611 |
||
1612 |
$sql = 'SELECT user_id, username, user_email, user_lang, user_notify_pm, user_notify_type, user_jabber |
|
1613 |
FROM ' . USERS_TABLE . ' |
|
1614 |
WHERE ' . $db->sql_in_set('user_id', array_map('intval', array_keys($recipients))); |
|
1615 |
$result = $db->sql_query($sql); |
|
1616 |
||
1617 |
$msg_list_ary = array(); |
|
1618 |
while ($row = $db->sql_fetchrow($result)) |
|
1619 |
{
|
|
1620 |
if ($row['user_notify_pm'] == 1 && trim($row['user_email'])) |
|
1621 |
{
|
|
1622 |
$msg_list_ary[] = array( |
|
1623 |
'method' => $row['user_notify_type'], |
|
1624 |
'email' => $row['user_email'], |
|
1625 |
'jabber' => $row['user_jabber'], |
|
1626 |
'name' => $row['username'], |
|
1627 |
'lang' => $row['user_lang'] |
|
1628 |
);
|
|
1629 |
}
|
|
1630 |
}
|
|
1631 |
$db->sql_freeresult($result); |
|
1632 |
||
1633 |
if (!sizeof($msg_list_ary)) |
|
1634 |
{
|
|
1635 |
return; |
|
1636 |
}
|
|
1637 |
||
1638 |
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); |
|
1639 |
$messenger = new messenger(); |
|
1640 |
||
1641 |
foreach ($msg_list_ary as $pos => $addr) |
|
1642 |
{
|
|
1643 |
$messenger->template('privmsg_notify', $addr['lang']); |
|
1644 |
||
1645 |
$messenger->to($addr['email'], $addr['name']); |
|
1646 |
$messenger->im($addr['jabber'], $addr['name']); |
|
1647 |
||
1648 |
$messenger->assign_vars(array( |
|
1649 |
'SUBJECT' => htmlspecialchars_decode($subject), |
|
1650 |
'AUTHOR_NAME' => htmlspecialchars_decode($author), |
|
1651 |
'USERNAME' => htmlspecialchars_decode($addr['name']), |
|
1652 |
||
1653 |
'U_INBOX' => generate_board_url() . "/ucp.$phpEx?i=pm&folder=inbox") |
|
1654 |
);
|
|
1655 |
||
1656 |
$messenger->send($addr['method']); |
|
1657 |
}
|
|
1658 |
unset($msg_list_ary); |
|
1659 |
||
1660 |
$messenger->save_queue(); |
|
1661 |
||
1662 |
unset($messenger); |
|
1663 |
}
|
|
1664 |
||
1665 |
/**
|
|
1666 |
* Display Message History
|
|
1667 |
*/
|
|
1668 |
function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false) |
|
1669 |
{
|
|
1670 |
global $db, $user, $config, $template, $phpbb_root_path, $phpEx, $auth, $bbcode; |
|
1671 |
||
1672 |
// Get History Messages (could be newer)
|
|
1673 |
$sql = 'SELECT t.*, p.*, u.* |
|
1674 |
FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . ' t, ' . USERS_TABLE . ' u |
|
1675 |
WHERE t.msg_id = p.msg_id
|
|
1676 |
AND p.author_id = u.user_id
|
|
1677 |
AND t.folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ") |
|
1678 |
AND t.user_id = $user_id"; |
|
1679 |
||
1680 |
if (!$message_row['root_level']) |
|
1681 |
{
|
|
1682 |
$sql .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))"; |
|
1683 |
}
|
|
1684 |
else
|
|
1685 |
{
|
|
1686 |
$sql .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')'; |
|
1687 |
}
|
|
1688 |
$sql .= ' ORDER BY p.message_time DESC'; |
|
1689 |
||
1690 |
$result = $db->sql_query($sql); |
|
1691 |
$row = $db->sql_fetchrow($result); |
|
1692 |
||
1693 |
if (!$row) |
|
1694 |
{
|
|
1695 |
$db->sql_freeresult($result); |
|
1696 |
return false; |
|
1697 |
}
|
|
1698 |
||
1699 |
$rowset = array(); |
|
1700 |
$bbcode_bitfield = ''; |
|
1701 |
$folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm') . '&folder='; |
|
1702 |
||
1703 |
do
|
|
1704 |
{
|
|
1705 |
$folder_id = (int) $row['folder_id']; |
|
1706 |
||
1707 |
$row['folder'][] = (isset($folder[$folder_id])) ? '<a href="' . $folder_url . $folder_id . '">' . $folder[$folder_id]['folder_name'] . '</a>' : $user->lang['UNKNOWN_FOLDER']; |
|
1708 |
||
1709 |
if (isset($rowset[$row['msg_id']])) |
|
1710 |
{
|
|
1711 |
$rowset[$row['msg_id']]['folder'][] = (isset($folder[$folder_id])) ? '<a href="' . $folder_url . $folder_id . '">' . $folder[$folder_id]['folder_name'] . '</a>' : $user->lang['UNKNOWN_FOLDER']; |
|
1712 |
}
|
|
1713 |
else
|
|
1714 |
{
|
|
1715 |
$rowset[$row['msg_id']] = $row; |
|
1716 |
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']); |
|
1717 |
}
|
|
1718 |
}
|
|
1719 |
while ($row = $db->sql_fetchrow($result)); |
|
1720 |
$db->sql_freeresult($result); |
|
1721 |
||
1722 |
$title = $row['message_subject']; |
|
1723 |
||
1724 |
if (sizeof($rowset) == 1 && !$in_post_mode) |
|
1725 |
{
|
|
1726 |
return false; |
|
1727 |
}
|
|
1728 |
||
1729 |
// Instantiate BBCode class
|
|
1730 |
if ((empty($bbcode) || $bbcode === false) && $bbcode_bitfield !== '') |
|
1731 |
{
|
|
1732 |
if (!class_exists('bbcode')) |
|
1733 |
{
|
|
1734 |
include($phpbb_root_path . 'includes/bbcode.' . $phpEx); |
|
1735 |
}
|
|
1736 |
$bbcode = new bbcode(base64_encode($bbcode_bitfield)); |
|
1737 |
}
|
|
1738 |
||
1739 |
$title = censor_text($title); |
|
1740 |
||
1741 |
$url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm'); |
|
1742 |
$next_history_pm = $previous_history_pm = $prev_id = 0; |
|
1743 |
||
1744 |
foreach ($rowset as $id => $row) |
|
1745 |
{
|
|
1746 |
$author_id = $row['author_id']; |
|
1747 |
$folder_id = (int) $row['folder_id']; |
|
1748 |
||
1749 |
$subject = $row['message_subject']; |
|
1750 |
$message = $row['message_text']; |
|
1751 |
||
1752 |
$message = censor_text($message); |
|
1753 |
||
1754 |
if ($row['bbcode_bitfield']) |
|
1755 |
{
|
|
1756 |
$bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']); |
|
1757 |
}
|
|
1758 |
||
1759 |
$message = bbcode_nl2br($message); |
|
1760 |
$message = smiley_text($message, !$row['enable_smilies']); |
|
1761 |
||
1762 |
$subject = censor_text($subject); |
|
1763 |
||
1764 |
if ($id == $msg_id) |
|
1765 |
{
|
|
1766 |
$next_history_pm = next($rowset); |
|
1767 |
$next_history_pm = (sizeof($next_history_pm)) ? (int) $next_history_pm['msg_id'] : 0; |
|
1768 |
$previous_history_pm = $prev_id; |
|
1769 |
}
|
|
1770 |
||
1771 |
$template->assign_block_vars('history_row', array( |
|
1772 |
'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $row['username'], $row['user_colour'], $row['username']), |
|
1773 |
'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $row['username'], $row['user_colour'], $row['username']), |
|
1774 |
'MESSAGE_AUTHOR' => get_username_string('username', $author_id, $row['username'], $row['user_colour'], $row['username']), |
|
1775 |
'U_MESSAGE_AUTHOR' => get_username_string('profile', $author_id, $row['username'], $row['user_colour'], $row['username']), |
|
1776 |
||
1777 |
'SUBJECT' => $subject, |
|
1778 |
'SENT_DATE' => $user->format_date($row['message_time']), |
|
1779 |
'MESSAGE' => $message, |
|
1780 |
'FOLDER' => implode(', ', $row['folder']), |
|
1781 |
||
1782 |
'S_CURRENT_MSG' => ($row['msg_id'] == $msg_id), |
|
1783 |
'S_AUTHOR_DELETED' => ($author_id == ANONYMOUS) ? true : false, |
|
1784 |
'S_IN_POST_MODE' => $in_post_mode, |
|
1785 |
||
1786 |
'MSG_ID' => $row['msg_id'], |
|
1787 |
'U_VIEW_MESSAGE' => "$url&f=$folder_id&p=" . $row['msg_id'], |
|
1788 |
'U_QUOTE' => (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS && $author_id != $user->data['user_id']) ? "$url&mode=compose&action=quote&f=" . $folder_id . "&p=" . $row['msg_id'] : '', |
|
1789 |
'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&mode=compose&action=reply&f=$folder_id&p=" . $row['msg_id'] : '') |
|
1790 |
);
|
|
1791 |
unset($rowset[$id]); |
|
1792 |
$prev_id = $id; |
|
1793 |
}
|
|
1794 |
||
1795 |
$template->assign_vars(array( |
|
1796 |
'QUOTE_IMG' => $user->img('icon_post_quote', $user->lang['REPLY_WITH_QUOTE']), |
|
1797 |
'HISTORY_TITLE' => $title, |
|
1798 |
||
1799 |
'U_VIEW_NEXT_HISTORY' => ($next_history_pm) ? "$url&p=" . $next_history_pm : '', |
|
1800 |
'U_VIEW_PREVIOUS_HISTORY' => ($previous_history_pm) ? "$url&p=" . $previous_history_pm : '', |
|
1801 |
));
|
|
1802 |
||
1803 |
return true; |
|
1804 |
}
|
|
1805 |
||
1806 |
?>
|