'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_page['is_admmod'] = ($pun_user['g_id'] == PUN_ADMIN || ($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_page['is_admmod']) $pun_user['may_post'] = (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1' || $pun_page['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'].' '.paginate($pun_page['num_pages'], $pun_page['page'], $pun_url['topic'], $lang_common['Paging separator'], 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_page['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'] && (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '0') || $cur_topic['post_replies'] == '0')) $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; if (!$pid) 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) 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'], pun_htmlencode($cur_post['username'])) : sprintf($lang_topic['Reply by'], pun_htmlencode($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'][] = ($pun_user['g_view_users'] == '1') ? ''.pun_htmlencode($cur_post['username']).'' : ''.pun_htmlencode($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'][] = ''.pun_htmlencode($cur_post['username']).''; $pun_page['user_info'][] = '
  • '.$lang_topic['Title'].' '.get_title($cur_post).'
  • '; } // Generate author information if ($cur_post['poster_id'] > 1) { if ($pun_config['o_show_user_info'] == '1') { 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'].' '.pun_htmlencode($cur_post['location']).'
  • '; } $pun_page['user_info'][] = '
  • '.$lang_topic['Registered'].' '.format_time($cur_post['registered'], true).'
  • '; 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']) { if ($cur_post['admin_note'] != '') $pun_page['user_info'][] = '
  • '.$lang_topic['Note'].' '.pun_htmlencode($cur_post['admin_note']).'
  • '; } } // Generate IP information for moderators/administrators if ($pun_user['is_admmod']) $pun_page['user_info'][] = '
  • '.$lang_topic['IP'].' '.$cur_post['poster_ip'].'
  • '; // 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'], pun_htmlencode($cur_post['username'])).''; if ((($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['is_admmod']) && $pun_user['g_send_email'] == '1') $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.pun_htmlencode($cur_post['username']).''; else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1') $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.pun_htmlencode($cur_post['username']).''; } else { if ($cur_post['poster_email'] != '' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1') $pun_page['post_options'][] = ''.$lang_common['E-mail'].' '.pun_htmlencode($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_page['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'], pun_htmlencode($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';