From fb2b66e2dd67ceefc94d8e64eedd9300f64d695f Mon Sep 17 00:00:00 2001 From: sinuca <55vitaminado@gmail.com> Date: Mon, 17 Mar 2014 19:11:16 -0300 Subject: [PATCH] Recent posts functionality Conflicts: inc/config.php inc/mod/pages.php mod.php --- inc/config.php | 2 ++ inc/mod/pages.php | 66 +++++++++++++++++++++++++++++++++++++ js/recent-posts.js | 73 +++++++++++++++++++++++++++++++++++++++++ mod.php | 2 ++ templates/mod/recent_posts.html | 5 +++ 5 files changed, 148 insertions(+) create mode 100644 js/recent-posts.js create mode 100644 templates/mod/recent_posts.html diff --git a/inc/config.php b/inc/config.php index 1bf55fb7..b2f62f5e 100644 --- a/inc/config.php +++ b/inc/config.php @@ -1376,6 +1376,8 @@ $config['mod']['view_ban_appeals'] = MOD; // Accept and deny ban appeals $config['mod']['ban_appeals'] = MOD; + // View the recent posts page + $config['mod']['recent'] = MOD; // Config editor permissions $config['mod']['config'] = array(); diff --git a/inc/mod/pages.php b/inc/mod/pages.php index a247e35c..b9f3b045 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -2213,6 +2213,72 @@ function mod_report_dismiss($id, $all = false) { header('Location: ?/reports', true, $config['redirect_http']); } +function mod_recent_posts($lim) { + global $config, $mod, $pdo; + + if (!hasPermission($config['mod']['recent'])) + error($config['error']['noaccess']); + + $limit = (is_numeric($lim))? $lim : 25; + + $mod_boards = array(); + $boards = listBoards(); + + //if not all boards + if ($mod['boards'][0]!='*') { + foreach ($boards as $board) { + if (in_array($board['uri'], $mod['boards'])) + $mod_boards[] = $board; + } + } else { + $mod_boards = $boards; + } + + // Manually build an SQL query + $query = 'SELECT * FROM ('; + foreach ($mod_boards as $board) { + $query .= sprintf('SELECT *, %s AS `board` FROM ``posts_%s`` UNION ALL ', $pdo->quote($board['uri']), $board['uri']); + } + // Remove the last "UNION ALL" seperator and complete the query + $query = preg_replace('/UNION ALL $/', ') AS `all_posts` ORDER BY `time` DESC LIMIT ' . $limit, $query); + $query = query($query) or error(db_error()); + $posts = $query->fetchAll(PDO::FETCH_ASSOC); + + $body = '

Viewing last '.$limit.' posts

+

View 25 | 50 | 100

+ Erase local data'; + foreach ($posts as $post) { + openBoard($post['board']); + if (!$post['thread']) { + // Still need to fix this: + $po = new Thread($post, '?/', $mod, false); + $string = $po->build(true); + $replacement = str_replace('

', + '

/'.$post['board'].'/'.$post['id'].'

', + $string); + } else { + $po = new Post($post, '?/', $mod); + $string = $po->build(true); + $replacement = str_replace('

/'.$post['board'].'/'.$post['id'].'
'; + } + + echo Element('modpage.html', array( + 'config' => $config, + 'mod' => $mod, + 'hide_dashboard_link' => true, + 'title' => _('Recent posts'), + 'subtitle' => '', + 'nojavascript' => false, + 'is_recent_posts' => true, + 'body' => $body + ) + ); + +} function mod_config($board_config = false) { global $config, $mod, $board; diff --git a/js/recent-posts.js b/js/recent-posts.js new file mode 100644 index 00000000..c65f6991 --- /dev/null +++ b/js/recent-posts.js @@ -0,0 +1,73 @@ +/* + * recent-posts.js + * + * Recent posts controlling script + * + * Released under the WTFPL license + * Copyright (c) 2014 sinuca <#55ch@rizon.net> + * + * Requires jquery + * incomplete + * + */ + +$(document).ready(function(){ + + if (!localStorage.hiddenrecentposts) + localStorage.hiddenrecentposts = '{}'; + + if (!localStorage.recentpostscount) + localStorage.recentpostscount = 25; + + // Load data from HTML5 localStorage + var hidden_data = JSON.parse(localStorage.hiddenrecentposts); + + var store_data_posts = function() { + localStorage.hiddenrecentposts = JSON.stringify(hidden_data); + } + + // Delete old hidden posts (7+ days old) + for (var key in hidden_data) { + for (var id in hidden_data[key]) { + if (hidden_data[key][id] < Math.round(Date.now() / 1000) - 60 * 60 * 24 * 7) { + delete hidden_data[key][id]; + store_data_posts(); + } + } + } + + var do_hide_posts = function() { + var data = $(this).attr('id'); + var splitted = data.split('-'); + var id = splitted[2]; + var post_container = $(this).parent(); + + var board = post_container.data("board"); + + if (!hidden_data[board]) { + hidden_data[board] = {}; + } + + $(' Dismiss ') + .insertBefore(post_container.find('a.eita-link:first')) + .click(function(){ + hidden_data[board][id] = Math.round(Date.now() / 1000); + store_data_posts(); + + post_container.closest('hr').hide(); + post_container.children().hide(); + }); + if(hidden_data[board][id]) + post_container.find('a.hide-post-link').click(); + } + + $('a.eita-link').each(do_hide_posts); + + $('#erase-local-data').click(function(){ + hidden_data = {}; + store_data_posts(); + $(this).html('Loading...'); + location.reload(); + }); + +}); \ No newline at end of file diff --git a/mod.php b/mod.php index e5b14878..6918dc57 100644 --- a/mod.php +++ b/mod.php @@ -65,6 +65,8 @@ $pages = array( '/bans/(\d+)' => 'secure_POST bans', // ban list '/ban-appeals' => 'secure_POST ban_appeals', // view ban appeals + '/recent/(\d+)' => 'recent_posts', // view recent posts + '/search' => 'search_redirect', // search '/search/(posts|IP_notes|bans|log)/(.+)/(\d+)' => 'search', // search '/search/(posts|IP_notes|bans|log)/(.+)' => 'search', // search diff --git a/templates/mod/recent_posts.html b/templates/mod/recent_posts.html new file mode 100644 index 00000000..c106b4e8 --- /dev/null +++ b/templates/mod/recent_posts.html @@ -0,0 +1,5 @@ +{% if posts|count %} +

({% trans 'There are no active posts.' %})

+{% else %} + +{% endif %} \ No newline at end of file