PageRenderTime 26ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/phpBB3/chat.php

http://pbb-png1.googlecode.com/
PHP | 345 lines | 289 code | 36 blank | 20 comment | 37 complexity | 6c876d71efbcbf7863f54187524f2734 MD5 | raw file
  1. <?php
  2. /**
  3. *
  4. * @package phpBB3
  5. * @version $Id: chat.php 52 2007-11-04 05:56:17Z Handyman $
  6. * @copyright (c) 2007 StarTrekGuide
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. * @ignore
  12. */
  13. define('IN_PHPBB', true);
  14. $phpbb_root_path = './';
  15. $phpEx = substr(strrchr(__FILE__, '.'), 1);
  16. include($phpbb_root_path . 'common.' . $phpEx);
  17. // Start session management
  18. $user->session_begin();
  19. $auth->acl($user->data);
  20. $user->setup('chat');
  21. define('CHAT_TABLE', $table_prefix . 'chat');
  22. define('CHAT_SESSIONS_TABLE', $table_prefix . 'chat_sessions');
  23. /******************************************/
  24. /* EDIT these for custom online settings */
  25. /****************************************/
  26. $session_time = 300;
  27. $default_delay = 15;
  28. //set status
  29. $times = array(
  30. 'online' => 0,
  31. 'idle' => 300,
  32. 'offline' => 1800,
  33. );
  34. //set delay for each status
  35. $delay = array(
  36. 'online' => 5,
  37. 'idle' => 60,
  38. 'offline' => 300,
  39. );
  40. /*****************************************/
  41. /* DO NOT EDIT ANYTHING BELOW THIS LINE */
  42. /***************************************/
  43. $mode = request_var('mode', '');
  44. $last_id = request_var('last_id', 0);
  45. $last_post = request_var('last_post', 0);
  46. $last_time = request_var('last_time', 0);
  47. $get = $init = false;
  48. $count = 0;
  49. switch ($mode)
  50. {
  51. default:
  52. $sql = 'SELECT * FROM ' . CHAT_TABLE . ' ORDER BY message_id DESC';
  53. $result = $db->sql_query_limit($sql, 25);
  54. $rows = $db->sql_fetchrowset($result);
  55. foreach ($rows as $row)
  56. {
  57. if ($count++ == 0)
  58. {
  59. $last_id = $row['message_id'];
  60. }
  61. $template->assign_block_vars('chatrow', array(
  62. 'MESSAGE_ID' => $row['message_id'],
  63. 'USERNAME_FULL' => clean_username(get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], $user->lang['GUEST'])),
  64. 'MESSAGE' => generate_text_for_display($row['message'], $row['bbcode_uid'], $row['bbcode_bitfield'], $row['bbcode_options']),
  65. 'TIME' => $user->format_date($row['time']),
  66. 'CLASS' => ($row['message_id'] % 2) ? 1 : 2,
  67. ));
  68. }
  69. $db->sql_freeresult($result);
  70. if ($user->data['user_type'] == USER_FOUNDER || $user->data['user_type'] == USER_NORMAL)
  71. {
  72. $sql = 'SELECT * FROM ' . CHAT_SESSIONS_TABLE . " WHERE user_id = {$user->data['user_id']}";
  73. $result = $db->sql_query($sql);
  74. $row = $db->sql_fetchrow($result);
  75. $db->sql_freeresult($result);
  76. if ($row['user_id'] != $user->data['user_id'])
  77. {
  78. $sql_ary = array(
  79. 'user_id' => $user->data['user_id'],
  80. 'username' => $user->data['username'],
  81. 'user_colour' => $user->data['user_colour'],
  82. 'user_login' => time(),
  83. 'user_lastupdate' => time(),
  84. );
  85. $sql = 'INSERT INTO ' . CHAT_SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
  86. $db->sql_query($sql);
  87. }
  88. else
  89. {
  90. $sql_ary = array(
  91. 'username' => $user->data['username'],
  92. 'user_colour' => $user->data['user_colour'],
  93. 'user_login' => time(),
  94. 'user_lastupdate' => time(),
  95. );
  96. $sql = 'UPDATE ' . CHAT_SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE user_id = {$user->data['user_id']}";
  97. $db->sql_query($sql);
  98. }
  99. }
  100. whois_online();
  101. $template->assign_vars(array(
  102. 'TIME' => time(),
  103. 'DELAY' => $default_delay,
  104. ));
  105. break;
  106. case 'read':
  107. $sql = 'SELECT * FROM ' . CHAT_TABLE . " WHERE message_id > $last_id ORDER BY message_id DESC";
  108. $result = $db->sql_query_limit($sql, 25);
  109. $rows = $db->sql_fetchrowset($result);
  110. if (!sizeof($rows) && ((time() - 60) < $last_time))
  111. {
  112. exit;
  113. }
  114. foreach ($rows as $row)
  115. {
  116. if ($count++ == 0)
  117. {
  118. $last_id = $row['message_id'];
  119. }
  120. $template->assign_block_vars('chatrow', array(
  121. 'MESSAGE_ID' => $row['message_id'],
  122. 'USERNAME_FULL' => clean_username(get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], $user->lang['GUEST'])),
  123. 'MESSAGE' => generate_text_for_display($row['message'], $row['bbcode_uid'], $row['bbcode_bitfield'], $row['bbcode_options']),
  124. 'TIME' => $user->format_date($row['time']),
  125. 'CLASS' => ($row['message_id'] % 2) ? 1 : 2,
  126. ));
  127. }
  128. $db->sql_freeresult($result);
  129. if ((time() - 60) > $last_time)
  130. {
  131. whois_online();
  132. $sql_ary = array(
  133. 'username' => $user->data['username'],
  134. 'user_colour' => $user->data['user_colour'],
  135. 'user_lastupdate' => time(),
  136. );
  137. $sql = 'UPDATE ' . CHAT_SESSIONS_TABLE . '
  138. SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
  139. WHERE user_id = {$user->data['user_id']}";
  140. $result = $db->sql_query($sql);
  141. }
  142. $get = true;
  143. break;
  144. case 'add':
  145. if (!$user->data['is_registered'] || $user->data['user_type'] == USER_INACTIVE || $user->data['user_type'] == USER_IGNORE)
  146. {
  147. redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'));
  148. }
  149. $get = true;
  150. $read_interval = request_var('read_interval', 0);
  151. $message = utf8_normalize_nfc(request_var('message', '', true));
  152. if (!$message)
  153. {
  154. break;
  155. }
  156. clean_message($message);
  157. $uid = $bitfield = $options = '';
  158. $allow_bbcode = $allow_urls = $allow_smilies = true;
  159. generate_text_for_storage($message, $uid, $bitfield, $options, $allow_bbcode, $allow_urls, $allow_smilies);
  160. $sql_ary = array(
  161. 'chat_id' => 1,
  162. 'user_id' => $user->data['user_id'],
  163. 'username' => $user->data['username'],
  164. 'user_colour' => $user->data['user_colour'],
  165. 'message' => $message,
  166. 'bbcode_bitfield' => $bitfield,
  167. 'bbcode_uid' => $uid,
  168. 'bbcode_options' => $options,
  169. 'time' => time(),
  170. );
  171. $sql = 'INSERT INTO ' . CHAT_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
  172. $db->sql_query($sql);
  173. $sql_ary = array(
  174. 'username' => $user->data['username'],
  175. 'user_colour' => $user->data['user_colour'],
  176. 'user_lastpost' => time(),
  177. 'user_lastupdate' => time(),
  178. );
  179. $sql = 'UPDATE ' . CHAT_SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE user_id = {$user->data['user_id']}";
  180. $result = $db->sql_query($sql);
  181. $sql = 'SELECT * FROM ' . CHAT_TABLE . " WHERE message_id > $last_id ORDER BY message_id DESC";
  182. $result = $db->sql_query_limit($sql, 25);
  183. $rows = $db->sql_fetchrowset($result);
  184. if (!sizeof($rows) && ((time() - 60) < $last_time))
  185. {
  186. exit;
  187. }
  188. foreach ($rows as $row)
  189. {
  190. if ($count++ == 0)
  191. {
  192. $last_id = $row['message_id'];
  193. }
  194. $template->assign_block_vars('chatrow', array(
  195. 'MESSAGE_ID' => $row['message_id'],
  196. 'USERNAME_FULL' => clean_username(get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], $user->lang['GUEST'])),
  197. 'MESSAGE' => generate_text_for_display($row['message'], $row['bbcode_uid'], $row['bbcode_bitfield'], $row['bbcode_options']),
  198. 'TIME' => $user->format_date($row['time']),
  199. 'CLASS' => ($row['message_id'] % 2) ? 1 : 2,
  200. ));
  201. }
  202. $db->sql_freeresult($result);
  203. if ($read_interval != $delay['online'])
  204. {
  205. whois_online();
  206. }
  207. break;
  208. case 'delete':
  209. $get = true;
  210. $chat_id = request_var('chat_id', 0);
  211. if (!$chat_id)
  212. {
  213. break;
  214. }
  215. if (!$auth->acl_get('a_') && !$auth->acl_get('m_'))
  216. {
  217. break;
  218. }
  219. $sql = 'DELETE FROM ' . CHAT_TABLE . " WHERE message_id = $chat_id";
  220. $db->sql_query($sql);
  221. break;
  222. }
  223. $mode = strtoupper($mode);
  224. $template->assign_vars(array(
  225. 'FILENAME' => append_sid("{$phpbb_root_path}chat.$phpEx"),
  226. 'LAST_ID' => $last_id,
  227. 'S_CHAT' => (!$get) ? true : false,
  228. 'S_GET_CHAT' => ($get) ? true : false,
  229. 'S_' . $mode => true,
  230. ));
  231. page_header($user->lang['PAGE_TITLE']);
  232. $template->set_filenames(array(
  233. 'body' => 'chat_body.html')
  234. );
  235. page_footer();
  236. function whois_online()
  237. {
  238. global $db, $template, $user;
  239. global $delay, $last_post, $session_time;
  240. $check_time = time() - $session_time;
  241. $sql_ary = array(
  242. 'username' => $user->data['username'],
  243. 'user_colour' => $user->data['user_colour'],
  244. 'user_lastupdate' => time(),
  245. );
  246. $sql = 'UPDATE ' . CHAT_SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE user_id = {$user->data['user_id']}";
  247. $db->sql_query($sql);
  248. $sql = 'DELETE FROM ' . CHAT_SESSIONS_TABLE . " WHERE user_lastupdate < $check_time";
  249. $db->sql_query($sql);
  250. $sql = 'SELECT *
  251. FROM ' . CHAT_SESSIONS_TABLE . "
  252. WHERE user_lastupdate > $check_time
  253. ORDER BY username ASC";
  254. $result = $db->sql_query($sql);
  255. $status_time = time();
  256. while ($row = $db->sql_fetchrow($result))
  257. {
  258. if ($row['user_id'] == $user->data['user_id'])
  259. {
  260. $last_post = $row['user_lastpost'];
  261. $login_time = $row['user_login'];
  262. $status_time = ($last_post > $login_time) ? $last_post : $login_time;
  263. }
  264. $status = get_status($row['user_lastpost']);
  265. $template->assign_block_vars('whoisrow', array(
  266. 'USERNAME_FULL' => clean_username(get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], $user->lang['GUEST'])),
  267. 'USER_STATUS' => $status,
  268. ));
  269. }
  270. $db->sql_freeresult($result);
  271. $template->assign_vars(array(
  272. 'DELAY' => ($status_time) ? $delay[get_status($status_time)] : $delay['idle'],
  273. 'LAST_TIME' => time(),
  274. 'S_WHOISONLINE' => true,
  275. ));
  276. return false;
  277. }
  278. function get_status($last)
  279. {
  280. global $times;
  281. $status = 'online';
  282. if ($last < (time() - $times['offline']))
  283. {
  284. $status = 'offline';
  285. }
  286. else if ($last < (time() - $times['idle']))
  287. {
  288. $status = 'idle';
  289. }
  290. return $status;
  291. }
  292. function clean_message(&$message)
  293. {
  294. if (strpos($message, '---') !== false)
  295. {
  296. $message = str_replace('---', '–––', $message);
  297. clean_message($message);
  298. }
  299. }
  300. function clean_username($user)
  301. {
  302. if (strpos($user, '---') !== false)
  303. {
  304. $user = str_replace('---', '–––', $user);
  305. clean_username($user);
  306. }
  307. return $user;
  308. }
  309. ?>