Chris@76: ', $context['user']['name'], '', allowedTo('pm_read') ? ', ' . $txt['msg_alert_you_have'] . ' ' . $context['user']['messages'] . ' ' . ($context['user']['messages'] == '1' ? $txt['message_lowercase'] : $txt['msg_alert_messages']) . '' . $txt['newmessages4'] . ' ' . $context['user']['unread_messages'] . ' ' . ($context['user']['unread_messages'] == '1' ? $txt['newmessages0'] : $txt['newmessages1']) : '', '.';
Chris@76: }
Chris@76: // Don't echo... then do what?!
Chris@76: else
Chris@76: return $context['user'];
Chris@76: }
Chris@76:
Chris@76: // Display a menu bar, like is displayed at the top of the forum.
Chris@76: function ssi_menubar($output_method = 'echo')
Chris@76: {
Chris@76: global $context;
Chris@76:
Chris@76: if ($output_method == 'echo')
Chris@76: template_menu();
Chris@76: // What else could this do?
Chris@76: else
Chris@76: return $context['menu_buttons'];
Chris@76: }
Chris@76:
Chris@76: // Show a logout link.
Chris@76: function ssi_logout($redirect_to = '', $output_method = 'echo')
Chris@76: {
Chris@76: global $context, $txt, $scripturl;
Chris@76:
Chris@76: if ($redirect_to != '')
Chris@76: $_SESSION['logout_url'] = $redirect_to;
Chris@76:
Chris@76: // Guests can't log out.
Chris@76: if ($context['user']['is_guest'])
Chris@76: return false;
Chris@76:
Chris@76: $link = '' . $txt['logout'] . '';
Chris@76:
Chris@76: if ($output_method == 'echo')
Chris@76: echo $link;
Chris@76: else
Chris@76: return $link;
Chris@76: }
Chris@76:
Chris@76: // Recent post list: [board] Subject by Poster Date
Chris@76: function ssi_recentPosts($num_recent = 8, $exclude_boards = null, $include_boards = null, $output_method = 'echo', $limit_body = true)
Chris@76: {
Chris@76: global $context, $settings, $scripturl, $txt, $db_prefix, $user_info;
Chris@76: global $modSettings, $smcFunc;
Chris@76:
Chris@76: // Excluding certain boards...
Chris@76: if ($exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
Chris@76: $exclude_boards = array($modSettings['recycle_board']);
Chris@76: else
Chris@76: $exclude_boards = empty($exclude_boards) ? array() : (is_array($exclude_boards) ? $exclude_boards : array($exclude_boards));
Chris@76:
Chris@76: // What about including certain boards - note we do some protection here as pre-2.0 didn't have this parameter.
Chris@76: if (is_array($include_boards) || (int) $include_boards === $include_boards)
Chris@76: {
Chris@76: $include_boards = is_array($include_boards) ? $include_boards : array($include_boards);
Chris@76: }
Chris@76: elseif ($include_boards != null)
Chris@76: {
Chris@76: $include_boards = array();
Chris@76: }
Chris@76:
Chris@76: // Let's restrict the query boys (and girls)
Chris@76: $query_where = '
Chris@76: m.id_msg >= {int:min_message_id}
Chris@76: ' . (empty($exclude_boards) ? '' : '
Chris@76: AND b.id_board NOT IN ({array_int:exclude_boards})') . '
Chris@76: ' . ($include_boards === null ? '' : '
Chris@76: AND b.id_board IN ({array_int:include_boards})') . '
Chris@76: AND {query_wanna_see_board}' . ($modSettings['postmod_active'] ? '
Chris@76: AND m.approved = {int:is_approved}' : '');
Chris@76:
Chris@76: $query_where_params = array(
Chris@76: 'is_approved' => 1,
Chris@76: 'include_boards' => $include_boards === null ? '' : $include_boards,
Chris@76: 'exclude_boards' => empty($exclude_boards) ? '' : $exclude_boards,
Chris@76: 'min_message_id' => $modSettings['maxMsgID'] - 25 * min($num_recent, 5),
Chris@76: );
Chris@76:
Chris@76: // Past to this simpleton of a function...
Chris@76: return ssi_queryPosts($query_where, $query_where_params, $num_recent, 'm.id_msg DESC', $output_method, $limit_body);
Chris@76: }
Chris@76:
Chris@76: // Fetch a post with a particular ID. By default will only show if you have permission to the see the board in question - this can be overriden.
Chris@76: function ssi_fetchPosts($post_ids = array(), $override_permissions = false, $output_method = 'echo')
Chris@76: {
Chris@76: global $user_info, $modSettings;
Chris@76:
Chris@76: if (empty($post_ids))
Chris@76: return;
Chris@76:
Chris@76: // Allow the user to request more than one - why not?
Chris@76: $post_ids = is_array($post_ids) ? $post_ids : array($post_ids);
Chris@76:
Chris@76: // Restrict the posts required...
Chris@76: $query_where = '
Chris@76: m.id_msg IN ({array_int:message_list})' . ($override_permissions ? '' : '
Chris@76: AND {query_wanna_see_board}') . ($modSettings['postmod_active'] ? '
Chris@76: AND m.approved = {int:is_approved}' : '');
Chris@76: $query_where_params = array(
Chris@76: 'message_list' => $post_ids,
Chris@76: 'is_approved' => 1,
Chris@76: );
Chris@76:
Chris@76: // Then make the query and dump the data.
Chris@76: return ssi_queryPosts($query_where, $query_where_params, '', 'm.id_msg DESC', $output_method);
Chris@76: }
Chris@76:
Chris@76: // This removes code duplication in other queries - don't call it direct unless you really know what you're up to.
Chris@76: function ssi_queryPosts($query_where = '', $query_where_params = array(), $query_limit = 10, $query_order = 'm.id_msg DESC', $output_method = 'echo', $limit_body = false, $override_permissions = false)
Chris@76: {
Chris@76: global $context, $settings, $scripturl, $txt, $db_prefix, $user_info;
Chris@76: global $modSettings, $smcFunc;
Chris@76:
Chris@76: // Find all the posts. Newer ones will have higher IDs.
Chris@76: $request = $smcFunc['db_query']('substring', '
Chris@76: SELECT
Chris@76: m.poster_time, m.subject, m.id_topic, m.id_member, m.id_msg, m.id_board, b.name AS board_name,
Chris@76: IFNULL(mem.real_name, m.poster_name) AS poster_name, ' . ($user_info['is_guest'] ? '1 AS is_read, 0 AS new_from' : '
Chris@76: IFNULL(lt.id_msg, IFNULL(lmr.id_msg, 0)) >= m.id_msg_modified AS is_read,
Chris@76: IFNULL(lt.id_msg, IFNULL(lmr.id_msg, -1)) + 1 AS new_from') . ', ' . ($limit_body ? 'SUBSTRING(m.body, 1, 384) AS body' : 'm.body') . ', m.smileys_enabled
Chris@76: FROM {db_prefix}messages AS m
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board)
Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (!$user_info['is_guest'] ? '
Chris@76: LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = m.id_topic AND lt.id_member = {int:current_member})
Chris@76: LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = m.id_board AND lmr.id_member = {int:current_member})' : '') . '
Chris@76: WHERE 1=1 ' . ($override_permissions ? '' : '
Chris@76: AND {query_wanna_see_board}') . ($modSettings['postmod_active'] ? '
Chris@76: AND m.approved = {int:is_approved}' : '') . '
Chris@76: ' . (empty($query_where) ? '' : 'AND ' . $query_where) . '
Chris@76: ORDER BY ' . $query_order . '
Chris@76: ' . ($query_limit == '' ? '' : 'LIMIT ' . $query_limit),
Chris@76: array_merge($query_where_params, array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'is_approved' => 1,
Chris@76: ))
Chris@76: );
Chris@76: $posts = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: $row['body'] = parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']);
Chris@76:
Chris@76: // Censor it!
Chris@76: censorText($row['subject']);
Chris@76: censorText($row['body']);
Chris@76:
Chris@76: $preview = strip_tags(strtr($row['body'], array('
' => '
')));
Chris@76:
Chris@76: // Build the array.
Chris@76: $posts[] = array(
Chris@76: 'id' => $row['id_msg'],
Chris@76: 'board' => array(
Chris@76: 'id' => $row['id_board'],
Chris@76: 'name' => $row['board_name'],
Chris@76: 'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
Chris@76: 'link' => '' . $row['board_name'] . ''
Chris@76: ),
Chris@76: 'topic' => $row['id_topic'],
Chris@76: 'poster' => array(
Chris@76: 'id' => $row['id_member'],
Chris@76: 'name' => $row['poster_name'],
Chris@76: 'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76: 'link' => empty($row['id_member']) ? $row['poster_name'] : '' . $row['poster_name'] . ''
Chris@76: ),
Chris@76: 'subject' => $row['subject'],
Chris@76: 'short_subject' => shorten_subject($row['subject'], 25),
Chris@76: 'preview' => $smcFunc['strlen']($preview) > 128 ? $smcFunc['substr']($preview, 0, 128) . '...' : $preview,
Chris@76: 'body' => $row['body'],
Chris@76: 'time' => timeformat($row['poster_time']),
Chris@76: 'timestamp' => forum_time(true, $row['poster_time']),
Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#new',
Chris@76: 'link' => '' . $row['subject'] . '',
Chris@76: 'new' => !empty($row['is_read']),
Chris@76: 'is_new' => empty($row['is_read']),
Chris@76: 'new_from' => $row['new_from'],
Chris@76: );
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Just return it.
Chris@76: if ($output_method != 'echo' || empty($posts))
Chris@76: return $posts;
Chris@76:
Chris@76: echo '
Chris@76:
';
Chris@76: foreach ($posts as $post)
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: [', $post['board']['link'], ']
Chris@76: |
Chris@76:
Chris@76: ', $post['subject'], '
Chris@76: ', $txt['by'], ' ', $post['poster']['link'], '
Chris@76: ', $post['is_new'] ? ' ' : '', '
Chris@76: |
Chris@76:
Chris@76: ', $post['time'], '
Chris@76: |
Chris@76:
';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: // Recent topic list: [board] Subject by Poster Date
Chris@76: function ssi_recentTopics($num_recent = 8, $exclude_boards = null, $include_boards = null, $output_method = 'echo')
Chris@76: {
Chris@76: global $context, $settings, $scripturl, $txt, $db_prefix, $user_info;
Chris@76: global $modSettings, $smcFunc;
Chris@76:
Chris@76: if ($exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
Chris@76: $exclude_boards = array($modSettings['recycle_board']);
Chris@76: else
Chris@76: $exclude_boards = empty($exclude_boards) ? array() : (is_array($exclude_boards) ? $exclude_boards : array($exclude_boards));
Chris@76:
Chris@76: // Only some boards?.
Chris@76: if (is_array($include_boards) || (int) $include_boards === $include_boards)
Chris@76: {
Chris@76: $include_boards = is_array($include_boards) ? $include_boards : array($include_boards);
Chris@76: }
Chris@76: elseif ($include_boards != null)
Chris@76: {
Chris@76: $output_method = $include_boards;
Chris@76: $include_boards = array();
Chris@76: }
Chris@76:
Chris@76: $stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
Chris@76: $icon_sources = array();
Chris@76: foreach ($stable_icons as $icon)
Chris@76: $icon_sources[$icon] = 'images_url';
Chris@76:
Chris@76: // Find all the posts in distinct topics. Newer ones will have higher IDs.
Chris@76: $request = $smcFunc['db_query']('substring', '
Chris@76: SELECT
Chris@76: m.poster_time, ms.subject, m.id_topic, m.id_member, m.id_msg, b.id_board, b.name AS board_name, t.num_replies, t.num_views,
Chris@76: IFNULL(mem.real_name, m.poster_name) AS poster_name, ' . ($user_info['is_guest'] ? '1 AS is_read, 0 AS new_from' : '
Chris@76: IFNULL(lt.id_msg, IFNULL(lmr.id_msg, 0)) >= m.id_msg_modified AS is_read,
Chris@76: IFNULL(lt.id_msg, IFNULL(lmr.id_msg, -1)) + 1 AS new_from') . ', SUBSTRING(m.body, 1, 384) AS body, m.smileys_enabled, m.icon
Chris@76: FROM {db_prefix}topics AS t
Chris@76: INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_last_msg)
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
Chris@76: INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg)
Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (!$user_info['is_guest'] ? '
Chris@76: LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = t.id_topic AND lt.id_member = {int:current_member})
Chris@76: LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = b.id_board AND lmr.id_member = {int:current_member})' : '') . '
Chris@76: WHERE t.id_last_msg >= {int:min_message_id}
Chris@76: ' . (empty($exclude_boards) ? '' : '
Chris@76: AND b.id_board NOT IN ({array_int:exclude_boards})') . '
Chris@76: ' . (empty($include_boards) ? '' : '
Chris@76: AND b.id_board IN ({array_int:include_boards})') . '
Chris@76: AND {query_wanna_see_board}' . ($modSettings['postmod_active'] ? '
Chris@76: AND t.approved = {int:is_approved}
Chris@76: AND m.approved = {int:is_approved}' : '') . '
Chris@76: ORDER BY t.id_last_msg DESC
Chris@76: LIMIT ' . $num_recent,
Chris@76: array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'include_boards' => empty($include_boards) ? '' : $include_boards,
Chris@76: 'exclude_boards' => empty($exclude_boards) ? '' : $exclude_boards,
Chris@76: 'min_message_id' => $modSettings['maxMsgID'] - 35 * min($num_recent, 5),
Chris@76: 'is_approved' => 1,
Chris@76: )
Chris@76: );
Chris@76: $posts = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: $row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']), array('
' => '
')));
Chris@76: if ($smcFunc['strlen']($row['body']) > 128)
Chris@76: $row['body'] = $smcFunc['substr']($row['body'], 0, 128) . '...';
Chris@76:
Chris@76: // Censor the subject.
Chris@76: censorText($row['subject']);
Chris@76: censorText($row['body']);
Chris@76:
Chris@76: if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
Chris@76: $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';
Chris@76:
Chris@76: // Build the array.
Chris@76: $posts[] = array(
Chris@76: 'board' => array(
Chris@76: 'id' => $row['id_board'],
Chris@76: 'name' => $row['board_name'],
Chris@76: 'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
Chris@76: 'link' => '' . $row['board_name'] . ''
Chris@76: ),
Chris@76: 'topic' => $row['id_topic'],
Chris@76: 'poster' => array(
Chris@76: 'id' => $row['id_member'],
Chris@76: 'name' => $row['poster_name'],
Chris@76: 'href' => empty($row['id_member']) ? '' : $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76: 'link' => empty($row['id_member']) ? $row['poster_name'] : '' . $row['poster_name'] . ''
Chris@76: ),
Chris@76: 'subject' => $row['subject'],
Chris@76: 'replies' => $row['num_replies'],
Chris@76: 'views' => $row['num_views'],
Chris@76: 'short_subject' => shorten_subject($row['subject'], 25),
Chris@76: 'preview' => $row['body'],
Chris@76: 'time' => timeformat($row['poster_time']),
Chris@76: 'timestamp' => forum_time(true, $row['poster_time']),
Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . ';topicseen#new',
Chris@76: 'link' => '' . $row['subject'] . '',
Chris@76: // Retained for compatibility - is technically incorrect!
Chris@76: 'new' => !empty($row['is_read']),
Chris@76: 'is_new' => empty($row['is_read']),
Chris@76: 'new_from' => $row['new_from'],
Chris@76: 'icon' => '
',
Chris@76: );
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Just return it.
Chris@76: if ($output_method != 'echo' || empty($posts))
Chris@76: return $posts;
Chris@76:
Chris@76: echo '
Chris@76: ';
Chris@76: foreach ($posts as $post)
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: [', $post['board']['link'], ']
Chris@76: |
Chris@76:
Chris@76: ', $post['subject'], '
Chris@76: ', $txt['by'], ' ', $post['poster']['link'], '
Chris@76: ', !$post['is_new'] ? '' : ' ', '
Chris@76: |
Chris@76:
Chris@76: ', $post['time'], '
Chris@76: |
Chris@76:
';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: // Show the top poster's name and profile link.
Chris@76: function ssi_topPoster($topNumber = 1, $output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $scripturl, $smcFunc;
Chris@76:
Chris@76: // Find the latest poster.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_member, real_name, posts
Chris@76: FROM {db_prefix}members
Chris@76: ORDER BY posts DESC
Chris@76: LIMIT ' . $topNumber,
Chris@76: array(
Chris@76: )
Chris@76: );
Chris@76: $return = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: $return[] = array(
Chris@76: 'id' => $row['id_member'],
Chris@76: 'name' => $row['real_name'],
Chris@76: 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76: 'link' => '' . $row['real_name'] . '',
Chris@76: 'posts' => $row['posts']
Chris@76: );
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Just return all the top posters.
Chris@76: if ($output_method != 'echo')
Chris@76: return $return;
Chris@76:
Chris@76: // Make a quick array to list the links in.
Chris@76: $temp_array = array();
Chris@76: foreach ($return as $member)
Chris@76: $temp_array[] = $member['link'];
Chris@76:
Chris@76: echo implode(', ', $temp_array);
Chris@76: }
Chris@76:
Chris@76: // Show boards by activity.
Chris@76: function ssi_topBoards($num_top = 10, $output_method = 'echo')
Chris@76: {
Chris@76: global $context, $settings, $db_prefix, $txt, $scripturl, $user_info, $modSettings, $smcFunc;
Chris@76:
Chris@76: // Find boards with lots of posts.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: b.name, b.num_topics, b.num_posts, b.id_board,' . (!$user_info['is_guest'] ? ' 1 AS is_read' : '
Chris@76: (IFNULL(lb.id_msg, 0) >= b.id_last_msg) AS is_read') . '
Chris@76: FROM {db_prefix}boards AS b
Chris@76: LEFT JOIN {db_prefix}log_boards AS lb ON (lb.id_board = b.id_board AND lb.id_member = {int:current_member})
Chris@76: WHERE {query_wanna_see_board}' . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
Chris@76: AND b.id_board != {int:recycle_board}' : '') . '
Chris@76: ORDER BY b.num_posts DESC
Chris@76: LIMIT ' . $num_top,
Chris@76: array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'recycle_board' => (int) $modSettings['recycle_board'],
Chris@76: )
Chris@76: );
Chris@76: $boards = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: $boards[] = array(
Chris@76: 'id' => $row['id_board'],
Chris@76: 'num_posts' => $row['num_posts'],
Chris@76: 'num_topics' => $row['num_topics'],
Chris@76: 'name' => $row['name'],
Chris@76: 'new' => empty($row['is_read']),
Chris@76: 'href' => $scripturl . '?board=' . $row['id_board'] . '.0',
Chris@76: 'link' => '' . $row['name'] . ''
Chris@76: );
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // If we shouldn't output or have nothing to output, just jump out.
Chris@76: if ($output_method != 'echo' || empty($boards))
Chris@76: return $boards;
Chris@76:
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: ', $txt['board'], ' |
Chris@76: ', $txt['board_topics'], ' |
Chris@76: ', $txt['posts'], ' |
Chris@76:
';
Chris@76: foreach ($boards as $board)
Chris@76: echo '
Chris@76:
Chris@76: ', $board['link'], $board['new'] ? ' ' : '', ' |
Chris@76: ', comma_format($board['num_topics']), ' |
Chris@76: ', comma_format($board['num_posts']), ' |
Chris@76:
';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: // Shows the top topics.
Chris@76: function ssi_topTopics($type = 'replies', $num_topics = 10, $output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $txt, $scripturl, $user_info, $modSettings, $smcFunc, $context;
Chris@76:
Chris@76: if ($modSettings['totalMessages'] > 100000)
Chris@76: {
Chris@76: // !!! Why don't we use {query(_wanna)_see_board}?
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_topic
Chris@76: FROM {db_prefix}topics
Chris@76: WHERE num_' . ($type != 'replies' ? 'views' : 'replies') . ' != 0' . ($modSettings['postmod_active'] ? '
Chris@76: AND approved = {int:is_approved}' : '') . '
Chris@76: ORDER BY num_' . ($type != 'replies' ? 'views' : 'replies') . ' DESC
Chris@76: LIMIT {int:limit}',
Chris@76: array(
Chris@76: 'is_approved' => 1,
Chris@76: 'limit' => $num_topics > 100 ? ($num_topics + ($num_topics / 2)) : 100,
Chris@76: )
Chris@76: );
Chris@76: $topic_ids = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: $topic_ids[] = $row['id_topic'];
Chris@76: $smcFunc['db_free_result']($request);
Chris@76: }
Chris@76: else
Chris@76: $topic_ids = array();
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT m.subject, m.id_topic, t.num_views, t.num_replies
Chris@76: FROM {db_prefix}topics AS t
Chris@76: INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg)
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
Chris@76: WHERE {query_wanna_see_board}' . ($modSettings['postmod_active'] ? '
Chris@76: AND t.approved = {int:is_approved}' : '') . (!empty($topic_ids) ? '
Chris@76: AND t.id_topic IN ({array_int:topic_list})' : '') . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
Chris@76: AND b.id_board != {int:recycle_enable}' : '') . '
Chris@76: ORDER BY t.num_' . ($type != 'replies' ? 'views' : 'replies') . ' DESC
Chris@76: LIMIT {int:limit}',
Chris@76: array(
Chris@76: 'topic_list' => $topic_ids,
Chris@76: 'is_approved' => 1,
Chris@76: 'recycle_enable' => $modSettings['recycle_board'],
Chris@76: 'limit' => $num_topics,
Chris@76: )
Chris@76: );
Chris@76: $topics = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: censorText($row['subject']);
Chris@76:
Chris@76: $topics[] = array(
Chris@76: 'id' => $row['id_topic'],
Chris@76: 'subject' => $row['subject'],
Chris@76: 'num_replies' => $row['num_replies'],
Chris@76: 'num_views' => $row['num_views'],
Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0',
Chris@76: 'link' => '' . $row['subject'] . '',
Chris@76: );
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: if ($output_method != 'echo' || empty($topics))
Chris@76: return $topics;
Chris@76:
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: |
Chris@76: ', $txt['views'], ' |
Chris@76: ', $txt['replies'], ' |
Chris@76:
';
Chris@76: foreach ($topics as $topic)
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: ', $topic['link'], '
Chris@76: |
Chris@76: ', comma_format($topic['num_views']), ' |
Chris@76: ', comma_format($topic['num_replies']), ' |
Chris@76:
';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: // Shows the top topics, by replies.
Chris@76: function ssi_topTopicsReplies($num_topics = 10, $output_method = 'echo')
Chris@76: {
Chris@76: return ssi_topTopics('replies', $num_topics, $output_method);
Chris@76: }
Chris@76:
Chris@76: // Shows the top topics, by views.
Chris@76: function ssi_topTopicsViews($num_topics = 10, $output_method = 'echo')
Chris@76: {
Chris@76: return ssi_topTopics('views', $num_topics, $output_method);
Chris@76: }
Chris@76:
Chris@76: // Show a link to the latest member: Please welcome, Someone, out latest member.
Chris@76: function ssi_latestMember($output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $txt, $scripturl, $context;
Chris@76:
Chris@76: if ($output_method == 'echo')
Chris@76: echo '
Chris@76: ', $txt['welcome_member'], ' ', $context['common_stats']['latest_member']['link'], '', $txt['newest_member'], '
';
Chris@76: else
Chris@76: return $context['common_stats']['latest_member'];
Chris@76: }
Chris@76:
Chris@76: // Fetch a random member - if type set to 'day' will only change once a day!
Chris@76: function ssi_randomMember($random_type = '', $output_method = 'echo')
Chris@76: {
Chris@76: global $modSettings;
Chris@76:
Chris@76: // If we're looking for something to stay the same each day then seed the generator.
Chris@76: if ($random_type == 'day')
Chris@76: {
Chris@76: // Set the seed to change only once per day.
Chris@76: mt_srand(floor(time() / 86400));
Chris@76: }
Chris@76:
Chris@76: // Get the lowest ID we're interested in.
Chris@76: $member_id = mt_rand(1, $modSettings['latestMember']);
Chris@76:
Chris@76: $where_query = '
Chris@76: id_member >= {int:selected_member}
Chris@76: AND is_activated = {int:is_activated}';
Chris@76:
Chris@76: $query_where_params = array(
Chris@76: 'selected_member' => $member_id,
Chris@76: 'is_activated' => 1,
Chris@76: );
Chris@76:
Chris@76: $result = ssi_queryMembers($where_query, $query_where_params, 1, 'id_member ASC', $output_method);
Chris@76:
Chris@76: // If we got nothing do the reverse - in case of unactivated members.
Chris@76: if (empty($result))
Chris@76: {
Chris@76: $where_query = '
Chris@76: id_member <= {int:selected_member}
Chris@76: AND is_activated = {int:is_activated}';
Chris@76:
Chris@76: $query_where_params = array(
Chris@76: 'selected_member' => $member_id,
Chris@76: 'is_activated' => 1,
Chris@76: );
Chris@76:
Chris@76: $result = ssi_queryMembers($where_query, $query_where_params, 1, 'id_member DESC', $output_method);
Chris@76: }
Chris@76:
Chris@76: // Just to be sure put the random generator back to something... random.
Chris@76: if ($random_type != '')
Chris@76: mt_srand(time());
Chris@76:
Chris@76: return $result;
Chris@76: }
Chris@76:
Chris@76: // Fetch a specific member.
Chris@76: function ssi_fetchMember($member_ids = array(), $output_method = 'echo')
Chris@76: {
Chris@76: if (empty($member_ids))
Chris@76: return;
Chris@76:
Chris@76: // Can have more than one member if you really want...
Chris@76: $member_ids = is_array($member_ids) ? $member_ids : array($member_ids);
Chris@76:
Chris@76: // Restrict it right!
Chris@76: $query_where = '
Chris@76: id_member IN ({array_int:member_list})';
Chris@76:
Chris@76: $query_where_params = array(
Chris@76: 'member_list' => $member_ids,
Chris@76: );
Chris@76:
Chris@76: // Then make the query and dump the data.
Chris@76: return ssi_queryMembers($query_where, $query_where_params, '', 'id_member', $output_method);
Chris@76: }
Chris@76:
Chris@76: // Get all members of a group.
Chris@76: function ssi_fetchGroupMembers($group_id = null, $output_method = 'echo')
Chris@76: {
Chris@76: if ($group_id === null)
Chris@76: return;
Chris@76:
Chris@76: $query_where = '
Chris@76: id_group = {int:id_group}
Chris@76: OR id_post_group = {int:id_group}
Chris@76: OR FIND_IN_SET({int:id_group}, additional_groups)';
Chris@76:
Chris@76: $query_where_params = array(
Chris@76: 'id_group' => $group_id,
Chris@76: );
Chris@76:
Chris@76: return ssi_queryMembers($query_where, $query_where_params, '', 'real_name', $output_method);
Chris@76: }
Chris@76:
Chris@76: // Fetch some member data!
Chris@76: function ssi_queryMembers($query_where = null, $query_where_params = array(), $query_limit = '', $query_order = 'id_member DESC', $output_method = 'echo')
Chris@76: {
Chris@76: global $context, $settings, $scripturl, $txt, $db_prefix, $user_info;
Chris@76: global $modSettings, $smcFunc, $memberContext;
Chris@76:
Chris@76: if ($query_where === null)
Chris@76: return;
Chris@76:
Chris@76: // Fetch the members in question.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_member
Chris@76: FROM {db_prefix}members
Chris@76: WHERE ' . $query_where . '
Chris@76: ORDER BY ' . $query_order . '
Chris@76: ' . ($query_limit == '' ? '' : 'LIMIT ' . $query_limit),
Chris@76: array_merge($query_where_params, array(
Chris@76: ))
Chris@76: );
Chris@76: $members = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: $members[] = $row['id_member'];
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: if (empty($members))
Chris@76: return array();
Chris@76:
Chris@76: // Load the members.
Chris@76: loadMemberData($members);
Chris@76:
Chris@76: // Draw the table!
Chris@76: if ($output_method == 'echo')
Chris@76: echo '
Chris@76: ';
Chris@76:
Chris@76: $query_members = array();
Chris@76: foreach ($members as $member)
Chris@76: {
Chris@76: // Load their context data.
Chris@76: if (!loadMemberContext($member))
Chris@76: continue;
Chris@76:
Chris@76: // Store this member's information.
Chris@76: $query_members[$member] = $memberContext[$member];
Chris@76:
Chris@76: // Only do something if we're echo'ing.
Chris@76: if ($output_method == 'echo')
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: ', $query_members[$member]['link'], '
Chris@76: ', $query_members[$member]['blurb'], '
Chris@76: ', $query_members[$member]['avatar']['image'], '
Chris@76: |
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: // End the table if appropriate.
Chris@76: if ($output_method == 'echo')
Chris@76: echo '
Chris@76:
';
Chris@76:
Chris@76: // Send back the data.
Chris@76: return $query_members;
Chris@76: }
Chris@76:
Chris@76: // Show some basic stats: Total This: XXXX, etc.
Chris@76: function ssi_boardStats($output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $txt, $scripturl, $modSettings, $smcFunc;
Chris@76:
Chris@76: $totals = array(
Chris@76: 'members' => $modSettings['totalMembers'],
Chris@76: 'posts' => $modSettings['totalMessages'],
Chris@76: 'topics' => $modSettings['totalTopics']
Chris@76: );
Chris@76:
Chris@76: $result = $smcFunc['db_query']('', '
Chris@76: SELECT COUNT(*)
Chris@76: FROM {db_prefix}boards',
Chris@76: array(
Chris@76: )
Chris@76: );
Chris@76: list ($totals['boards']) = $smcFunc['db_fetch_row']($result);
Chris@76: $smcFunc['db_free_result']($result);
Chris@76:
Chris@76: $result = $smcFunc['db_query']('', '
Chris@76: SELECT COUNT(*)
Chris@76: FROM {db_prefix}categories',
Chris@76: array(
Chris@76: )
Chris@76: );
Chris@76: list ($totals['categories']) = $smcFunc['db_fetch_row']($result);
Chris@76: $smcFunc['db_free_result']($result);
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $totals;
Chris@76:
Chris@76: echo '
Chris@76: ', $txt['total_members'], ': ', comma_format($totals['members']), '
Chris@76: ', $txt['total_posts'], ': ', comma_format($totals['posts']), '
Chris@76: ', $txt['total_topics'], ': ', comma_format($totals['topics']), '
Chris@76: ', $txt['total_cats'], ': ', comma_format($totals['categories']), '
Chris@76: ', $txt['total_boards'], ': ', comma_format($totals['boards']);
Chris@76: }
Chris@76:
Chris@76: // Shows a list of online users: YY Guests, ZZ Users and then a list...
Chris@76: function ssi_whosOnline($output_method = 'echo')
Chris@76: {
Chris@76: global $user_info, $txt, $sourcedir, $settings, $modSettings;
Chris@76:
Chris@76: require_once($sourcedir . '/Subs-MembersOnline.php');
Chris@76: $membersOnlineOptions = array(
Chris@76: 'show_hidden' => allowedTo('moderate_forum'),
Chris@76: 'sort' => 'log_time',
Chris@76: 'reverse_sort' => true,
Chris@76: );
Chris@76: $return = getMembersOnlineStats($membersOnlineOptions);
Chris@76:
Chris@76: // Add some redundancy for backwards compatibility reasons.
Chris@76: if ($output_method != 'echo')
Chris@76: return $return + array(
Chris@76: 'users' => $return['users_online'],
Chris@76: 'guests' => $return['num_guests'],
Chris@76: 'hidden' => $return['num_users_hidden'],
Chris@76: 'buddies' => $return['num_buddies'],
Chris@76: 'num_users' => $return['num_users_online'],
Chris@76: 'total_users' => $return['num_users_online'] + $return['num_guests'] + $return['num_spiders'],
Chris@76: );
Chris@76:
Chris@76: echo '
Chris@76: ', comma_format($return['num_guests']), ' ', $return['num_guests'] == 1 ? $txt['guest'] : $txt['guests'], ', ', comma_format($return['num_users_online']), ' ', $return['num_users_online'] == 1 ? $txt['user'] : $txt['users'];
Chris@76:
Chris@76: $bracketList = array();
Chris@76: if (!empty($user_info['buddies']))
Chris@76: $bracketList[] = comma_format($return['num_buddies']) . ' ' . ($return['num_buddies'] == 1 ? $txt['buddy'] : $txt['buddies']);
Chris@76: if (!empty($return['num_spiders']))
Chris@76: $bracketList[] = comma_format($return['num_spiders']) . ' ' . ($return['num_spiders'] == 1 ? $txt['spider'] : $txt['spiders']);
Chris@76: if (!empty($return['num_users_hidden']))
Chris@76: $bracketList[] = comma_format($return['num_users_hidden']) . ' ' . $txt['hidden'];
Chris@76:
Chris@76: if (!empty($bracketList))
Chris@76: echo ' (' . implode(', ', $bracketList) . ')';
Chris@76:
Chris@76: echo '
Chris@76: ', implode(', ', $return['list_users_online']);
Chris@76:
Chris@76: // Showing membergroups?
Chris@76: if (!empty($settings['show_group_key']) && !empty($return['membergroups']))
Chris@76: echo '
Chris@76: [' . implode('] [', $return['membergroups']) . ']';
Chris@76: }
Chris@76:
Chris@76: // Just like whosOnline except it also logs the online presence.
Chris@76: function ssi_logOnline($output_method = 'echo')
Chris@76: {
Chris@76: writeLog();
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return ssi_whosOnline($output_method);
Chris@76: else
Chris@76: ssi_whosOnline($output_method);
Chris@76: }
Chris@76:
Chris@76: // Shows a login box.
Chris@76: function ssi_login($redirect_to = '', $output_method = 'echo')
Chris@76: {
Chris@76: global $scripturl, $txt, $user_info, $context, $modSettings;
Chris@76:
Chris@76: if ($redirect_to != '')
Chris@76: $_SESSION['login_url'] = $redirect_to;
Chris@76:
Chris@76: if ($output_method != 'echo' || !$user_info['is_guest'])
Chris@76: return $user_info['is_guest'];
Chris@76:
Chris@76: echo '
Chris@76: ';
Chris@76:
Chris@76: }
Chris@76:
Chris@76: // Show the most-voted-in poll.
Chris@76: function ssi_topPoll($output_method = 'echo')
Chris@76: {
Chris@76: // Just use recentPoll, no need to duplicate code...
Chris@76: return ssi_recentPoll(true, $output_method);
Chris@76: }
Chris@76:
Chris@76: // Show the most recently posted poll.
Chris@76: function ssi_recentPoll($topPollInstead = false, $output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $txt, $settings, $boardurl, $user_info, $context, $smcFunc, $modSettings;
Chris@76:
Chris@76: $boardsAllowed = array_intersect(boardsAllowedTo('poll_view'), boardsAllowedTo('poll_vote'));
Chris@76:
Chris@76: if (empty($boardsAllowed))
Chris@76: return array();
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT p.id_poll, p.question, t.id_topic, p.max_votes, p.guest_vote, p.hide_results, p.expire_time
Chris@76: FROM {db_prefix}polls AS p
Chris@76: INNER JOIN {db_prefix}topics AS t ON (t.id_poll = p.id_poll' . ($modSettings['postmod_active'] ? ' AND t.approved = {int:is_approved}' : '') . ')
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)' . ($topPollInstead ? '
Chris@76: INNER JOIN {db_prefix}poll_choices AS pc ON (pc.id_poll = p.id_poll)' : '') . '
Chris@76: LEFT JOIN {db_prefix}log_polls AS lp ON (lp.id_poll = p.id_poll AND lp.id_member > {int:no_member} AND lp.id_member = {int:current_member})
Chris@76: WHERE p.voting_locked = {int:voting_opened}
Chris@76: AND (p.expire_time = {int:no_expiration} OR {int:current_time} < p.expire_time)
Chris@76: AND ' . ($user_info['is_guest'] ? 'p.guest_vote = {int:guest_vote_allowed}' : 'lp.id_choice IS NULL') . '
Chris@76: AND {query_wanna_see_board}' . (!in_array(0, $boardsAllowed) ? '
Chris@76: AND b.id_board IN ({array_int:boards_allowed_list})' : '') . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
Chris@76: AND b.id_board != {int:recycle_enable}' : '') . '
Chris@76: ORDER BY ' . ($topPollInstead ? 'pc.votes' : 'p.id_poll') . ' DESC
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'boards_allowed_list' => $boardsAllowed,
Chris@76: 'is_approved' => 1,
Chris@76: 'guest_vote_allowed' => 1,
Chris@76: 'no_member' => 0,
Chris@76: 'voting_opened' => 0,
Chris@76: 'no_expiration' => 0,
Chris@76: 'current_time' => time(),
Chris@76: 'recycle_enable' => $modSettings['recycle_board'],
Chris@76: )
Chris@76: );
Chris@76: $row = $smcFunc['db_fetch_assoc']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // This user has voted on all the polls.
Chris@76: if ($row === false)
Chris@76: return array();
Chris@76:
Chris@76: // If this is a guest who's voted we'll through ourselves to show poll to show the results.
Chris@76: if ($user_info['is_guest'] && (!$row['guest_vote'] || (isset($_COOKIE['guest_poll_vote']) && in_array($row['id_poll'], explode(',', $_COOKIE['guest_poll_vote'])))))
Chris@76: return ssi_showPoll($row['id_topic'], $output_method);
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT COUNT(DISTINCT id_member)
Chris@76: FROM {db_prefix}log_polls
Chris@76: WHERE id_poll = {int:current_poll}',
Chris@76: array(
Chris@76: 'current_poll' => $row['id_poll'],
Chris@76: )
Chris@76: );
Chris@76: list ($total) = $smcFunc['db_fetch_row']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_choice, label, votes
Chris@76: FROM {db_prefix}poll_choices
Chris@76: WHERE id_poll = {int:current_poll}',
Chris@76: array(
Chris@76: 'current_poll' => $row['id_poll'],
Chris@76: )
Chris@76: );
Chris@76: $options = array();
Chris@76: while ($rowChoice = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: censorText($rowChoice['label']);
Chris@76:
Chris@76: $options[$rowChoice['id_choice']] = array($rowChoice['label'], $rowChoice['votes']);
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Can they view it?
Chris@76: $is_expired = !empty($row['expire_time']) && $row['expire_time'] < time();
Chris@76: $allow_view_results = allowedTo('moderate_board') || $row['hide_results'] == 0 || $is_expired;
Chris@76:
Chris@76: $return = array(
Chris@76: 'id' => $row['id_poll'],
Chris@76: 'image' => 'poll',
Chris@76: 'question' => $row['question'],
Chris@76: 'total_votes' => $total,
Chris@76: 'is_locked' => false,
Chris@76: 'topic' => $row['id_topic'],
Chris@76: 'allow_view_results' => $allow_view_results,
Chris@76: 'options' => array()
Chris@76: );
Chris@76:
Chris@76: // Calculate the percentages and bar lengths...
Chris@76: $divisor = $return['total_votes'] == 0 ? 1 : $return['total_votes'];
Chris@76: foreach ($options as $i => $option)
Chris@76: {
Chris@76: $bar = floor(($option[1] * 100) / $divisor);
Chris@76: $barWide = $bar == 0 ? 1 : floor(($bar * 5) / 3);
Chris@76: $return['options'][$i] = array(
Chris@76: 'id' => 'options-' . ($topPollInstead ? 'top-' : 'recent-') . $i,
Chris@76: 'percent' => $bar,
Chris@76: 'votes' => $option[1],
Chris@76: 'bar' => ' . '.gif)

',
Chris@76: 'option' => parse_bbc($option[0]),
Chris@76: 'vote_button' => ''
Chris@76: );
Chris@76: }
Chris@76:
Chris@76: $return['allowed_warning'] = $row['max_votes'] > 1 ? sprintf($txt['poll_options6'], min(count($options), $row['max_votes'])) : '';
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return;
Chris@76:
Chris@76: if ($allow_view_results)
Chris@76: {
Chris@76: echo '
Chris@76: ';
Chris@76: }
Chris@76: else
Chris@76: echo $txt['poll_cannot_see'];
Chris@76: }
Chris@76:
Chris@76: function ssi_showPoll($topic = null, $output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $txt, $settings, $boardurl, $user_info, $context, $smcFunc, $modSettings;
Chris@76:
Chris@76: $boardsAllowed = boardsAllowedTo('poll_view');
Chris@76:
Chris@76: if (empty($boardsAllowed))
Chris@76: return array();
Chris@76:
Chris@76: if ($topic === null && isset($_REQUEST['ssi_topic']))
Chris@76: $topic = (int) $_REQUEST['ssi_topic'];
Chris@76: else
Chris@76: $topic = (int) $topic;
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: p.id_poll, p.question, p.voting_locked, p.hide_results, p.expire_time, p.max_votes, p.guest_vote, b.id_board
Chris@76: FROM {db_prefix}topics AS t
Chris@76: INNER JOIN {db_prefix}polls AS p ON (p.id_poll = t.id_poll)
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
Chris@76: WHERE t.id_topic = {int:current_topic}
Chris@76: AND {query_see_board}' . (!in_array(0, $boardsAllowed) ? '
Chris@76: AND b.id_board IN ({array_int:boards_allowed_see})' : '') . ($modSettings['postmod_active'] ? '
Chris@76: AND t.approved = {int:is_approved}' : '') . '
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'current_topic' => $topic,
Chris@76: 'boards_allowed_see' => $boardsAllowed,
Chris@76: 'is_approved' => 1,
Chris@76: )
Chris@76: );
Chris@76:
Chris@76: // Either this topic has no poll, or the user cannot view it.
Chris@76: if ($smcFunc['db_num_rows']($request) == 0)
Chris@76: return array();
Chris@76:
Chris@76: $row = $smcFunc['db_fetch_assoc']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Check if they can vote.
Chris@76: if (!empty($row['expire_time']) && $row['expire_time'] < time())
Chris@76: $allow_vote = false;
Chris@76: elseif ($user_info['is_guest'] && $row['guest_vote'] && (!isset($_COOKIE['guest_poll_vote']) || !in_array($row['id_poll'], explode(',', $_COOKIE['guest_poll_vote']))))
Chris@76: $allow_vote = true;
Chris@76: elseif ($user_info['is_guest'])
Chris@76: $allow_vote = false;
Chris@76: elseif (!empty($row['voting_locked']) || !allowedTo('poll_vote', $row['id_board']))
Chris@76: $allow_vote = false;
Chris@76: else
Chris@76: {
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_member
Chris@76: FROM {db_prefix}log_polls
Chris@76: WHERE id_poll = {int:current_poll}
Chris@76: AND id_member = {int:current_member}
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'current_poll' => $row['id_poll'],
Chris@76: )
Chris@76: );
Chris@76: $allow_vote = $smcFunc['db_num_rows']($request) == 0;
Chris@76: $smcFunc['db_free_result']($request);
Chris@76: }
Chris@76:
Chris@76: // Can they view?
Chris@76: $is_expired = !empty($row['expire_time']) && $row['expire_time'] < time();
Chris@76: $allow_view_results = allowedTo('moderate_board') || $row['hide_results'] == 0 || ($row['hide_results'] == 1 && !$allow_vote) || $is_expired;
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT COUNT(DISTINCT id_member)
Chris@76: FROM {db_prefix}log_polls
Chris@76: WHERE id_poll = {int:current_poll}',
Chris@76: array(
Chris@76: 'current_poll' => $row['id_poll'],
Chris@76: )
Chris@76: );
Chris@76: list ($total) = $smcFunc['db_fetch_row']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_choice, label, votes
Chris@76: FROM {db_prefix}poll_choices
Chris@76: WHERE id_poll = {int:current_poll}',
Chris@76: array(
Chris@76: 'current_poll' => $row['id_poll'],
Chris@76: )
Chris@76: );
Chris@76: $options = array();
Chris@76: $total_votes = 0;
Chris@76: while ($rowChoice = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: censorText($rowChoice['label']);
Chris@76:
Chris@76: $options[$rowChoice['id_choice']] = array($rowChoice['label'], $rowChoice['votes']);
Chris@76: $total_votes += $rowChoice['votes'];
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: $return = array(
Chris@76: 'id' => $row['id_poll'],
Chris@76: 'image' => empty($pollinfo['voting_locked']) ? 'poll' : 'locked_poll',
Chris@76: 'question' => $row['question'],
Chris@76: 'total_votes' => $total,
Chris@76: 'is_locked' => !empty($pollinfo['voting_locked']),
Chris@76: 'allow_vote' => $allow_vote,
Chris@76: 'allow_view_results' => $allow_view_results,
Chris@76: 'topic' => $topic
Chris@76: );
Chris@76:
Chris@76: // Calculate the percentages and bar lengths...
Chris@76: $divisor = $total_votes == 0 ? 1 : $total_votes;
Chris@76: foreach ($options as $i => $option)
Chris@76: {
Chris@76: $bar = floor(($option[1] * 100) / $divisor);
Chris@76: $barWide = $bar == 0 ? 1 : floor(($bar * 5) / 3);
Chris@76: $return['options'][$i] = array(
Chris@76: 'id' => 'options-' . $i,
Chris@76: 'percent' => $bar,
Chris@76: 'votes' => $option[1],
Chris@76: 'bar' => ' . '.gif)

',
Chris@76: 'option' => parse_bbc($option[0]),
Chris@76: 'vote_button' => ''
Chris@76: );
Chris@76: }
Chris@76:
Chris@76: $return['allowed_warning'] = $row['max_votes'] > 1 ? sprintf($txt['poll_options6'], min(count($options), $row['max_votes'])) : '';
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return;
Chris@76:
Chris@76: if ($return['allow_vote'])
Chris@76: {
Chris@76: echo '
Chris@76: ';
Chris@76: }
Chris@76: elseif ($return['allow_view_results'])
Chris@76: {
Chris@76: echo '
Chris@76:
Chris@76:
', $return['question'], '
Chris@76:
';
Chris@76:
Chris@76: foreach ($return['options'] as $option)
Chris@76: echo '
Chris@76: - ', $option['option'], '
Chris@76: -
Chris@76:
Chris@76:
Chris@76:
Chris@76:
Chris@76: ', $option['votes'], ' (', $option['percent'], '%)
Chris@76: ';
Chris@76: echo '
Chris@76:
Chris@76:
', $txt['poll_total_voters'], ': ', $return['total_votes'], '
Chris@76:
';
Chris@76: }
Chris@76: // Cannot see it I'm afraid!
Chris@76: else
Chris@76: echo $txt['poll_cannot_see'];
Chris@76: }
Chris@76:
Chris@76: // Takes care of voting - don't worry, this is done automatically.
Chris@76: function ssi_pollVote()
Chris@76: {
Chris@76: global $context, $db_prefix, $user_info, $sc, $smcFunc, $sourcedir, $modSettings;
Chris@76:
Chris@76: if (!isset($_POST[$context['session_var']]) || $_POST[$context['session_var']] != $sc || empty($_POST['options']) || !isset($_POST['poll']))
Chris@76: {
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76:
Chris@76:
Chris@76: «
Chris@76: ';
Chris@76: return;
Chris@76: }
Chris@76:
Chris@76: // This can cause weird errors! (ie. copyright missing.)
Chris@76: checkSession();
Chris@76:
Chris@76: $_POST['poll'] = (int) $_POST['poll'];
Chris@76:
Chris@76: // Check if they have already voted, or voting is locked.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: p.id_poll, p.voting_locked, p.expire_time, p.max_votes, p.guest_vote,
Chris@76: t.id_topic,
Chris@76: IFNULL(lp.id_choice, -1) AS selected
Chris@76: FROM {db_prefix}polls AS p
Chris@76: INNER JOIN {db_prefix}topics AS t ON (t.id_poll = {int:current_poll})
Chris@76: INNER JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board)
Chris@76: LEFT JOIN {db_prefix}log_polls AS lp ON (lp.id_poll = p.id_poll AND lp.id_member = {int:current_member})
Chris@76: WHERE p.id_poll = {int:current_poll}
Chris@76: AND {query_see_board}' . ($modSettings['postmod_active'] ? '
Chris@76: AND t.approved = {int:is_approved}' : '') . '
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'current_member' => $user_info['id'],
Chris@76: 'current_poll' => $_POST['poll'],
Chris@76: 'is_approved' => 1,
Chris@76: )
Chris@76: );
Chris@76: if ($smcFunc['db_num_rows']($request) == 0)
Chris@76: die;
Chris@76: $row = $smcFunc['db_fetch_assoc']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: if (!empty($row['voting_locked']) || ($row['selected'] != -1 && !$user_info['is_guest']) || (!empty($row['expire_time']) && time() > $row['expire_time']))
Chris@76: redirectexit('topic=' . $row['id_topic'] . '.0');
Chris@76:
Chris@76: // Too many options checked?
Chris@76: if (count($_REQUEST['options']) > $row['max_votes'])
Chris@76: redirectexit('topic=' . $row['id_topic'] . '.0');
Chris@76:
Chris@76: // It's a guest who has already voted?
Chris@76: if ($user_info['is_guest'])
Chris@76: {
Chris@76: // Guest voting disabled?
Chris@76: if (!$row['guest_vote'])
Chris@76: redirectexit('topic=' . $row['id_topic'] . '.0');
Chris@76: // Already voted?
Chris@76: elseif (isset($_COOKIE['guest_poll_vote']) && in_array($row['id_poll'], explode(',', $_COOKIE['guest_poll_vote'])))
Chris@76: redirectexit('topic=' . $row['id_topic'] . '.0');
Chris@76: }
Chris@76:
Chris@76: $options = array();
Chris@76: $inserts = array();
Chris@76: foreach ($_REQUEST['options'] as $id)
Chris@76: {
Chris@76: $id = (int) $id;
Chris@76:
Chris@76: $options[] = $id;
Chris@76: $inserts[] = array($_POST['poll'], $user_info['id'], $id);
Chris@76: }
Chris@76:
Chris@76: // Add their vote in to the tally.
Chris@76: $smcFunc['db_insert']('insert',
Chris@76: $db_prefix . 'log_polls',
Chris@76: array('id_poll' => 'int', 'id_member' => 'int', 'id_choice' => 'int'),
Chris@76: $inserts,
Chris@76: array('id_poll', 'id_member', 'id_choice')
Chris@76: );
Chris@76: $smcFunc['db_query']('', '
Chris@76: UPDATE {db_prefix}poll_choices
Chris@76: SET votes = votes + 1
Chris@76: WHERE id_poll = {int:current_poll}
Chris@76: AND id_choice IN ({array_int:option_list})',
Chris@76: array(
Chris@76: 'option_list' => $options,
Chris@76: 'current_poll' => $_POST['poll'],
Chris@76: )
Chris@76: );
Chris@76:
Chris@76: // Track the vote if a guest.
Chris@76: if ($user_info['is_guest'])
Chris@76: {
Chris@76: $_COOKIE['guest_poll_vote'] = !empty($_COOKIE['guest_poll_vote']) ? ($_COOKIE['guest_poll_vote'] . ',' . $row['id_poll']) : $row['id_poll'];
Chris@76:
Chris@76: require_once($sourcedir . '/Subs-Auth.php');
Chris@76: $cookie_url = url_parts(!empty($modSettings['localCookies']), !empty($modSettings['globalCookies']));
Chris@76: setcookie('guest_poll_vote', $_COOKIE['guest_poll_vote'], time() + 2500000, $cookie_url[1], $cookie_url[0], 0);
Chris@76: }
Chris@76:
Chris@76: redirectexit('topic=' . $row['id_topic'] . '.0');
Chris@76: }
Chris@76:
Chris@76: // Show a search box.
Chris@76: function ssi_quickSearch($output_method = 'echo')
Chris@76: {
Chris@76: global $scripturl, $txt, $context;
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $scripturl . '?action=search';
Chris@76:
Chris@76: echo '
Chris@76: ';
Chris@76: }
Chris@76:
Chris@76: // Show what would be the forum news.
Chris@76: function ssi_news($output_method = 'echo')
Chris@76: {
Chris@76: global $context;
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $context['random_news_line'];
Chris@76:
Chris@76: echo $context['random_news_line'];
Chris@76: }
Chris@76:
Chris@76: // Show today's birthdays.
Chris@76: function ssi_todaysBirthdays($output_method = 'echo')
Chris@76: {
Chris@76: global $scripturl, $modSettings, $user_info;
Chris@76:
Chris@76: if (empty($modSettings['cal_enabled']) || !allowedTo('calendar_view') || !allowedTo('profile_view_any'))
Chris@76: return;
Chris@76:
Chris@76: $eventOptions = array(
Chris@76: 'include_birthdays' => true,
Chris@76: 'num_days_shown' => empty($modSettings['cal_days_for_index']) || $modSettings['cal_days_for_index'] < 1 ? 1 : $modSettings['cal_days_for_index'],
Chris@76: );
Chris@76: $return = cache_quick_get('calendar_index_offset_' . ($user_info['time_offset'] + $modSettings['time_offset']), 'Subs-Calendar.php', 'cache_getRecentEvents', array($eventOptions));
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return['calendar_birthdays'];
Chris@76:
Chris@76: foreach ($return['calendar_birthdays'] as $member)
Chris@76: echo '
Chris@76: ' . $member['name'] . (isset($member['age']) ? ' (' . $member['age'] . ')' : '') . '' . (!$member['is_last'] ? ', ' : '');
Chris@76: }
Chris@76:
Chris@76: // Show today's holidays.
Chris@76: function ssi_todaysHolidays($output_method = 'echo')
Chris@76: {
Chris@76: global $modSettings, $user_info;
Chris@76:
Chris@76: if (empty($modSettings['cal_enabled']) || !allowedTo('calendar_view'))
Chris@76: return;
Chris@76:
Chris@76: $eventOptions = array(
Chris@76: 'include_holidays' => true,
Chris@76: 'num_days_shown' => empty($modSettings['cal_days_for_index']) || $modSettings['cal_days_for_index'] < 1 ? 1 : $modSettings['cal_days_for_index'],
Chris@76: );
Chris@76: $return = cache_quick_get('calendar_index_offset_' . ($user_info['time_offset'] + $modSettings['time_offset']), 'Subs-Calendar.php', 'cache_getRecentEvents', array($eventOptions));
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return['calendar_holidays'];
Chris@76:
Chris@76: echo '
Chris@76: ', implode(', ', $return['calendar_holidays']);
Chris@76: }
Chris@76:
Chris@76: // Show today's events.
Chris@76: function ssi_todaysEvents($output_method = 'echo')
Chris@76: {
Chris@76: global $modSettings, $user_info;
Chris@76:
Chris@76: if (empty($modSettings['cal_enabled']) || !allowedTo('calendar_view'))
Chris@76: return;
Chris@76:
Chris@76: $eventOptions = array(
Chris@76: 'include_events' => true,
Chris@76: 'num_days_shown' => empty($modSettings['cal_days_for_index']) || $modSettings['cal_days_for_index'] < 1 ? 1 : $modSettings['cal_days_for_index'],
Chris@76: );
Chris@76: $return = cache_quick_get('calendar_index_offset_' . ($user_info['time_offset'] + $modSettings['time_offset']), 'Subs-Calendar.php', 'cache_getRecentEvents', array($eventOptions));
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return['calendar_events'];
Chris@76:
Chris@76: foreach ($return['calendar_events'] as $event)
Chris@76: {
Chris@76: if ($event['can_edit'])
Chris@76: echo '
Chris@76: * ';
Chris@76: echo '
Chris@76: ' . $event['link'] . (!$event['is_last'] ? ', ' : '');
Chris@76: }
Chris@76: }
Chris@76:
Chris@76: // Show all calendar entires for today. (birthdays, holodays, and events.)
Chris@76: function ssi_todaysCalendar($output_method = 'echo')
Chris@76: {
Chris@76: global $modSettings, $txt, $scripturl, $user_info;
Chris@76:
Chris@76: $eventOptions = array(
Chris@76: 'include_birthdays' => allowedTo('profile_view_any'),
Chris@76: 'include_holidays' => true,
Chris@76: 'include_events' => true,
Chris@76: 'num_days_shown' => empty($modSettings['cal_days_for_index']) || $modSettings['cal_days_for_index'] < 1 ? 1 : $modSettings['cal_days_for_index'],
Chris@76: );
Chris@76: $return = cache_quick_get('calendar_index_offset_' . ($user_info['time_offset'] + $modSettings['time_offset']), 'Subs-Calendar.php', 'cache_getRecentEvents', array($eventOptions));
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return;
Chris@76:
Chris@76: if (!empty($return['calendar_holidays']))
Chris@76: echo '
Chris@76: ' . $txt['calendar_prompt'] . ' ' . implode(', ', $return['calendar_holidays']) . '
';
Chris@76: if (!empty($return['calendar_birthdays']))
Chris@76: {
Chris@76: echo '
Chris@76: ' . $txt['birthdays_upcoming'] . ' ';
Chris@76: foreach ($return['calendar_birthdays'] as $member)
Chris@76: echo '
Chris@76: ', $member['name'], isset($member['age']) ? ' (' . $member['age'] . ')' : '', '', !$member['is_last'] ? ', ' : '';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76: if (!empty($return['calendar_events']))
Chris@76: {
Chris@76: echo '
Chris@76: ' . $txt['events_upcoming'] . ' ';
Chris@76: foreach ($return['calendar_events'] as $event)
Chris@76: {
Chris@76: if ($event['can_edit'])
Chris@76: echo '
Chris@76: * ';
Chris@76: echo '
Chris@76: ' . $event['link'] . (!$event['is_last'] ? ', ' : '');
Chris@76: }
Chris@76: }
Chris@76: }
Chris@76:
Chris@76: // Show the latest news, with a template... by board.
Chris@76: function ssi_boardNews($board = null, $limit = null, $start = null, $length = null, $output_method = 'echo')
Chris@76: {
Chris@76: global $scripturl, $db_prefix, $txt, $settings, $modSettings, $context;
Chris@76: global $smcFunc;
Chris@76:
Chris@76: loadLanguage('Stats');
Chris@76:
Chris@76: // Must be integers....
Chris@76: if ($limit === null)
Chris@76: $limit = isset($_GET['limit']) ? (int) $_GET['limit'] : 5;
Chris@76: else
Chris@76: $limit = (int) $limit;
Chris@76:
Chris@76: if ($start === null)
Chris@76: $start = isset($_GET['start']) ? (int) $_GET['start'] : 0;
Chris@76: else
Chris@76: $start = (int) $start;
Chris@76:
Chris@76: if ($board !== null)
Chris@76: $board = (int) $board;
Chris@76: elseif (isset($_GET['board']))
Chris@76: $board = (int) $_GET['board'];
Chris@76:
Chris@76: if ($length === null)
Chris@76: $length = isset($_GET['length']) ? (int) $_GET['length'] : 0;
Chris@76: else
Chris@76: $length = (int) $length;
Chris@76:
Chris@76: $limit = max(0, $limit);
Chris@76: $start = max(0, $start);
Chris@76:
Chris@76: // Make sure guests can see this board.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT id_board
Chris@76: FROM {db_prefix}boards
Chris@76: WHERE ' . ($board === null ? '' : 'id_board = {int:current_board}
Chris@76: AND ') . 'FIND_IN_SET(-1, member_groups)
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'current_board' => $board,
Chris@76: )
Chris@76: );
Chris@76: if ($smcFunc['db_num_rows']($request) == 0)
Chris@76: {
Chris@76: if ($output_method == 'echo')
Chris@76: die($txt['ssi_no_guests']);
Chris@76: else
Chris@76: return array();
Chris@76: }
Chris@76: list ($board) = $smcFunc['db_fetch_row']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // Load the message icons - the usual suspects.
Chris@76: $stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
Chris@76: $icon_sources = array();
Chris@76: foreach ($stable_icons as $icon)
Chris@76: $icon_sources[$icon] = 'images_url';
Chris@76:
Chris@76: // Find the post ids.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT t.id_first_msg
Chris@76: FROM {db_prefix}topics as t
Chris@76: LEFT JOIN {db_prefix}boards as b ON (b.id_board = t.id_board)
Chris@76: WHERE t.id_board = {int:current_board}' . ($modSettings['postmod_active'] ? '
Chris@76: AND t.approved = {int:is_approved}' : '') . '
Chris@76: AND {query_see_board}
Chris@76: ORDER BY t.id_first_msg DESC
Chris@76: LIMIT ' . $start . ', ' . $limit,
Chris@76: array(
Chris@76: 'current_board' => $board,
Chris@76: 'is_approved' => 1,
Chris@76: )
Chris@76: );
Chris@76: $posts = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: $posts[] = $row['id_first_msg'];
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: if (empty($posts))
Chris@76: return array();
Chris@76:
Chris@76: // Find the posts.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: m.icon, m.subject, m.body, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.poster_time,
Chris@76: t.num_replies, t.id_topic, m.id_member, m.smileys_enabled, m.id_msg, t.locked, t.id_last_msg
Chris@76: FROM {db_prefix}topics AS t
Chris@76: INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg)
Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
Chris@76: WHERE t.id_first_msg IN ({array_int:post_list})
Chris@76: ORDER BY t.id_first_msg DESC
Chris@76: LIMIT ' . count($posts),
Chris@76: array(
Chris@76: 'post_list' => $posts,
Chris@76: )
Chris@76: );
Chris@76: $return = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: // If we want to limit the length of the post.
Chris@76: if (!empty($length) && $smcFunc['strlen']($row['body']) > $length)
Chris@76: {
Chris@76: $row['body'] = $smcFunc['substr']($row['body'], 0, $length);
Chris@76:
Chris@76: // The first space or line break. (
, etc.)
Chris@76: $cutoff = max(strrpos($row['body'], ' '), strrpos($row['body'], '<'));
Chris@76:
Chris@76: if ($cutoff !== false)
Chris@76: $row['body'] = $smcFunc['substr']($row['body'], 0, $cutoff);
Chris@76: $row['body'] .= '...';
Chris@76: }
Chris@76:
Chris@76: $row['body'] = parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']);
Chris@76:
Chris@76: // Check that this message icon is there...
Chris@76: if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
Chris@76: $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';
Chris@76:
Chris@76: censorText($row['subject']);
Chris@76: censorText($row['body']);
Chris@76:
Chris@76: $return[] = array(
Chris@76: 'id' => $row['id_topic'],
Chris@76: 'message_id' => $row['id_msg'],
Chris@76: 'icon' => '
',
Chris@76: 'subject' => $row['subject'],
Chris@76: 'time' => timeformat($row['poster_time']),
Chris@76: 'timestamp' => forum_time(true, $row['poster_time']),
Chris@76: 'body' => $row['body'],
Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0',
Chris@76: 'link' => '' . $row['num_replies'] . ' ' . ($row['num_replies'] == 1 ? $txt['ssi_comment'] : $txt['ssi_comments']) . '',
Chris@76: 'replies' => $row['num_replies'],
Chris@76: 'comment_href' => !empty($row['locked']) ? '' : $scripturl . '?action=post;topic=' . $row['id_topic'] . '.' . $row['num_replies'] . ';last_msg=' . $row['id_last_msg'],
Chris@76: 'comment_link' => !empty($row['locked']) ? '' : '' . $txt['ssi_write_comment'] . '',
Chris@76: 'new_comment' => !empty($row['locked']) ? '' : '' . $txt['ssi_write_comment'] . '',
Chris@76: 'poster' => array(
Chris@76: 'id' => $row['id_member'],
Chris@76: 'name' => $row['poster_name'],
Chris@76: 'href' => !empty($row['id_member']) ? $scripturl . '?action=profile;u=' . $row['id_member'] : '',
Chris@76: 'link' => !empty($row['id_member']) ? '' . $row['poster_name'] . '' : $row['poster_name']
Chris@76: ),
Chris@76: 'locked' => !empty($row['locked']),
Chris@76: 'is_last' => false
Chris@76: );
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: if (empty($return))
Chris@76: return $return;
Chris@76:
Chris@76: $return[count($return) - 1]['is_last'] = true;
Chris@76:
Chris@76: if ($output_method != 'echo')
Chris@76: return $return;
Chris@76:
Chris@76: foreach ($return as $news)
Chris@76: {
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76:
', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], '
Chris@76:
', $news['body'], '
Chris@76: ', $news['link'], $news['locked'] ? '' : ' | ' . $news['comment_link'], '
Chris@76:
';
Chris@76:
Chris@76: if (!$news['is_last'])
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76: }
Chris@76:
Chris@76: // Show the most recent events.
Chris@76: function ssi_recentEvents($max_events = 7, $output_method = 'echo')
Chris@76: {
Chris@76: global $db_prefix, $user_info, $scripturl, $modSettings, $txt, $context, $smcFunc;
Chris@76:
Chris@76: if (empty($modSettings['cal_enabled']) || !allowedTo('calendar_view'))
Chris@76: return;
Chris@76:
Chris@76: // Find all events which are happening in the near future that the member can see.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: cal.id_event, cal.start_date, cal.end_date, cal.title, cal.id_member, cal.id_topic,
Chris@76: cal.id_board, t.id_first_msg, t.approved
Chris@76: FROM {db_prefix}calendar AS cal
Chris@76: LEFT JOIN {db_prefix}boards AS b ON (b.id_board = cal.id_board)
Chris@76: LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = cal.id_topic)
Chris@76: WHERE cal.start_date <= {date:current_date}
Chris@76: AND cal.end_date >= {date:current_date}
Chris@76: AND (cal.id_board = {int:no_board} OR {query_wanna_see_board})
Chris@76: ORDER BY cal.start_date DESC
Chris@76: LIMIT ' . $max_events,
Chris@76: array(
Chris@76: 'current_date' => strftime('%Y-%m-%d', forum_time(false)),
Chris@76: 'no_board' => 0,
Chris@76: )
Chris@76: );
Chris@76: $return = array();
Chris@76: $duplicates = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: // Check if we've already come by an event linked to this same topic with the same title... and don't display it if we have.
Chris@76: if (!empty($duplicates[$row['title'] . $row['id_topic']]))
Chris@76: continue;
Chris@76:
Chris@76: // Censor the title.
Chris@76: censorText($row['title']);
Chris@76:
Chris@76: if ($row['start_date'] < strftime('%Y-%m-%d', forum_time(false)))
Chris@76: $date = strftime('%Y-%m-%d', forum_time(false));
Chris@76: else
Chris@76: $date = $row['start_date'];
Chris@76:
Chris@76: // If the topic it is attached to is not approved then don't link it.
Chris@76: if (!empty($row['id_first_msg']) && !$row['approved'])
Chris@76: $row['id_board'] = $row['id_topic'] = $row['id_first_msg'] = 0;
Chris@76:
Chris@76: $return[$date][] = array(
Chris@76: 'id' => $row['id_event'],
Chris@76: 'title' => $row['title'],
Chris@76: 'can_edit' => allowedTo('calendar_edit_any') || ($row['id_member'] == $user_info['id'] && allowedTo('calendar_edit_own')),
Chris@76: 'modify_href' => $scripturl . '?action=' . ($row['id_board'] == 0 ? 'calendar;sa=post;' : 'post;msg=' . $row['id_first_msg'] . ';topic=' . $row['id_topic'] . '.0;calendar;') . 'eventid=' . $row['id_event'] . ';' . $context['session_var'] . '=' . $context['session_id'],
Chris@76: 'href' => $row['id_board'] == 0 ? '' : $scripturl . '?topic=' . $row['id_topic'] . '.0',
Chris@76: 'link' => $row['id_board'] == 0 ? $row['title'] : '' . $row['title'] . '',
Chris@76: 'start_date' => $row['start_date'],
Chris@76: 'end_date' => $row['end_date'],
Chris@76: 'is_last' => false
Chris@76: );
Chris@76:
Chris@76: // Let's not show this one again, huh?
Chris@76: $duplicates[$row['title'] . $row['id_topic']] = true;
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: foreach ($return as $mday => $array)
Chris@76: $return[$mday][count($array) - 1]['is_last'] = true;
Chris@76:
Chris@76: if ($output_method != 'echo' || empty($return))
Chris@76: return $return;
Chris@76:
Chris@76: // Well the output method is echo.
Chris@76: echo '
Chris@76: ' . $txt['events'] . ' ';
Chris@76: foreach ($return as $mday => $array)
Chris@76: foreach ($array as $event)
Chris@76: {
Chris@76: if ($event['can_edit'])
Chris@76: echo '
Chris@76: * ';
Chris@76:
Chris@76: echo '
Chris@76: ' . $event['link'] . (!$event['is_last'] ? ', ' : '');
Chris@76: }
Chris@76: }
Chris@76:
Chris@76: // Check the passed id_member/password. If $is_username is true, treats $id as a username.
Chris@76: function ssi_checkPassword($id = null, $password = null, $is_username = false)
Chris@76: {
Chris@76: global $db_prefix, $sourcedir, $smcFunc;
Chris@76:
Chris@76: // If $id is null, this was most likely called from a query string and should do nothing.
Chris@76: if ($id === null)
Chris@76: return;
Chris@76:
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT passwd, member_name, is_activated
Chris@76: FROM {db_prefix}members
Chris@76: WHERE ' . ($is_username ? 'member_name' : 'id_member') . ' = {string:id}
Chris@76: LIMIT 1',
Chris@76: array(
Chris@76: 'id' => $id,
Chris@76: )
Chris@76: );
Chris@76: list ($pass, $user, $active) = $smcFunc['db_fetch_row']($request);
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: return sha1(strtolower($user) . $password) == $pass && $active == 1;
Chris@76: }
Chris@76:
Chris@76: // We want to show the recent attachments outside of the forum.
Chris@76: function ssi_recentAttachments($num_attachments = 10, $attachment_ext = array(), $output_method = 'echo')
Chris@76: {
Chris@76: global $smcFunc, $context, $modSettings, $scripturl, $txt, $settings;
Chris@76:
Chris@76: // We want to make sure that we only get attachments for boards that we can see *if* any.
Chris@76: $attachments_boards = boardsAllowedTo('view_attachments');
Chris@76:
Chris@76: // No boards? Adios amigo.
Chris@76: if (empty($attachments_boards))
Chris@76: return array();
Chris@76:
Chris@76: // Is it an array?
Chris@76: if (!is_array($attachment_ext))
Chris@76: $attachment_ext = array($attachment_ext);
Chris@76:
Chris@76: // Lets build the query.
Chris@76: $request = $smcFunc['db_query']('', '
Chris@76: SELECT
Chris@76: att.id_attach, att.id_msg, att.filename, IFNULL(att.size, 0) AS filesize, att.downloads, mem.id_member,
Chris@76: IFNULL(mem.real_name, m.poster_name) AS poster_name, m.id_topic, m.subject, t.id_board, m.poster_time,
Chris@76: att.width, att.height' . (empty($modSettings['attachmentShowImages']) || empty($modSettings['attachmentThumbnails']) ? '' : ', IFNULL(thumb.id_attach, 0) AS id_thumb, thumb.width AS thumb_width, thumb.height AS thumb_height') . '
Chris@76: FROM {db_prefix}attachments AS att
Chris@76: INNER JOIN {db_prefix}messages AS m ON (m.id_msg = att.id_msg)
Chris@76: INNER JOIN {db_prefix}topics AS t ON (t.id_topic = m.id_topic)
Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . (empty($modSettings['attachmentShowImages']) || empty($modSettings['attachmentThumbnails']) ? '' : '
Chris@76: LEFT JOIN {db_prefix}attachments AS thumb ON (thumb.id_attach = att.id_thumb)') . '
Chris@76: WHERE att.attachment_type = 0' . ($attachments_boards === array(0) ? '' : '
Chris@76: AND m.id_board IN ({array_int:boards_can_see})') . (!empty($attachment_ext) ? '
Chris@76: AND att.fileext IN ({array_string:attachment_ext})' : '') .
Chris@76: (!$modSettings['postmod_active'] || allowedTo('approve_posts') ? '' : '
Chris@76: AND t.approved = {int:is_approved}
Chris@76: AND m.approved = {int:is_approved}
Chris@76: AND att.approved = {int:is_approved}') . '
Chris@76: ORDER BY att.id_attach DESC
Chris@76: LIMIT {int:num_attachments}',
Chris@76: array(
Chris@76: 'boards_can_see' => $attachments_boards,
Chris@76: 'attachment_ext' => $attachment_ext,
Chris@76: 'num_attachments' => $num_attachments,
Chris@76: 'is_approved' => 1,
Chris@76: )
Chris@76: );
Chris@76:
Chris@76: // We have something.
Chris@76: $attachments = array();
Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76: {
Chris@76: $filename = preg_replace('~&#(\\d{1,7}|x[0-9a-fA-F]{1,6});~', '\\1;', htmlspecialchars($row['filename']));
Chris@76:
Chris@76: // Is it an image?
Chris@76: $attachments[$row['id_attach']] = array(
Chris@76: 'member' => array(
Chris@76: 'id' => $row['id_member'],
Chris@76: 'name' => $row['poster_name'],
Chris@76: 'link' => empty($row['id_member']) ? $row['poster_name'] : '' . $row['poster_name'] . '',
Chris@76: ),
Chris@76: 'file' => array(
Chris@76: 'filename' => $filename,
Chris@76: 'filesize' => round($row['filesize'] /1024, 2) . $txt['kilobyte'],
Chris@76: 'downloads' => $row['downloads'],
Chris@76: 'href' => $scripturl . '?action=dlattach;topic=' . $row['id_topic'] . '.0;attach=' . $row['id_attach'],
Chris@76: 'link' => '
' . $filename . '',
Chris@76: 'is_image' => !empty($row['width']) && !empty($row['height']) && !empty($modSettings['attachmentShowImages']),
Chris@76: ),
Chris@76: 'topic' => array(
Chris@76: 'id' => $row['id_topic'],
Chris@76: 'subject' => $row['subject'],
Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . '#msg' . $row['id_msg'],
Chris@76: 'link' => '' . $row['subject'] . '',
Chris@76: 'time' => timeformat($row['poster_time']),
Chris@76: ),
Chris@76: );
Chris@76:
Chris@76: // Images.
Chris@76: if ($attachments[$row['id_attach']]['file']['is_image'])
Chris@76: {
Chris@76: $id_thumb = empty($row['id_thumb']) ? $row['id_attach'] : $row['id_thumb'];
Chris@76: $attachments[$row['id_attach']]['file']['image'] = array(
Chris@76: 'id' => $id_thumb,
Chris@76: 'width' => $row['width'],
Chris@76: 'height' => $row['height'],
Chris@76: 'img' => '
',
Chris@76: 'thumb' => '
',
Chris@76: 'href' => $scripturl . '?action=dlattach;topic=' . $row['id_topic'] . '.0;attach=' . $id_thumb . ';image',
Chris@76: 'link' => '
',
Chris@76: );
Chris@76: }
Chris@76: }
Chris@76: $smcFunc['db_free_result']($request);
Chris@76:
Chris@76: // So you just want an array? Here you can have it.
Chris@76: if ($output_method == 'array' || empty($attachments))
Chris@76: return $attachments;
Chris@76:
Chris@76: // Give them the default.
Chris@76: echo '
Chris@76:
Chris@76:
Chris@76: ', $txt['file'], ' |
Chris@76: ', $txt['posted_by'], ' |
Chris@76: ', $txt['downloads'], ' |
Chris@76: ', $txt['filesize'], ' |
Chris@76:
';
Chris@76: foreach ($attachments as $attach)
Chris@76: echo '
Chris@76:
Chris@76: ', $attach['file']['link'], ' |
Chris@76: ', $attach['member']['link'], ' |
Chris@76: ', $attach['file']['downloads'], ' |
Chris@76: ', $attach['file']['filesize'], ' |
Chris@76:
';
Chris@76: echo '
Chris@76:
';
Chris@76: }
Chris@76:
Chris@76: ?>