230 lines
9.7 KiB
PHP
230 lines
9.7 KiB
PHP
<?php
|
|
|
|
/* --------------------------------------------------------------------
|
|
|
|
This file is part of Chevereto Free.
|
|
https://chevereto.com/free
|
|
|
|
(c) Rodolfo Berrios <rodolfo@chevereto.com>
|
|
|
|
For the full copyright and license information, please view the LICENSE
|
|
file that was distributed with this source code.
|
|
|
|
--------------------------------------------------------------------- */
|
|
|
|
use function G\str_replace_first;
|
|
|
|
$route = function ($handler) {
|
|
try {
|
|
// Parse the current query string
|
|
parse_str($_SERVER['QUERY_STRING'], $querystr);
|
|
|
|
if (!in_array(key($querystr), ['random']) and G\starts_with('route_', CHV\Settings::get('homepage_style'))) {
|
|
$route = str_replace_first('route_', '', CHV\Settings::get('homepage_style'));
|
|
$handler->mapRoute($route);
|
|
include G_APP_PATH_ROUTES . 'route.'.$route.'.php';
|
|
|
|
return $route($handler);
|
|
}
|
|
|
|
$logged_user = CHV\Login::getUser();
|
|
|
|
// User status override redirect
|
|
CHV\User::statusRedirect($logged_user['status']);
|
|
|
|
// Process the index query string requests like "?lang=en"
|
|
if ($_SERVER['QUERY_STRING']) {
|
|
switch (key($querystr)) {
|
|
// Party Boy
|
|
case 'random':
|
|
if (!CHV\getSetting('website_random')) {
|
|
break;
|
|
}
|
|
$tables = CHV\DB::getTables();
|
|
$db = CHV\DB::getInstance();
|
|
$db->query('SELECT MIN(image_id) as min, MAX(image_id) as max FROM ' . $tables['images']);
|
|
$limit = $db->fetchSingle();
|
|
// Try to get the right image
|
|
$random_ids = G\random_values($limit['min'], $limit['max'], 100);
|
|
if (is_null($random_ids)) {
|
|
G\redirect();
|
|
} else {
|
|
if (count($random_ids) == 1) {
|
|
$random_ids[] = $random_ids[0];
|
|
}
|
|
}
|
|
if ($limit['min'] !== $limit['max']) {
|
|
// Do NOT show the last viewed image
|
|
$last_viewed_image = CHV\decodeID($_SESSION['last_viewed_image']);
|
|
if (($key = array_search($last_viewed_image, $random_ids)) !== false) {
|
|
unset($random_ids[$key]);
|
|
}
|
|
}
|
|
$query = 'SELECT image_id FROM ' . $tables['images'] . ' LEFT JOIN ' . $tables['albums'] . ' ON ' . $tables['images'] . '.image_album_id = ' . $tables['albums'] . '.album_id WHERE image_id IN (' . join(',', $random_ids) . ") AND (album_privacy = 'public' OR album_privacy IS NULL) ";
|
|
// Don't show NSFW in random mode
|
|
if (!CHV\getSetting('show_nsfw_in_random_mode')) {
|
|
if ($logged_user) {
|
|
$query .= 'AND (' . $tables['images'] . '.image_nsfw = 0 OR ' . $tables['images'] . '.image_user_id = ' . $logged_user['id'] . ') ';
|
|
} else {
|
|
$query .= 'AND ' . $tables['images'] . '.image_nsfw = 0 ';
|
|
}
|
|
}
|
|
if ($handler::getCond('forced_private_mode')) {
|
|
$query .= 'AND ' . $tables['images'] . '.image_user_id = ' . $logged_user['id'] . ' ';
|
|
}
|
|
$query .= 'ORDER BY RAND() LIMIT 1';
|
|
$db->query($query);
|
|
$imageID = $db->fetchSingle()['image_id'];
|
|
$image = CHV\Image::getSingle($imageID, false, true);
|
|
// Does exists in the disk?
|
|
if ($image['file_resource']['chain']['image'] == null) {
|
|
$image = false;
|
|
}
|
|
if (!$image) {
|
|
if ($_SESSION['random_failure'] > 3) {
|
|
G\redirect();
|
|
} else {
|
|
++$_SESSION['random_failure'];
|
|
}
|
|
} else {
|
|
unset($_SESSION['random_failure']);
|
|
}
|
|
|
|
return G\redirect($image ? CHV\Image::getUrlViewer(CHV\encodeID($imageID)) : '?random');
|
|
break;
|
|
|
|
// Legacy 1.X viewer request (?v=file.ext)
|
|
case 'v':
|
|
if (preg_match('{^\w*\.jpg|png|gif$}', $_GET['v'])) {
|
|
$explode = array_filter(explode('.', $_GET['v']));
|
|
if (count($explode) == 2) {
|
|
$image = CHV\DB::get('images', ['name' => $explode[0], 'extension' => $explode[1]], 'AND', [], 1);
|
|
if ($image) {
|
|
$image = CHV\Image::formatArray($image);
|
|
G\redirect($image['url_viewer']);
|
|
}
|
|
}
|
|
}
|
|
$handler->issue404();
|
|
break;
|
|
|
|
// Allow any /?list=
|
|
case 'list':
|
|
$handler->template = 'index';
|
|
break;
|
|
|
|
// For everything else, check for redirects
|
|
default:
|
|
$handler->checkIndexRedirect = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (CHV\Settings::get('homepage_style') == 'split') {
|
|
// Tabs
|
|
$tabs = [
|
|
[
|
|
'tools' => true,
|
|
'current' => true,
|
|
'id' => 'home-pics',
|
|
'type' => 'image',
|
|
],
|
|
];
|
|
|
|
// Handle the home uids
|
|
$home_uids = CHV\getSetting('homepage_uids');
|
|
$home_uid_is_null = ($home_uids == '' or $home_uids == '0' ? true : false);
|
|
$home_uid_arr = !$home_uid_is_null ? explode(',', $home_uids) : false;
|
|
|
|
if (is_array($home_uid_arr)) {
|
|
$home_uid_bind = [];
|
|
foreach ($home_uid_arr as $k => $v) {
|
|
$home_uid_bind[] = ':user_id_' . $k;
|
|
if ($v == 0) {
|
|
$home_uid_is_null = true;
|
|
}
|
|
}
|
|
$home_uid_bind = implode(',', $home_uid_bind);
|
|
}
|
|
|
|
$doing = is_array($home_uid_arr) ? 'recent' : 'trending';
|
|
|
|
$explore_semantics = $handler::getVar('explore_semantics');
|
|
$listing = $explore_semantics[$doing];
|
|
$listing['list'] = is_null($doing) ? G\get_route_name() : $doing;
|
|
|
|
$list_params = CHV\Listing::getParams(); // Use CHV magic params
|
|
|
|
$list = new CHV\Listing();
|
|
|
|
$listingParams = [
|
|
'listing' => $doing,
|
|
'basename' => '/',
|
|
'params_hidden' => [
|
|
'hide_empty' => 1,
|
|
'hide_banned' => 1,
|
|
'album_min_image_count' => CHV\getSetting('explore_albums_min_image_count'),
|
|
'route' => 'index',
|
|
],
|
|
];
|
|
|
|
$tabs = CHV\Listing::getTabs($listingParams, true);
|
|
$currentKey = $tabs['currentKey'];
|
|
$currentTab = $tabs['tabs'][$currentKey];
|
|
$type = $currentTab['type'];
|
|
$tabs = $tabs['tabs'];
|
|
parse_str($tabs[$currentKey]['params'], $tabs_params);
|
|
$list_params['sort'] = explode('_', $tabs_params['sort']);
|
|
|
|
$handler::setVar('list_params', $list_params);
|
|
|
|
$list->setParamsHidden($listingParams['params_hidden']);
|
|
|
|
if (is_array($home_uid_arr)) {
|
|
foreach ($tabs as $k => &$v) {
|
|
if ($v['type'] == 'users') {
|
|
unset($tabs[$k]);
|
|
}
|
|
}
|
|
$prefix = CHV\DB::getFieldPrefix($type);
|
|
$where = 'WHERE ' . $prefix . '_user_id IN(' . $home_uid_bind . ')';
|
|
if ($home_uid_is_null) {
|
|
$where .= ' OR ' . $prefix . '_user_id IS NULL';
|
|
}
|
|
$list->setWhere($where);
|
|
foreach ($home_uid_arr as $k => $v) {
|
|
$list->bind(':user_id_' . $k, $v);
|
|
}
|
|
} else {
|
|
$canonical = G\str_replace_first(G\get_base_url(), G\get_base_url('explore/trending'), G\get_current_url());
|
|
$handler::setVar('canonical', $canonical);
|
|
}
|
|
|
|
$list->setType($type);
|
|
$list->setReverse($list_params['reverse']);
|
|
$list->setSeek($list_params['seek']);
|
|
$list->setOffset($list_params['offset']);
|
|
$list->setLimit($list_params['limit']); // how many results?
|
|
$list->setItemsPerPage($list_params['items_per_page']); // must
|
|
$list->setSortType($list_params['sort'][0]); // date | size | views | likes
|
|
$list->setSortOrder($list_params['sort'][1]); // asc | desc
|
|
$list->setRequester(CHV\Login::getUser());
|
|
$list->exec();
|
|
|
|
$handler::setVar('listing', $listing);
|
|
|
|
$handler::setVar('tabs', $tabs);
|
|
$handler::setVar('list', $list);
|
|
}
|
|
|
|
$handler::setVar('doctitle', CHV\Settings::get('website_doctitle'));
|
|
$handler::setVar('pre_doctitle', CHV\Settings::get('website_name'));
|
|
|
|
if ($logged_user['is_content_manager']) {
|
|
$handler::setVar('user_items_editor', false);
|
|
}
|
|
} catch (Exception $e) {
|
|
G\exception_to_error($e);
|
|
}
|
|
};
|