/** * The UI for a chat room. * * @return tempcode The UI */ function chat_room() { require_javascript('javascript_yahoo_2'); require_javascript('javascript_colour_picker'); require_javascript('javascript_posting'); require_css('colour_picker'); $prefs = @$_COOKIE['ocp_chat_prefs']; $prefs = @explode(';', $prefs); //$mode=get_param('mode',''); $room_id = get_param_integer('id', 1); $GLOBALS['FEED_URL'] = find_script('backend') . '?mode=chat&filter=' . strval($room_id); $room_check = $GLOBALS['SITE_DB']->query_select('chat_rooms', array('id', 'is_im', 'allow_list', 'allow_list_groups', 'disallow_list', 'disallow_list_groups', 'room_owner'), array('id' => $room_id), '', 1); if (!array_key_exists(0, $room_check)) { warn_exit(do_lang_tempcode('MISSING_RESOURCE')); } check_chatroom_access($room_check[0]); $posting_name = do_lang_tempcode('SEND_MESSAGE'); $keep = symbol_tempcode('KEEP'); $posting_url = find_script('messages') . '?mode=2&room_id=' . strval($room_id) . $keep->evaluate(); $messages_link = find_script('messages') . '?room_id=' . strval($room_id) . '&zone=' . get_zone_name() . $keep->evaluate(); $comcode_help = build_url(array('page' => 'userguide_comcode'), get_comcode_zone('userguide_comcode')); $chatcode_help = build_url(array('page' => 'userguide_chatcode'), get_comcode_zone('userguide_chatcode')); $buttons = new ocp_tempcode(); $_buttons = array('url', 'thumb', 'email', 'code', 'hide'); if (has_specific_permission(get_member(), 'comcode_dangerous')) { $_buttons[] = 'html'; } foreach ($_buttons as $button) { $buttons->attach(do_template('COMCODE_EDITOR_BUTTON', array('_GUID' => '4fd75edb2d091b1c78a71c653efb18f0', 'DIVIDER' => false, 'FIELD_NAME' => 'post', 'TITLE' => do_lang_tempcode('INPUT_COMCODE_' . $button), 'B' => $button))); } if (!is_guest()) { $_buttons = array('private_message', 'invite'); if (has_specific_permission(get_member(), 'create_private_room')) { $_buttons[] = 'new_room'; } foreach ($_buttons as $button) { $buttons->attach(do_template('CHATCODE_EDITOR_BUTTON', array('_GUID' => 'f1c3ccc2b6f0b68d71b7d256b3817cf3', 'TITLE' => do_lang_tempcode('INPUT_CHATCODE_' . $button), 'B' => $button))); } } $micro_buttons = new ocp_tempcode(); $_micro_buttons = array('b', 'i'); foreach ($_micro_buttons as $button) { $micro_buttons->attach(do_template('COMCODE_EDITOR_MICRO_BUTTON', array('_GUID' => '3ced1e569e0c6feaeadbc09f7f89e7ee', 'FIELD_NAME' => 'post', 'TITLE' => do_lang_tempcode('INPUT_COMCODE_' . $button), 'B' => $button))); } $user_colour = array_key_exists(0, $prefs) && $prefs[0] != '' ? $prefs[0] : get_option('chat_default_post_colour'); $line_contents = array_key_exists(1, $prefs) && $prefs[1] != '' ? $prefs[1] : get_option('chat_default_post_font'); $cs_post_url = build_url(array('page' => '_SELF', 'type' => 'options', 'id' => $room_id), '_SELF'); $yourname = $GLOBALS['FORUM_DRIVER']->get_username(get_member()); if (is_guest()) { $yourname .= '-' . substr(md5(get_ip_address()), 0, 5); } $messages_php = find_script('messages'); $debug = get_param_integer('debug', 0) == 1 ? 'block' : 'none'; $title = get_page_title('ROOM'); if (has_actual_page_access(get_member(), 'cms_chat', NULL, array('chat', strval($room_id)), array('edit_lowrange_content', $room_check[0]['room_owner'] == get_member() ? 'moderate_my_private_rooms' : NULL))) { $link = build_url(array('page' => 'cms_chat', 'type' => 'room', 'id' => $room_id), get_module_zone('cms_chat')); $modlink = hyperlink($link, do_lang_tempcode('CHAT_MOD_PANEL'), true); } else { $modlink = new ocp_tempcode(); } if (has_actual_page_access(get_member(), 'admin_chat')) { // The user is staff, so let him have the admin link $link = build_url(array('page' => 'admin_chat', 'type' => '_ed', 'id' => $room_id), 'adminzone'); $adminlink = hyperlink($link, do_lang_tempcode('EDIT_CHATROOM'), true); } else { $adminlink = new ocp_tempcode(); } $link = build_url(array('page' => '_SELF', 'type' => 'room', 'id' => $room_id), '_SELF'); $refreshlink = hyperlink($link, do_lang_tempcode('CHAT_REFRESH')); $link = build_url(array('page' => '_SELF', 'type' => 'download_logs'), '_SELF'); $downloadlink = hyperlink(build_url(array('page' => '_SELF', 'type' => 'download_logs', 'id' => $room_id), '_SELF'), do_lang_tempcode('CHAT_DOWNLOAD_LOGS'), true); $seteffectslink = hyperlink(build_url(array('page' => '_SELF', 'type' => 'set_effects'), '_SELF'), do_lang_tempcode('CHAT_SET_EFFECTS'), true); $links = array($adminlink, $modlink, $refreshlink, $downloadlink, $seteffectslink); breadcrumb_set_parents(array(array('_SELF:_SELF:misc', do_lang_tempcode('CHAT_LOBBY_END_CHAT')))); return do_template('CHAT_SCREEN', array('_GUID' => '867a0b050c050c81d33482d131783eb0', 'CHATTERS' => get_chatters_in_room_tpl(get_chatters_in_room($room_id)), 'CHAT_SOUND' => get_chat_sound_tpl(), 'ROOM_ID' => strval($room_id), 'DEBUG' => $debug, 'MESSAGES_PHP' => $messages_php, 'TEXT_COLOUR_DEFAULT' => $user_colour, 'FONT_NAME_DEFAULT' => $line_contents, 'OPTIONS_URL' => $cs_post_url, 'COMCODE_HELP' => $comcode_help, 'CHATCODE_HELP' => $chatcode_help, 'ROOM_NAME' => get_chatroom_name(get_param_integer('id', 1)), 'MICRO_BUTTONS' => $micro_buttons, 'BUTTONS' => $buttons, 'YOUR_NAME' => $yourname, 'MESSAGES_LINK' => $messages_link, 'POSTING_URL' => $posting_url, 'SUBMIT_VALUE' => $posting_name, 'INTRODUCTION' => '', 'TITLE' => $title, 'LINKS' => $links)); }
/** * Output messages (in XML format) from up to five minutes ago (give somebody who's just joined the chatroom some chat backlog), or the messages posted since the last check. * * @param AUTO_LINK Room ID (or -1 to mean 'all' as used for IM global process, -2 to mean none) * @param boolean Output the backlog? * @param ?AUTO_LINK Latest received message ID (NULL: we're not getting latest messages) * @param ?AUTO_LINK Latest event ID (NULL: we're not getting events, but we do request a null event so we can use that as a future reference point) * @param string Events output to append */ function _chat_messages_script_ajax($room_id, $backlog = false, $message_id = NULL, $event_id = NULL, $events_output = '') { if ($event_id == -1) { $event_id = NULL; } require_lang('chat'); require_lang('submitban'); $room_check = NULL; if ($room_id >= 0) { $room_check = $GLOBALS['SITE_DB']->query_select('chat_rooms', array('id', 'is_im', 'c_welcome', 'allow_list_groups', 'disallow_list_groups', 'allow_list', 'disallow_list', 'room_owner'), array('id' => $room_id), '', 1); if (!array_key_exists(0, $room_check)) { // This room doesn't exist warn_exit(do_lang_tempcode('MISSING_RESOURCE')); } if (!check_chatroom_access($room_check[0], true)) { return; } // Possibly the room was closed already $welcome = array_key_exists(get_member(), get_chatters_in_room($room_id)) || !$backlog || get_param_integer('no_reenter_message', 0) == 1 ? NULL : $room_check[0]['c_welcome']; } else { $welcome = NULL; } if ($room_id >= 0) { $room_check = $GLOBALS['SITE_DB']->query_select('chat_rooms', array('*'), array('id' => $room_id)); if (array_key_exists(0, $room_check)) { chat_room_prune($room_id); } } elseif ($room_id != -2) { // Note that *we are still here* if ($room_id == -1) { $GLOBALS['SITE_DB']->query_update('chat_active', array('date_and_time' => time()), array('member_id' => get_member())); } else { $GLOBALS['SITE_DB']->query_delete('chat_active', array('member_id' => get_member(), 'room_id' => $room_id), '', 1); $GLOBALS['SITE_DB']->query_insert('chat_active', array('member_id' => get_member(), 'date_and_time' => time(), 'room_id' => $room_id)); } } if (is_null($room_check)) { $room_check = $GLOBALS['SITE_DB']->query('SELECT id,is_im,c_welcome,allow_list_groups,disallow_list_groups,allow_list,disallow_list,room_owner FROM ' . get_table_prefix() . 'chat_rooms WHERE is_im=1 AND allow_list LIKE \'' . db_encode_like('%' . strval(get_member()) . '%') . '\''); } $from_id = NULL; $start = NULL; if (!$backlog) { $from_id = $message_id; } else { $start = time() - CHAT_BACKLOG_TIME; } $messages = $room_id == -2 ? array() : chat_get_room_content($room_id, $room_check, 20, false, false, $start, NULL, $from_id, NULL, $welcome, true, get_param_integer('no_reenter_message', 0) == 0); $stored_id = array_key_exists(0, $messages) ? $messages[0]['id'] : NULL; $messages_output = ''; foreach ($messages as $_message) { $edit_url = new ocp_tempcode(); $chat_ban_url = new ocp_tempcode(); $chat_unban_url = new ocp_tempcode(); if (!is_null($room_check) && array_key_exists(0, $room_check)) { $moderator = is_chat_moderator($_message['member_id'], $room_id, $room_check[0]['room_owner']); $edit_url = build_url(array('page' => 'cms_chat', 'type' => 'ed', 'id' => $_message['id'], 'room_id' => $_message['room_id']), get_module_zone('cms_chat')); if (has_specific_permission(get_member(), 'ban_chatters_from_rooms')) { if (check_chatroom_access($room_check[0], true, $_message['member_id'])) { $chat_ban_url = build_url(array('page' => 'cms_chat', 'type' => 'ban', 'id' => $_message['room_id'], 'member_id' => $_message['member_id']), get_module_zone('cms_chat')); $chat_unban_url = new ocp_tempcode(); } else { $chat_ban_url = new ocp_tempcode(); $chat_unban_url = build_url(array('page' => 'cms_chat', 'type' => 'unban', 'id' => $_message['room_id'], 'member_id' => $_message['member_id']), get_module_zone('cms_chat')); } } } else { $moderator = false; } if (addon_installed('actionlog') && has_actual_page_access(get_member(), 'admin_actionlog') && preg_match('#[:\\.]#', $_message['ip_address']) != 0) { if (is_guest($_message['member_id'])) { $ban_url = build_url(array('page' => 'admin_actionlog', 'type' => 'toggle_ip_ban', 'id' => $_message['ip_address']), 'adminzone'); } else { $ban_url = build_url(array('page' => 'admin_actionlog', 'type' => 'toggle_submitter_ban', 'id' => $_message['member_id']), 'adminzone'); } //$ban_url=build_url(array('page'=>'admin_actionlog','type'=>'multi_ban','id'=>$_message['ip_address'].':'.$_message['username']),'adminzone'); } else { $ban_url = new ocp_tempcode(); } if ($room_id != -1 && addon_installed('actionlog') && (has_actual_page_access(get_member(), 'admin_actionlog') || has_actual_page_access(get_member(), 'cms_chat'))) { $staff_actions = do_template('CHAT_STAFF_ACTIONS', array('_GUID' => 'd3fbcaa9eee688452091583ee436e465', 'CHAT_BAN_URL' => $chat_ban_url, 'CHAT_UNBAN_URL' => $chat_unban_url, 'EDIT_URL' => $edit_url, 'BAN_URL' => $ban_url)); } else { $staff_actions = new ocp_tempcode(); } $avatar_url = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url($_message['member_id']); if (!is_guest($_message['member_id'])) { $user = $GLOBALS['FORUM_DRIVER']->member_profile_hyperlink($_message['member_id'], true, $_message['username']); } else { if (preg_match('#[:\\.]#', $_message['ip_address']) != 0) { $user = make_string_tempcode(escape_html(do_lang('GUEST') . '-' . substr(md5($_message['ip_address']), 0, 5))); } else { $user = make_string_tempcode(escape_html($_message['ip_address'])); } } $template = do_template('CHAT_MESSAGE', array('_GUID' => '6bcac8d9fdd166cde266f8d23b790b69', 'SYSTEM_MESSAGE' => strval($_message['system_message']), 'STAFF' => $moderator, 'OLD_MESSAGES' => $backlog, 'AVATAR_URL' => $avatar_url, 'STAFF_ACTIONS' => $staff_actions, 'USER' => $user, 'MESSAGE' => $_message['the_message'], 'TIME' => $_message['date_and_time_nice'], 'RAW_TIME' => strval($_message['date_and_time']), 'FONT_COLOUR' => $_message['text_colour'], 'FONT_FACE' => $_message['font_name'])); $messages_output .= '<div xmlns="http://www.w3.org/1999/xhtml" sender_id="' . strval($_message['member_id']) . '" room_id="' . strval($_message['room_id']) . '" id="' . strval($_message['id']) . '" timestamp="' . strval($_message['date_and_time']) . '">' . $template->evaluate() . '</div>'; } // Members update, but only for the room interface if ($room_id >= 0) { $tpl = get_chatters_in_room_tpl(get_chatters_in_room($room_id)); $events_output .= '<chat_members_update>' . escape_html($tpl->evaluate()) . '</chat_members_update>'; } // IM events and invitations, but only for the lobby IM interface $invitations_output = ''; if ($room_id < 0) { $room_check = list_to_map('id', $GLOBALS['SITE_DB']->query('SELECT * FROM ' . get_table_prefix() . 'chat_rooms WHERE is_im=1 AND allow_list LIKE \'' . db_encode_like('%' . strval(get_member()) . '%') . '\'')); foreach ($room_check as $room) { if (check_chatroom_access($room, true, NULL, true)) { if ($room['allow_list'] == strval(get_member()) && is_null($event_id)) { require_code('chat2'); delete_chatroom($room['id']); } else { $people_in_room = explode(',', $room['allow_list']); if ($room['room_name'] == $GLOBALS['FORUM_DRIVER']->get_username(get_member()) && count($people_in_room) > 1) { $test = $GLOBALS['FORUM_DRIVER']->get_username(intval($people_in_room[1])); if (!is_null($test)) { $room['room_name'] = $test; } } // Find who else is in room $participants = ''; foreach ($people_in_room as $person) { if (intval($person) != get_member()) { if ($participants != '') { $participants .= ''; } $participants .= $person; } } $num_posts = $GLOBALS['SITE_DB']->query_value('chat_messages', 'COUNT(*)', array('room_id' => $room['id'])); $avatar_url = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url($room['room_owner']); $invitations_output .= '<chat_invite num_posts="' . strval($num_posts) . '" you="' . strval(get_member()) . '" inviter="' . (is_null($room['room_owner']) ? '' : strval($room['room_owner'])) . '" participants="' . xmlentities($participants) . '" room_name="' . xmlentities($room['room_name']) . '" avatar_url="' . xmlentities($avatar_url) . '">' . strval($room['id']) . '</chat_invite>'; } } } if (!is_null($event_id)) { $events = $GLOBALS['SITE_DB']->query('SELECT * FROM ' . get_table_prefix() . 'chat_events WHERE id>' . strval((int) $event_id)); foreach ($events as $event) { if ($event['e_member_id'] == get_member()) { continue; } if (is_guest($event['e_member_id'])) { continue; } $send_out = false; switch ($event['e_type_code']) { case 'BECOME_INACTIVE': case 'BECOME_ACTIVE': if (!member_blocked(get_member(), $event['e_member_id']) && member_befriended($event['e_member_id'])) { $send_out = true; } break; case 'PREINVITED_TO_IM': case 'JOIN_IM': if (array_key_exists($event['e_room_id'], $room_check) && check_chatroom_access($room_check[$event['e_room_id']], true, NULL, true)) { $send_out = true; } break; case 'DEINVOLVE_IM': if (array_key_exists($event['e_room_id'], $room_check) && check_chatroom_access($room_check[$event['e_room_id']], true, NULL, true)) { $send_out = true; } break; case 'INVITED_TO_IM': // Ignore this one break; } if ($send_out) { $username = $GLOBALS['FORUM_DRIVER']->get_username($event['e_member_id']); $avatar_url = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url($event['e_member_id']); if (!is_null($username)) { $events_output .= '<chat_event away="' . (chatter_active($event['e_member_id']) ? '0' : '1') . '" event_type="' . $event['e_type_code'] . '" member_id="' . strval($event['e_member_id']) . '" username="******" avatar_url="' . xmlentities($avatar_url) . '" room_id="' . (is_null($event['e_room_id']) ? '' : strval($event['e_room_id'])) . '">' . strval($event['id']) . '</chat_event>'; } } } } else { $max_id = $GLOBALS['SITE_DB']->query_value('chat_events', 'MAX(id)'); if (is_null($max_id)) { $max_id = db_get_first_id() - 1; } $events_output .= '<chat_event type="NULL">' . strval($max_id) . '</chat_event>'; } } if ($messages_output == '') { $messages_output = '<chat_null>' . strval($room_id) . '</chat_null>'; } header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past header('Content-Type: application/xml'); $output = '<' . '?xml version="1.0" encoding="' . get_charset() . '" ?' . '> <!DOCTYPE xc:content [ <!ENTITY euro "€"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY permil "‰"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY hellip "…"> <!ENTITY copy "©"> <!ENTITY nbsp " "> <!ENTITY fnof "ƒ"> <!ENTITY reg "®"> <!ENTITY trade "™"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> ]> <response> <result> ' . $events_output . $invitations_output . $messages_output . ' </result> </response>'; echo $output; }