Files
easystream-main/f_core/f_classes/class.home.php
SamiAhmed7777 0b7e2d0a5b feat: Add comprehensive documentation suite and reorganize project structure
- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
2025-10-21 00:39:45 -07:00

1280 lines
62 KiB
PHP

<?php
/*******************************************************************************************************************
| Software Name : EasyStream
| Software Description : High End YouTube Clone Script with Videos, Shorts, Streams, Images, Audio, Documents, Blogs
| Software Author : (c) Sami Ahmed
|*******************************************************************************************************************
|
|*******************************************************************************************************************
| This source file is subject to the EasyStream Proprietary License Agreement.
|
| By using this software, you acknowledge having read this Agreement and agree to be bound thereby.
|*******************************************************************************************************************
| Copyright (c) 2025 Sami Ahmed. All rights reserved.
|*******************************************************************************************************************/
defined('_ISVALID') or header('Location: /error');
class VHome
{
private static $cfg;
private static $db;
private static $db_cache;
private static $dbc;
private static $filter;
private static $class_language;
private static $language;
private static $href;
private static $home_cfg = false;
private static $mod = array('live', 'video', 'short', 'image', 'audio', 'document', 'blog');
public function __construct($_type = false)
{
require 'f_core/config.href.php';
global $cfg, $class_filter, $class_database, $db, $language, $class_language;
self::$cfg = $cfg;
self::$db = $db;
self::$dbc = $class_database;
self::$filter = $class_filter;
self::$language = $language;
self::$class_language = $class_language;
self::$href = $href;
if ((int) $_SESSION['USER_ID'] > 0) {
self::$home_cfg = unserialize($class_database->singleFieldValue('db_accountuser', 'home_cfg', 'usr_id', (int) $_SESSION['USER_ID']));
}
self::$db_cache = false; //change here to enable caching
}
/* content layout */
public static function doLayout()
{
$cfg = self::$cfg;
$language = self::$language;
$html = '
<div id="home-content">
' . VGenerate::advHTML(1) . '
' . (isset($_GET['fsn']) ? VGenerate::noticeTpl('', '', $language['notif.success.subscribe']) : null) . '
' . ($cfg['live_module'] == 1 ? self::featuredMedia('live', 0) : null) . '
' . ($cfg['video_module'] == 1 ? self::featuredMedia('video', 1) : null) . '
' . ($cfg['short_module'] == 1 ? self::shortsMedia('latest') : null) . '
' . ($cfg['video_module'] == 1 ? self::featuredMedia('video', 0, false, ' r-section') : null) . '
' . ($cfg['short_module'] == 1 ? self::shortsMedia('featured') : null) . '
' . VGenerate::advHTML(2);
$html .= self::getFeaturedChannels();
$html .= self::getFeaturedCategories();
$html .= '</div>';
/* subscribe/unsubscribe action */
if ($cfg['user_subscriptions'] == 1) {
$ht_js = 'c_url = "' . $cfg['main_url'] . '/' . VHref::getKey('watch') . '?a";';
$ht_js .= '$(document).on("click", ".unsubscribe-action", function(e){';
$ht_js .= 'rel = $(this).attr("rel-usr"); if (rel === "' . $_SESSION['USER_KEY'] . '") return;';
$ht_js .= 'if($("#sub-wrap .sub-txt:first").text()=="' . $language['frontend.global.unsubscribed'] . '")return;';
$ht_js .= '$("#sub-wrap .sub-txt:first").text("' . $language['frontend.global.loading'] . '");return;';
$ht_js .= '$.post(c_url+"?do=user-unsubscribe", $("#user-files-form").serialize(), function(data){';
$ht_js .= '$("#sub-wrap .sub-txt:first").text("' . $language['frontend.global.unsubscribed'] . '");';
$ht_js .= '});';
$ht_js .= '});';
}
/* follow/unfollow action */
if ($cfg['user_follows'] == 1) {
$ht_js .= 'c_url = "' . $cfg['main_url'] . '/' . VHref::getKey('watch') . '?a";';
$ht_js .= '$(document).on("click", ".follow-action", function(e){';
$ht_js .= 'rel = $(this).attr("rel-usr"); if (rel === "' . $_SESSION['USER_KEY'] . '") return;';
$ht_js .= '$(".follow-txt-"+rel).text("' . $language['frontend.global.loading'] . '");';
$ht_js .= '$.post(c_url+"&do=user-follow", $("#user-files-form-"+rel).serialize(), function(data){';
$ht_js .= '$(".follow-txt-"+rel).text("' . $language['frontend.global.followed'] . '");';
$ht_js .= '});';
$ht_js .= '});';
$ht_js .= '$(document).on("click", ".unfollow-action", function(e){';
$ht_js .= 'rel = $(this).attr("rel-usr"); if (rel === "' . $_SESSION['USER_KEY'] . '") return;';
$ht_js .= '$(".follow-txt-"+rel).text("' . $language['frontend.global.loading'] . '");';
$ht_js .= '$.post(c_url+"&do=user-unfollow", $("#user-files-form-"+rel).serialize(), function(data){';
$ht_js .= '$(".follow-txt-"+rel).text("' . $language['frontend.global.unfollowed'] . '");';
$ht_js .= '});';
$ht_js .= '});';
}
$html .= $ht_js != '' ? '
<script type="text/javascript">
$(function(){' . $ht_js . '});
</script>
' : null;
return $html;
}
private static function getFeaturedCategories($type = 'video')
{
$db = self::$db;
$language = self::$language;
$cfg = self::$cfg;
$uid = (int) $_SESSION['USER_ID'];
$html = null;
switch ($type[0]) {
case "l":$href_key = 'broadcasts';
break;
case "v":$href_key = 'videos';
break;
case "i":$href_key = 'images';
break;
case "a":$href_key = 'audios';
break;
case "d":$href_key = 'documents';
break;
case "b":$href_key = 'blogs';
break;
}
$sql = sprintf("SELECT `ct_id`, `ct_name`, `ct_slug`, `ct_icon` FROM `db_categories` WHERE `ct_type`='%s' AND `ct_featured`='1' AND `ct_active`='1' ORDER BY RAND() LIMIT 5;", $type);
$rs = self::$db_cache ? self::$db->CacheExecute(self::$cfg['cache_home_featured_channels'], $sql) : self::$db->execute($sql);
$ids = [];
$names = [];
$icons = [];
$slugs = [];
if ($rs->fields['ct_id']) {
while (!$rs->EOF) {
$ct_id = $rs->fields['ct_id'];
$ids[] = $ct_id;
$names[$ct_id] = $rs->fields['ct_name'];
$icons[$ct_id] = $rs->fields['ct_icon'];
$slugs[$ct_id] = $rs->fields['ct_slug'];
$rs->MoveNext();
}
}
$sql = sprintf("WITH RankedVideos AS (
SELECT
A.`file_key`,
A.`file_views`,
A.`file_duration`,
A.`file_like`,
A.`file_comments`,
A.`thumb_server`,
A.`thumb_cache`,
A.`upload_date`,
A.`stream_live`,
A.`thumb_preview`,
A.`file_title`,
A.`file_category`,
D.`usr_dname`,
D.`ch_title`,
D.`usr_photo`,
D.`usr_profileinc`,
D.`usr_partner`,
D.`usr_affiliate`,
D.`affiliate_badge`,
D.`usr_id`,
D.`usr_key`,
D.`usr_user`,
ROW_NUMBER() OVER (PARTITION BY A.`file_category` ORDER BY A.`db_id` DESC) AS rn
FROM
(SELECT DISTINCT `ct_id` FROM `db_categories` WHERE `ct_type` = '%s' AND `ct_id` IN (%s) LIMIT 5) AS sub
JOIN `db_%sfiles` AS A ON sub.`ct_id` = A.`file_category`
JOIN `db_accountuser` AS D ON A.`usr_id` = D.`usr_id`
WHERE
A.`privacy` = 'public'
AND A.`approved` = '1'
AND A.`deleted` = '0'
AND A.`active` = '1'
)
SELECT *
FROM RankedVideos
WHERE rn <= 5
ORDER BY `file_category`, `rn`", $type, implode(',', $ids), $type);
$res = self::$db_cache ? self::$db->CacheExecute(self::$cfg['cache_home_featured_channels'], $sql) : self::$db->execute($sql);
$html = null;
$ares = 'categ';
$default_section = 'featured';
$main_section = 'featured_section recommended_section';
$user_watchlist = VBrowse::watchlistEntries($type);
$results = [];
if ($res->fields['usr_id']) {
while (!$res->EOF) {
$index[$ct_id] = 0;
foreach ($ids as $ct_id) {
if ($res->fields['file_category'] == $ct_id) {
if ($index[$ct_id] <= 5) {
$results[$ct_id][] = [
"file_title" => $res->fields['file_title'],
"usr_user" => $res->fields['usr_user'],
"usr_dname" => $res->fields['usr_dname'],
"ch_title" => $res->fields['ch_title'],
"file_key" => $res->fields['file_key'],
"usr_key" => $res->fields['usr_key'],
"usr_id" => $res->fields['usr_id'],
"usr_affiliate" => $res->fields['usr_affiliate'],
"usr_partner" => $res->fields['usr_partner'],
"affiliate_badge" => $res->fields['affiliate_badge'],
"thumb_server" => $res->fields['thumb_server'],
"thumb_cache" => $res->fields['thumb_cache'],
"usr_photo" => $res->fields['usr_photo'],
"usr_profileinc" => $res->fields['usr_profileinc'],
"stream_live" => $res->fields['stream_live'],
"upload_date" => $res->fields['upload_date'],
"file_duration" => $res->fields['file_duration'],
"file_views" => $res->fields['file_views'],
"file_like" => $res->fields['file_like'],
"file_comments" => $res->fields['file_comments'],
"thumb_preview" => $res->fields['thumb_preview'],
];
}
$index[$ct_id] += 1;
}
}
$res->MoveNext();
}
}
foreach ($results as $ct_id => $result) {
$_heading = '<i class="' . $icons[$ct_id] . '"></i><a href="' . $cfg['main_url'] . '/' . $href_key . '/' . $slugs[$ct_id] . '">' . $names[$ct_id] . '</a>';
$html .= ' <div class="clearfix"></div>
<section class="' . $main_section . ' ' . $default_section . '_' . $href_key . '">
<div class="container">
<article>
<h2 class="content-title">
<span class="heading">' . $_heading . '</span>
</h2>
</article>
<article>
<div id="main-view-mode-1-' . $default_section . '-' . $type . '" class="homeContent ' . $default_section . ' ' . $type . '">
<div id="main-view-mode-1-' . $default_section . '-' . $type . '-list">
';
if ($results[$ct_id]) {
$html .= VBrowse::viewMode1($results[$ct_id], $user_watchlist, $type, true);
}
$html .= ' </div>
</div>
</article>
</div>
</section>';
$html .= '<div class="clearfix"></div>';
$html .= '<div class="line"></div>';
}
return $html;
}
private static function getFeaturedChannels($page = 1, $type = 'video')
{
$db = self::$db;
$language = self::$language;
$cfg = self::$cfg;
$uid = (int) $_SESSION['USER_ID'];
$_q = "AND A.`usr_featured`='1' ORDER BY RAND()";
if ($page) {
switch ($page) {
case 3:
$lim = "10, 5";
break;
case 2:
$lim = "5, 5";
break;
default:
$lim = "0, 5";
break;
}
}
switch ($type[0]) {
case "l":$href_key = 'broadcasts';
break;
case "v":$href_key = 'videos';
break;
case "i":$href_key = 'images';
break;
case "a":$href_key = 'audios';
break;
case "d":$href_key = 'documents';
break;
case "b":$href_key = 'blogs';
break;
}
$sql = sprintf("SELECT
A.`usr_id`, A.`usr_key`, A.`usr_user`, A.`usr_affiliate`, A.`usr_partner`,
A.`usr_dname`, A.`ch_views`, A.`ch_title`, A.`affiliate_badge`, A.`usr_photo`, A.`usr_profileinc`
FROM
`db_accountuser` A
WHERE
A.`usr_status`='1'
%s
%s
LIMIT %s;", $_q, ($uid > 0 ? (is_array($ids) ? "ORDER BY FIND_IN_SET(A.`usr_id`, '" . implode(',', $ids) . "')" : null) : null), $lim);
$res = self::$db_cache ? self::$db->CacheExecute(self::$cfg['cache_home_featured_channels'], $sql) : self::$db->execute($sql);
$ids = [];
$keys = [];
$uuser = [];
if ($res->fields['usr_id']) {
while (!$res->EOF) {
$usr_id = $res->fields['usr_id'];
$ids[] = (int) $usr_id;
$keys[$usr_id] = $res->fields['usr_key'];
$uuser[$usr_id] = $res->fields['usr_user'];
$res->MoveNext();
}
shuffle($ids);
}
$sql = sprintf("WITH RankedVideos AS (
SELECT
A.`file_key`,
A.`file_views`,
A.`file_duration`,
A.`file_like`,
A.`file_comments`,
A.`thumb_server`,
A.`thumb_cache`,
A.`upload_date`,
A.`stream_live`,
A.`thumb_preview`,
A.`file_title`,
A.`file_category`,
D.`usr_dname`,
D.`ch_title`,
D.`usr_photo`,
D.`usr_profileinc`,
D.`usr_partner`,
D.`usr_affiliate`,
D.`affiliate_badge`,
D.`usr_id`,
D.`usr_key`,
D.`usr_user`,
D.`usr_followcount`,
D.`usr_subcount`,
ROW_NUMBER() OVER (PARTITION BY A.`usr_id` ORDER BY A.`db_id` DESC) AS rn
FROM
(SELECT DISTINCT `usr_id` FROM `db_accountuser` WHERE `usr_id` IN (%s)) AS sub
JOIN `db_%sfiles` AS A ON sub.`usr_id` = A.`usr_id`
JOIN `db_accountuser` AS D ON A.`usr_id` = D.`usr_id`
WHERE
A.`privacy` = 'public'
AND A.`approved` = '1'
AND A.`deleted` = '0'
AND A.`active` = '1'
)
SELECT *
FROM RankedVideos
WHERE rn <= 5
ORDER BY `usr_id`, `rn`;", implode(',', $ids), $type);
$res = self::$db_cache ? self::$db->CacheExecute(self::$cfg['cache_home_featured_channels'], $sql) : self::$db->execute($sql);
$html = null;
$ares = 'categ';
$default_section = 'featured';
$main_section = 'featured_section recommended_section';
$user_watchlist = VBrowse::watchlistEntries($type);
$results = [];
if ($res->fields['usr_id']) {
while (!$res->EOF) {
$index[$usr_id] = 0;
foreach ($ids as $usr_id) {
if ($res->fields['usr_id'] == $usr_id) {
if ($index[$usr_id] <= 5) {
$results[$usr_id][] = [
"file_title" => $res->fields['file_title'],
"usr_user" => $res->fields['usr_user'],
"usr_dname" => $res->fields['usr_dname'],
"ch_title" => $res->fields['ch_title'],
"file_key" => $res->fields['file_key'],
"usr_key" => $res->fields['usr_key'],
"usr_id" => $res->fields['usr_id'],
"usr_affiliate" => $res->fields['usr_affiliate'],
"usr_partner" => $res->fields['usr_partner'],
"affiliate_badge" => $res->fields['affiliate_badge'],
"thumb_server" => $res->fields['thumb_server'],
"thumb_cache" => $res->fields['thumb_cache'],
"usr_photo" => $res->fields['usr_photo'],
"usr_profileinc" => $res->fields['usr_profileinc'],
"stream_live" => $res->fields['stream_live'],
"upload_date" => $res->fields['upload_date'],
"file_duration" => $res->fields['file_duration'],
"file_views" => $res->fields['file_views'],
"file_like" => $res->fields['file_like'],
"file_comments" => $res->fields['file_comments'],
"thumb_preview" => $res->fields['thumb_preview'],
];
}
$index[$usr_id] += 1;
}
}
$res->MoveNext();
}
}
foreach ($results as $usr_id => $result) {
$usr_id = $result[0]['usr_id'];
$usr_key = $result[0]['usr_key'];
$usr_user = $result[0]['usr_user'];
$user_followtotal = $result[0]['usr_followcount'];
$user_subtotal = $result[0]['usr_subcount'];
$_user = ($result[0]['usr_dname'] != '' ? $result[0]['usr_dname'] : ($result[0]['ch_title'] != '' ? $result[0]['ch_title'] : $result[0]['usr_user']));
$_heading = '<a href="' . VHref::channelURL(["username" => $result[0]['usr_user']]) . '">' . $_user . VAffiliate::affiliateBadge($result[0]['usr_affiliate'], $result[0]['affiliate_badge']) . '</a>';
$bg_url = VUseraccount::getProfileImage_inc($usr_key, $result[0]['usr_photo'], $result[0]['usr_profileinc']);
$_icon = '<img alt="' . $_user . '" title="' . $_user . '" height="32" src="' . $bg_url . '" />';
$html .= ' <div class="clearfix"></div>
<section class="' . $main_section . ' ' . $default_section . '_' . $href_key . '">
<div class="container">
<article>
<h2 class="content-title">
' . $_icon . '
<span class="heading">' . $_heading . '</span>
</h2>
</article>
<article>
<div id="main-view-mode-1-' . $default_section . '-' . $type . '" class="homeContent ' . $default_section . ' ' . $type . '">
<div id="main-view-mode-1-' . $default_section . '-' . $type . '-list">
';
if ($results[$usr_id]) {
$html .= VBrowse::viewMode1($results[$usr_id], $user_watchlist, $type, true);
}
$html .= ' </div>
</div>
</article>
</div>
</section>';
$html .= '<div class="clearfix"></div>';
$html .= '<div class="line"></div>';
}
return $html;
}
/* list media content
* $ares = true trending
* $ares = false recommended/featured
* $ares = array subscriptions/featured channels
*/
public function featuredMedia($type = 'video', $ares = false, $ct_id = false, $extra_class = null)
{
$cfg = self::$cfg;
$db = self::$db;
$language = self::$language;
switch ($type[0]) {
case "l":$href_key = 'broadcasts';
break;
case "v":$href_key = 'videos';
break;
case "i":$href_key = 'images';
break;
case "a":$href_key = 'audios';
break;
case "d":$href_key = 'documents';
break;
case "b":$href_key = 'blogs';
break;
}
$_o = null;
if (is_array($ares)) {
$usr_key = $ares['usr_key'];
$usr_photo = $ares['usr_photo'];
$usr_inc = $ares['usr_profileinc'];
$_q = sprintf("AND %sB.`usr_id`='%s'%s", ((int) $_SESSION['USER_ID'] == 0 ? "(" : null), $ares['usr_id'], ((int) $_SESSION['USER_ID'] == 0 ? ")" : null));
$_o = "ORDER BY B.`upload_date` DESC";
$usr_affiliate = $ares['usr_affiliate'];
$usr_partner = $ares['usr_partner'];
$usr_affiliate = ($usr_affiliate == 1 or $usr_partner == 1) ? 1 : 0;
$af_badge = $ares['affiliate_badge'];
$_user = ($ares['usr_dname'] != '' ? $ares['usr_dname'] : ($ares['ch_title'] != '' ? $ares['ch_title'] : $ares['usr_user']));
$_heading = '<a href="' . VHref::channelURL(["username" => $ares['usr_user']]) . '">' . $_user . VAffiliate::affiliateBadge($usr_affiliate, $af_badge) . '</a>';
$bg_url = VUseraccount::getProfileImage_inc($usr_key, $usr_photo, $usr_inc);
$_icon = '<img alt="' . $_user . '" title="' . $_user . '" height="32" src="' . $bg_url . '" />';
$default_section = 'channel-' . $usr_key;
$main_section = 'channel_section';
} else {
if ((int) $_SESSION['USER_ID'] > 0 and !$ares) {
$_q = ($type != 'live' and !$ct_id) ? "AND B.`is_featured`='1' ORDER BY RAND() " : null;
} elseif ((int) $_SESSION['USER_ID'] > 0 and $ares == 'categ') {
$_q = "AND B.`is_featured`='1' ";
} else {
$_q = (($ct_id > 0 and !$ares) ? null : ($type != 'live' ? "AND B.`is_featured`='1' ORDER BY RAND() " : null));
}
if (!$ares) {
$_heading = ($type == 'live' ? '<i class="icon-live"></i>' . $language['frontend.global.live.now'] : $language['frontend.global.recommended']);
if ($ct_id > 0) {
$csql = $db->execute(sprintf("SELECT `ct_name`, `ct_icon`, `ct_type`, `ct_slug` FROM `db_categories` WHERE `ct_id`='%s' LIMIT 1;", $ct_id));
switch ($csql->fields['ct_type']) {
case "video":$u = self::$href['videos'];
break;
case "live":$u = self::$href['broadcasts'];
break;
case "image":$u = self::$href['images'];
break;
case "audio":$u = self::$href['audios'];
break;
case "document":$u = self::$href['documents'];
break;
case "blog":$u = self::$href['blogs'];
break;
}
$_heading = '<i class="' . $csql->fields['ct_icon'] . '"></i><a href="' . $cfg['main_url'] . '/' . $u . '/' . $csql->fields['ct_slug'] . '">' . $csql->fields['ct_name'] . '</a>';
}
$default_section = 'featured';
$main_section = 'featured_section recommended_section';
} elseif ($ares and $ares !== 'categ') {
$_q = "AND (B.`upload_date` BETWEEN DATE_SUB(NOW(), INTERVAL 365 DAY) AND NOW()) AND B.`file_views` > 0 ORDER BY RAND() ";
$_heading = $language['frontend.global.trending'];
$default_section = 'recommended';
$main_section = 'featured_section';
$_icon = 'icon-fire';
}
$_icon = '<i class="' . (($ares and $ares !== "categ") ? 'icon-fire' : ($ares == 'categ' ? $_cticon : ($type == 'doc' ? 'icon-file' : ($type == 'blog' ? 'icon-pencil2' : 'icon-' . $type)))) . '"></i>';
$sub_html = null;
}
if (isset($_GET['rc']) and isset($_GET['rn'])) {
$nr = (int) $_GET['rn'];
$lim = sprintf("%s, %s", $nr, $nr);
} else {
$lim = ($ct_id > 0) ? 5 : 10;
}
$_q .= ($ct_id > 0 and !$ares) ? "AND B.`file_category`='" . $ct_id . "' ORDER BY B.`db_id` DESC " : null;
$sql = sprintf("SELECT
B.`file_key`, B.`old_file_key`, B.`old_key` AS `fkey`, B.`file_title`, B.`thumb_preview`,
B.`file_hd`, B.`file_views`, B.`file_duration`, B.`file_comments`, B.`file_like`, B.`upload_date`, B.`thumb_server`, B.`thumb_cache`, B.`stream_live`,
C.`usr_affiliate`, C.`usr_partner`, C.`affiliate_badge`, C.`usr_id`, C.`usr_key`, C.`old_usr_key`, C.`old_key` AS `ukey`, C.`usr_user`, C.`usr_dname`, C.`ch_title`, C.`usr_photo`, C.`usr_profileinc`
FROM
`db_%sfiles` B, `db_accountuser` C
WHERE
B.`usr_id`=C.`usr_id` AND
" . ($type == 'live' ? "B.`stream_live`='1' AND" : null) . "
B.`privacy`='public' AND
B.`approved`='1' AND
B.`deleted`='0' AND
B.`active`='1'
%s %s LIMIT %s;", $type, $_q, $_o, (!$ares ? $lim : 5));
$res = self::$db_cache ? self::$db->CacheExecute(self::$cfg['cache_home_featured_media'], $sql) : self::$db->execute($sql);
if (!$res->fields['file_key']) {
return;
}
if (isset($_GET['rc']) and isset($_GET['rn'])) {
$user_watchlist = VBrowse::watchlistEntries($type);
$html = VBrowse::viewMode1($res, $user_watchlist, $type, (!$ares ? true : false));
return $html;
}
$html = ' <div class="clearfix"></div>
<section class="' . $main_section . ' ' . $default_section . '_' . $href_key . $extra_class .'">
<div class="container">
<article>
<h2 class="content-title">
' . $_icon . '<span class="heading">' . $_heading . '</span>
</h2>
' . $sub_html . '
</article>
<article>
<div id="main-view-mode-1-' . $default_section . '-' . $type . '" class="homeContent ' . $default_section . ' ' . $type . '">
<div id="main-view-mode-1-' . $default_section . '-' . $type . '-list">
';
if ($res->fields['file_key']) {
$user_watchlist = VBrowse::watchlistEntries($type);
$html .= VBrowse::viewMode1($res, $user_watchlist, $type, (!$ares ? true : false));
}
$html .= ' </div>
</div>
</article>
</div>
</section>';
$html .= '<div class="clearfix"></div>';
$html .= '<div class="line"></div>';
return $html;
}
/* get my subs/follows count */
public function getSubCount($follow_count = false)
{
global $class_database, $cfg;
$user_id = (int) $_SESSION['USER_ID'];
$sub_cache = self::$db_cache ? $cfg['cache_view_sub_id'] : false;
if (!$follow_count and $cfg['user_subscriptions'] == 1) {
return $class_database->singleFieldValue('db_accountuser', 'usr_subcount', 'usr_id', $user_id, $sub_cache);
} elseif ($follow_count and $cfg['user_follows'] == 1) {
return $class_database->singleFieldValue('db_accountuser', 'usr_followcount', 'usr_id', $user_id, $sub_cache);
}
}
public function shortsMedia($show = 'latest')
{
$cfg = self::$cfg;
$language = self::$language;
$href_key = 'home';
$main_section = 'shorts';
$default_section = $type . '-' . $main_section;
$_icon = '<i class="icon-clock"></i>';
$_heading = $language['frontend.global.shorts'];
$user_theme = isset($_SESSION['USER_THEME']) ? $_SESSION['USER_THEME'] : $_SESSION['theme_name'];
$def_thumb = $cfg['global_images_url'] . '/loading-' . (strpos($user_theme, 'dark') !== false ? 'dark' : 'light') . '-shorts.gif';
$vpv = true;
$shorts = VBrowse::getShorts($show);
$items = [];
if ($shorts->fields['file_key']) {
while (!$shorts->EOF) {
$file_key = $shorts->fields['file_key'];
$usr_key = $shorts->fields['usr_key'];
$thumb_server = $shorts->fields['thumb_server'];
$thumb_cache = $shorts->fields['thumb_cache'];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$title = $shorts->fields['file_title'];
$url = $cfg['main_url'] . '/' . VHref::getKey("shorts") . '/' . $file_key;
$duration = VFiles::fileDuration($shorts->fields['file_duration']);
$duration_show = 1;
$views = VFiles::numFormat($shorts->fields['file_views']);
$_rel_v = $shorts->fields['embed_src'] == 'local' ? md5($file_key . '_preview') : null;
if ($duration_show == 1 and $duration == '00:00') {
$conv = VFileinfo::get_progress($file_key);
$conv_class = ' converting';
$thumbnail = '<img class="mediaThumb" src="' . $def_thumb . '" alt="' . $title . '">';
} else {
$conv = null;
$conv_class = null;
$img_tmb = is_file($cfg['media_files_dir'] . '/' . $usr_key . '/t/' . $file_key . '/0' . $thumb_cache . '.jpg');
$img_src = ($type == 'blog' and !$img_tmb) ? $cfg['global_images_url'] . '/default-blog.png' : VBrowse::thumbnail(array($usr_key, $thumb_cache), $file_key, $thumb_server);
$thumbnail = '<img class="mediaThumb" src="' . $def_thumb . '" ' . ($img_tmb ? 'data-src="' . $img_src . '"' : null) . ' alt="' . $title . '" onclick="window.location=\'' . $url . '\'">';
}
$items[] = '
<li class="vs-column sixths small-thumbs">
<div class="thumbs-wrapper">
<figure class="effect-smallT">
' . $thumbnail . '
<div style="display:none;position:absolute;top:0px;width:100%;height:100%" class="vpv">
' . ($vpv ? '<video loop playsinline="true" muted="true" style="width:100%;height:100%" id="pv' . $file_key . rand(9999, 999999999) . '" rel-u="' . $usr_key . '" rel-s="' . $_rel_v . '" oncontextmenu="return false;" onclick="window.location=\'' . $url . '\'">
<source src="' . self::$cfg['previews_url'] . '/default.mp4" type="video/mp4"></source>
</video>
' : null) . '
</div>
</figure>
<h3><a href="' . $url . '">' . $title . '</a></h3>
<div class="caption">
<div class="vs-column">
<span class="views-number">' . $views . ' ' . ($views == 1 ? $language['frontend.global.view'] : $language['frontend.global.views']) . '</span>
</div>
</div>
</div>
</li>
';
$shorts->MoveNext();
}
}
$html = null;
if (!empty($items)) {
$html .= ' <div class="clearfix"></div>
<section class="' . $main_section . ' ' . $default_section . '-' . $href_key . '">
<div class="container">
<article>
<h2 class="content-title">
' . $_icon . '<span class="heading">' . $_heading . '</span>
</h2>
' . $sub_html . '
</article>
<article>
<div id="main-view-mode-1-' . $default_section . '-' . $type . '" class="shortsContent ' . $default_section . ' ' . $type . '">
<div id="main-view-mode-1-' . $default_section . '-' . $type . '-list">
<ul class="fileThumbs big clearfix view-list">';
// for ($i == 1; $i <= 12; $i++) {
$html .= implode('', $items);
// }
$html .= ' </ul>';
$html .= ' </div>
</div>
</article>
</div>
</section>';
$html .= '<div class="clearfix"></div>';
$html .= '<div class="line"></div>';
}
return $html;
}
/* get sub paging content */
public static function subContent_OFFFFF()
{
$cfg = self::$cfg;
$language = self::$language;
$page = (int) $_GET['p'];
$channels = self::getFeaturedChannels($page);
$html = null;
if ($channels->fields['usr_id']) {
foreach ($channels as $channel) {
$html .= self::featuredMedia('video', $channel);
}
}
$html .= '<div class="load-more-sub" data-loader="pageLoader" rel-p="' . ($page + 1) . '"></div>';
echo $html;
}
/* user notifications list */
public static function userNotifications($show_hidden = false)
{
$html = null;
$uid = (int) $_SESSION['USER_ID'];
$db = self::$db;
$cfg = self::$cfg;
$class_filter = self::$filter;
$page = isset($_GET['p']) ? (int) $_GET['p'] : 1;
$ids = array();
$_q = array();
if ($uid > 0) {
if ($cfg['user_subscriptions'] == 1) {
$rs = $db->execute(sprintf("SELECT `db_id`, `usr_id`, `sub_type` FROM `db_subscribers` WHERE `sub_id`='%s';", $uid));
if ($rs->fields['db_id']) {
while (!$rs->EOF) {
$id = $rs->fields['usr_id'];
if (!in_array($id, $ids)) {
$ids[] = (int) $id;
$_q[] = sprintf("(A.`usr_id`='%s'%s)", $id, ($rs->fields['sub_type'] == 'files' ? " AND A.`act_type` LIKE 'upload%'" : null));
}
$rs->MoveNext();
}
}
}
if ($cfg['user_follows'] == 1) {
$rs = $db->execute(sprintf("SELECT `db_id`, `usr_id`, `sub_type` FROM `db_followers` WHERE `sub_id`='%s';", $uid));
if ($rs->fields['db_id']) {
while (!$rs->EOF) {
$id = $rs->fields['usr_id'];
if (!in_array($id, $ids)) {
$ids[] = (int) $id;
$_q[] = sprintf("(A.`usr_id`='%s'%s)", $id, ($rs->fields['sub_type'] == 'files' ? " AND A.`act_type` LIKE 'upload%'" : null));
}
$rs->MoveNext();
}
}
}
if ($page == 1) {
$html = '
<p class="notification-entries-heading">
' . self::$language['frontend.global.notifications'] . '
<i class="icon-eye-blocked hidden-notifications' . ($show_hidden ? ' active' : null) . '" rel="tooltip" title="' . self::$language['frontend.global.notification.toggle'] . '"></i>
</p>
';
}
$html .= self::userActivity($_q, $show_hidden);
if ($page == 1) {
$html .= '
<div class="line toggle-off"></div>
<div id="more-results">
<center>
<a href="javascript:;" rel="nofollow">
<span class="info-toggle notifications-more" rel-page="2">' . self::$language['frontend.global.load.more'] . '</span>
</a>
</center>
</div>
';
}
}
echo $html;
}
/* generate subscriber activity */
private static function userActivity($_q, $show_hidden)
{
$html = null;
$cfg = self::$cfg;
$db = self::$db;
$class_filter = self::$filter;
$class_database = self::$dbc;
$class_language = self::$class_language;
$language = self::$language;
$usr_id = (int) $_SESSION['USER_ID'];
$page = isset($_GET['p']) ? (int) $_GET['p'] : 1;
$lim = 10;
$page_lim = $page > 1 ? sprintf("%s, %s", ($lim * ($page - 1)), $lim) : $lim;
$display = 0;
include_once $class_language->setLanguageFile('frontend', 'language.channel');
$ex = array();
$fids = array();
$q = isset($_q[0]) ? implode(' OR ', $_q) . ' OR ' : null;
$sql = sprintf("SELECT `act_id` FROM `db_notifications_hidden` WHERE `usr_id`='%s';", $usr_id);
$res = $db->execute($sql);
if ($res->fields['act_id']) {
while (!$res->EOF) {
$ex[] = $res->fields['act_id'];
$res->MoveNext();
}
}
$sql = sprintf("SELECT
A.`act_id` AS `db_id`, A.`usr_id`, A.`usr_id_to`, A.`act_type`, A.`act_time`,
B.`usr_key`, B.`usr_user`,
B.`usr_dname`, B.`ch_title`
FROM
`db_useractivity` A, `db_accountuser` B
WHERE
DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= A.`act_time` AND
%s
(%sA.`usr_id_to`='%s') AND
A.`usr_id`=B.`usr_id` AND
A.`act_visible`='1' AND
A.`act_deleted`='0'
GROUP BY A.`act_id`
ORDER BY A.`act_id` DESC LIMIT %s;", (($ex[0] != '' and !$show_hidden) ? "A.`act_id` NOT IN (" . implode(",", $ex) . ") AND" : null), $q, $usr_id, $page_lim);
$rs = $db->execute($sql);
if ($rs->fields['db_id']) {
$db->execute(sprintf("UPDATE `db_notifications_count` SET `nr`=0 WHERE `usr_id`='%s' LIMIT 1;", $usr_id));
if ($db->Affected_Rows()) {
$_SESSION['new_notifications'] = 0;
}
$html .= $page == 1 ? '<div id="notifications-box-scroll" class="scroll scroll-' . (strpos($cfg['theme_name'], 'dark') === 0 ? 'dark' : 'light') . '">' : null;
$html .= $page == 1 ? '<div id="notifications-box-list">' : null;
while (!$rs->EOF) {
$act_id = $rs->fields['db_id'];
$user_id = $rs->fields['usr_id'];
$user_id_to = $rs->fields['usr_id_to'];
$user_key = $rs->fields['usr_key'];
$user_uname = $rs->fields['usr_user'];
$user_dname = $rs->fields['usr_dname'];
$user_chtitle = $rs->fields['ch_title'];
$user_name = $user_dname != '' ? $user_dname : ($user_chtitle != '' ? $user_chtitle : $user_uname);
$act_type = $rs->fields['act_type'];
$act_time = VUserinfo::timeRange($rs->fields['act_time']);
$action = explode(":", $act_type);
$show = true;
$class = null;
switch ($action[0]) {
case "bulletin":
$class = $action[0];
$action_text = '<p>';
$action_text .= $user_name . ' ' . $language["upage.act." . $action[0]];
$action_text .= '</p>';
$action_text .= '<p style="margin-top: 7px;">';
$action_text .= '<span class="black">' . $action[1] . '</span>';
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
break;
case "upload":
case "like":
case "dislike":
case "favorite":
case "response":
$action_text = null;
$title = null;
if ($user_uname != $_SESSION['USER_NAME']) {
$class = $action[0];
$i = $db->execute(sprintf("SELECT A.`file_title`, A.`thumb_cache`, C.`usr_key` FROM `db_%sfiles` A, `db_accountuser` C WHERE A.`usr_id`=C.`usr_id` AND A.`file_key`='%s' LIMIT 1;", $action[1], $action[2]));
$title = $i->fields['file_title'];
$user_key = $i->fields['usr_key'];
$thumb_cache = $i->fields['thumb_cache'];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$url = $cfg['main_url'] . '/' . VGenerate::fileHref($action[1][0], $action[2], $title);
if ($action[0] !== 'response') {
$action_thumb = VGenerate::thumbSigned($action[1], $action[2], array($user_key, $thumb_cache), (3600 * 24), 0, 1);
} else {
$u = $db->execute(sprintf("SELECT A.`usr_key`, B.`usr_id`, C.`file_title`, C.`thumb_cache` FROM `db_accountuser` A, `db_%sresponses` B, `db_%sfiles` C WHERE B.`file_key`='%s' AND B.`file_response`='%s' AND A.`usr_id`=B.`usr_id` AND B.`file_response`=C.`file_key` LIMIT 1;", $action[1], $action[1], $action[2], $action[3]));
$title2 = $u->fields['file_title'];
$user_key2 = $u->fields['usr_key'];
$thumb_cache = $u->fields['thumb_cache'];
$action_thumb = VGenerate::thumbSigned($action[1], $action[3], array($user_key2, $thumb_cache), (3600 * 24), 0, 1);
$url = $cfg['main_url'] . '/' . VGenerate::fileHref($action[1][0], $action[3], $title2);
$url .= '&rs=' . md5(date("Y-m-d"));
}
if ($title) {
$action_text .= '<p>';
$action_text .= '<a href="' . VHref::channelURL(["username" => $user_uname]) . '">' . $user_name . '</a> ' . str_replace('##TYPE##', $language["frontend.global." . $action[1][0]], $language["upage.act." . $action[0]]) . ' ' . ($action[0] !== 'response' ? $language["frontend.global." . $action[1][0] . ($user_key == $_SESSION['USER_KEY'] ? ".y" : ".a")] : null);
$action_text .= '<br><a href="' . $url . '">' . $title . '</a>';
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
} else {
$show = false;
}
} else {
$show = false;
}
break;
default:
$_x = explode(" ", $action[0]);
switch ($_x[0]) {
case "comments":
$action_text = null;
$title = null;
$class = $_x[0];
if ($_x[2] == 'channel') {
$i = $db->execute(sprintf("SELECT B.`c_usr_id`, B.`c_body`, B.`c_replyto`, C.`usr_id`, C.`usr_user`, C.`usr_key`, C.`usr_dname`, C.`ch_title` FROM `db_%scomments` B, `db_accountuser` C WHERE B.`c_key`='%s' AND B.`file_key`=C.`usr_id` LIMIT 1;", $_x[2], $action[2]));
if ($i->fields['c_usr_id'] != $_SESSION['USER_ID']) {
$title = $i->fields['ch_title'] != '' ? $i->fields['ch_title'] : ($i->fields['usr_dname'] != '' ? $i->fields['usr_dname'] : $i->fields['usr_user']);
$title = $i->fields['usr_user'] == $_SESSION['USER_NAME'] ? $language['upage.act.your.ch'] : $title;
$user_key = $i->fields['usr_key'];
$url = VHref::channelURL(["username" => $i->fields['usr_user']]) . '/' . VHref::getKey("discussion");
$action_thumb = VUserAccount::getProfileImage($i->fields['usr_id']);
}
} else {
$i = $db->execute(sprintf("SELECT A.`file_title`, A.`thumb_cache`, B.`c_usr_id`, B.`c_body`, B.`c_replyto`, C.`usr_key` FROM `db_%sfiles` A, `db_%scomments` B, `db_accountuser` C WHERE A.`file_key`=B.`file_key` AND A.`usr_id`=C.`usr_id` AND B.`c_key`='%s' LIMIT 1;", $_x[2], $_x[2], $action[2]));
if ($i->fields['c_usr_id'] != $_SESSION['USER_ID']) {
$title = $i->fields['file_title'];
$user_key = $i->fields['usr_key'];
$thumb_cache = $i->fields['thumb_cache'];
$thumb_cache = $thumb_cache > 1 ? $thumb_cache : null;
$url = $cfg['main_url'] . '/' . VGenerate::fileHref($_x[2][0], $action[1], $title);
$action_thumb = VGenerate::thumbSigned($_x[2], $action[1], array($user_key, $thumb_cache), (3600 * 24), 0, 1);
}
}
$comment = $i->fields['c_body'];
if ($title) {
$action_text .= '<p>';
$action_text .= '<a href="' . VHref::channelURL(["username" => $user_uname]) . '">' . $user_name . '</a> ' . ($i->fields['c_replyto'] == '0' ? $language['upage.act.comment'] : $language['upage.act.reply']);
$action_text .= ' <a href="' . $url . '">' . $title . '</a>';
$action_text .= '<br><br><pre><span class="black">' . $comment . '</span></pre>';
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
} else {
$show = false;
}
break;
case "subscribes":
case "follows":
$usr_id = $class_database->singleFieldValue('db_accountuser', 'usr_id', 'usr_user', ($_x[0] == 'subscribes' ? $_x[2] : $_x[1]));
$action_text = null;
$action_thumb = null;
$class = $_x[0];
if ($usr_id > 0) {
$_uinfo = VUserinfo::getUserInfo($usr_id);
$_user_uname = $_uinfo['uname'];
$_user_dname = $_uinfo['dname'];
$_user_chtitle = $_uinfo['ch_title'];
$_user_key = $_uinfo['key'];
$_user_name = $_user_dname != '' ? $_user_dname : ($_user_chtitle != '' ? $_user_chtitle : $_user_uname);
$title = $_user_name;
$url = VHref::channelURL(["username" => $_user_uname]);
$action_text .= '<p>';
$action_text .= '<a href="' . VHref::channelURL(["username" => $user_uname]) . '">' . $user_name . '</a> ' . ($_x[0] == 'subscribes' ? $language['upage.act.subscribe'] : $language['upage.act.follow']);
$action_text .= ($user_id_to == $_SESSION['USER_ID'] ? ' ' . $language['upage.act.your.ch'] : ' <a href="' . $url . '">' . $title . '</a>');
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
} else {
$show = false;
}
break;
case "private":
$action_text = null;
$action_thumb = null;
$title = null;
$class = $_x[0];
if ($user_id_to == $_SESSION['USER_ID']) {
$pm = $db->execute(sprintf("SELECT `msg_subj`, `msg_body` FROM `db_messaging` WHERE `msg_id`='%s' AND `msg_to`='%s' LIMIT 1;", (int) $action[1], $user_id_to));
$title = $pm->fields['msg_subj'];
$comment = VUserinfo::truncateString($pm->fields['msg_body'], 30);
$action_text .= '<p>';
$action_text .= '<a href="' . VHref::channelURL(["username" => $user_uname]) . '">' . $user_name . '</a> ' . $language['upage.act.pmessage'];
$action_text .= ': <a href="' . $cfg['main_url'] . '/' . VHref::getKey("messages") . '">' . $title . '</a>';
$action_text .= '<br><br><pre><span class="black">' . $comment . '</span></pre>';
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
} else {
$show = false;
}
break;
case "friend":
$action_text = null;
$action_thumb = null;
$title = null;
$class = $_x[0];
if ($user_id_to == $_SESSION['USER_ID']) {
$comment = str_replace('##PMSG##', '<a href="' . $cfg['main_url'] . '/' . VHref::getKey("messages") . '">' . $language['subnav.entry.contacts.messages'] . '</a>', $language['upage.act.check.pmg']);
$action_text .= '<p>';
$action_text .= '<a href="' . VHref::channelURL(["username" => $user_uname]) . '">' . $user_name . '</a> ' . $language['upage.act.frinvite'];
$action_text .= '<br><br><pre><span class="black">' . $comment . '</span></pre>';
$action_text .= '</p>';
$action_text .= '<p>';
$action_text .= '<form class="entry-form-class"><label>' . $act_time . '</label></form>';
$action_text .= '</p>';
} else {
$show = false;
}
break;
}
break;
}
if ($show) {
$html .= '
<div class="user-sub-activity' . (in_array($act_id, $ex) ? ' is-hidden' : null) . '" id="a' . $act_id . '">
<div class="place-left user-activity-side-left">
<div class="user-activity-entry">
<div class="user-thumb-xlarge top">
<a href="' . VHref::channelURL(["username" => $user_uname]) . '">
<img height="48" class="own-profile-image" title="' . $user_name . '" alt="' . $user_name . '" src="' . VUseraccount::getProfileImage($user_id) . '">
</a>
</div>
</div>
</div>
<div class="user-activity-entry user-activity-text ' . $class . '">' . $action_text . '</div>
<i class="icon-' . (in_array($act_id, $ex) ? 'undo2' : 'times') . ' ' . (in_array($act_id, $ex) ? 'unhide' : 'hide') . '-entry" rel-nr="' . $act_id . '" rel="tooltip" title="' . (in_array($act_id, $ex) ? $language['frontend.global.notification.restore'] : $language['frontend.global.notification.hide']) . '"></i>
' . ($action_thumb != '' ? '
<div class="user-activity-side-right">
<div class="user-activity-entry">
<a href="' . $url . '"><img src="' . $action_thumb . '" height="' . (((isset($_x[2]) and $_x[2] == 'short') or (isset($action[1]) and $action[1] == 'short')) ? 96 : 64) . '" /></a>
</div>
</div>
' : null) . '
<div class="clearfix"></div>
</div>
';
$display += 1;
}
$rs->MoveNext();
}
if ($display == 0) {
$html .= '<div id="notifications-default">';
$html .= '<i class="icon-bell"></i>';
$html .= '<p class="n-1">' . $language['frontend.global.notif.text1'] . '</p>';
$html .= '<p class="n-2">' . $language['frontend.global.notif.text2'] . '</p>';
$html .= '</div>';
}
$html .= $page == 1 ? '</div>' : null;
$html .= $page == 1 ? '</div>' : null;
}
return $html;
}
/* get new notifications number */
public static function countNewNotifications()
{
global $cfg, $db, $class_database, $class_filter;
$_q = array();
$ids = array();
$usr_id = (int) $_SESSION['USER_ID'];
if ($usr_id == 0) {
return;
}
if ($cfg['user_subscriptions'] == 1) {
$rs = $db->execute(sprintf("SELECT `db_id`, `usr_id`, `sub_type` FROM `db_subscribers` WHERE `sub_id`='%s';", $usr_id));
if ($rs->fields['db_id']) {
while (!$rs->EOF) {
$id = $rs->fields['usr_id'];
if (!in_array($id, $ids)) {
$ids[] = (int) $id;
$_q[] = sprintf("(A.`usr_id`='%s'%s)", $id, ($rs->fields['sub_type'] == 'files' ? " AND A.`act_type` LIKE 'upload%'" : null));
}
$rs->MoveNext();
}
}
}
if ($cfg['user_follows'] == 1) {
$rs = $db->execute(sprintf("SELECT `db_id`, `usr_id`, `sub_type` FROM `db_followers` WHERE `sub_id`='%s';", $usr_id));
if ($rs->fields['db_id']) {
while (!$rs->EOF) {
$id = $rs->fields['usr_id'];
if (!in_array($id, $ids)) {
$ids[] = (int) $id;
$_q[] = sprintf("(A.`usr_id`='%s'%s)", $id, ($rs->fields['sub_type'] == 'files' ? " AND A.`act_type` LIKE 'upload%'" : null));
}
$rs->MoveNext();
}
}
}
$last = 0;
$tnr = 0;
$rs = $db->execute(sprintf("SELECT `db_id`, `act_id`, `nr` FROM `db_notifications_count` WHERE `usr_id`='%s' LIMIT 1;", $usr_id));
if ($rs->fields['db_id']) {
$lid = $rs->fields['db_id'];
$last = $rs->fields['act_id'];
$tnr = $rs->fields['nr'];
}
if ($tnr > 0) {
return $tnr;
}
$sql = sprintf("SELECT
A.`act_id`, A.`usr_id`, A.`usr_id_to`,
B.`usr_key`
FROM
`db_useractivity` A, `db_accountuser` B
WHERE
A.`usr_id`!=A.`usr_id_to` AND
A.`act_id`>'%s' AND
(%sA.`usr_id_to`='%s') AND
A.`usr_id`=B.`usr_id` AND
A.`act_visible`='1' AND
A.`act_deleted`='0' AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= A.`act_time`
ORDER BY A.`act_id` DESC;", $last, (isset($_q[0]) ? implode(' OR ', $_q) . ' OR ' : null), $usr_id);
$rs = $db->execute($sql);
$tt = $rs->fields['act_id'] ? $rs->RecordCount() : 0;
$ai = $rs->fields['act_id'];
if ($last == 0 and $tt == 0) {
$ins = array("usr_id" => $usr_id, "nr" => $tt, "act_id" => $ai);
$class_database->doInsert('db_notifications_count', $ins);
return $tt;
} elseif ($tt > 0) {
$db->execute(sprintf("UPDATE `db_notifications_count` SET `nr`='%s', `act_id`='%s' WHERE `usr_id`='%s' LIMIT 1;", $tt, $ai, $usr_id));
return $tt;
}
}
/* hide notifications from list */
public static function hideNotifications($unhide = false)
{
$usr_id = (int) $_SESSION['USER_ID'];
if (!$unhide and $_POST and $usr_id > 0) {
$act_id = (int) $_POST['i'];
$ins = array("act_id" => $act_id, "usr_id" => $usr_id);
$res = self::$dbc->doInsert("db_notifications_hidden", $ins);
if ($res) {
echo 1;
} else {
echo 0;
}
} elseif ($unhide and $_POST and $usr_id > 0) {
$act_id = (int) $_POST['i'];
$sql = sprintf("DELETE FROM `db_notifications_hidden` WHERE `act_id`='%s' AND `usr_id`='%s' LIMIT 1;", $act_id, $usr_id);
$res = self::$db->execute($sql);
if (self::$db->Affected_Rows() > 0) {
echo 1;
} else {
echo 0;
}
}
}
}