PageRenderTime 108ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/includes/functions_ajax_chat.php

https://github.com/MightyGorgon/icy_phoenix
PHP | 366 lines | 298 code | 31 blank | 37 comment | 33 complexity | a738442a34a14ad90e1832afadaa6d65 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. if (!defined('IN_ICYPHOENIX'))
  16. {
  17. die('Hacking attempt');
  18. }
  19. /*
  20. * From php.net comments
  21. * by ivanmaz(remove) at mech dot math dot msu dot su
  22. * UTF8 to Cyrillic Win-1251 Convertor
  23. */
  24. function utf8dec($s)
  25. {
  26. $out = "";
  27. for ($i = 0; $i < strlen($s); $i++)
  28. {
  29. $c1 = substr ($s, $i, 1);
  30. $byte1 = ord ($c1);
  31. if ($byte1>>5 == 6) // 110x xxxx, 110 prefix for 2 bytes unicode
  32. {
  33. $i++;
  34. $c2 = substr ($s, $i, 1);
  35. $byte2 = ord ($c2);
  36. $byte1 &= 31; // remove the 3 bit two bytes prefix
  37. $byte2 &= 63; // remove the 2 bit trailing byte prefix
  38. $byte2 |= (($byte1 & 3) << 6); // last 2 bits of c1 become first 2 of c2
  39. $byte1 >>= 2; // c1 shifts 2 to the right
  40. $word = ($byte1<<8) + $byte2;
  41. if ($word == 1025)
  42. {
  43. $out .= chr(168);
  44. }
  45. elseif ($word == 1105)
  46. {
  47. $out .= chr(184);
  48. }
  49. elseif ($word >= 0x0410 && $word <= 0x044F)
  50. {
  51. $out .= chr($word - 848);
  52. }
  53. else
  54. {
  55. $a = dechex($byte1);
  56. $a = str_pad($a, 2, "0", STR_PAD_LEFT);
  57. $b = dechex($byte2);
  58. $b = str_pad($b, 2, "0", STR_PAD_LEFT);
  59. $out .= "&#x" . $a . $b . ";";
  60. }
  61. }
  62. else
  63. {
  64. $out .= $c1;
  65. }
  66. }
  67. return $out;
  68. }
  69. // A fast way to stop running the script and displaying the xml response
  70. function pseudo_die($error, $error_msg)
  71. {
  72. global $template;
  73. $template->assign_vars(array(
  74. 'ERROR_STATUS' => $error,
  75. 'ERROR_MSG' => utf8_encode($error_msg)
  76. )
  77. );
  78. $template->pparse('xhr');
  79. die();
  80. }
  81. // Update and return Shoutbox sessions data
  82. function update_session(&$error_msg, $refresh = true)
  83. {
  84. global $db, $cache, $config, $user, $lang;
  85. $guest_sql = '';
  86. $online_counter = 0;
  87. $reg_online_counter = 0;
  88. $guest_online_counter = 0;
  89. // First clean old data... so we should have a light table...
  90. // Just double chat session refresh time to make sure we are not removing sessions for users still active...
  91. $clean_time = time() - ((int) $config['ajax_chat_session_refresh'] * 2);
  92. $sql = "DELETE FROM " . AJAX_SHOUTBOX_SESSIONS_TABLE . " WHERE session_time < " . $clean_time;
  93. $db->sql_return_on_error(true);
  94. $result = $db->sql_query($sql);
  95. $db->sql_return_on_error(false);
  96. if (!$result)
  97. {
  98. $error_msg = 'Could not update Shoutbox session data';
  99. }
  100. if ($refresh)
  101. {
  102. // Guest are reconized by their IP
  103. if (!$user->data['session_logged_in'])
  104. {
  105. $guest_sql = " AND session_ip = '" . $db->sql_escape($user->ip) . "'";
  106. }
  107. // Only get session data if the user was online $config['ajax_chat_session_refresh'] seconds ago
  108. $time_ago = time() - (int) $config['ajax_chat_session_refresh'];
  109. $sql = 'SELECT session_id
  110. FROM ' . AJAX_SHOUTBOX_SESSIONS_TABLE . '
  111. WHERE session_user_id = ' . $user->data['user_id'] . '
  112. AND session_time >= ' . $time_ago . '
  113. ' . $guest_sql . '
  114. LIMIT 1';
  115. $db->sql_return_on_error(true);
  116. $result = $db->sql_query($sql);
  117. $db->sql_return_on_error(false);
  118. if (!$result)
  119. {
  120. $error_msg = 'Can\'t read shoutbox session data';
  121. }
  122. // We need to decide if we create an entry or update a previous one
  123. if ($row = $db->sql_fetchrow($result))
  124. {
  125. $current_session_id = $row['session_id'];
  126. $sql = "UPDATE " . AJAX_SHOUTBOX_SESSIONS_TABLE . "
  127. SET session_ip = '" . $db->sql_escape($user->ip) . "',
  128. session_time = " . time() . "
  129. WHERE session_id = " . $row['session_id'];
  130. }
  131. else
  132. {
  133. $current_session_id = get_ajax_chat_max_session_id() + 1;
  134. $sql = "INSERT INTO " . AJAX_SHOUTBOX_SESSIONS_TABLE . " (session_id, session_user_id, session_username, session_ip, session_start, session_time)
  135. VALUES (" . $current_session_id . ", " . $user->data['user_id'] . ", '" . ($user->data['session_logged_in'] ? $user->data['username'] : '') . "', '" . $db->sql_escape($user->ip) . "', " . time() . ", " . time() . ")";
  136. }
  137. $db->sql_return_on_error(true);
  138. $result = $db->sql_query($sql);
  139. $db->sql_return_on_error(false);
  140. if (!$result)
  141. {
  142. $error_msg = 'Could not update Shoutbox session data';
  143. }
  144. $sql = "DELETE FROM " . AJAX_SHOUTBOX_SESSIONS_TABLE . "
  145. WHERE session_user_id = " . $user->data['user_id'] . "
  146. AND session_id <> " . $current_session_id;
  147. $db->sql_return_on_error(true);
  148. $result = $db->sql_query($sql);
  149. $db->sql_return_on_error(false);
  150. if (!$result)
  151. {
  152. $error_msg = 'Could not update Shoutbox session data';
  153. }
  154. }
  155. if (!empty($user->data['user_private_chat_alert']))
  156. {
  157. $sql = "UPDATE " . USERS_TABLE . " SET user_private_chat_alert = '' WHERE user_id = " . $user->data['user_id'];
  158. $db->sql_return_on_error(true);
  159. $db->sql_query($sql);
  160. $db->sql_return_on_error(false);
  161. }
  162. }
  163. // remove a Shoutbox session
  164. function remove_session(&$error_msg)
  165. {
  166. global $db, $user, $user_ip;
  167. $guest_sql = '';
  168. // Guest are reconized by their IP
  169. if (!$user->data['session_logged_in'])
  170. {
  171. $guest_sql = " AND session_ip = '" . $db->sql_escape($user->ip) . "'";
  172. }
  173. // Only get session data if the user was online $config['ajax_chat_session_refresh'] seconds ago
  174. $time_ago = time() - (int) $config['ajax_chat_session_refresh'];
  175. $sql = 'SELECT session_id
  176. FROM ' . AJAX_SHOUTBOX_SESSIONS_TABLE . '
  177. WHERE session_user_id = ' . $user->data['user_id'] . '
  178. AND session_time >= ' . $time_ago . '
  179. ' . $guest_sql . '
  180. LIMIT 1';
  181. $db->sql_return_on_error(true);
  182. $result = $db->sql_query($sql);
  183. $db->sql_return_on_error(false);
  184. if (!$result)
  185. {
  186. $error_msg = 'Can\'t read shoutbox session data';
  187. }
  188. // We need to delete a previous existing entry only
  189. if ($row = $db->sql_fetchrow($result))
  190. {
  191. $sql = "DELETE FROM " . AJAX_SHOUTBOX_SESSIONS_TABLE . "
  192. WHERE session_id = " . $row['session_id'];
  193. $db->sql_return_on_error(true);
  194. $result = $db->sql_query($sql);
  195. $db->sql_return_on_error(false);
  196. if (!$result)
  197. {
  198. $error_msg = 'Could not delete Shoutbox session data';
  199. }
  200. }
  201. }
  202. // Checks if a user is in the chat session
  203. function user_in_chat_session($id)
  204. {
  205. global $db, $cache, $config;
  206. // Only get session data if the user was online $config['ajax_chat_session_refresh'] seconds ago
  207. $time_ago = time() - (int) $config['ajax_chat_session_refresh'];
  208. $sql = 'SELECT session_id
  209. FROM ' . AJAX_SHOUTBOX_SESSIONS_TABLE . '
  210. WHERE session_user_id = ' . $id . '
  211. AND session_time >= ' . $time_ago . '
  212. LIMIT 1';
  213. $result = $db->sql_query($sql);
  214. if (!$result)
  215. {
  216. return false;
  217. }
  218. if ($row = $db->sql_fetchrow($result))
  219. {
  220. return true;
  221. }
  222. return false;
  223. }
  224. // Get max session_id
  225. function get_ajax_chat_max_session_id()
  226. {
  227. global $db, $cache;
  228. $sql = 'SELECT MAX(session_id) AS max_session_id
  229. FROM ' . AJAX_SHOUTBOX_SESSIONS_TABLE;
  230. $db->sql_return_on_error(true);
  231. $result = $db->sql_query($sql);
  232. $db->sql_return_on_error(false);
  233. if (!$result)
  234. {
  235. $error_msg = 'Can\'t read shoutbox session data';
  236. }
  237. if($row = $db->sql_fetchrow($result))
  238. {
  239. return (int) $row['max_session_id'];
  240. }
  241. else
  242. {
  243. return 0;
  244. }
  245. }
  246. // Given a list of rooms, produce a list of users in those rooms
  247. //
  248. // $rooms the list of rooms
  249. // $chat_room the current chat room
  250. // $chat_link the chat room link
  251. function get_chat_room_users($rooms, $chat_room, $chat_link)
  252. {
  253. global $db, $cache, $user, $lang;
  254. $chatroom_title = $lang['Public_room'];
  255. $chatroom_userlist = '';
  256. $result = array();
  257. $result['rooms'] = array();
  258. $room_class = '';
  259. $chat_room_all = request_var('all_rooms', 0);
  260. $chat_room_all = !empty($chat_room_all) ? true : false;
  261. if (($chat_room == '') && empty($chat_room_all))
  262. {
  263. $room_class = ' class="active"';
  264. }
  265. $result['rooms'][] = array(
  266. 'NAME' => $lang['Public_room'],
  267. 'LIST' => '',
  268. 'STYLED_LIST' => '',
  269. 'CLASS' => $room_class,
  270. 'LINK' => append_sid($chat_link)
  271. );
  272. $room_list_ids = array();
  273. $room_styled_list_ids = array();
  274. if (!empty($rooms))
  275. {
  276. $room_users_list = '';
  277. foreach ($rooms as $room)
  278. {
  279. $room_users_list .= $room['shout_room'];
  280. }
  281. $room_users_sql = array_unique(array_filter(array_map('intval', explode('|', $room_users_list))));
  282. $sql = "SELECT DISTINCT user_id, username, user_color, user_active
  283. FROM " . USERS_TABLE . "
  284. WHERE " . $db->sql_in_set('user_id', $room_users_sql);
  285. $results = $db->sql_query($sql);
  286. $users = $db->sql_fetchrowset($results);
  287. foreach ($users as $chat_user)
  288. {
  289. if($user->data['session_logged_in'] && ($chat_user['user_id'] == $user->data['user_id']))
  290. {
  291. $room_list_ids[$chat_user['user_id']] = $lang['My_id'];
  292. $room_styled_list_ids[$chat_user['user_id']] = colorize_username($chat_user['user_id'], $lang['My_id'], $chat_user['user_color'], $chat_user['user_active'], false, true);
  293. }
  294. else
  295. {
  296. $room_list_ids[$chat_user['user_id']] = $chat_user['username'];
  297. $room_styled_list_ids[$chat_user['user_id']] = colorize_username($chat_user['user_id'], $chat_user['username'], $chat_user['user_color'], $chat_user['user_active'], false, true);
  298. }
  299. }
  300. foreach ($rooms as $room)
  301. {
  302. $comma = '';
  303. $list = '';
  304. $styled_list = '';
  305. $room_class = '';
  306. $current_room = $room['shout_room'];
  307. $room_users = array_unique(array_filter(array_map('intval', explode('|', $room['shout_room']))));
  308. foreach ($room_users as $room_user)
  309. {
  310. $list .= $comma . $room_list_ids[$room_user];
  311. $styled_list .= $comma . '<span ' . $room_styled_list_ids[$room_user] . '>' . $room_list_ids[$room_user] . '</span>';
  312. $comma = ', ';
  313. }
  314. if ($current_room == ('|' . $chat_room . '|'))
  315. {
  316. $room_class = ' class="active"';
  317. $chatroom_title = $lang['Private_room'];
  318. $chatroom_userlist = $styled_list;
  319. }
  320. $result['rooms'][] = array(
  321. 'NAME' => $lang['Private_room'],
  322. 'LIST' => $list,
  323. 'STYLED_LIST' => $styled_list,
  324. 'CLASS' => $room_class,
  325. 'LINK' => append_sid($chat_link . '&amp;chat_room=' . implode('|', $room_users))
  326. );
  327. }
  328. }
  329. $result['room_list_ids'] = $room_list_ids;
  330. $result['styled_list_ids'] = $room_styled_list_ids;
  331. $result['title'] = $chatroom_title;
  332. $result['userlist'] = $chatroom_userlist;
  333. return $result;
  334. }
  335. ?>