~azzar1/unity/add-show-desktop-key

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&amp;folder=' . $f_id) : append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;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&amp;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&amp;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&amp;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&amp;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') . '&amp;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&amp;f=$folder_id&amp;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&amp;mode=compose&amp;action=quote&amp;f=" . $folder_id . "&amp;p=" . $row['msg_id'] : '',
1789
			'U_POST_REPLY_PM'	=> ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;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&amp;p=" . $next_history_pm : '',
1800
		'U_VIEW_PREVIOUS_HISTORY'	=> ($previous_history_pm) ? "$url&amp;p=" . $previous_history_pm : '',
1801
	));
1802
1803
	return true;
1804
}
1805
1806
?>