diff -r 5e1f1e916419 -r 98bbc533541c punbb/viewtopic.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/punbb/viewtopic.php Sun Apr 06 00:28:50 2008 -0400 @@ -0,0 +1,615 @@ + $_ ) +{ + $$key =& $GLOBALS[$key]; +} + +($hook = get_hook('vt_start')) ? eval($hook) : null; + +if ($pun_user['g_read_board'] == '0') + message($lang_common['No view']); + +// Load the viewtopic.php language file +require PUN_ROOT.'lang/'.$pun_user['language'].'/topic.php'; + + +$action = isset($_GET['action']) ? $_GET['action'] : null; +$id = isset($_GET['id']) ? intval($_GET['id']) : 0; +$pid = isset($_GET['pid']) ? intval($_GET['pid']) : 0; +if ($id < 1 && $pid < 1) + message($lang_common['Bad request']); + + +// If a post ID is specified we determine topic ID and page number so we can redirect to the correct message +if ($pid) +{ + $query = array( + 'SELECT' => 'p.topic_id, p.posted', + 'FROM' => 'posts AS p', + 'WHERE' => 'p.id='.$pid + ); + + ($hook = get_hook('vt_qr_get_post_info')) ? eval($hook) : null; + $result = $pun_db->query_build($query) or error(__FILE__, __LINE__); + if (!$pun_db->num_rows($result)) + message($lang_common['Bad request']); + + list($id, $posted) = $pun_db->fetch_row($result); + + // Determine on what page the post is located (depending on $pun_user['disp_posts']) + $query = array( + 'SELECT' => '1', + 'FROM' => 'posts AS p', + 'WHERE' => 'p.topic_id='.$id.' AND p.posted<'.$posted + ); + + ($hook = get_hook('vt_qr_get_post_page')) ? eval($hook) : null; + $result = $pun_db->query_build($query) or error(__FILE__, __LINE__); + $num_posts = $pun_db->num_rows($result) + 1; + + $_GET['p'] = ceil($num_posts / $pun_user['disp_posts']); +} + +// If action=new, we redirect to the first new post (if any) +else if ($action == 'new' && !$pun_user['is_guest']) +{ + // We need to check if this topic has been viewed recently by the user + $tracked_topics = get_tracked_topics(); + $last_viewed = isset($tracked_topics['topics'][$id]) ? $tracked_topics['topics'][$id] : $pun_user['last_visit']; + + ($hook = get_hook('vt_find_new_post')) ? eval($hook) : null; + + $query = array( + 'SELECT' => 'MIN(p.id)', + 'FROM' => 'posts AS p', + 'WHERE' => 'p.topic_id='.$id.' AND p.posted>'.$last_viewed + ); + + ($hook = get_hook('vt_qr_get_first_new_post')) ? eval($hook) : null; + $result = $pun_db->query_build($query) or error(__FILE__, __LINE__); + $first_new_post_id = $pun_db->result($result); + + if ($first_new_post_id) + header('Location: '.str_replace('&', '&', pun_link($pun_url['post'], $first_new_post_id))); + else // If there is no new post, we go to the last post + header('Location: '.str_replace('&', '&', pun_link($pun_url['topic_last_post'], $id))); + + exit; +} + +// If action=last, we redirect to the last post +else if ($action == 'last') +{ + $query = array( + 'SELECT' => 't.last_post_id', + 'FROM' => 'topics AS t', + 'WHERE' => 't.id='.$id + ); + + ($hook = get_hook('vt_qr_get_last_post')) ? eval($hook) : null; + $result = $pun_db->query_build($query) or error(__FILE__, __LINE__); + $last_post_id = $pun_db->result($result); + + if ($last_post_id) + { + header('Location: '.str_replace('&', '&', pun_link($pun_url['post'], $last_post_id))); + exit; + } +} + + +// Fetch some info about the topic +$query = array( + 'SELECT' => 't.subject, t.posted, t.poster, t.first_post_id, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies', + 'FROM' => 'topics AS t', + 'JOINS' => array( + array( + 'INNER JOIN' => 'forums AS f', + 'ON' => 'f.id=t.forum_id' + ), + array( + 'LEFT JOIN' => 'forum_perms AS fp', + 'ON' => '(fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].')' + ) + ), + 'WHERE' => '(fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL' +); + +if (!$pun_user['is_guest']) +{ + $query['SELECT'] .= ', s.user_id AS is_subscribed'; + $query['JOINS'][] = array( + 'LEFT JOIN' => 'subscriptions AS s', + 'ON' => '(t.id=s.topic_id AND s.user_id='.$pun_user['id'].')' + ); +} + +($hook = get_hook('vt_qr_get_topic_info')) ? eval($hook) : null; +$result = $pun_db->query_build($query) or error(__FILE__, __LINE__); +if (!$pun_db->num_rows($result)) + message($lang_common['Bad request']); + +$cur_topic = $pun_db->fetch_assoc($result); + +// Sort out who the moderators are and if we are currently a moderator (or an admin) +$mods_array = ($cur_topic['moderators'] != '') ? unserialize($cur_topic['moderators']) : array(); +$pun_user['is_admmod'] = ($session->user_level >= USER_LEVEL_MOD || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false; + +// Can we or can we not post replies? +if ($cur_topic['closed'] == '0' || $pun_user['is_admmod']) + $pun_user['may_post'] = (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1' || $pun_user['is_admmod']) ? true : false; +else + $pun_user['may_post'] = false; + +// Add/update this topic in our list of tracked topics +if (!$pun_user['is_guest']) +{ + $tracked_topics = get_tracked_topics(); + $tracked_topics['topics'][$id] = time(); + set_tracked_topics($tracked_topics); +} + +// Determine the post offset (based on $_GET['p']) +$pun_page['num_pages'] = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']); +$pun_page['page'] = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $pun_page['num_pages']) ? 1 : $_GET['p']; +$pun_page['start_from'] = $pun_user['disp_posts'] * ($pun_page['page'] - 1); +$pun_page['finish_at'] = min(($pun_page['start_from'] + $pun_user['disp_posts']), ($cur_topic['num_replies'] + 1)); + +// Navigation links for header and page numbering for title/meta description +if ($pun_page['page'] < $pun_page['num_pages']) +{ + $pun_page['nav'][] = ''; + $pun_page['nav'][] = ''; +} +if ($pun_page['page'] > 1) +{ + $pun_page['nav'][] = ''; + $pun_page['nav'][] = ''; +} + +// Generate page information +if ($pun_page['num_pages'] > 1) + $pun_page['main_info'] = ''.sprintf($lang_common['Page number'], $pun_page['page'], $pun_page['num_pages']).' '.sprintf($lang_common['Paged info'], $lang_common['Posts'], $pun_page['start_from'] + 1, $pun_page['finish_at'], $cur_topic['num_replies'] + 1); +else + $pun_page['main_info'] = sprintf($lang_common['Page info'], $lang_common['Posts'], ($cur_topic['num_replies'] + 1)); + +// Generate paging and posting links +$pun_page['page_post'][] = '

'.$lang_common['Pages'].' '.pun_paginate($pun_page['num_pages'], $pun_page['page'], $pun_url['topic'], array($id, sef_friendly($cur_topic['subject']))).'

'; + +if ($pun_user['may_post']) + $pun_page['page_post'][] = '

'.$lang_topic['Post reply'].'

'; + +// Setup options for main header and footer +$pun_page['main_head_options'] = array(); + +if (!$pun_user['is_guest'] && $pun_config['o_subscriptions'] == '1') +{ + if ($cur_topic['is_subscribed']) + $pun_page['main_head_options'][] = ''.$lang_topic['Cancel subscription'].''; + else + $pun_page['main_head_options'][] = ''.$lang_topic['Subscription'].''; +} + +$pun_page['main_head_options'][] = ''.$lang_common['ATOM Feed'].''; +$pun_page['main_head_options'][] = ''.$lang_common['RSS Feed'].''; + +$pun_page['main_foot_options'] = array(); +if ($pun_user['is_admmod']) +{ + $pun_page['main_foot_options'][] = ''.$lang_topic['Move'].''; + $pun_page['main_foot_options'][] = ''.$lang_topic['Delete topic'].''; + $pun_page['main_foot_options'][] = (($cur_topic['closed'] == '1') ? ''.$lang_topic['Open'].'' : ''.$lang_topic['Close'].''); + $pun_page['main_foot_options'][] = (($cur_topic['sticky'] == '1') ? ''.$lang_topic['Unstick'].'' : ''.$lang_topic['Stick'].''); + + if ($cur_topic['num_replies'] != 0) + $pun_page['main_foot_options'][] = ''.$lang_topic['Delete posts'].''; +} + +if ($pun_user['is_guest'] && !$pun_user['may_post']) + $pun_page['main_foot_options'][] = sprintf($lang_topic['Topic login nag'], ''.strtolower($lang_common['Login']).'', ''.strtolower($lang_common['Register']).''); + +if ($pun_config['o_censoring'] == '1') + $cur_topic['subject'] = censor_words($cur_topic['subject']); + +// Setup breadcrumbs +$pun_page['crumbs'] = array( + array($pun_config['o_board_title'], pun_link($pun_url['index'])), + array($cur_topic['forum_name'], pun_link($pun_url['forum'], array($cur_topic['forum_id'], sef_friendly($cur_topic['forum_name'])))), + array($cur_topic['subject'], pun_link($pun_url['topic'], array($id, sef_friendly($cur_topic['subject'])))), +); + +($hook = get_hook('vt_pre_header_load')) ? eval($hook) : null; + +define('PUN_ALLOW_INDEX', 1); +define('PUN_PAGE', 'viewtopic'); +require PUN_ROOT.'header.php'; + +?> +
+ +

+ +
+ +
+ +
+

+

+
+ +
+ 'u.email, u.title, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online', + 'FROM' => 'posts AS p', + 'JOINS' => array( + array( + 'INNER JOIN' => 'users AS u', + 'ON' => 'u.id=p.poster_id' + ), + array( + 'INNER JOIN' => 'groups AS g', + 'ON' => 'g.g_id=u.group_id' + ), + array( + 'LEFT JOIN' => 'online AS o', + 'ON' => '(o.user_id=u.id AND o.user_id!=1 AND o.idle=0)' + ), + ), + 'WHERE' => 'p.topic_id='.$id, + 'ORDER BY' => 'p.id', + 'LIMIT' => $pun_page['start_from'].','.$pun_user['disp_posts'] +); + +($hook = get_hook('vt_qr_get_posts')) ? eval($hook) : null; +$result = $pun_db->query_build($query, true) or error(__FILE__, __LINE__); +while ($cur_post = $pun_db->fetch_assoc($result)) +{ + ($hook = get_hook('vt_post_loop_start')) ? eval($hook) : null; + + ++$pun_page['item_count']; + + $signature = ''; + $pun_page['user_ident'] = array(); + $pun_page['user_info'] = array(); + $pun_page['post_options'] = array(); + $pun_page['message'] = array(); + + // Generate the post heading + $pun_page['item_ident'] = array( + 'num' => ''.($pun_page['start_from'] + $pun_page['item_count']).'', + 'user' => ''.($cur_topic['posted'] == $cur_post['posted'] ? sprintf($lang_topic['Topic by'], htmlspecialchars($cur_post['username'])) : sprintf($lang_topic['Reply by'], htmlspecialchars($cur_post['username']))).'', + 'date' => ''.format_time($cur_post['posted']).'' + ); + + $pun_page['item_head'] = ''; + + // Generate author identification + if ($cur_post['poster_id'] > 1 && $pun_config['o_avatars'] == '1' && $pun_user['show_avatars'] != '0') + { + if (file_exists($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif') && $img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif')) + $pun_page['user_ident'][] = ''; + else if (file_exists($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg') && $img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg')) + $pun_page['user_ident'][] = ''; + else if (file_exists($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png') && $img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png')) + $pun_page['user_ident'][] = ''; + } + + if ($cur_post['poster_id'] > 1) + { + $pun_page['user_ident'][] = ''.htmlspecialchars($cur_post['username']).''; + $pun_page['user_info'][] = '
  • '.$lang_topic['Title'].' '.get_title($cur_post).'
  • '; + + if ($cur_post['is_online'] == $cur_post['poster_id']) + $pun_page['user_info'][] = '
  • '.$lang_topic['Status'].' '.$lang_topic['Online'].'
  • '; + else + $pun_page['user_info'][] = '
  • '.$lang_topic['Status'].' '.$lang_topic['Offline'].'
  • '; + } + else + { + $pun_page['user_ident'][] = ''.htmlspecialchars($cur_post['username']).''; + $pun_page['user_info'][] = '
  • '.$lang_topic['Title'].' '.get_title($cur_post).'
  • '; + } + + // Generate author information + if ($cur_post['poster_id'] > 1 && $pun_config['o_show_user_info'] == '1') + { + + $pun_page['user_info'][] = '
  • '.$lang_topic['Registered'].' '.format_time($cur_post['registered'], true).'
  • '; + + if ($cur_post['location'] != '') + { + if ($pun_config['o_censoring'] == '1') + $cur_post['location'] = censor_words($cur_post['location']); + + $pun_page['user_info'][] = '
  • '.$lang_topic['From'].' '.htmlspecialchars($cur_post['location']).'
  • '; + } + + if ($pun_config['o_show_post_count'] == '1' || $pun_user['is_admmod']) + $pun_page['user_info'][] = '
  • '.$lang_topic['Posts'].' '.$cur_post['num_posts'].'
  • '; + + if ($pun_user['is_admmod']) + { + $pun_page['user_info'][] = '
  • '.$lang_topic['IP'].' '.$cur_post['poster_ip'].'
  • '; + + if ($cur_post['admin_note'] != '') + $pun_page['user_info'][] = '
  • '.$lang_topic['Note'].' '.htmlspecialchars($cur_post['admin_note']).'
  • '; + } + } + + // Generate author contact details + if ($pun_config['o_show_user_info'] == '1') + { + if ($cur_post['poster_id'] > 1) + { + if ($cur_post['url'] != '') + $pun_page['post_options'][] = ''.sprintf($lang_topic['Visit website'], htmlspecialchars($cur_post['username'])).''; + if (($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['is_admmod']) + $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.htmlspecialchars($cur_post['username']).''; + else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest']) + $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.htmlspecialchars($cur_post['username']).''; + } + else + { + if ($cur_post['poster_email'] != '' && !$pun_user['is_guest']) + $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.htmlspecialchars($cur_post['username']).''; + } + } + + // Generate the post options links + if (!$pun_user['is_guest']) + { + $pun_page['post_options'][] = ''.$lang_topic['Report'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + + if (!$pun_user['is_admmod']) + { + if ($cur_topic['closed'] == '0') + { + if ($cur_post['poster_id'] == $pun_user['id']) + { + if (($pun_page['start_from'] + $pun_page['item_count']) == 1 && $pun_user['g_delete_topics'] == '1') + $pun_page['post_options'][] = ''.$lang_topic['Delete topic'].''; + if (($pun_page['start_from'] + $pun_page['item_count']) > 1 && $pun_user['g_delete_posts'] == '1') + $pun_page['post_options'][] = ''.$lang_topic['Delete'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + if ($pun_user['g_edit_posts'] == '1') + $pun_page['post_options'][] = ''.$lang_topic['Edit'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + } + + if (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1') + $pun_page['post_options'][] = ''.$lang_topic['Quote'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + } + } + else + { + if (($pun_page['start_from'] + $pun_page['item_count']) == 1) + $pun_page['post_options'][] = ''.$lang_topic['Delete topic'].''; + else + $pun_page['post_options'][] = ''.$lang_topic['Delete'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + + $pun_page['post_options'][] = ''.$lang_topic['Edit'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + $pun_page['post_options'][] = ''.$lang_topic['Quote'].' '.$lang_topic['Post'].' '.($pun_page['start_from'] + $pun_page['item_count']).''; + } + } + + // Give the post some class + $pun_page['item_status'] = array( + 'post', + ($pun_page['item_count'] % 2 == 0) ? 'odd' : 'even' + ); + + if ($pun_page['item_count'] == 1) + $pun_page['item_status'][] = 'firstpost'; + + if (($pun_page['start_from'] + $pun_page['item_count']) == $pun_page['finish_at']) + $pun_page['item_status'][] = 'lastpost'; + + if ($cur_post['id'] == $cur_topic['first_post_id']) + $pun_page['item_status'][] = 'topicpost'; + else + $pun_page['item_status'][] = 'replypost'; + + + // Generate the post title + if ($cur_post['id'] == $cur_topic['first_post_id']) + $pun_page['item_subject'] = $lang_common['Topic'].': '.$cur_topic['subject']; + else + $pun_page['item_subject'] = $lang_common['Re'].' '.$cur_topic['subject']; + + // Perform the main parsing of the message (BBCode, smilies, censor words etc) + $pun_page['message'][] = parse_message($cur_post['message'], $cur_post['hide_smilies']); + + if ($cur_post['edited'] != '') + $pun_page['message'][] = '

    '.sprintf($lang_topic['Last edited'], htmlspecialchars($cur_post['edited_by']), format_time($cur_post['edited'])).'

    '; + + // Do signature parsing/caching + if ($cur_post['signature'] != '' && $pun_user['show_sig'] != '0' && $pun_config['o_signatures'] == '1') + { + if (!isset($signature_cache[$cur_post['poster_id']])) + $signature_cache[$cur_post['poster_id']] = parse_signature($cur_post['signature']); + + $pun_page['message'][] = '
    '."\n\t\t\t\t\t\t\t\t".''."\n\t\t\t\t\t\t\t\t".$signature_cache[$cur_post['poster_id']]."\n\t\t\t\t\t\t\t".'
    '; + } + + ($hook = get_hook('vt_row_pre_display')) ? eval($hook) : null; + +?> +
    +
    +
    +

    +
    +
    +
    +

    + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +

    +

    +
    + +
    + +
    + +
    + +
    +

    +
    +', + '' +); + +if ($pun_user['is_admmod']) + $pun_page['hidden_fields'][] = ''; + +if (!$pun_user['is_guest'] && $pun_config['o_subscriptions'] == '1' && ($pun_user['auto_notify'] == '1' || $cur_topic['is_subscribed'])) + $pun_page['hidden_fields'][] = ''; + +// Setup help +$pun_page['main_head_options'] = array(); +if ($pun_config['p_message_bbcode'] == '1') + $pun_page['main_head_options'][] = ''.$lang_common['BBCode'].''; +if ($pun_config['p_message_img_tag'] == '1') + $pun_page['main_head_options'][] = ''.$lang_common['Images'].''; +if ($pun_config['o_smilies'] == '1') + $pun_page['main_head_options'][] = ''.$lang_common['Smilies'].''; + +($hook = get_hook('vt_quickpost_pre_display')) ? eval($hook) : null; + +?> +
    + +
    +

    +

    +
    + +
    +
    +

    '.$lang_common['Required'].'') ?>

    +
    +
    + + +
    + + +
    + +
    +
    + +
    + + +
    +
    +
    + +
    + 'topics', + 'SET' => 'num_views=num_views+1', + 'WHERE' => 'id='.$id, + 'PARAMS' => array( + 'LOW_PRIORITY' => 1 // MySQL only + ) + ); + + ($hook = get_hook('vt_qr_increment_num_views')) ? eval($hook) : null; + $pun_db->query_build($query) or error(__FILE__, __LINE__); +} + +$forum_id = $cur_topic['forum_id']; + +($hook = get_hook('vt_end')) ? eval($hook) : null; + +require PUN_ROOT.'footer.php';