PageRenderTime 66ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/zafenio/includes/ucp/ucp_pm_options.php

https://github.com/chrishildebrandt/zafenio
PHP | 853 lines | 663 code | 128 blank | 62 comment | 122 complexity | 966ae03b4a1628a78823f05f510d649f MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package ucp
  5. * @version $Id$
  6. * @copyright (c) 2005 phpBB Group
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. * @ignore
  12. */
  13. if (!defined('IN_PHPBB'))
  14. {
  15. exit;
  16. }
  17. /**
  18. * Execute message options
  19. */
  20. function message_options($id, $mode, $global_privmsgs_rules, $global_rule_conditions)
  21. {
  22. global $phpbb_root_path, $phpEx, $user, $template, $auth, $config, $db;
  23. $redirect_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=options");
  24. add_form_key('ucp_pm_options');
  25. // Change "full folder" setting - what to do if folder is full
  26. if (isset($_POST['fullfolder']))
  27. {
  28. check_form_key('ucp_pm_options', $config['form_token_lifetime'], $redirect_url);
  29. $full_action = request_var('full_action', 0);
  30. $set_folder_id = 0;
  31. switch ($full_action)
  32. {
  33. case 1:
  34. $set_folder_id = FULL_FOLDER_DELETE;
  35. break;
  36. case 2:
  37. $set_folder_id = request_var('full_move_to', PRIVMSGS_INBOX);
  38. break;
  39. case 3:
  40. $set_folder_id = FULL_FOLDER_HOLD;
  41. break;
  42. default:
  43. $full_action = 0;
  44. break;
  45. }
  46. if ($full_action)
  47. {
  48. $sql = 'UPDATE ' . USERS_TABLE . '
  49. SET user_full_folder = ' . $set_folder_id . '
  50. WHERE user_id = ' . $user->data['user_id'];
  51. $db->sql_query($sql);
  52. $user->data['user_full_folder'] = $set_folder_id;
  53. $message = $user->lang['FULL_FOLDER_OPTION_CHANGED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
  54. meta_refresh(3, $redirect_url);
  55. trigger_error($message);
  56. }
  57. }
  58. // Add Folder
  59. if (isset($_POST['addfolder']))
  60. {
  61. if (check_form_key('ucp_pm_options'))
  62. {
  63. $folder_name = utf8_normalize_nfc(request_var('foldername', '', true));
  64. $msg = '';
  65. if ($folder_name)
  66. {
  67. $sql = 'SELECT folder_name
  68. FROM ' . PRIVMSGS_FOLDER_TABLE . "
  69. WHERE folder_name = '" . $db->sql_escape($folder_name) . "'
  70. AND user_id = " . $user->data['user_id'];
  71. $result = $db->sql_query_limit($sql, 1);
  72. $row = $db->sql_fetchrow($result);
  73. $db->sql_freeresult($result);
  74. if ($row)
  75. {
  76. trigger_error(sprintf($user->lang['FOLDER_NAME_EXIST'], $folder_name));
  77. }
  78. $sql = 'SELECT COUNT(folder_id) as num_folder
  79. FROM ' . PRIVMSGS_FOLDER_TABLE . '
  80. WHERE user_id = ' . $user->data['user_id'];
  81. $result = $db->sql_query($sql);
  82. $num_folder = (int) $db->sql_fetchfield('num_folder');
  83. $db->sql_freeresult($result);
  84. if ($num_folder >= $config['pm_max_boxes'])
  85. {
  86. trigger_error('MAX_FOLDER_REACHED');
  87. }
  88. $sql = 'INSERT INTO ' . PRIVMSGS_FOLDER_TABLE . ' ' . $db->sql_build_array('INSERT', array(
  89. 'user_id' => (int) $user->data['user_id'],
  90. 'folder_name' => $folder_name)
  91. );
  92. $db->sql_query($sql);
  93. $msg = $user->lang['FOLDER_ADDED'];
  94. }
  95. else
  96. {
  97. $msg = $user->lang['FOLDER_NAME_EMPTY'];
  98. }
  99. }
  100. else
  101. {
  102. $msg = $user->lang['FORM_INVALID'];
  103. }
  104. $message = $msg . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
  105. meta_refresh(3, $redirect_url);
  106. trigger_error($message);
  107. }
  108. // Rename folder
  109. if (isset($_POST['rename_folder']))
  110. {
  111. if (check_form_key('ucp_pm_options'))
  112. {
  113. $new_folder_name = utf8_normalize_nfc(request_var('new_folder_name', '', true));
  114. $rename_folder_id= request_var('rename_folder_id', 0);
  115. if (!$new_folder_name)
  116. {
  117. trigger_error('NO_NEW_FOLDER_NAME');
  118. }
  119. // Select custom folder
  120. $sql = 'SELECT folder_name, pm_count
  121. FROM ' . PRIVMSGS_FOLDER_TABLE . "
  122. WHERE user_id = {$user->data['user_id']}
  123. AND folder_id = $rename_folder_id";
  124. $result = $db->sql_query_limit($sql, 1);
  125. $folder_row = $db->sql_fetchrow($result);
  126. $db->sql_freeresult($result);
  127. if (!$folder_row)
  128. {
  129. trigger_error('CANNOT_RENAME_FOLDER');
  130. }
  131. $sql = 'UPDATE ' . PRIVMSGS_FOLDER_TABLE . "
  132. SET folder_name = '" . $db->sql_escape($new_folder_name) . "'
  133. WHERE folder_id = $rename_folder_id
  134. AND user_id = {$user->data['user_id']}";
  135. $db->sql_query($sql);
  136. $msg = $user->lang['FOLDER_RENAMED'];
  137. }
  138. else
  139. {
  140. $msg = $user->lang['FORM_INVALID'];
  141. }
  142. $message = $msg . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
  143. meta_refresh(3, $redirect_url);
  144. trigger_error($message);
  145. }
  146. // Remove Folder
  147. if (isset($_POST['remove_folder']))
  148. {
  149. $remove_folder_id = request_var('remove_folder_id', 0);
  150. // Default to "move all messages to inbox"
  151. $remove_action = request_var('remove_action', 1);
  152. $move_to = request_var('move_to', PRIVMSGS_INBOX);
  153. // Move to same folder?
  154. if ($remove_action == 1 && $remove_folder_id == $move_to)
  155. {
  156. trigger_error('CANNOT_MOVE_TO_SAME_FOLDER');
  157. }
  158. // Select custom folder
  159. $sql = 'SELECT folder_name, pm_count
  160. FROM ' . PRIVMSGS_FOLDER_TABLE . "
  161. WHERE user_id = {$user->data['user_id']}
  162. AND folder_id = $remove_folder_id";
  163. $result = $db->sql_query_limit($sql, 1);
  164. $folder_row = $db->sql_fetchrow($result);
  165. $db->sql_freeresult($result);
  166. if (!$folder_row)
  167. {
  168. trigger_error('CANNOT_REMOVE_FOLDER');
  169. }
  170. $s_hidden_fields = array(
  171. 'remove_folder_id' => $remove_folder_id,
  172. 'remove_action' => $remove_action,
  173. 'move_to' => $move_to,
  174. 'remove_folder' => 1
  175. );
  176. // Do we need to confirm?
  177. if (confirm_box(true))
  178. {
  179. // Gather message ids
  180. $sql = 'SELECT msg_id
  181. FROM ' . PRIVMSGS_TO_TABLE . '
  182. WHERE user_id = ' . $user->data['user_id'] . "
  183. AND folder_id = $remove_folder_id";
  184. $result = $db->sql_query($sql);
  185. $msg_ids = array();
  186. while ($row = $db->sql_fetchrow($result))
  187. {
  188. $msg_ids[] = (int) $row['msg_id'];
  189. }
  190. $db->sql_freeresult($result);
  191. // First of all, copy all messages to another folder... or delete all messages
  192. switch ($remove_action)
  193. {
  194. // Move Messages
  195. case 1:
  196. $num_moved = move_pm($user->data['user_id'], $user->data['message_limit'], $msg_ids, $move_to, $remove_folder_id);
  197. // Something went wrong, only partially moved?
  198. if ($num_moved != $folder_row['pm_count'])
  199. {
  200. trigger_error(sprintf($user->lang['MOVE_PM_ERROR'], $num_moved, $folder_row['pm_count']));
  201. }
  202. break;
  203. // Remove Messages
  204. case 2:
  205. delete_pm($user->data['user_id'], $msg_ids, $remove_folder_id);
  206. break;
  207. }
  208. // Remove folder
  209. $sql = 'DELETE FROM ' . PRIVMSGS_FOLDER_TABLE . "
  210. WHERE user_id = {$user->data['user_id']}
  211. AND folder_id = $remove_folder_id";
  212. $db->sql_query($sql);
  213. // Check full folder option. If the removed folder has been specified as destination switch back to inbox
  214. if ($user->data['user_full_folder'] == $remove_folder_id)
  215. {
  216. $sql = 'UPDATE ' . USERS_TABLE . '
  217. SET user_full_folder = ' . PRIVMSGS_INBOX . '
  218. WHERE user_id = ' . $user->data['user_id'];
  219. $db->sql_query($sql);
  220. $user->data['user_full_folder'] = PRIVMSGS_INBOX;
  221. }
  222. // Now make sure the folder is not used for rules
  223. // We assign another folder id (the one the messages got moved to) or assign the INBOX (to not have to remove any rule)
  224. $sql = 'UPDATE ' . PRIVMSGS_RULES_TABLE . ' SET rule_folder_id = ';
  225. $sql .= ($remove_action == 1) ? $move_to : PRIVMSGS_INBOX;
  226. $sql .= ' WHERE rule_folder_id = ' . $remove_folder_id;
  227. $db->sql_query($sql);
  228. $meta_info = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=$mode");
  229. $message = $user->lang['FOLDER_REMOVED'];
  230. meta_refresh(3, $meta_info);
  231. $message .= '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $meta_info . '">', '</a>');
  232. trigger_error($message);
  233. }
  234. else
  235. {
  236. confirm_box(false, 'REMOVE_FOLDER', build_hidden_fields($s_hidden_fields));
  237. }
  238. }
  239. // Add Rule
  240. if (isset($_POST['add_rule']))
  241. {
  242. if (check_form_key('ucp_pm_options'))
  243. {
  244. $check_option = request_var('check_option', 0);
  245. $rule_option = request_var('rule_option', 0);
  246. $cond_option = request_var('cond_option', '');
  247. $action_option = explode('|', request_var('action_option', ''));
  248. $rule_string = ($cond_option != 'none') ? utf8_normalize_nfc(request_var('rule_string', '', true)) : '';
  249. $rule_user_id = ($cond_option != 'none') ? request_var('rule_user_id', 0) : 0;
  250. $rule_group_id = ($cond_option != 'none') ? request_var('rule_group_id', 0) : 0;
  251. $action = (int) $action_option[0];
  252. $folder_id = (int) $action_option[1];
  253. if (!$action || !$check_option || !$rule_option || !$cond_option || ($cond_option != 'none' && !$rule_string))
  254. {
  255. trigger_error('RULE_NOT_DEFINED');
  256. }
  257. if (($cond_option == 'user' && !$rule_user_id) || ($cond_option == 'group' && !$rule_group_id))
  258. {
  259. trigger_error('RULE_NOT_DEFINED');
  260. }
  261. $rule_ary = array(
  262. 'user_id' => $user->data['user_id'],
  263. 'rule_check' => $check_option,
  264. 'rule_connection' => $rule_option,
  265. 'rule_string' => $rule_string,
  266. 'rule_user_id' => $rule_user_id,
  267. 'rule_group_id' => $rule_group_id,
  268. 'rule_action' => $action,
  269. 'rule_folder_id' => $folder_id
  270. );
  271. $sql = 'SELECT rule_id
  272. FROM ' . PRIVMSGS_RULES_TABLE . '
  273. WHERE ' . $db->sql_build_array('SELECT', $rule_ary);
  274. $result = $db->sql_query($sql);
  275. $row = $db->sql_fetchrow($result);
  276. $db->sql_freeresult($result);
  277. if ($row)
  278. {
  279. trigger_error('RULE_ALREADY_DEFINED');
  280. }
  281. $sql = 'INSERT INTO ' . PRIVMSGS_RULES_TABLE . ' ' . $db->sql_build_array('INSERT', $rule_ary);
  282. $db->sql_query($sql);
  283. // Update users message rules
  284. $sql = 'UPDATE ' . USERS_TABLE . '
  285. SET user_message_rules = 1
  286. WHERE user_id = ' . $user->data['user_id'];
  287. $db->sql_query($sql);
  288. $msg = $user->lang['RULE_ADDED'];
  289. }
  290. else
  291. {
  292. $msg = $user->lang['FORM_INVALID'];
  293. }
  294. $message = $msg . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $redirect_url . '">', '</a>');
  295. meta_refresh(3, $redirect_url);
  296. trigger_error($message);
  297. }
  298. // Remove Rule
  299. if (isset($_POST['delete_rule']) && !isset($_POST['cancel']))
  300. {
  301. $delete_id = array_keys(request_var('delete_rule', array(0 => 0)));
  302. $delete_id = (!empty($delete_id[0])) ? $delete_id[0] : 0;
  303. if (!$delete_id)
  304. {
  305. redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=' . $mode));
  306. }
  307. // Do we need to confirm?
  308. if (confirm_box(true))
  309. {
  310. $sql = 'DELETE FROM ' . PRIVMSGS_RULES_TABLE . '
  311. WHERE user_id = ' . $user->data['user_id'] . "
  312. AND rule_id = $delete_id";
  313. $db->sql_query($sql);
  314. $meta_info = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=' . $mode);
  315. $message = $user->lang['RULE_DELETED'];
  316. // Reset user_message_rules if no more assigned
  317. $sql = 'SELECT rule_id
  318. FROM ' . PRIVMSGS_RULES_TABLE . '
  319. WHERE user_id = ' . $user->data['user_id'];
  320. $result = $db->sql_query_limit($sql, 1);
  321. $row = $db->sql_fetchrow($result);
  322. $db->sql_freeresult($result);
  323. // Update users message rules
  324. if (!$row)
  325. {
  326. $sql = 'UPDATE ' . USERS_TABLE . '
  327. SET user_message_rules = 0
  328. WHERE user_id = ' . $user->data['user_id'];
  329. $db->sql_query($sql);
  330. }
  331. meta_refresh(3, $meta_info);
  332. $message .= '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $meta_info . '">', '</a>');
  333. trigger_error($message);
  334. }
  335. else
  336. {
  337. confirm_box(false, 'DELETE_RULE', build_hidden_fields(array('delete_rule' => array($delete_id => 1))));
  338. }
  339. }
  340. $folder = array();
  341. $sql = 'SELECT COUNT(msg_id) as num_messages
  342. FROM ' . PRIVMSGS_TO_TABLE . '
  343. WHERE user_id = ' . $user->data['user_id'] . '
  344. AND folder_id = ' . PRIVMSGS_INBOX;
  345. $result = $db->sql_query($sql);
  346. $num_messages = (int) $db->sql_fetchfield('num_messages');
  347. $db->sql_freeresult($result);
  348. $folder[PRIVMSGS_INBOX] = array(
  349. 'folder_name' => $user->lang['PM_INBOX'],
  350. 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $num_messages, $user->data['message_limit'])
  351. );
  352. $sql = 'SELECT folder_id, folder_name, pm_count
  353. FROM ' . PRIVMSGS_FOLDER_TABLE . '
  354. WHERE user_id = ' . $user->data['user_id'];
  355. $result = $db->sql_query($sql);
  356. $num_user_folder = 0;
  357. while ($row = $db->sql_fetchrow($result))
  358. {
  359. $num_user_folder++;
  360. $folder[$row['folder_id']] = array(
  361. 'folder_name' => $row['folder_name'],
  362. 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $row['pm_count'], $user->data['message_limit'])
  363. );
  364. }
  365. $db->sql_freeresult($result);
  366. $s_full_folder_options = $s_to_folder_options = $s_folder_options = '';
  367. if ($user->data['user_full_folder'] == FULL_FOLDER_NONE)
  368. {
  369. // -3 here to let the correct folder id be selected
  370. $to_folder_id = $config['full_folder_action'] - 3;
  371. }
  372. else
  373. {
  374. $to_folder_id = $user->data['user_full_folder'];
  375. }
  376. foreach ($folder as $folder_id => $folder_ary)
  377. {
  378. $s_full_folder_options .= '<option value="' . $folder_id . '"' . (($user->data['user_full_folder'] == $folder_id) ? ' selected="selected"' : '') . '>' . $folder_ary['folder_name'] . ' (' . $folder_ary['message_status'] . ')</option>';
  379. $s_to_folder_options .= '<option value="' . $folder_id . '"' . (($to_folder_id == $folder_id) ? ' selected="selected"' : '') . '>' . $folder_ary['folder_name'] . ' (' . $folder_ary['message_status'] . ')</option>';
  380. if ($folder_id != PRIVMSGS_INBOX)
  381. {
  382. $s_folder_options .= '<option value="' . $folder_id . '">' . $folder_ary['folder_name'] . ' (' . $folder_ary['message_status'] . ')</option>';
  383. }
  384. }
  385. $s_delete_checked = ($user->data['user_full_folder'] == FULL_FOLDER_DELETE) ? ' checked="checked"' : '';
  386. $s_hold_checked = ($user->data['user_full_folder'] == FULL_FOLDER_HOLD) ? ' checked="checked"' : '';
  387. $s_move_checked = ($user->data['user_full_folder'] >= 0) ? ' checked="checked"' : '';
  388. if ($user->data['user_full_folder'] == FULL_FOLDER_NONE)
  389. {
  390. switch ($config['full_folder_action'])
  391. {
  392. case 1:
  393. $s_delete_checked = ' checked="checked"';
  394. break;
  395. case 2:
  396. $s_hold_checked = ' checked="checked"';
  397. break;
  398. }
  399. }
  400. $template->assign_vars(array(
  401. 'S_FULL_FOLDER_OPTIONS' => $s_full_folder_options,
  402. 'S_TO_FOLDER_OPTIONS' => $s_to_folder_options,
  403. 'S_FOLDER_OPTIONS' => $s_folder_options,
  404. 'S_DELETE_CHECKED' => $s_delete_checked,
  405. 'S_HOLD_CHECKED' => $s_hold_checked,
  406. 'S_MOVE_CHECKED' => $s_move_checked,
  407. 'S_MAX_FOLDER_REACHED' => ($num_user_folder >= $config['pm_max_boxes']) ? true : false,
  408. 'S_MAX_FOLDER_ZERO' => ($config['pm_max_boxes'] == 0) ? true : false,
  409. 'DEFAULT_ACTION' => ($config['full_folder_action'] == 1) ? $user->lang['DELETE_OLDEST_MESSAGES'] : $user->lang['HOLD_NEW_MESSAGES'],
  410. 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=ucp&amp;field=rule_string&amp;select_single=true'),
  411. ));
  412. $rule_lang = $action_lang = $check_lang = array();
  413. // Build all three language arrays
  414. preg_replace('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#e', "\${strtolower('\\2') . '_lang'}[constant('\\1')] = \$user->lang['PM_\\2']['\\3']", array_keys(get_defined_constants()));
  415. /*
  416. Rule Ordering:
  417. -> CHECK_* -> RULE_* [IN $global_privmsgs_rules:CHECK_*] -> [IF $rule_conditions[RULE_*] [|text|bool|user|group|own_group]] -> ACTION_*
  418. */
  419. $check_option = request_var('check_option', 0);
  420. $rule_option = request_var('rule_option', 0);
  421. $cond_option = request_var('cond_option', '');
  422. $action_option = request_var('action_option', '');
  423. $back = (isset($_REQUEST['back'])) ? request_var('back', array('' => 0)) : array();
  424. if (sizeof($back))
  425. {
  426. if ($action_option)
  427. {
  428. $action_option = '';
  429. }
  430. else if ($cond_option)
  431. {
  432. $cond_option = '';
  433. }
  434. else if ($rule_option)
  435. {
  436. $rule_option = 0;
  437. }
  438. else if ($check_option)
  439. {
  440. $check_option = 0;
  441. }
  442. }
  443. if (isset($back['action']) && $cond_option == 'none')
  444. {
  445. $back['cond'] = true;
  446. }
  447. // Check
  448. if (!isset($global_privmsgs_rules[$check_option]))
  449. {
  450. $check_option = 0;
  451. }
  452. define_check_option(($check_option && !isset($back['rule'])) ? true : false, $check_option, $check_lang);
  453. if ($check_option && !isset($back['rule']))
  454. {
  455. define_rule_option(($rule_option && !isset($back['cond'])) ? true : false, $rule_option, $rule_lang, $global_privmsgs_rules[$check_option]);
  456. }
  457. if ($rule_option && !isset($back['cond']))
  458. {
  459. if (!isset($global_rule_conditions[$rule_option]))
  460. {
  461. $cond_option = 'none';
  462. $template->assign_var('NONE_CONDITION', true);
  463. }
  464. else
  465. {
  466. define_cond_option(($cond_option && !isset($back['action'])) ? true : false, $cond_option, $rule_option, $global_rule_conditions);
  467. }
  468. }
  469. if ($cond_option && !isset($back['action']))
  470. {
  471. define_action_option(false, $action_option, $action_lang, $folder);
  472. }
  473. show_defined_rules($user->data['user_id'], $check_lang, $rule_lang, $action_lang, $folder);
  474. }
  475. /**
  476. * Defining check option for message rules
  477. */
  478. function define_check_option($hardcoded, $check_option, $check_lang)
  479. {
  480. global $template;
  481. $s_check_options = '';
  482. if (!$hardcoded)
  483. {
  484. foreach ($check_lang as $value => $lang)
  485. {
  486. $s_check_options .= '<option value="' . $value . '"' . (($value == $check_option) ? ' selected="selected"' : '') . '>' . $lang . '</option>';
  487. }
  488. }
  489. $template->assign_vars(array(
  490. 'S_CHECK_DEFINED' => true,
  491. 'S_CHECK_SELECT' => ($hardcoded) ? false : true,
  492. 'CHECK_CURRENT' => isset($check_lang[$check_option]) ? $check_lang[$check_option] : '',
  493. 'S_CHECK_OPTIONS' => $s_check_options,
  494. 'CHECK_OPTION' => $check_option)
  495. );
  496. }
  497. /**
  498. * Defining action option for message rules
  499. */
  500. function define_action_option($hardcoded, $action_option, $action_lang, $folder)
  501. {
  502. global $db, $template, $user;
  503. $l_action = $s_action_options = '';
  504. if ($hardcoded)
  505. {
  506. $option = explode('|', $action_option);
  507. $action = (int) $option[0];
  508. $folder_id = (int) $option[1];
  509. $l_action = $action_lang[$action];
  510. if ($action == ACTION_PLACE_INTO_FOLDER)
  511. {
  512. $l_action .= ' -> ' . $folder[$folder_id]['folder_name'];
  513. }
  514. }
  515. else
  516. {
  517. foreach ($action_lang as $action => $lang)
  518. {
  519. if ($action == ACTION_PLACE_INTO_FOLDER)
  520. {
  521. foreach ($folder as $folder_id => $folder_ary)
  522. {
  523. $s_action_options .= '<option value="' . $action . '|' . $folder_id . '"' . (($action_option == $action . '|' . $folder_id) ? ' selected="selected"' : '') . '>' . $lang . ' -> ' . $folder_ary['folder_name'] . '</option>';
  524. }
  525. }
  526. else
  527. {
  528. $s_action_options .= '<option value="' . $action . '|0"' . (($action_option == $action . '|0') ? ' selected="selected"' : '') . '>' . $lang . '</option>';
  529. }
  530. }
  531. }
  532. $template->assign_vars(array(
  533. 'S_ACTION_DEFINED' => true,
  534. 'S_ACTION_SELECT' => ($hardcoded) ? false : true,
  535. 'ACTION_CURRENT' => $l_action,
  536. 'S_ACTION_OPTIONS' => $s_action_options,
  537. 'ACTION_OPTION' => $action_option)
  538. );
  539. }
  540. /**
  541. * Defining rule option for message rules
  542. */
  543. function define_rule_option($hardcoded, $rule_option, $rule_lang, $check_ary)
  544. {
  545. global $template;
  546. global $module;
  547. $exclude = array();
  548. if (!$module->loaded('zebra', 'friends'))
  549. {
  550. $exclude[RULE_IS_FRIEND] = true;
  551. }
  552. if (!$module->loaded('zebra', 'foes'))
  553. {
  554. $exclude[RULE_IS_FOE] = true;
  555. }
  556. $s_rule_options = '';
  557. if (!$hardcoded)
  558. {
  559. foreach ($check_ary as $value => $_check)
  560. {
  561. if (isset($exclude[$value]))
  562. {
  563. continue;
  564. }
  565. $s_rule_options .= '<option value="' . $value . '"' . (($value == $rule_option) ? ' selected="selected"' : '') . '>' . $rule_lang[$value] . '</option>';
  566. }
  567. }
  568. $template->assign_vars(array(
  569. 'S_RULE_DEFINED' => true,
  570. 'S_RULE_SELECT' => !$hardcoded,
  571. 'RULE_CURRENT' => isset($rule_lang[$rule_option]) ? $rule_lang[$rule_option] : '',
  572. 'S_RULE_OPTIONS' => $s_rule_options,
  573. 'RULE_OPTION' => $rule_option)
  574. );
  575. }
  576. /**
  577. * Defining condition option for message rules
  578. */
  579. function define_cond_option($hardcoded, $cond_option, $rule_option, $global_rule_conditions)
  580. {
  581. global $db, $template, $auth, $user;
  582. $template->assign_vars(array(
  583. 'S_COND_DEFINED' => true,
  584. 'S_COND_SELECT' => (!$hardcoded && isset($global_rule_conditions[$rule_option])) ? true : false)
  585. );
  586. // Define COND_OPTION
  587. if (!isset($global_rule_conditions[$rule_option]))
  588. {
  589. $template->assign_vars(array(
  590. 'COND_OPTION' => 'none',
  591. 'COND_CURRENT' => false)
  592. );
  593. return;
  594. }
  595. // Define Condition
  596. $condition = $global_rule_conditions[$rule_option];
  597. $current_value = '';
  598. switch ($condition)
  599. {
  600. case 'text':
  601. $rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
  602. $template->assign_vars(array(
  603. 'S_TEXT_CONDITION' => true,
  604. 'CURRENT_STRING' => $rule_string,
  605. 'CURRENT_USER_ID' => 0,
  606. 'CURRENT_GROUP_ID' => 0)
  607. );
  608. $current_value = $rule_string;
  609. break;
  610. case 'user':
  611. $rule_user_id = request_var('rule_user_id', 0);
  612. $rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
  613. if ($rule_string && !$rule_user_id)
  614. {
  615. $sql = 'SELECT user_id
  616. FROM ' . USERS_TABLE . "
  617. WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($rule_string)) . "'";
  618. $result = $db->sql_query($sql);
  619. $rule_user_id = (int) $db->sql_fetchfield('user_id');
  620. $db->sql_freeresult($result);
  621. if (!$rule_user_id)
  622. {
  623. $rule_string = '';
  624. }
  625. }
  626. else if (!$rule_string && $rule_user_id)
  627. {
  628. $sql = 'SELECT username
  629. FROM ' . USERS_TABLE . "
  630. WHERE user_id = $rule_user_id";
  631. $result = $db->sql_query($sql);
  632. $rule_string = $db->sql_fetchfield('username');
  633. $db->sql_freeresult($result);
  634. if (!$rule_string)
  635. {
  636. $rule_user_id = 0;
  637. }
  638. }
  639. $template->assign_vars(array(
  640. 'S_USER_CONDITION' => true,
  641. 'CURRENT_STRING' => $rule_string,
  642. 'CURRENT_USER_ID' => $rule_user_id,
  643. 'CURRENT_GROUP_ID' => 0)
  644. );
  645. $current_value = $rule_string;
  646. break;
  647. case 'group':
  648. $rule_group_id = request_var('rule_group_id', 0);
  649. $rule_string = utf8_normalize_nfc(request_var('rule_string', '', true));
  650. $sql = 'SELECT g.group_id, g.group_name, g.group_type
  651. FROM ' . GROUPS_TABLE . ' g ';
  652. if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
  653. {
  654. $sql .= 'LEFT JOIN ' . USER_GROUP_TABLE . ' ug
  655. ON (
  656. g.group_id = ug.group_id
  657. AND ug.user_id = ' . $user->data['user_id'] . '
  658. AND ug.user_pending = 0
  659. )
  660. WHERE (ug.user_id = ' . $user->data['user_id'] . ' OR g.group_type <> ' . GROUP_HIDDEN . ')
  661. AND';
  662. }
  663. else
  664. {
  665. $sql .= 'WHERE';
  666. }
  667. $sql .= " (g.group_name NOT IN ('GUESTS', 'BOTS') OR g.group_type <> " . GROUP_SPECIAL . ')
  668. ORDER BY g.group_type DESC, g.group_name ASC';
  669. $result = $db->sql_query($sql);
  670. $s_group_options = '';
  671. while ($row = $db->sql_fetchrow($result))
  672. {
  673. if ($rule_group_id && ($row['group_id'] == $rule_group_id))
  674. {
  675. $rule_string = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
  676. }
  677. $s_class = ($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '';
  678. $s_selected = ($row['group_id'] == $rule_group_id) ? ' selected="selected"' : '';
  679. $s_group_options .= '<option value="' . $row['group_id'] . '"' . $s_class . $s_selected . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
  680. }
  681. $db->sql_freeresult($result);
  682. $template->assign_vars(array(
  683. 'S_GROUP_CONDITION' => true,
  684. 'S_GROUP_OPTIONS' => $s_group_options,
  685. 'CURRENT_STRING' => $rule_string,
  686. 'CURRENT_USER_ID' => 0,
  687. 'CURRENT_GROUP_ID' => $rule_group_id)
  688. );
  689. $current_value = $rule_string;
  690. break;
  691. default:
  692. return;
  693. }
  694. $template->assign_vars(array(
  695. 'COND_OPTION' => $condition,
  696. 'COND_CURRENT' => $current_value)
  697. );
  698. }
  699. /**
  700. * Display defined message rules
  701. */
  702. function show_defined_rules($user_id, $check_lang, $rule_lang, $action_lang, $folder)
  703. {
  704. global $db, $template;
  705. $sql = 'SELECT *
  706. FROM ' . PRIVMSGS_RULES_TABLE . '
  707. WHERE user_id = ' . $user_id . '
  708. ORDER BY rule_id ASC';
  709. $result = $db->sql_query($sql);
  710. $count = 0;
  711. while ($row = $db->sql_fetchrow($result))
  712. {
  713. $template->assign_block_vars('rule', array(
  714. 'COUNT' => ++$count,
  715. 'RULE_ID' => $row['rule_id'],
  716. 'CHECK' => $check_lang[$row['rule_check']],
  717. 'RULE' => $rule_lang[$row['rule_connection']],
  718. 'STRING' => $row['rule_string'],
  719. 'ACTION' => $action_lang[$row['rule_action']],
  720. 'FOLDER' => ($row['rule_action'] == ACTION_PLACE_INTO_FOLDER) ? $folder[$row['rule_folder_id']]['folder_name'] : '')
  721. );
  722. }
  723. $db->sql_freeresult($result);
  724. }
  725. ?>