PageRenderTime 47ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax_chat.php

https://github.com/MightyGorgon/icy_phoenix
PHP | 500 lines | 409 code | 49 blank | 42 comment | 56 complexity | 806abd2cbbf15e7135e77cb664b6df4d MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package Icy Phoenix
  5. * @version $Id$
  6. * @copyright (c) 2008 Icy Phoenix
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. *
  12. * @Extra credits for this file
  13. * Javier B (kinfule@lycos.es)
  14. */
  15. define('CTRACKER_DISABLED', true);
  16. define('IN_ICYPHOENIX', true);
  17. if (!defined('IP_ROOT_PATH')) define('IP_ROOT_PATH', './');
  18. if (!defined('PHP_EXT')) define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
  19. include(IP_ROOT_PATH . 'common.' . PHP_EXT);
  20. include(IP_ROOT_PATH . 'includes/functions_ajax_chat.' . PHP_EXT);
  21. // Start session management
  22. $user->session_begin();
  23. $auth->acl($user->data);
  24. $user->setup();
  25. // End session management
  26. // Decide whether XML or JSON is to be used - JSON preferred
  27. $response_type = (function_exists('json_decode') && is_array(json_decode('{"a":1}', true))) ? 'json' : 'xml';
  28. $mode_types = array('archive');
  29. $mode = request_var('mode', '');
  30. $mode = (!in_array($mode, $mode_types) ? '' : $mode);
  31. // Give guest a notice so they know they aren't allowed to use the shoutbox.
  32. if (($config['shout_allow_guest'] == 0) && !$user->data['session_logged_in'])
  33. {
  34. redirect(append_sid(CMS_PAGE_LOGIN . '?redirect=' . CMS_PAGE_AJAX_CHAT, true));
  35. }
  36. $private_chat = false;
  37. $chat_room_all = request_var('all_rooms', 0);
  38. $chat_room_all = (($user->data['user_level'] == ADMIN) && !empty($chat_room_all)) ? true : false;
  39. $chat_room = request_var('chat_room', '');
  40. $chat_room_users = array_unique(array_filter(array_map('intval', explode('|', $chat_room))));
  41. $chat_room_users_count = sizeof($chat_room_users);
  42. $chat_room_sql = " s.shout_room = '' ";
  43. if (!empty($chat_room))
  44. {
  45. // validate chat room
  46. if ($chat_room_users_count < 2)
  47. {
  48. // Less than 2 users in chat room
  49. message_die(GENERAL_ERROR, $lang['INVALID']);
  50. }
  51. sort($chat_room_users);
  52. $chat_last_user = 0;
  53. foreach ($chat_room_users as $chat_user)
  54. {
  55. if ($chat_user <= $chat_last_user)
  56. {
  57. // Same user cannot be twice in a room or invalid user id
  58. message_die(GENERAL_ERROR, $lang['INVALID']);
  59. }
  60. $chat_last_user = $chat_user;
  61. }
  62. if (($user->data['user_level'] != ADMIN) && !in_array($user->data['user_id'], $chat_room_users))
  63. {
  64. // Current user is not in that chat room
  65. message_die(GENERAL_ERROR, $lang['Not_Auth_View']);
  66. }
  67. $private_chat = true;
  68. $chat_room = implode('|', $chat_room_users);
  69. $chat_room_sql = " s.shout_room = '|" . $chat_room . "|' ";
  70. define('AJAX_CHAT_ROOM', true);
  71. }
  72. // Show shoutbox with header and footer if the user didn't request anything else
  73. if (empty($mode))
  74. {
  75. if (!isset($cms_page['page_id']))
  76. {
  77. $cms_page['page_id'] = 'ajax_chat';
  78. }
  79. // Set as tmp value to not overwrite page id if included as a block...
  80. // Check before the archive link, so we can then use $cms_page_id_tmp for deciding what template to use
  81. $cms_page_id_tmp = 'ajax_chat_archive';
  82. $cms_auth_level_tmp = (isset($cms_config_layouts[$cms_page_id_tmp]['view']) ? $cms_config_layouts[$cms_page_id_tmp]['view'] : AUTH_ALL);
  83. $ajax_archive_link = check_page_auth($cms_page_id_tmp, $cms_auth_level_tmp, true);
  84. // Import settings from other vars if set... or force global blocks to off since this may be run as stand alone
  85. $cms_page_id_tmp = 'ajax_chat';
  86. $cms_page['page_nav'] = isset($cms_page['page_nav']) ? $cms_page['page_nav'] : true;
  87. $cms_page['global_blocks'] = isset($cms_page['global_blocks']) ? $cms_page['global_blocks'] : false;
  88. $cms_auth_level_tmp = (isset($cms_config_layouts[$cms_page_id_tmp]['view']) ? $cms_config_layouts[$cms_page_id_tmp]['view'] : AUTH_ALL);
  89. check_page_auth($cms_page_id_tmp, $cms_auth_level_tmp);
  90. $breadcrumbs['bottom_right_links'] = '<a href="' . append_sid('ajax_chat.' . PHP_EXT) . '">' . $lang['Ajax_Chat'] . '</a>' . (($ajax_archive_link == true) ? ('&nbsp;' . MENU_SEP_CHAR . '&nbsp;' . '<a href="' . append_sid('ajax_chat.' . PHP_EXT . '?mode=archive') . '">' . $lang['Ajax_Archive'] . '</a>') : '');
  91. $template_to_parse = 'ajax_chat_body.tpl';
  92. $template->assign_vars(array(
  93. 'L_PAGE_TITLE' => $lang['Ajax_Chat'],
  94. 'L_WIO' => $lang['Who_is_Chatting'],
  95. 'L_GUESTS' => $lang['Online_guests'],
  96. 'L_TOTAL' => $lang['Online_total'],
  97. 'L_USERS' => $lang['Online_registered'],
  98. 'L_SHOUTBOX_ONLINE_EXPLAIN' => $lang['Shoutbox_online_explain'],
  99. 'DELETE_IMG' => '<img src="' . $images['icon_delpost'] . '" alt="' . $lang['Delete_post'] . '" title="' . $lang['Delete_post'] . '" />',
  100. 'L_SHOUT_PREFIX' => 'shout_',
  101. 'L_USER_PREFIX' => 'user_',
  102. 'L_ROOM_PREFIX' => 'room_',
  103. 'S_TARGET' => 'target=\"_blank\"',
  104. )
  105. );
  106. $shoutbox_template_parse = false;
  107. include(IP_ROOT_PATH . 'includes/ajax_shoutbox_inc.' . PHP_EXT);
  108. }
  109. else
  110. {
  111. if (!isset($cms_page['page_id']))
  112. {
  113. $cms_page['page_id'] = 'ajax_chat_archive';
  114. }
  115. // Set as tmp value to not overwrite page id if included as a block...
  116. // Check before the chat link, so we can then use $cms_page_id_tmp for deciding what template to use
  117. $cms_page_id_tmp = 'ajax_chat';
  118. $cms_auth_level_tmp = (isset($cms_config_layouts[$cms_page_id_tmp]['view']) ? $cms_config_layouts[$cms_page_id_tmp]['view'] : AUTH_ALL);
  119. $ajax_chat_link = check_page_auth($cms_page_id_tmp, $cms_auth_level_tmp, true);
  120. // Import settings from other vars if set... or force global blocks to off since this may be run as stand alone
  121. $cms_page_id_tmp = 'ajax_chat_archive';
  122. $cms_page['page_nav'] = isset($cms_page['page_nav']) ? $cms_page['page_nav'] : true;
  123. $cms_page['global_blocks'] = isset($cms_page['global_blocks']) ? $cms_page['global_blocks'] : false;
  124. $cms_auth_level_tmp = (isset($cms_config_layouts[$cms_page_id_tmp]['view']) ? $cms_config_layouts[$cms_page_id_tmp]['view'] : AUTH_ALL);
  125. check_page_auth($cms_page_id_tmp, $cms_auth_level_tmp);
  126. $breadcrumbs['bottom_right_links'] = (($ajax_chat_link == true) ? '<a href="' . append_sid('ajax_chat.' . PHP_EXT) . '">' . $lang['Ajax_Chat'] . '</a>&nbsp;' . MENU_SEP_CHAR . '&nbsp;' : '') . '<a href="' . append_sid('ajax_chat.' . PHP_EXT . '?mode=archive') . '">' . $lang['Ajax_Archive'] . '</a>';
  127. $template_to_parse = 'ajax_chat_archive.tpl';
  128. include_once(IP_ROOT_PATH . 'includes/functions_ajax_chat.' . PHP_EXT);
  129. // Include Post functions and BBCodes
  130. include_once(IP_ROOT_PATH . 'includes/bbcode.' . PHP_EXT);
  131. include_once(IP_ROOT_PATH . 'includes/functions_post.' . PHP_EXT);
  132. // Make Pagination and collect some extra data
  133. $sql = "SELECT COUNT(s.shout_id) as stored_shouts, MAX(s.shout_id) as total_shouts
  134. FROM " . AJAX_SHOUTBOX_TABLE . " s " . (!empty($chat_room_all) ? "" : " WHERE " . $chat_room_sql);
  135. $result = $db->sql_query($sql);
  136. $num_items = $db->sql_fetchrow($result);
  137. $start = request_get_var('start', 0);
  138. $start = ($start < 0) ? 0 : $start;
  139. $template->assign_vars(array(
  140. 'PAGINATION' => generate_pagination('ajax_chat.' . PHP_EXT . '?mode=archive&amp;chat_room=' . $chat_room, $num_items['stored_shouts'], $config['posts_per_page'], $start),
  141. )
  142. );
  143. // Get my shouts
  144. $sql = "SELECT COUNT(s.shout_id) as count
  145. FROM " . AJAX_SHOUTBOX_TABLE . " s
  146. WHERE s.user_id = " . $user->data['user_id'] . (!empty($chat_room_all) ? "" : " AND " . $chat_room_sql);
  147. $result = $db->sql_query($sql);
  148. $myshouts = $db->sql_fetchrow($result);
  149. // Get the shouts count for the last 24 hours
  150. $yesterday = time() - (24 * 60 * 60);
  151. $sql = "SELECT COUNT(s.shout_id) as count
  152. FROM " . AJAX_SHOUTBOX_TABLE . " s
  153. WHERE s.shout_time >= " . $yesterday . (!empty($chat_room_all) ? "" : " AND " . $chat_room_sql);
  154. $result = $db->sql_query($sql);
  155. $today = $db->sql_fetchrow($result);
  156. $template->assign_vars(array(
  157. 'L_PAGE_TITLE' => $lang['Ajax_Archive'],
  158. 'L_AUTHOR' => $lang['Author'],
  159. 'L_SHOUTS' => $lang['Shouts'],
  160. 'L_STATS' =>$lang['Statistics'],
  161. 'L_ARCHIVE' => $lang['Ajax_Archive'],
  162. 'L_CONFIRM' => $lang['Confirm_delete_pm'],
  163. 'L_UNABLE' => $lang['Shoutbox_unable'],
  164. 'L_TIMEOUT' => $lang['Shoutbox_timeout'],
  165. 'TOTAL_SHOUTS' => $num_items['total_shouts'],
  166. 'L_TOTAL_SHOUTS' => $lang['Total_shouts'],
  167. 'STORED_SHOUTS' => $num_items['stored_shouts'],
  168. 'L_STORED_SHOUTS' => $lang['Stored_shouts'],
  169. 'MY_SHOUTS' => $myshouts['count'],
  170. 'L_MY_SHOUTS' => $lang['My_shouts'],
  171. 'TODAY_SHOUTS' => $today['count'],
  172. 'L_TODAY_SHOUTS' => $lang['Today_shouts'],
  173. 'L_POSTED' => $lang['Posted'],
  174. 'L_WIO' => $lang['Who_is_Chatting'],
  175. 'L_GUESTS' => $lang['Online_guests'],
  176. 'L_TOTAL' => $lang['Online_total'],
  177. 'L_USERS' => $lang['Online_registered'],
  178. 'L_TOP_SHOUTERS' => $lang['Top_Ten_Shouters'],
  179. 'L_SHOUTBOX_ONLINE_EXPLAIN' => $lang['Shoutbox_online_explain'],
  180. 'L_SHOUT_PREFIX' => 'shout_',
  181. 'L_USER_PREFIX' => 'user_',
  182. 'L_ROOM_PREFIX' => 'room_',
  183. 'PRIVATE_USERS' => '{ }' // Javascript object syntax
  184. )
  185. );
  186. $template->assign_block_vars('view_shoutbox', array(
  187. 'REFRESH_TIME' => (int) $config['ajax_chat_msgs_refresh'] * 1000,
  188. 'RESPONSE_TYPE' => $response_type,
  189. 'CHAT_ROOM' => $chat_room,
  190. 'UPDATE_MODE' => 'archive',
  191. 'U_ACTION' => append_sid(IP_ROOT_PATH . CMS_PAGE_AJAX_SHOUTBOX)
  192. )
  193. );
  194. $admin_mode = false;
  195. if ($user->data['user_level'] == ADMIN)
  196. {
  197. $admin_mode = request_var('admin', 0);
  198. $admin_mode = empty($admin_mode) ? false : true;
  199. $template->assign_block_vars('view_shoutbox.user_is_admin', array());
  200. }
  201. // Guest are reconized by their IP
  202. $guest_sql = '';
  203. $is_guest = false;
  204. if (!$user->data['session_logged_in'])
  205. {
  206. $is_guest = true;
  207. $guest_sql = " AND session_ip = '" . $db->sql_escape($user->ip) . "'";
  208. }
  209. // Update session data and online list - only get session data if the user was online $config['ajax_chat_session_refresh'] seconds ago
  210. $time_ago = time() - (int) $config['ajax_chat_session_refresh'];
  211. // Read session data for update
  212. $sql = "SELECT u.user_id, u.username, u.user_active, u.user_color, u.user_level
  213. FROM " . AJAX_SHOUTBOX_SESSIONS_TABLE . " s, " . USERS_TABLE . " u
  214. WHERE s.session_time >= " . $time_ago . "
  215. AND s.session_user_id = u.user_id" . $guest_sql . "
  216. ORDER BY case u.user_level when 0 then 10 else u.user_level end";
  217. $result = $db->sql_query($sql);
  218. // Set all counters to 0
  219. $reg_online_counter = $guest_online_counter = $online_counter = 0;
  220. $online_list = array();
  221. // Default online user
  222. $online_user = array();
  223. while($online = $db->sql_fetchrow($result))
  224. {
  225. if($online['user_id'] != ANONYMOUS)
  226. {
  227. $style_color = colorize_username($online['user_id'], $online['username'], $online['user_color'], $online['user_active'], false, true);
  228. $online['user_style_color'] = $style_color;
  229. if ($online['user_id'] != $user->data['user_id'])
  230. {
  231. $online_list[$online['username']] = $online;
  232. }
  233. else
  234. {
  235. $online['username'] = $lang['My_id'];
  236. $online_user = $online;
  237. }
  238. $reg_online_counter++;
  239. }
  240. else
  241. {
  242. $guest_online_counter++;
  243. }
  244. $online_counter++;
  245. }
  246. // Check if anything has changed
  247. ksort($online_list);
  248. $online_keys = array_keys($online_list);
  249. // Start with the user
  250. if (!empty($online_user))
  251. {
  252. if ($response_type == 'xml')
  253. {
  254. $template->assign_block_vars('online_list', array(
  255. 'USER_ID' => $online_user['user_id'],
  256. 'USERNAME' => $online_user['username'],
  257. 'USER_STYLE' => $online_user['user_style_color'],
  258. 'CHAT_LINK' => ''
  259. )
  260. );
  261. }
  262. else
  263. {
  264. $json_user = array(
  265. 'user_id' => $online_user['user_id'],
  266. 'username' => $online_user['username'],
  267. 'user_style' => $online_user['user_style_color'],
  268. 'chat_link' => ''
  269. );
  270. $template->assign_block_vars('online_list', array(
  271. 'user' => @json_encode($json_user)
  272. )
  273. );
  274. }
  275. }
  276. foreach ($online_list as $online)
  277. {
  278. $chat_link = '';
  279. if ($response_type == 'xml')
  280. {
  281. $template->assign_block_vars('online_list', array(
  282. 'USER_ID' => $online['user_id'],
  283. 'USERNAME' => $online['username'],
  284. 'USER_STYLE' => $online['user_style_color'],
  285. 'CHAT_LINK' => $chat_link,
  286. )
  287. );
  288. }
  289. else
  290. {
  291. $json_user = array(
  292. 'user_id' => $online['user_id'],
  293. 'username' => $online['username'],
  294. 'user_style' => $online['user_style_color'],
  295. 'chat_link' => $chat_link,
  296. );
  297. $template->assign_block_vars('online_list', array(
  298. 'user' => @json_encode($json_user)
  299. )
  300. );
  301. }
  302. }
  303. $template->assign_vars(array(
  304. 'TOTAL_COUNTER' => $online_counter,
  305. 'REGISTERED_COUNTER' => $reg_online_counter,
  306. 'GUEST_COUNTER' => $guest_online_counter
  307. )
  308. );
  309. // Get the top ten shouters
  310. $sql = "SELECT COUNT(*) AS user_shouts, s.user_id, u.username, u.user_color
  311. FROM " . AJAX_SHOUTBOX_TABLE . " s, " . USERS_TABLE . " u
  312. WHERE s.user_id != " . ANONYMOUS . (!empty($chat_room_all) ? "" : " AND " . $chat_room_sql) . "
  313. AND u.user_id = s.user_id
  314. GROUP BY u.user_id
  315. ORDER BY user_shouts DESC
  316. LIMIT 10";
  317. $result = $db->sql_query($sql);
  318. while($top_shouters = $db->sql_fetchrow($result))
  319. {
  320. if ($top_shouters['user_id'] == ANONYMOUS)
  321. {
  322. $shouter = $top_shouters['username'];
  323. $shouter_link = '';
  324. }
  325. else
  326. {
  327. $shouter = ($user->data['session_logged_in'] && $top_shouters['user_id'] == $user->data['user_id']) ? $lang['My_id'] : $top_shouters['username'];
  328. $shouter_link = append_sid(CMS_PAGE_PROFILE . '?mode=viewprofile&amp;u=' . $top_shouters['user_id']);
  329. }
  330. $template->assign_block_vars('top_shouters', array(
  331. 'USERNAME' => colorize_username($top_shouters['user_id'], $shouter, $top_shouters['user_color']),
  332. 'USER_LINK' => $shouter_link,
  333. 'USER_SHOUTS' => $top_shouters['user_shouts']
  334. )
  335. );
  336. }
  337. // Gets the shouts for display
  338. $chatroom_title = $lang['Public_room'];
  339. $chatroom_userlist = '';
  340. $sql = "SELECT s.*, u.username, u.user_color
  341. FROM " . AJAX_SHOUTBOX_TABLE . " s, " . USERS_TABLE . " u
  342. WHERE s.user_id = u.user_id" . (!empty($chat_room_all) ? "" : " AND " . $chat_room_sql) . "
  343. ORDER BY s.shout_id DESC
  344. LIMIT " . $start . ", " . $config['posts_per_page'];
  345. $results = $db->sql_query($sql);
  346. $row = $db->sql_fetchrowset($results);
  347. if(empty($row))
  348. {
  349. $template->assign_block_vars('no_shouts', array());
  350. }
  351. else
  352. {
  353. for($x = 0; $x < sizeof($row); $x++)
  354. {
  355. $id = $row[$x]['shout_id'];
  356. $time = utf8_encode(create_date($lang['DATE_FORMAT_CHAT'], $row[$x]['shout_time'], $config['board_timezone']));
  357. if ($row[$x]['user_id'] == ANONYMOUS)
  358. {
  359. $shouter = $row[$x]['username'];
  360. $shouter_link = false;
  361. $shouter_color = '';
  362. }
  363. else
  364. {
  365. $shouter = ($user->data['session_logged_in'] && ($row[$x]['user_id'] == $user->data['user_id'])) ? $lang['My_id'] : $row[$x]['username'];
  366. $shouter_link = append_sid(CMS_PAGE_PROFILE . '?mode=viewprofile&amp;u=' . $row[$x]['user_id']);
  367. $shouter_color = colorize_username($row[$x]['user_id'], $shouter, $row[$x]['user_color'], true, false, true);
  368. }
  369. $message = $row[$x]['shout_text'];
  370. $message = strip_tags($message);
  371. $message = censor_text($message);
  372. $bbcode->allow_html = false;
  373. $bbcode->allow_bbcode = ($user->data['user_allowbbcode'] && $config['allow_bbcode']) ? true : false;
  374. $bbcode->allow_smilies = ($user->data['user_allowsmile'] && $config['allow_smilies']) ? true : false;
  375. $message = $bbcode->parse($message);
  376. if ($user->data['session_logged_in'] && ($user->data['user_level'] == ADMIN))
  377. {
  378. $temp_url = 'javascript:removeShout(' . $id . ');';
  379. $delpost_img = '<a href="#" onclick="' . $temp_url . '"><img src="' . $images['icon_delpost'] . '" alt="' . $lang['Delete_post'] . '" title="' . $lang['Delete_post'] . '" /></a>';
  380. }
  381. else
  382. {
  383. $temp_url = '';
  384. $delpost_img = '';
  385. }
  386. if($shouter_link != false)
  387. {
  388. $shouter_html = '<a href="' . $shouter_link . '" class="postlink"' . $shouter_color . '>' . $shouter . '</a>';
  389. }
  390. else
  391. {
  392. $shouter_html = $shouter;
  393. }
  394. $template->assign_block_vars('shouts', array(
  395. 'ID' => $id,
  396. 'SHOUTER' => $shouter_html,
  397. 'MESSAGE' => $message,
  398. 'DELETE_IMG' => $delpost_img,
  399. 'DATE' => $time
  400. )
  401. );
  402. }
  403. // Gets the chat_rooms for display
  404. $archive_link = '?mode=archive';
  405. if ($user->data['user_level'] == ADMIN)
  406. {
  407. $template->assign_block_vars('rooms', array(
  408. 'NAME' => $lang['Admin_rooms'],
  409. 'LIST' => '',
  410. 'STYLED_LIST' => '',
  411. 'CLASS' => !empty($chat_room_all) ? ' class="active"' : '',
  412. 'LINK' => append_sid('ajax_chat.' . PHP_EXT . $archive_link . '&amp;admin=1&amp;all_rooms=1')
  413. )
  414. );
  415. $admin_mode = request_var('admin', '');
  416. if (!empty($admin_mode))
  417. {
  418. $admin_mode = true;
  419. $archive_link .= '&amp;admin=1';
  420. }
  421. else
  422. {
  423. $admin_mode = false;
  424. }
  425. }
  426. $room_filter = ($admin_mode == true) ? "shout_room != ''" : "shout_room LIKE '%|" . $user->data['user_id'] . "|%'";
  427. $sql = "SELECT DISTINCT shout_room
  428. FROM " . AJAX_SHOUTBOX_TABLE . "
  429. WHERE " . $room_filter . "
  430. ORDER BY shout_id DESC";
  431. $results = $db->sql_query($sql);
  432. $rooms = $db->sql_fetchrowset($results);
  433. $room_users = get_chat_room_users($rooms, $chat_room, $archive_link);
  434. $chatroom_title = $room_users['title'];
  435. $chatroom_userlist = $room_users['userlist'];
  436. $rooms = $room_users['rooms'];
  437. foreach ($rooms as $room)
  438. {
  439. $template->assign_block_vars('rooms', $room);
  440. }
  441. }
  442. $template->assign_vars(array(
  443. 'L_SHOUTBOX_EMPTY' => $lang['Shoutbox_empty'],
  444. 'L_SHOUT_ROOMS' => $lang['Shout_rooms'],
  445. 'L_SHOUT_ROOM_TITLE' => $chatroom_title,
  446. 'L_SHOUT_ROOM_LIST' => $chatroom_userlist
  447. )
  448. );
  449. }
  450. full_page_generation($template_to_parse, ($template_to_parse == 'ajax_chat_body.tpl') ? $lang['Ajax_Chat'] : $lang['Ajax_Archive'], '', '');
  451. ?>