Add random theme. Like Ukko, but sorts threads randomly.

This commit is contained in:
Michael Walker 2015-01-26 22:31:23 +00:00
parent e8737b23d5
commit 9c091aaa47
4 changed files with 274 additions and 0 deletions

View File

@ -0,0 +1,54 @@
<?php
$theme = array();
// Theme name
$theme['name'] = 'Random Overboard';
// Description (you can use Tinyboard markup here)
$theme['description'] = 'Board with threads and messages from all boards, sorted randomly';
$theme['version'] = 'v0.2';
// Theme configuration
$theme['config'] = array();
$theme['config'][] = array(
'title' => 'Board name',
'name' => 'title',
'type' => 'text',
'default' => 'Random'
);
$theme['config'][] = array(
'title' => 'Board URI',
'name' => 'uri',
'type' => 'text',
'default' => '.',
'comment' => '(rand for example)'
);
$theme['config'][] = array(
'title' => 'Subtitle',
'name' => 'subtitle',
'type' => 'text',
'comment' => '(%s = thread limit. for example "%s freshly bumped threads")'
);
$theme['config'][] = array(
'title' => 'Excluded boards',
'name' => 'exclude',
'type' => 'text',
'comment' => '(space seperated)'
);
$theme['config'][] = array(
'title' => 'Number of threads',
'name' => 'thread_limit',
'type' => 'text',
'default' => '15',
);
// Unique function name for building everything
$theme['build_function'] = 'rand_build';
$theme['install_callback'] = 'rand_install';
if(!function_exists('rand_install')) {
function rand_install($settings) {
if (!file_exists($settings['uri']))
@mkdir($settings['uri'], 0777) or error("Couldn't create " . $settings['uri'] . ". Check permissions.", true);
}
}

View File

@ -0,0 +1,116 @@
(function(){
var cache = new Array(),
thread = false,
loading = false,
ukkotimer = false;
if (localStorage.hiddenboards === undefined) {
localStorage.hiddenboards = "{}";
}
// Load data from HTML5 localStorage
var hiddenboards = JSON.parse(localStorage.hiddenboards);
var storeboards = function() {
localStorage.hiddenboards = JSON.stringify(hiddenboards);
};
$(document).ready(function() {
var addukkohide = function() {
var ukkohide = $('<a href="javascript:void(0);" class="unimportant ukkohide"></a>');
var board = $(this).next().data("board");
var hr = $("<hr />");
$(this).append(ukkohide);
$(this).append(hr);
if (hiddenboards[board] !== true) {
ukkohide.html(_("(hide threads from this board)"));
hr.hide();
}
else {
ukkohide.html(_("(show threads from this board)"));
$(this).next().hide();
}
ukkohide.click(function() {
hiddenboards[board] = (hiddenboards[board] !== true);
if (hiddenboards[board] !== true) {
$('[data-board="'+board+'"]:not([data-cached="yes"])').show().prev().
find('.ukkohide').html(_("(hide threads from this board)")).
parent().find('hr').hide();
}
else {
$('[data-board="'+board+'"]:not([data-cached="yes"])').hide().prev().
find('.ukkohide').html(_("(show threads from this board)"))
.parent().find('hr').show();
}
storeboards();
return false;
});
};
$("h2").each(addukkohide);
$('.pages').hide();
var loadnext = function() {
if (overflow.length == 0) {
$('.pages').show().html(_("No more threads to display"));
}
while($(window).scrollTop() + $(window).height() + 1000 > $(document).height() && !loading && overflow.length > 0) {
var page = modRoot + overflow[0].board + '/' + overflow[0].page;
thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"]');
if (thread.length > 0 && thread.attr("data-cached") !== 'yes') { // already present
overflow.shift();
continue;
}
var boardheader = $('<h2><a href="/' + overflow[0].board + '/">/' + overflow[0].board + '/</a> </h2>');
if($.inArray(page, cache) != -1) {
if (thread.length > 0) {
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).attr("data-cached", "no").css('display', 'block'));
boardheader.insertBefore(thread);
addukkohide.call(boardheader);
$(document).trigger('new_post', thread);
}
overflow.shift();
} else {
loading = true;
$('.pages').show().html(_("Loading..."));
$.get(page, function(data) {
cache.push(page);
$(data).find('div[id*="thread_"]').each(function() {
var checkout = $(this).attr('id').replace('thread_', '');
if ($('div#thread_' + checkout + '[data-board="' + overflow[0].board + '"]').length == 0) {
$('form[name="postcontrols"]').prepend($(this).css('display', 'none').attr("data-cached", "yes").attr('data-board', overflow[0].board));
}
});
thread = $('div#thread_' + overflow[0].id + '[data-board="' + overflow[0].board + '"][data-cached="yes"]');
if(thread.length > 0) {
$('div[id*="thread_"]').last().after(thread.attr('data-board', overflow[0].board).attr("data-cached", "no").css('display', 'block'));
boardheader.insertBefore(thread);
addukkohide.call(boardheader);
$(document).trigger('new_post', thread);
}
overflow.shift();
loading = false;
$('.pages').hide().html("");
});
break;
}
}
clearTimeout(ukkotimer);
ukkotimer = setTimeout(loadnext, 1000);
};
$(window).on('scroll', loadnext);
ukkotimer = setTimeout(loadnext, 1000);
});
})();

View File

@ -0,0 +1,104 @@
<?php
require 'info.php';
function rand_build($action, $settings) {
$rand = new rand();
$rand->settings = $settings;
file_write($settings['uri'] . '/index.html', $rand->build());
file_write($settings['uri'] . '/rand.js', Element('themes/rand/rand.js', array()));
}
class rand {
public $settings;
public function build($mod = false) {
global $config;
$boards = listBoards();
$body = '';
$overflow = array();
$board = array(
'url' => $this->settings['uri'],
'name' => $this->settings['title'],
'title' => sprintf($this->settings['subtitle'], $this->settings['thread_limit'])
);
$query = '';
foreach($boards as &$_board) {
if(in_array($_board['uri'], explode(' ', $this->settings['exclude'])))
continue;
$query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE `thread` IS NULL UNION ALL ", $_board['uri'], $_board['uri']);
}
$query = preg_replace('/UNION ALL $/', 'ORDER BY RAND()', $query);
$query = query($query) or error(db_error());
$count = 0;
$threads = array();
while($post = $query->fetch()) {
if(!isset($threads[$post['board']])) {
$threads[$post['board']] = 1;
} else {
$threads[$post['board']] += 1;
}
if($count < $this->settings['thread_limit']) {
openBoard($post['board']);
$thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
$posts = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $post['board']));
$posts->bindValue(':id', $post['id']);
$posts->bindValue(':limit', ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT);
$posts->execute() or error(db_error($posts));
$num_images = 0;
while ($po = $posts->fetch()) {
if ($po['files'])
$num_images++;
$thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod));
}
if ($posts->rowCount() == ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) {
$ct = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM ``posts_%s`` WHERE `thread` = :thread UNION ALL SELECT COUNT(`id`) FROM ``posts_%s`` WHERE `files` IS NOT NULL AND `thread` = :thread", $post['board'], $post['board']));
$ct->bindValue(':thread', $post['id'], PDO::PARAM_INT);
$ct->execute() or error(db_error($count));
$c = $ct->fetch();
$thread->omitted = $c['num'] - ($post['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']);
$c = $ct->fetch();
$thread->omitted_images = $c['num'] - $num_images;
}
$thread->posts = array_reverse($thread->posts);
$body .= '<h2><a href="' . $config['root'] . $post['board'] . '">/' . $post['board'] . '/</a></h2>';
$body .= $thread->build(true);
} else {
$page = 'index';
if(floor($threads[$post['board']] / $config['threads_per_page']) > 0) {
$page = floor($threads[$post['board']] / $config['threads_per_page']) + 1;
}
$overflow[] = array('id' => $post['id'], 'board' => $post['board'], 'page' => $page . '.html');
}
$count += 1;
}
$body .= '<script> var overflow = ' . json_encode($overflow) . '</script>';
$body .= '<script type="text/javascript" src="/'.$this->settings['uri'].'/rand.js"></script>';
return Element('index.html', array(
'config' => $config,
'board' => $board,
'no_post_form' => true,
'body' => $body,
'mod' => $mod,
'boardlist' => createBoardlist($mod),
));
}
};
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB