Beispiel #1
0
/**
 * Show the point transactions a member has had.
 *
 * @param  ID_TEXT		The type of transactions we are looking for
 * @set    from to
 * @param  MEMBER			Who we are looking at transactions for
 * @param  MEMBER			Who we are looking at transactions using the account of
 * @return tempcode		The UI
 */
function points_get_transactions($type, $member_id_of, $member_id_viewing)
{
    $where = array('gift_' . $type => $member_id_of);
    if ($type == 'from') {
        $where['anonymous'] = 0;
    }
    $start = get_param_integer('gift_start_' . $type, 0);
    $max = get_param_integer('gift_max_' . $type, 10);
    $sortables = array('date_and_time' => do_lang_tempcode('DATE'), 'amount' => do_lang_tempcode('AMOUNT'));
    $test = explode(' ', get_param('gift_sort_' . $type, 'date_and_time DESC'));
    if (count($test) == 1) {
        $test[1] = 'DESC';
    }
    list($sortable, $sort_order) = $test;
    if (strtoupper($sort_order) != 'ASC' && strtoupper($sort_order) != 'DESC' || !array_key_exists($sortable, $sortables)) {
        log_hack_attack_and_exit('ORDERBY_HACK');
    }
    global $NON_CANONICAL_PARAMS;
    $NON_CANONICAL_PARAMS[] = 'gift_sort_' . $type;
    $NON_CANONICAL_PARAMS[] = 'gift_start_' . $type;
    $max_rows = $GLOBALS['SITE_DB']->query_value('gifts', 'COUNT(*)', $where);
    $rows = $GLOBALS['SITE_DB']->query_select('gifts g LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'translate t ON ' . db_string_equal_to('language', user_lang()) . ' AND t.id=g.reason', array('*'), $where, 'ORDER BY ' . $sortable . ' ' . $sort_order, $max, $start);
    $out = new ocp_tempcode();
    $viewing_name = $GLOBALS['FORUM_DRIVER']->get_username($member_id_of);
    if (is_null($viewing_name)) {
        $viewing_name = do_lang('UNKNOWN');
    }
    require_code('templates_results_table');
    $fields_title = results_field_title(array(do_lang_tempcode('DATE'), do_lang_tempcode('AMOUNT'), do_lang_tempcode('FROM'), do_lang_tempcode('TO'), do_lang_tempcode('REASON')), $sortables, 'gift_sort_' . $type, $sortable . ' ' . $sort_order);
    foreach ($rows as $myrow) {
        if ($myrow['anonymous'] == 1 && $type == 'from') {
            continue;
        }
        // Their name
        $fromname = is_guest($myrow['gift_from']) ? get_site_name() : $GLOBALS['FORUM_DRIVER']->get_username($myrow['gift_from']);
        $toname = $GLOBALS['FORUM_DRIVER']->get_username($myrow['gift_to']);
        if (is_null($fromname)) {
            $fromname = do_lang('UNKNOWN');
        }
        if ($myrow['anonymous'] == 1 && !is_guest($myrow['gift_from'])) {
            if (!has_specific_permission($member_id_viewing, 'trace_anonymous_gifts')) {
                $_fromname = do_lang_tempcode('ANON');
            } else {
                $_fromname = hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_from']), get_module_zone('points')), do_lang_tempcode('ANON'), false, false, escape_html($fromname));
            }
        } else {
            $_fromname = is_guest($myrow['gift_from']) ? make_string_tempcode(escape_html($fromname)) : hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_from']), get_module_zone('points')), escape_html($fromname), false, false, do_lang_tempcode('VIEW_POINTS'));
        }
        $_toname = hyperlink(build_url(array('page' => 'points', 'type' => 'member', 'id' => $myrow['gift_to']), get_module_zone('points')), escape_html($toname), false, false, do_lang_tempcode('VIEW_POINTS'));
        $date = get_timezoned_date($myrow['date_and_time']);
        $amount = $myrow['amount'];
        if (get_page_name() != 'search' && array_key_exists('text_parsed', $myrow) && !is_null($myrow['text_parsed']) && $myrow['text_parsed'] != '' && $myrow['reason'] != 0) {
            $reason = new ocp_tempcode();
            if (!$reason->from_assembly($myrow['text_parsed'], true)) {
                $reason = get_translated_tempcode($myrow['reason']);
            }
        } else {
            $reason = get_translated_tempcode($myrow['reason']);
        }
        $out->attach(results_entry(array(escape_html($date), escape_html(integer_format($amount)), $_fromname, $_toname, $reason)));
    }
    $out = results_table(do_lang_tempcode('_POINTS', escape_html($viewing_name)), $start, 'gift_start_' . $type, $max, 'gift_max_' . $type, $max_rows, $fields_title, $out, $sortables, $sortable, $sort_order, 'gift_sort_' . $type, NULL, NULL, NULL, 8, 'gfhfghtrhhjghgfhfgf', false, 'tab__points');
    if ($type == 'to') {
        $title = do_lang_tempcode('POINTS_TO');
    } else {
        $title = do_lang_tempcode('POINTS_FROM');
    }
    return do_template('POINTS_TRANSACTIONS_WRAP', array('_GUID' => 'f19e3eedeb0b8bf398251b24e8389723', 'CONTENT' => $out, 'TITLE' => $title));
}
Beispiel #2
0
/**
 * Show a post, isolated of the other posts in it's topic.
 *
 * @param  array		The post row.
 * @param  boolean	Whether to use the post title, as opposed to the post's topic's title.
 * @return tempcode  The isolated post.
 */
function ocf_show_isolated_post($row, $use_post_title = false)
{
    require_code('ocf_groups');
    require_css('ocf');
    // Poster title
    $primary_group = $GLOBALS['FORUM_DRIVER']->get_member_row_field($row['p_poster'], 'm_primary_group');
    if (!is_null($primary_group)) {
        if (addon_installed('ocf_member_titles')) {
            $poster_title = $GLOBALS['OCF_DRIVER']->get_member_row_field($row['p_poster'], 'm_title');
            if ($poster_title == '') {
                $poster_title = get_translated_text(ocf_get_group_property($primary_group, 'title'), $GLOBALS['FORUM_DB']);
            }
        } else {
            $poster_title = '';
        }
        $avatar = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url($row['p_poster']);
        $posters_groups = $GLOBALS['FORUM_DRIVER']->get_members_groups($row['p_poster'], true);
    } else {
        $poster_title = '';
        $avatar = '';
        $posters_groups = array();
    }
    // Avatar
    if (is_guest($row['p_poster'])) {
        if ($row['p_poster_name_if_guest'] == do_lang('SYSTEM')) {
            $avatar = find_theme_image('ocf_default_avatars/default_set/ocp_fanatic', true);
        }
    }
    if ($avatar != '') {
        $post_avatar = do_template('OCF_TOPIC_POST_AVATAR', array('AVATAR' => $avatar));
    } else {
        $post_avatar = new ocp_tempcode();
    }
    // Rank images
    $rank_images = new ocp_tempcode();
    foreach ($posters_groups as $group) {
        $rank_image = ocf_get_group_property($group, 'rank_image');
        $group_leader = ocf_get_group_property($group, 'group_leader');
        $group_name = ocf_get_group_name($group);
        $rank_image_pri_only = ocf_get_group_property($group, 'rank_image_pri_only');
        if ($rank_image != '' && ($rank_image_pri_only == 0 || $group == $primary_group)) {
            $rank_images->attach(do_template('OCF_RANK_IMAGE', array('GROUP_NAME' => $group_name, 'USERNAME' => $GLOBALS['FORUM_DRIVER']->get_username($row['p_poster']), 'IMG' => $rank_image, 'IS_LEADER' => $group_leader == $row['p_poster'])));
        }
    }
    // Poster details
    if (!is_guest($row['p_poster']) && !is_null($primary_group)) {
        require_code('ocf_members2');
        $poster_details = ocf_show_member_box($row['p_poster'], false, NULL, NULL, false);
    } else {
        $custom_fields = new ocp_tempcode();
        $poster_details = new ocp_tempcode();
    }
    if (!is_guest($row['p_poster']) && !is_null($primary_group)) {
        $poster = do_template('OCF_POSTER_MEMBER', array('ONLINE' => member_is_online($row['p_poster']), 'ID' => strval($row['p_poster']), 'POSTER_DETAILS' => $poster_details, 'PROFILE_URL' => $GLOBALS['FORUM_DRIVER']->member_profile_url($row['p_poster'], false, true), 'POSTER_USERNAME' => $GLOBALS['FORUM_DRIVER']->get_username($row['p_poster']), 'HIGHLIGHT_NAME' => NULL));
    } else {
        $poster = do_template('OCF_POSTER_GUEST', array('IP_LINK' => '', 'POSTER_DETAILS' => $poster_details, 'POSTER_USERNAME' => $row['p_poster_name_if_guest'] != '' ? $row['p_poster_name_if_guest'] : do_lang('GUEST')));
    }
    // Last edited
    if (!is_null($row['p_last_edit_time'])) {
        $last_edited = do_template('OCF_TOPIC_POST_LAST_EDITED', array('LAST_EDIT_DATE_RAW' => is_null($row['p_last_edit_time']) ? '' : strval($row['p_last_edit_time']), 'LAST_EDIT_DATE' => get_timezoned_date($row['p_last_edit_time']), 'LAST_EDIT_PROFILE_URL' => is_null($row['p_last_edit_by']) ? '' : $GLOBALS['FORUM_DRIVER']->member_profile_url($row['p_last_edit_by'], false, true), 'LAST_EDIT_USERNAME' => is_null($row['p_last_edit_by']) ? '' : $GLOBALS['FORUM_DRIVER']->get_username($row['p_last_edit_by'])));
    } else {
        $last_edited = new ocp_tempcode();
    }
    $last_edited_raw = is_null($row['p_last_edit_time']) ? '' : strval($row['p_last_edit_time']);
    // Misc stuff
    $poster_id = $row['p_poster'];
    $tree = ocf_forum_breadcrumbs($row['p_cache_forum_id']);
    $post_url = build_url(array('page' => 'topicview', 'type' => 'findpost', 'id' => $row['id']), get_module_zone('topicview'));
    $post_url->attach('#post_' . strval($row['id']));
    if (get_page_name() != 'search' && array_key_exists('text_parsed', $row) && !is_null($row['text_parsed']) && $row['text_parsed'] != '' && $row['p_post'] != 0) {
        $post = new ocp_tempcode();
        if (!$post->from_assembly($row['text_parsed'], true)) {
            $post = get_translated_tempcode($row['p_post'], $GLOBALS['FORUM_DB']);
        }
    } else {
        $post = get_translated_tempcode($row['p_post'], $GLOBALS['FORUM_DB']);
    }
    $post_date = get_timezoned_date($row['p_time']);
    $post_date_raw = $row['p_time'];
    if ($use_post_title) {
        $post_title = $row['p_title'];
    } else {
        $post_title = $GLOBALS['FORUM_DB']->query_value('f_topics', 't_cache_first_title', array('id' => $row['p_topic_id']));
        if ($row['p_title'] != $post_title) {
            $post_title .= ': ' . $row['p_title'];
        }
    }
    //if ($post_title=='') $post_title=do_lang_tempcode('ISOLATED_POST_TITLE',strval($row['id']));
    $emphasis = new ocp_tempcode();
    if ($row['p_is_emphasised'] == 1) {
        $emphasis = do_lang_tempcode('IMPORTANT');
    } elseif (!is_null($row['p_intended_solely_for'])) {
        $pp_to_username = $GLOBALS['FORUM_DRIVER']->get_username($row['p_intended_solely_for']);
        if (is_null($pp_to_username)) {
            $pp_to_username = do_lang('UNKNOWN');
        }
        $emphasis = do_lang('PP_TO', $pp_to_username);
    }
    require_code('feedback');
    actualise_rating(true, 'post', strval($row['id']), get_self_url(), $row['p_title']);
    $rating = display_rating(get_self_url(), $row['p_title'], 'post', strval($row['id']), 'RATING_INLINE_DYNAMIC', $row['p_poster']);
    // Render
    return do_template('OCF_ISOLATED_POST', array('_GUID' => '9456f4fe4b8fb1bf34f606fcb2bcc9d7', 'URL' => $post_url, 'ID' => strval($row['id']), 'TREE' => $tree, 'POST' => do_template('OCF_TOPIC_POST', array('ID' => strval($row['id']), 'TOPIC_FIRST_POST_ID' => '', 'TOPIC_FIRST_POSTER' => '', 'POST_ID' => strval($row['id']), 'URL' => $post_url, 'CLASS' => $row['p_is_emphasised'] == 1 ? 'ocf_post_emphasis' : (!is_null($row['p_intended_solely_for']) ? 'ocf_post_personal' : ''), 'EMPHASIS' => $emphasis, 'FIRST_UNREAD' => '', 'POSTER_TITLE' => $poster_title, 'POST_TITLE' => $post_title, 'POST_DATE_RAW' => strval($post_date_raw), 'POST_DATE' => $post_date, 'POST' => $post, 'TOPIC_ID' => is_null($row['p_topic_id']) ? '' : strval($row['p_topic_id']), 'LAST_EDITED_RAW' => $last_edited_raw, 'LAST_EDITED' => $last_edited, 'POSTER_ID' => strval($poster_id), 'POSTER' => $poster, 'POSTER_DETAILS' => $poster_details, 'POST_AVATAR' => $post_avatar, 'RANK_IMAGES' => $rank_images, 'BUTTONS' => '', 'SIGNATURE' => '', 'UNVALIDATED' => '', 'DESCRIPTION' => '', 'PREVIEWING' => true, 'RATING' => $rating))));
}
/**
 * Get a tempcoded version of a normal XHTML template. It is perhaps the most common ocPortal function to load up templates using do_template, and then attach them together either as parameters to each other, or via the tempcode attach method.
 *
 * @param  ID_TEXT			The codename of the template being loaded
 * @param  ?array				A map of parameters for the template (key to value) (NULL: no parameters)
 * @param  ?LANGUAGE_NAME 	The language to load the template in (templates can embed language references) (NULL: users own language)
 * @param  boolean			Whether to not produce a stack dump if the template is missing
 * @param  ?ID_TEXT			Alternate template to use if the primary one does not exist (NULL: none)
 * @param  string				File type suffix of template file (e.g. .tpl)
 * @param  string				Subdirectory type to look in
 * @set    templates css
 * @param  ID_TEXT			Theme to use
 * @return tempcode			The tempcode for this template
 */
function do_template($codename, $parameters = NULL, $lang = NULL, $light_error = false, $fallback = NULL, $suffix = '.tpl', $type = 'templates', $theme = NULL)
{
    if (is_null($lang) || $lang == '') {
        global $USER_LANG_CACHED;
        $lang = isset($USER_LANG_CACHED) ? $USER_LANG_CACHED : (function_exists('user_lang') ? user_lang() : 'EN');
    }
    if ($GLOBALS['SEMI_DEBUG_MODE']) {
        if ($codename != 'tempcode_test' && $codename != 'handle_conflict_resolution' && strtoupper($codename) != strtoupper($codename)) {
            fatal_exit('Template names should be in upper case, and the files should be stored in upper case.');
        }
        if (substr($codename, -7) == '_SCREEN' || $codename == 'POOR_XHTML_WRAPPER' || $codename == 'OCF_WRAPPER') {
            $GLOBALS['SCREEN_TEMPLATE_CALLED'] = $codename;
        }
    }
    if (is_null($parameters)) {
        $parameters = array();
    }
    global $RECORD_TEMPLATES_USED, $FILE_ARRAY, $MEM_CACHE, $CACHE_TEMPLATES, $KEEP_MARKERS, $SHOW_EDIT_LINKS, $XHTML_SPIT_OUT, $TEMPLATE_CACHE, $MOBILE, $FORUM_DRIVER;
    $special_treatment = ($KEEP_MARKERS || $SHOW_EDIT_LINKS) && is_null($XHTML_SPIT_OUT);
    // Is it already loaded?
    if ($RECORD_TEMPLATES_USED) {
        global $RECORDED_TEMPLATES_USED;
        $RECORDED_TEMPLATES_USED[] = $codename;
    }
    // Variables we'll need
    if (!isset($theme)) {
        $theme = isset($FORUM_DRIVER) && is_object($FORUM_DRIVER) && method_exists($FORUM_DRIVER, 'get_theme') ? filter_naughty($FORUM_DRIVER->get_theme()) : 'default';
    }
    $_codename = $MOBILE ? $codename . '_mobile' : $codename;
    if (isset($TEMPLATE_CACHE[$theme][$codename][$lang])) {
        $_data = $TEMPLATE_CACHE[$theme][$codename][$lang]->bind($parameters, $codename);
        // Copy and pasted to remove need for an function call
        if ($special_treatment) {
            if ($KEEP_MARKERS) {
                $__data = make_string_tempcode('<!-- START-TEMPLATE=' . $codename . ' -->');
                $__data->attach($_data);
                $__data->attach('<!-- END-TEMPLATE=' . $codename . ' -->');
                $_data = $__data;
            }
            if ($SHOW_EDIT_LINKS) {
                $edit_url = build_url(array('page' => 'admin_themes', 'theme' => $FORUM_DRIVER->get_theme(), 'template' => $codename), 'adminzone');
                $_data->attach('<br /><a href="' . escape_html($edit_url->evaluate()) . '">' . do_lang('EDIT') . ' ' . $codename . '</a>');
            }
        }
        return $_data;
    }
    // Is it structurally cached on disk yet?
    $data = mixed();
    if ($CACHE_TEMPLATES) {
        if (!is_null($MEM_CACHE)) {
            $data = persistant_cache_get(array('TEMPLATE', $theme, $lang, $_codename));
            if (!is_null($data)) {
                $_data = new ocp_tempcode();
                $_data->from_assembly($data);
                if ($_data->bits == array()) {
                    $data = false;
                }
                // Corrupt somehow
            } else {
                $data = false;
            }
        } elseif (is_null($data)) {
            $_data = new ocp_tempcode();
            $tcp_path = get_custom_file_base() . '/themes/' . $theme . '/templates_cached/' . $lang . '/' . $_codename . $suffix . '.tcd';
            $data = @file_get_contents($tcp_path, FILE_BINARY);
            if ($data === '') {
                $data = false;
            }
            // '' needed for PHP4 - weird
            if ($data !== false) {
                $_data->from_assembly($data);
                if ($_data->bits == array()) {
                    $data = false;
                }
                // Corrupt somehow
            }
        }
    } else {
        $data = false;
    }
    if ($data === false) {
        if (!isset($FILE_ARRAY)) {
            $_data = NULL;
            $prefix_default = get_file_base() . '/themes/';
            $prefix = $theme == 'default' ? $prefix_default : get_custom_file_base() . '/themes/';
            if (file_exists($prefix . $theme . '/' . $type . '_custom/' . $_codename . $suffix)) {
                $_data = _do_template($theme, '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif (file_exists($prefix . $theme . '/' . $type . '/' . $_codename . $suffix)) {
                $_data = _do_template($theme, '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif (!is_null($GLOBALS['CURRENT_SHARE_USER']) && $theme != 'default' && file_exists($prefix_default . $theme . '/' . $type . '_custom/' . $_codename . $suffix)) {
                $_data = _do_template($theme, '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif (!is_null($GLOBALS['CURRENT_SHARE_USER']) && $theme != 'default' && file_exists($prefix_default . $theme . '/' . $type . '/' . $_codename . $suffix)) {
                $_data = _do_template($theme, '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif (file_exists($prefix_default . 'default' . '/' . $type . '_custom/' . $_codename . $suffix)) {
                $_data = _do_template('default', '/' . $type . '_custom/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif (file_exists($prefix_default . 'default' . '/' . $type . '/' . $_codename . $suffix)) {
                $_data = _do_template('default', '/' . $type . '/', $_codename, $_codename, $lang, $suffix, $theme);
            } elseif ($codename != $_codename) {
                if (file_exists($prefix . $theme . '/' . $type . '_custom/' . $codename . $suffix)) {
                    $_data = _do_template($theme, '/' . $type . '_custom/', $codename, $_codename, $lang, $suffix, $theme);
                } elseif (file_exists($prefix . $theme . '/' . $type . '/' . $codename . $suffix)) {
                    $_data = _do_template($theme, '/' . $type . '/', $codename, $_codename, $lang, $suffix, $theme);
                } elseif (file_exists($prefix_default . 'default' . '/' . $type . '_custom/' . $codename . $suffix)) {
                    $_data = _do_template('default', '/' . $type . '_custom/', $codename, $_codename, $lang, $suffix, $theme);
                } elseif (file_exists($prefix_default . 'default' . '/' . $type . '/' . $codename . $suffix)) {
                    $_data = _do_template('default', '/' . $type . '/', $codename, $_codename, $lang, $suffix, $theme);
                }
            }
            if (is_null($_data)) {
                if (is_null($fallback)) {
                    if ($light_error) {
                        return paragraph(do_lang_tempcode('MISSING_TEMPLATE_FILE', escape_html($codename)));
                    }
                    fatal_exit(do_lang_tempcode('MISSING_TEMPLATE_FILE', escape_html($codename)));
                } else {
                    $result = do_template($fallback, $parameters, $lang);
                    $TEMPLATE_CACHE[$theme][$codename][$lang] = $TEMPLATE_CACHE[$fallback][$lang];
                    return $result;
                }
            }
        } else {
            $_data = _do_template('default', '/' . $type . '/', $codename, $codename, $lang, $suffix, $theme);
        }
    }
    $TEMPLATE_CACHE[$theme][$codename][$lang] = $_data;
    $ret = $_data->bind($parameters, $codename);
    if ($special_treatment) {
        if ($KEEP_MARKERS) {
            $__data = new ocp_tempcode();
            $__data->attach('<!-- START-TEMPLATE=' . $codename . ' -->');
            $__data->attach($ret);
            $__data->attach('<!-- END-TEMPLATE=' . $codename . ' -->');
            $ret = $__data;
        }
        if ($SHOW_EDIT_LINKS && $codename != 'PARAM_INFO') {
            $param_info = do_template('PARAM_INFO', array('MAP' => $parameters));
            $edit_url = build_url(array('page' => 'admin_themes', 'theme' => $FORUM_DRIVER->get_theme(), 'template' => $codename), 'adminzone');
            $SHOW_EDIT_LINKS = false;
            $ret = do_template('TEMPLATE_EDIT_LINK', array('_GUID' => '511ae911d31a5b237a4371ff22fc78fd', 'PARAM_INFO' => $param_info, 'CONTENTS' => $ret, 'CODENAME' => $codename, 'EDIT_URL' => $edit_url));
            $SHOW_EDIT_LINKS = true;
        }
    }
    return $ret;
}
/**
 * Get an array of topics in the given forum. Each topic is an array with the following attributes:
 * - id, the topic ID
 * - title, the topic title
 * - lastusername, the username of the last poster
 * - lasttime, the timestamp of the last reply
 * - closed, a Boolean for whether the topic is currently closed or not
 * - firsttitle, the title of the first post
 * - firstpost, the first post (only set if $show_first_posts was true)
 *
 * @param  object			Link to the real forum driver
 * @param  mixed			The forum name or an array of forum IDs
 * @param  integer		The limit
 * @param  integer		The start position
 * @param  integer		The total rows (not a parameter: returns by reference)
 * @param  SHORT_TEXT	The topic title filter
 * @param  SHORT_TEXT	The topic description filter
 * @param  boolean		Whether to show the first posts
 * @param  string			The date key to sort by
 * @set    lasttime firsttime
 * @param  boolean		Whether to limit to hot topics
 * @return ?array			The array of topics (NULL: error/none)
 */
function _helper_show_forum_topics($this_ref, $name, $limit, $start, &$max_rows, $filter_topic_title, $filter_topic_description, $show_first_posts, $date_key, $hot)
{
    if (is_integer($name)) {
        $id_list = 't_forum_id=' . strval((int) $name);
    } elseif (!is_array($name)) {
        $id = $this_ref->forum_id_from_name($name);
        if (is_null($id)) {
            return NULL;
        }
        $id_list = 't_forum_id=' . strval((int) $id);
    } else {
        $id_list = '';
        foreach (array_keys($name) as $id) {
            if ($id_list != '') {
                $id_list .= ' OR ';
            }
            $id_list .= 't_forum_id=' . strval((int) $id);
        }
        if ($id_list == '') {
            return NULL;
        }
    }
    if ($hot) {
        $hot_topic_definition = intval(get_option('hot_topic_definition'));
        $topic_filter_sup = ' AND t_cache_num_posts/((t_cache_last_time-t_cache_first_time)/60/60/24+1)>' . strval($hot_topic_definition);
    } else {
        $topic_filter_sup = '';
    }
    global $SITE_INFO;
    if (!(isset($SITE_INFO['mysql_old']) && $SITE_INFO['mysql_old'] == '1' || !isset($SITE_INFO['mysql_old']) && is_file(get_file_base() . '/mysql_old'))) {
        if ($filter_topic_title == '' && $filter_topic_description == '') {
            $query = 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ')' . $topic_filter_sup;
        } else {
            $query = '';
            $topic_filters = array();
            if ($filter_topic_title != '') {
                $topic_filters[] = 't_cache_first_title LIKE \'' . db_encode_like($filter_topic_title) . '\'';
            }
            if ($filter_topic_description != '') {
                $topic_filters[] = 't_description LIKE \'' . db_encode_like($filter_topic_description) . '\'';
            }
            foreach ($topic_filters as $topic_filter) {
                if ($query != '') {
                    $query .= ' UNION ';
                }
                $query .= 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ') AND ' . $topic_filter . $topic_filter_sup;
            }
        }
    } else {
        $topic_filter = '';
        if ($filter_topic_title != '') {
            $topic_filter .= 't_cache_first_title LIKE \'' . db_encode_like($filter_topic_title) . '\'';
        }
        if ($filter_topic_description != '') {
            $topic_filter .= ' OR t_description LIKE \'' . db_encode_like($filter_topic_description) . '\'';
        }
        if ($topic_filter != '') {
            $topic_filter = ' AND (' . $topic_filter . ')';
        }
        $query = 'SELECT * FROM ' . $this_ref->connection->get_table_prefix() . 'f_topics top WHERE (' . $id_list . ') ' . $topic_filter . $topic_filter_sup;
    }
    $post_query_select = 'p.p_title,t.text_parsed,t.id,p.p_poster,p.p_poster_name_if_guest';
    $post_query_where = 'p_validated=1 AND p_topic_id=top.id ' . not_like_spacer_posts('t.text_original');
    $post_query_sql = 'SELECT ' . $post_query_select . ' FROM ' . $this_ref->connection->get_table_prefix() . 'f_posts p ';
    if (strpos(get_db_type(), 'mysql') !== false) {
        $post_query_sql .= 'USE INDEX(in_topic) ';
    }
    $post_query_sql .= 'LEFT JOIN ' . $this_ref->connection->get_table_prefix() . 'translate t ON t.id=p.p_post WHERE ' . $post_query_where . ' ORDER BY p_time,p.id';
    if (strpos(get_db_type(), 'mysql') !== false) {
        // So topics with no validated posts, or only spacer posts, are not drawn out only to then be filtered layer (meaning we don't get enough result)
        $query .= ' AND EXISTS(' . $post_query_sql . ')';
    }
    $max_rows = $this_ref->connection->query_value_null_ok_full(preg_replace('#(^| UNION )SELECT \\* #', '${1}SELECT COUNT(*) ', $query), false, true);
    if ($limit == 0) {
        return array();
    }
    $rows = $this_ref->connection->query($query . ' ORDER BY ' . ($date_key == 'lasttime' ? 't_cache_last_time' : 't_cache_first_time') . ' DESC', $limit, $start, false, true);
    $out = array();
    foreach ($rows as $i => $r) {
        $out[$i] = array();
        $out[$i]['id'] = $r['id'];
        $out[$i]['num'] = $r['t_cache_num_posts'];
        $out[$i]['title'] = $r['t_cache_first_title'];
        $out[$i]['description'] = $r['t_description'];
        $out[$i]['firstusername'] = $r['t_cache_first_username'];
        $out[$i]['lastusername'] = $r['t_cache_last_username'];
        $out[$i]['firstmemberid'] = $r['t_cache_first_member_id'];
        $out[$i]['lastmemberid'] = $r['t_cache_last_member_id'];
        $out[$i]['firsttime'] = $r['t_cache_first_time'];
        $out[$i]['lasttime'] = $r['t_cache_last_time'];
        $out[$i]['closed'] = 1 - $r['t_is_open'];
        $out[$i]['forum_id'] = $r['t_forum_id'];
        $post_query_sql = str_replace('top.id', strval($out[$i]['id']), $post_query_sql);
        $fp_rows = $this_ref->connection->query($post_query_sql, 1);
        if (!array_key_exists(0, $fp_rows)) {
            unset($out[$i]);
            continue;
        }
        $out[$i]['firstusername'] = $fp_rows[0]['p_poster_name_if_guest'];
        $out[$i]['firstmemberid'] = $fp_rows[0]['p_poster'];
        $out[$i]['firsttitle'] = $fp_rows[0]['p_title'];
        if ($show_first_posts) {
            $message = new ocp_tempcode();
            if (get_page_name() != 'search' && !is_null($fp_rows[0]['text_parsed']) && $fp_rows[0]['text_parsed'] != '' && $fp_rows[0]['id'] != 0) {
                if (!$message->from_assembly($fp_rows[0]['text_parsed'], true)) {
                    $message = get_translated_tempcode($fp_rows[0]['id'], $GLOBALS['FORUM_DB']);
                }
            } else {
                $message = get_translated_tempcode($fp_rows[0]['id'], $GLOBALS['FORUM_DB']);
            }
            $out[$i]['firstpost'] = $message;
        }
    }
    if (count($out) != 0) {
        return $out;
    }
    return NULL;
}
Beispiel #5
0
/**
 * Do the wrapper that fits around OCF module output.
 *
 * @param  tempcode		The title for the module output that we are wrapping.
 * @param  tempcode		The module output that we are wrapping.
 * @param  boolean		Whether to include the personal bar in the wrap.
 * @param  boolean		Whether to include statistics in the wrap.
 * @param  ?AUTO_LINK	The forum to make the search link search under (NULL: Users own PT forum/unknown).
 * @return tempcode		The wrapped output.
 */
function ocf_wrapper($title, $content, $show_personal_bar = true, $show_stats = true, $forum_id = NULL)
{
    global $ZONE;
    $wide = is_wide();
    if ($wide == 0 && get_value('force_forum_bar') !== '1') {
        $show_personal_bar = false;
        $show_stats = false;
    }
    // Notifications
    if (!is_guest() && (get_page_name() == 'forumview' || get_page_name() == 'topicview' || get_page_name() == 'vforums')) {
        $cache_identifier = serialize(array(get_member()));
        $_notifications = NULL;
        if ((get_option('is_on_block_cache') == '1' || get_param_integer('keep_cache', 0) == 1 || get_param_integer('cache', 0) == 1) && (get_param_integer('keep_cache', NULL) !== 0 && get_param_integer('cache', NULL) !== 0)) {
            $_notifications = get_cache_entry('_new_pp', $cache_identifier, 10000);
        }
        if (is_null($_notifications)) {
            require_code('ocf_notifications');
            list($notifications, $num_unread_pps) = generate_notifications($cache_identifier);
        } else {
            list($__notifications, $num_unread_pps) = $_notifications;
            $notifications = new ocp_tempcode();
            if (!$notifications->from_assembly($__notifications, true)) {
                require_code('ocf_notifications');
                list($notifications, $num_unread_pps) = generate_notifications($cache_identifier);
            }
            if (!$notifications->is_empty()) {
                require_javascript('javascript_ajax');
            }
        }
    } else {
        $notifications = new ocp_tempcode();
        $num_unread_pps = 0;
    }
    if ($show_personal_bar) {
        if (get_member() != $GLOBALS['OCF_DRIVER']->get_guest_id()) {
            $member_info = ocf_read_in_member_profile(get_member(), true);
            $profile_url = $GLOBALS['OCF_DRIVER']->member_profile_url(get_member(), true, true);
            $_new_topics = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_topics WHERE NOT t_forum_id IS NULL AND t_cache_first_time>' . strval((int) $member_info['last_visit_time']));
            $new_topics = $_new_topics[0]['mycnt'];
            $_new_posts = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE NOT p_cache_forum_id IS NULL AND p_time>' . strval((int) $member_info['last_visit_time']));
            $new_posts = $_new_posts[0]['mycnt'];
            $max_avatar_height = ocf_get_member_best_group_property(get_member(), 'max_avatar_height');
            // Any unread PT-PPs?
            $pt_extra = $num_unread_pps == 0 ? new ocp_tempcode() : do_lang_tempcode('NUM_UNREAD', integer_format($num_unread_pps));
            $personal_topic_url = build_url(array('page' => 'members', 'type' => 'view', 'id' => get_member()), get_module_zone('members'), NULL, true, false, false, 'tab__pts');
            $head = do_template('OCF_MEMBER_BAR', array('_GUID' => 's3kdsadf0p3wsjlcfksdj', 'AVATAR' => array_key_exists('avatar', $member_info) ? $member_info['avatar'] : '', 'PROFILE_URL' => $profile_url, 'USERNAME' => $member_info['username'], 'LOGOUT_URL' => build_url(array('page' => 'login', 'type' => 'logout'), get_module_zone('login')), 'NUM_POINTS_ADVANCE' => array_key_exists('num_points_advance', $member_info) ? make_string_tempcode(integer_format($member_info['num_points_advance'])) : do_lang('NA'), 'NUM_POINTS' => array_key_exists('points', $member_info) ? integer_format($member_info['points']) : '', 'NUM_POSTS' => integer_format($member_info['posts']), 'PRIMARY_GROUP' => $member_info['primary_group_name'], 'LAST_VISIT_DATE_RAW' => strval($member_info['last_visit_time']), 'LAST_VISIT_DATE' => $member_info['last_visit_time_string'], 'PERSONAL_TOPIC_URL' => $personal_topic_url, 'NEW_POSTS_URL' => build_url(array('page' => 'vforums', 'type' => 'misc'), get_module_zone('vforums')), 'UNREAD_TOPICS_URL' => build_url(array('page' => 'vforums', 'type' => 'unread'), get_module_zone('vforums')), 'RECENTLY_READ_URL' => build_url(array('page' => 'vforums', 'type' => 'recently_read'), get_module_zone('vforums')), 'INLINE_PERSONAL_POSTS_URL' => build_url(array('page' => 'topicview'), get_module_zone('topicview')), 'PT_EXTRA' => $pt_extra, 'NEW_TOPICS' => integer_format($new_topics), 'NEW_POSTS' => integer_format($new_posts), 'MAX_AVATAR_HEIGHT' => strval($max_avatar_height)));
        } else {
            if (count($_POST) > 0) {
                $_this_url = build_url(array('page' => 'forumview'), 'forum', array('keep_session' => 1));
            } else {
                $_this_url = build_url(array('page' => '_SELF'), '_SELF', array('keep_session' => 1), true);
            }
            $this_url = $_this_url->evaluate();
            $login_url = build_url(array('page' => 'login', 'type' => 'login', 'redirect' => $this_url), get_module_zone('login'));
            $full_link = build_url(array('page' => 'login', 'type' => 'misc', 'redirect' => $this_url), get_module_zone('login'));
            $join_url = build_url(array('page' => 'join', 'redirect' => $this_url), get_module_zone('join'));
            $head = do_template('OCF_GUEST_BAR', array('NAVIGATION' => '', 'LOGIN_URL' => $login_url, 'JOIN_LINK' => $join_url, 'FULL_LINK' => $full_link));
        }
    } else {
        $head = new ocp_tempcode();
    }
    if ($show_stats) {
        $stats = ocf_get_forums_stats();
        // Users online
        $users_online = new ocp_tempcode();
        $count = 0;
        $members = get_online_members(false, NULL, $count);
        $groups_seen = array();
        if (!is_null($members)) {
            //$members=collapse_2d_complexity('the_user','cache_username',$members);
            $guests = 0;
            foreach ($members as $bits) {
                $member = $bits['the_user'];
                $username = $bits['cache_username'];
                if ($member == $GLOBALS['OCF_DRIVER']->get_guest_id()) {
                    $guests++;
                    continue;
                }
                if (is_null($username)) {
                    continue;
                }
                $url = $GLOBALS['OCF_DRIVER']->member_profile_url($member, false, true);
                if (!array_key_exists('m_primary_group', $bits)) {
                    $bits['m_primary_group'] = $GLOBALS['FORUM_DRIVER']->get_member_row_field($member, 'm_primary_group');
                }
                $pgid = $bits['m_primary_group'];
                //$GLOBALS['FORUM_DRIVER']->get_member_row_field($member,'m_primary_group');
                if (is_null($pgid)) {
                    continue;
                }
                // Deleted member
                $groups_seen[$pgid] = 1;
                $col = get_group_colour($pgid);
                $usergroup = ocf_get_group_name($pgid);
                if (get_value('disable_user_online_groups') === '1') {
                    $usergroup = NULL;
                    $col = NULL;
                    $groups_seen = array();
                }
                $users_online->attach(do_template('OCF_USER_MEMBER', array('_GUID' => 'a9cb1af2a04b14edd70749c944495bff', 'COLOUR' => $col, 'PROFILE_URL' => $url, 'USERNAME' => $username, 'USERGROUP' => $usergroup)));
            }
            if ($guests != 0) {
                if (!$users_online->is_empty()) {
                    $users_online->attach(do_lang_tempcode('LIST_SEP'));
                }
                $users_online->attach(do_lang_tempcode('NUM_GUESTS', integer_format($guests)));
            }
        }
        // Birthdays
        $_birthdays = ocf_find_birthdays();
        $birthdays = new ocp_tempcode();
        foreach ($_birthdays as $_birthday) {
            $birthday_link = build_url(array('page' => 'topics', 'type' => 'birthday', 'id' => $_birthday['username']), get_module_zone('topics'));
            $birthday = do_template('OCF_BIRTHDAY_LINK', array('_GUID' => 'a98959187d37d80e134d47db7e3a52fa', 'AGE' => array_key_exists('age', $_birthday) ? integer_format($_birthday['age']) : NULL, 'PROFILE_URL' => $GLOBALS['OCF_DRIVER']->member_profile_url($_birthday['id'], false, true), 'USERNAME' => $_birthday['username'], 'BIRTHDAY_LINK' => $birthday_link));
            $birthdays->attach($birthday);
        }
        if (!$birthdays->is_empty()) {
            $birthdays = do_template('OCF_BIRTHDAYS', array('_GUID' => '03da2c0d46e76407d63bff22aac354bd', 'BIRTHDAYS' => $birthdays));
        }
        // Usergroup keys
        $groups = array();
        $all_groups = $GLOBALS['FORUM_DRIVER']->get_usergroup_list(true, false, false, NULL, NULL, true);
        foreach ($all_groups as $gid => $gtitle) {
            if ($gid == db_get_first_id()) {
                continue;
            }
            // Throw out the first, guest
            if (array_key_exists($gid, $groups_seen)) {
                $groups[] = array('GCOLOUR' => get_group_colour($gid), 'GID' => strval($gid), 'GTITLE' => $gtitle);
            }
        }
        $foot = do_template('OCF_STATS', array('_GUID' => 'sdflkdlfd303frksdf', 'NEWEST_MEMBER_PROFILE_URL' => $GLOBALS['OCF_DRIVER']->member_profile_url($stats['newest_member_id'], false, true), 'NEWEST_MEMBER_USERNAME' => $stats['newest_member_username'], 'NUM_MEMBERS' => integer_format($stats['num_members']), 'NUM_TOPICS' => integer_format($stats['num_topics']), 'NUM_POSTS' => integer_format($stats['num_posts']), 'BIRTHDAYS' => $birthdays, 'USERS_ONLINE' => $users_online, 'USERS_ONLINE_URL' => has_actual_page_access(get_member(), 'onlinemembers') ? build_url(array('page' => 'onlinemembers'), get_module_zone('onlinemembers')) : new ocp_tempcode(), 'GROUPS' => $groups));
    } else {
        $foot = new ocp_tempcode();
    }
    $wrap = do_template('OCF_WRAPPER', array('_GUID' => '456c21db6c09ae260accfa4c2a59fce7', 'TITLE' => $title, 'NOTIFICATIONS' => $notifications, 'HEAD' => $head, 'FOOT' => $foot, 'CONTENT' => $content));
    return $wrap;
}
Beispiel #6
0
/**
 * Find the cached result of what is named by codename and the further constraints.
 *
 * @param  ID_TEXT		The codename to check for cacheing
 * @param  LONG_TEXT		The further restraints (a serialized map)
 * @param  integer		The TTL for the cache entry
 * @param  boolean		Whether we are cacheing Tempcode (needs special care)
 * @param  boolean		Whether to defer caching to CRON. Note that this option only works if the block's defined cache signature depends only on $map (timezone, bot-type, in-panel and interlock are automatically considered)
 * @param  ?array			Parameters to call up block with if we have to defer caching (NULL: none)
 * @return ?mixed			The cached result (NULL: no cached result)
 */
function get_cache_entry($codename, $cache_identifier, $ttl = 10000, $tempcode = false, $caching_via_cron = false, $map = NULL)
{
    if ($GLOBALS['MEM_CACHE'] !== NULL) {
        $pcache = persistant_cache_get(array('CACHE', $codename));
        if ($pcache === NULL) {
            return NULL;
        }
        $theme = $GLOBALS['FORUM_DRIVER']->get_theme();
        $lang = user_lang();
        $pcache = isset($pcache[$cache_identifier][$lang][$theme]) ? $pcache[$cache_identifier][$lang][$theme] : NULL;
        if ($pcache === NULL) {
            if ($caching_via_cron) {
                request_via_cron($codename, $map, $tempcode);
                return paragraph(do_lang_tempcode('CACHE_NOT_READY_YET'), '', 'nothing_here');
            }
            return NULL;
        }
        $cache_rows = array($pcache);
    } else {
        $cache_rows = $GLOBALS['SITE_DB']->query_select('cache', array('*'), array('lang' => user_lang(), 'cached_for' => $codename, 'the_theme' => $GLOBALS['FORUM_DRIVER']->get_theme(), 'identifier' => md5($cache_identifier)), '', 1);
        if (!isset($cache_rows[0])) {
            if ($caching_via_cron) {
                request_via_cron($codename, $map, $tempcode);
                return paragraph(do_lang_tempcode('CACHE_NOT_READY_YET'), '', 'nothing_here');
            }
            return NULL;
        }
        if ($tempcode) {
            $ob = new ocp_tempcode();
            if (!$ob->from_assembly($cache_rows[0]['the_value'], true)) {
                return NULL;
            }
            $cache_rows[0]['the_value'] = $ob;
        } else {
            $cache_rows[0]['the_value'] = unserialize($cache_rows[0]['the_value']);
        }
    }
    $stale = $ttl != -1 && time() > $cache_rows[0]['date_and_time'] + $ttl * 60;
    if (!$caching_via_cron && $stale) {
        return NULL;
    } else {
        if ($stale) {
            request_via_cron($codename, $map, $tempcode);
        }
        $cache = $cache_rows[0]['the_value'];
        if ($cache_rows[0]['langs_required'] != '') {
            $bits = explode('!', $cache_rows[0]['langs_required']);
            $langs_required = explode(':', $bits[0]);
            // Sometimes lang has got intertwinded with non cacheable stuff (and thus was itself not cached), so we need the lang files
            foreach ($langs_required as $lang) {
                if ($lang != '') {
                    require_lang($lang, NULL, NULL, true);
                }
            }
            if (isset($bits[1])) {
                $javascripts_required = explode(':', $bits[1]);
                foreach ($javascripts_required as $javascript) {
                    if ($javascript != '') {
                        require_javascript($javascript);
                    }
                }
            }
            if (isset($bits[2])) {
                $csss_required = explode(':', $bits[2]);
                foreach ($csss_required as $css) {
                    if ($css != '') {
                        require_css($css);
                    }
                }
            }
        }
        return $cache;
    }
}
Beispiel #7
0
/**
 * This function is an offshoot of get_translated_text, it instead returns parsed comcode that is linked to the specified language id.
 *
 * @param  integer			The id
 * @param  ?object			The database connection to use (NULL: standard site connection)
 * @param  ?LANGUAGE_NAME	The language (NULL: uses the current language)
 * @param  boolean			Whether to force it to the specified language
 * @param  boolean			Whether to force as_admin, even if the lang string isn't stored against an admin (designed for comcode page cacheing)
 * @param  boolean			Whether to remove from the Tempcode cache when we're done, for performance reasons (normally don't bother with this, but some code knows it won't be needed again -- esp Comcode cache layer -- and saves RAM by removing it)
 * @return ?tempcode			The parsed comcode (NULL: the text couldn't be looked up)
 */
function get_translated_tempcode($entry, $connection = NULL, $lang = NULL, $force = false, $as_admin = false, $clear_away_from_cache = false)
{
    if ($entry == 0) {
        return paragraph(do_lang_tempcode('FAILED_ENTRY'), 'rtgtedgrgd');
    }
    if ($connection === NULL) {
        $connection = $GLOBALS['SITE_DB'];
    }
    global $RECORD_LANG_STRINGS_CONTENT;
    if ($RECORD_LANG_STRINGS_CONTENT) {
        global $RECORDED_LANG_STRINGS_CONTENT;
        $RECORDED_LANG_STRINGS_CONTENT[$entry] = $connection->connection_write != $GLOBALS['SITE_DB']->connection_write;
    }
    if ($lang === NULL) {
        $lang = user_lang();
    }
    if ($lang == 'xxx') {
        return make_string_tempcode('!!!');
    }
    // Helpful for testing language compliancy. We don't expect to see non x's/!'s if we're running this language
    if (isset($connection->text_lookup_cache[$entry]) && $lang == user_lang()) {
        $ret = $connection->text_lookup_cache[$entry];
        if ($ret !== '') {
            if (is_string($ret)) {
                $connection->text_lookup_cache[$entry] = new ocp_tempcode();
                $connection->text_lookup_cache[$entry]->from_assembly($ret);
                $ret = $connection->text_lookup_cache[$entry];
            }
            if ($clear_away_from_cache) {
                unset($connection->text_lookup_cache[$entry]);
                unset($connection->text_lookup_original_cache[$entry]);
            }
            return $ret;
        }
    }
    global $SEARCH__CONTENT_BITS;
    if ($SEARCH__CONTENT_BITS !== NULL) {
        $_result = $connection->query_select('translate', array('text_original', 'source_user'), array('id' => $entry, 'language' => $lang), '', 1);
        if (array_key_exists(0, $_result)) {
            global $LAX_COMCODE;
            $temp = $LAX_COMCODE;
            $LAX_COMCODE = true;
            $result = $_result[0];
            $ret = comcode_to_tempcode($result['text_original'], $result['source_user'], $as_admin, 60, NULL, $connection, false, false, false, false, false, $SEARCH__CONTENT_BITS);
            $LAX_COMCODE = $temp;
            return $ret;
        }
    }
    $_result = $connection->query_select('translate', array('text_parsed', 'text_original'), array('id' => $entry, 'language' => $lang), '', 1);
    $result = isset($_result[0]) ? $_result[0]['text_parsed'] : NULL;
    if (isset($_result[0])) {
        if ($lang == user_lang()) {
            $connection->text_lookup_original_cache[$entry] = $_result[0]['text_original'];
        }
    }
    if ($result === NULL || $result == '' || is_browser_decacheing()) {
        require_code('lang3');
        return parse_translated_text($entry, $connection, $lang, $force, $as_admin);
    }
    $parsed = new ocp_tempcode();
    if (!$parsed->from_assembly($result, true)) {
        require_code('lang3');
        return parse_translated_text($entry, $connection, $lang, $force, $as_admin);
    }
    if ($lang == user_lang()) {
        $connection->text_lookup_cache[$entry] = $parsed;
    }
    return $parsed;
}
Beispiel #8
0
/**
 * Convert a language string that is Comcode to tempcode, with potential cacheing in the db.
 *
 * @param  ID_TEXT		The language string ID
 * @return tempcode		The parsed Comcode
 */
function _comcode_lang_string($lang_code)
{
    global $COMCODE_LANG_STRING_CACHE;
    if (array_key_exists($lang_code, $COMCODE_LANG_STRING_CACHE)) {
        return $COMCODE_LANG_STRING_CACHE[$lang_code];
    }
    $comcode_page = $GLOBALS['SITE_DB']->query_select('cached_comcode_pages p LEFT JOIN ' . $GLOBALS['SITE_DB']->get_table_prefix() . 'translate t ON t.id=string_index AND ' . db_string_equal_to('t.language', user_lang()), array('string_index', 'text_parsed'), array('the_page' => $lang_code, 'the_zone' => '!'), '', 1);
    if (array_key_exists(0, $comcode_page) && !is_browser_decacheing()) {
        if (!is_null($comcode_page[0]['text_parsed']) && $comcode_page[0]['text_parsed'] != '') {
            $parsed = new ocp_tempcode();
            if (!$parsed->from_assembly($comcode_page[0]['text_parsed'], true)) {
                $ret = get_translated_tempcode($comcode_page[0]['string_index']);
                unset($GLOBALS['RECORDED_LANG_STRINGS_CONTENT'][$comcode_page[0]['string_index']]);
            }
        } else {
            $ret = get_translated_tempcode($comcode_page[0]['string_index'], NULL, NULL, true);
            if (is_null($ret)) {
                $looked_up = do_lang($lang_code, NULL, NULL, NULL, NULL, false);
                $GLOBALS['SITE_DB']->query_insert('translate', array('id' => $comcode_page[0]['string_index'], 'source_user' => get_member(), 'broken' => 0, 'importance_level' => 1, 'text_original' => $looked_up, 'text_parsed' => '', 'language' => user_lang()), true, false, true);
                $ret = get_translated_tempcode($comcode_page[0]['string_index']);
            }
            unset($GLOBALS['RECORDED_LANG_STRINGS_CONTENT'][$comcode_page[0]['string_index']]);
            return $ret;
        }
        $COMCODE_LANG_STRING_CACHE[$lang_code] = $parsed;
        return $parsed;
    } elseif (array_key_exists(0, $comcode_page)) {
        $GLOBALS['SITE_DB']->query_delete('cached_comcode_pages', array('the_page' => $lang_code, 'the_zone' => '!'));
        delete_lang($comcode_page[0]['string_index']);
    }
    $nql_backup = $GLOBALS['NO_QUERY_LIMIT'];
    $GLOBALS['NO_QUERY_LIMIT'] = true;
    $looked_up = do_lang($lang_code, NULL, NULL, NULL, NULL, false);
    if (is_null($looked_up)) {
        return make_string_tempcode(escape_html('{!' . $lang_code . '}'));
    }
    $index = insert_lang_comcode($looked_up, 4, NULL, true, NULL, 60, false, true);
    $GLOBALS['SITE_DB']->query_insert('cached_comcode_pages', array('the_zone' => '!', 'the_page' => $lang_code, 'string_index' => $index, 'the_theme' => $GLOBALS['FORUM_DRIVER']->get_theme(), 'cc_page_title' => NULL), false, true);
    // Race conditions
    $parsed = get_translated_tempcode($index);
    $COMCODE_LANG_STRING_CACHE[$lang_code] = $parsed;
    $GLOBALS['NO_QUERY_LIMIT'] = $nql_backup;
    return $parsed;
}