diff --git a/classes/script_start.php b/classes/script_start.php index 406fc7eb..043a8a8c 100644 --- a/classes/script_start.php +++ b/classes/script_start.php @@ -162,6 +162,12 @@ time() < strtotime($LoggedUser['RatioWatchEnds']) && ($LoggedUser['BytesDownloaded']*$LoggedUser['RequiredRatio'])>$LoggedUser['BytesUploaded'] ); + if(!isset($LoggedUser['ID'])) { + $Debug->log_var($LightInfo, 'LightInfo'); + $Debug->log_var($HeavyInfo, 'HeavyInfo'); + $Debug->log_var($Permissions, 'Permissions'); + $Debug->log_var($UserStats, 'UserStats'); + } //Load in the permissions $LoggedUser['Permissions'] = get_permissions_for_user($LoggedUser['ID'], $LoggedUser['CustomPermissions']); @@ -367,8 +373,8 @@ function user_heavy_info($UserID) { $HeavyInfo['CustomForums'] = null; } + $HeavyInfo['SiteOptions'] = unserialize($HeavyInfo['SiteOptions']); if(!empty($HeavyInfo['SiteOptions'])) { - $HeavyInfo['SiteOptions'] = unserialize($HeavyInfo['SiteOptions']); $HeavyInfo = array_merge($HeavyInfo, $HeavyInfo['SiteOptions']); } unset($HeavyInfo['SiteOptions']); diff --git a/gazelle.sql b/gazelle.sql index a8d68624..e9aace3b 100644 --- a/gazelle.sql +++ b/gazelle.sql @@ -832,7 +832,8 @@ CREATE TABLE `torrents` ( KEY `last_action` (`last_action`), KEY `Time` (`Time`), KEY `flags` (`flags`), - KEY `LastLogged` (`LastLogged`) + KEY `LastLogged` (`LastLogged`), + KEY `FreeTorrent` (`FreeTorrent`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `torrents_artists` ( diff --git a/sections/ajax/bookmarks.php b/sections/ajax/bookmarks.php new file mode 100644 index 00000000..056ee087 --- /dev/null +++ b/sections/ajax/bookmarks.php @@ -0,0 +1,246 @@ +query("SELECT Username FROM users_main WHERE ID='$UserID'"); + list($Username) = $DB->next_record(); +} else { + $UserID = $LoggedUser['ID']; +} + +$Sneaky = ($UserID != $LoggedUser['ID']); + +$Data = $Cache->get_value('bookmarks_torrent_'.$UserID.'_full'); + +if($Data) { + $Data = unserialize($Data); + list($K, list($TorrentList, $CollageDataList)) = each($Data); +} else { + // Build the data for the collage and the torrent list + $DB->query("SELECT + bt.GroupID, + tg.WikiImage, + tg.CategoryID, + bt.Time + FROM bookmarks_torrents AS bt + JOIN torrents_group AS tg ON tg.ID=bt.GroupID + WHERE bt.UserID='$UserID' + ORDER BY bt.Time"); + + $GroupIDs = $DB->collect('GroupID'); + $CollageDataList=$DB->to_array('GroupID', MYSQLI_ASSOC); + if(count($GroupIDs)>0) { + $TorrentList = get_groups($GroupIDs); + $TorrentList = $TorrentList['matches']; + } else { + $TorrentList = array(); + } +} + +$Title = ($Sneaky)?"$Username's bookmarked torrents":'Your bookmarked torrents'; + + +// Loop through the result set, building up $Collage and $TorrentTable +// Then we print them. +$Collage = array(); +$TorrentTable = ''; + +$NumGroups = 0; +$Artists = array(); +$Tags = array(); + +foreach ($TorrentList as $GroupID=>$Group) { + list($GroupID, $GroupName, $GroupYear, $GroupRecordLabel, $GroupCatalogueNumber, $TagList, $ReleaseType, $GroupVanityHouse, $Torrents, $GroupArtists) = array_values($Group); + list($GroupID2, $Image, $GroupCategoryID, $AddedTime) = array_values($CollageDataList[$GroupID]); + + // Handle stats and stuff + $NumGroups++; + + if($GroupArtists) { + foreach($GroupArtists as $Artist) { + if(!isset($Artists[$Artist['id']])) { + $Artists[$Artist['id']] = array('name'=>$Artist['name'], 'count'=>1); + } else { + $Artists[$Artist['id']]['count']++; + } + } + } + + $TagList = explode(' ',str_replace('_','.',$TagList)); + + $TorrentTags = array(); + foreach($TagList as $Tag) { + if(!isset($Tags[$Tag])) { + $Tags[$Tag] = array('name'=>$Tag, 'count'=>1); + } else { + $Tags[$Tag]['count']++; + } + $TorrentTags[]=''.$Tag.''; + } + $PrimaryTag = $TagList[0]; + $TorrentTags = implode(', ', $TorrentTags); + $TorrentTags='
'.$TorrentTags.'
'; + + $DisplayName = ''; + if(count($GroupArtists)>0) { + $DisplayName = display_artists(array('1'=>$GroupArtists)); + } + $DisplayName .= ''.$GroupName.''; + if($GroupYear>0) { $DisplayName = $DisplayName. ' ['. $GroupYear .']';} + if($GroupVanityHouse) { $DisplayName .= ' [VH]'; } + + // Start an output buffer, so we can store this output in $TorrentTable + ob_start(); + if(count($Torrents)>1 || $GroupCategoryID==1) { + // Grouped torrents + $ShowGroups = !(!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] == 1); + $LastRemasterYear = '-'; + $LastRemasterTitle = ''; + $LastRemasterRecordLabel = ''; + $LastRemasterCatalogueNumber = ''; + $LastMedia = ''; + + $EditionID = 0; + unset($FirstUnknown); + + foreach ($Torrents as $TorrentID => $Torrent) { + + if ($Torrent['Remastered'] && !$Torrent['RemasterYear']) { + $FirstUnknown = !isset($FirstUnknown); + } + + if($Torrent['RemasterTitle'] != $LastRemasterTitle || $Torrent['RemasterYear'] != $LastRemasterYear || + $Torrent['RemasterRecordLabel'] != $LastRemasterRecordLabel || $Torrent['RemasterCatalogueNumber'] != $LastRemasterCatalogueNumber || $FirstUnknown || $Torrent['Media'] != $LastMedia) { + + $EditionID++; + if($Torrent['Remastered'] && $Torrent['RemasterYear'] != 0) { + + $RemasterName = $Torrent['RemasterYear']; + $AddExtra = " - "; + if($Torrent['RemasterRecordLabel']) { $RemasterName .= $AddExtra.display_str($Torrent['RemasterRecordLabel']); $AddExtra=' / '; } + if($Torrent['RemasterCatalogueNumber']) { $RemasterName .= $AddExtra.display_str($Torrent['RemasterCatalogueNumber']); $AddExtra=' / '; } + if($Torrent['RemasterTitle']) { $RemasterName .= $AddExtra.display_str($Torrent['RemasterTitle']); $AddExtra=' / '; } + $RemasterName .= $AddExtra.display_str($Torrent['Media']); + + } else { + $AddExtra = " / "; + if (!$Torrent['Remastered']) { + $MasterName = "Original Release"; + if($GroupRecordLabel) { $MasterName .= $AddExtra.$GroupRecordLabel; $AddExtra=' / '; } + if($GroupCatalogueNumber) { $MasterName .= $AddExtra.$GroupCatalogueNumber; $AddExtra=' / '; } + } else { + $MasterName = "Unknown Release(s)"; + } + $MasterName .= $AddExtra.display_str($Torrent['Media']); + } + } + $LastRemasterTitle = $Torrent['RemasterTitle']; + $LastRemasterYear = $Torrent['RemasterYear']; + $LastRemasterRecordLabel = $Torrent['RemasterRecordLabel']; + $LastRemasterCatalogueNumber = $Torrent['RemasterCatalogueNumber']; + $LastMedia = $Torrent['Media']; + } + } else { + // Viewing a type that does not require grouping + + list($TorrentID, $Torrent) = each($Torrents); + + $DisplayName = ''.$GroupName.''; + + if(!empty($Torrent['FreeTorrent'])) { + $DisplayName .=' Freeleech!'; + } + } + $TorrentTable.=ob_get_clean(); + + // Album art + + ob_start(); + + $DisplayName = ''; + if(!empty($GroupArtists)) { + $DisplayName.= display_artists(array('1'=>$GroupArtists), false); + } + $DisplayName .= $GroupName; + if($GroupYear>0) { $DisplayName = $DisplayName. ' ['. $GroupYear .']';} + $Collage[]=ob_get_clean(); + +} + +uasort($Tags, 'compare'); +$i = 0; +foreach ($Tags as $TagName => $Tag) { + $i++; + if($i>5) { break; } +uasort($Artists, 'compare'); +$i = 0; +foreach ($Artists as $ID => $Artist) { + $i++; + if($i>10) { break; } +} +} + +$JsonBookmarks = array(); +foreach ($TorrentList as $Torrent) { + $JsonTorrents = array(); + foreach ($Torrent['Torrents'] as $GroupTorrents) { + $JsonTorrents[] = array( + 'id' => $GroupTorrents['ID'], + 'groupId' => $GroupTorrents['GroupID'], + 'media' => $GroupTorrents['Media'], + 'format' => $GroupTorrents['Format'], + 'encoding' => $GroupTorrents['Encoding'], + 'remasterYear' => $GroupTorrents['RemasterYear'], + 'remastered' => $GroupTorrents['Remastered'], + 'remasterTitle' => $GroupTorrents['RemasterTitle'], + 'remasterRecordLabel' => $GroupTorrents['RemasterRecordLabel'], + 'remasterCatalogueNumber' => $GroupTorrents['RemasterCatalogueNumber'], + 'scene' => $GroupTorrents['Scene'], + 'hasLog' => $GroupTorrents['HasLog'], + 'hasCue' => $GroupTorrents['HasCue'], + 'logScore' => $GroupTorrents['LogScore'], + 'fileCount' => $GroupTorrents['FileCount'], + 'freeTorrent' => $GroupTorrents['FreeTorrent'], + 'size' => $GroupTorrents['Size'], + 'leechers' => $GroupTorrents['Leechers'], + 'seeders' => $GroupTorrents['Seeders'], + 'snatched' => $GroupTorrents['Snatched'], + 'time' => $GroupTorrents['Time'], + 'hasFile' => $GroupTorrents['HasFile'] + ); + } + $JsonBookmarks[] = array( + 'id' => $Torrent['ID'], + 'name' => $Torrent['Name'], + 'year' => $Torrent['Year'], + 'recordLabel' => $Torrent['RecordLabel'], + 'catalogueNumber' => $Torrent['CatalogueNumber'], + 'tagList' => $Torrent['TagList'], + 'releaseType' => $Torrent['ReleaseType'], + 'vanityHouse' => $Torrent['VanityHouse'], + 'torrents' => $JsonTorrents + ); +} + +print + json_encode( + array( + 'status' => 'success', + 'response' => array( + 'bookmarks' => $JsonBookmarks + ) + ) + ); +?> diff --git a/sections/ajax/forum/forum.php b/sections/ajax/forum/forum.php new file mode 100644 index 00000000..67b65794 --- /dev/null +++ b/sections/ajax/forum/forum.php @@ -0,0 +1,157 @@ + 'failure')); + die(); +} + +if (isset($_GET['pp'])) { + $PerPage = $_GET['pp']; +} +else if (isset($LoggedUser['PostsPerPage'])) { + $PerPage = $LoggedUser['PostsPerPage']; +} else { + $PerPage = POSTS_PER_PAGE; +} + +list($Page,$Limit) = page_limit(TOPICS_PER_PAGE); + +//---------- Get some data to start processing + +// Caching anything beyond the first page of any given forum is just wasting ram +// users are more likely to search then to browse to page 2 +if($Page==1) { + list($Forum,,,$Stickies) = $Cache->get_value('forums_'.$ForumID); +} +if(!isset($Forum) || !is_array($Forum)) { + $DB->query("SELECT + t.ID, + t.Title, + t.AuthorID, + author.Username AS AuthorUsername, + t.IsLocked, + t.IsSticky, + t.NumPosts, + t.LastPostID, + t.LastPostTime, + t.LastPostAuthorID, + last_author.Username AS LastPostUsername + FROM forums_topics AS t + LEFT JOIN users_main AS last_author ON last_author.ID = t.LastPostAuthorID + LEFT JOIN users_main AS author ON author.ID = t.AuthorID + WHERE t.ForumID = '$ForumID' + ORDER BY t.IsSticky DESC, t.LastPostTime DESC + LIMIT $Limit"); // Can be cached until someone makes a new post + $Forum = $DB->to_array('ID',MYSQLI_ASSOC); + if($Page==1) { + $DB->query("SELECT COUNT(ID) FROM forums_topics WHERE ForumID='$ForumID' AND IsSticky='1'"); + list($Stickies) = $DB->next_record(); + $Cache->cache_value('forums_'.$ForumID, array($Forum,'',0,$Stickies), 0); + } +} + +if(!isset($Forums[$ForumID])) { + print json_encode(array('status' => 'failure')); + die(); +} +// Make sure they're allowed to look at the page +if (!check_perms('site_moderate_forums')) { + if (isset($LoggedUser['CustomForums'][$ForumID]) && $LoggedUser['CustomForums'][$ForumID] === 0) { error(403); } +} +if($LoggedUser['CustomForums'][$ForumID] != 1 && $Forums[$ForumID]['MinClassRead'] > $LoggedUser['Class']) { error(403); } + +$JsonSpecificRules = array(); +foreach ($Forums[$ForumID]['SpecificRules'] as $ThreadIDs) { + $Thread = get_thread_info($ThreadIDs); + $JsonSpecificRules[] = array( + 'threadId' => $ThreadIDs, + 'thread' => $Thread['Title'] + ); +} + +$Pages=get_pages($Page,$Forums[$ForumID]['NumTopics'],TOPICS_PER_PAGE,9); + +if (count($Forum) == 0) { + print + json_encode( + array( + 'status' => 'success', + 'forumName' => $Forums[$ForumID]['Name'], + 'threads' => array() + ) + ); +} +else { + // forums_last_read_topics is a record of the last post a user read in a topic, and what page that was on + $DB->query('SELECT + l.TopicID, + l.PostID, + CEIL((SELECT COUNT(ID) FROM forums_posts WHERE forums_posts.TopicID = l.TopicID AND forums_posts.ID<=l.PostID)/'.$PerPage.') AS Page + FROM forums_last_read_topics AS l + WHERE TopicID IN('.implode(', ', array_keys($Forum)).') AND + UserID=\''.$LoggedUser['ID'].'\''); + + // Turns the result set into a multi-dimensional array, with + // forums_last_read_topics.TopicID as the key. + // This is done here so we get the benefit of the caching, and we + // don't have to make a database query for each topic on the page + $LastRead = $DB->to_array('TopicID'); + + $JsonTopics = array(); + foreach ($Forum as $Topic) { + list($TopicID, $Title, $AuthorID, $AuthorName, $Locked, $Sticky, $PostCount, $LastID, $LastTime, $LastAuthorID, $LastAuthorName) = array_values($Topic); + + // handle read/unread posts - the reason we can't cache the whole page + if((!$Locked || $Sticky) && ((empty($LastRead[$TopicID]) || $LastRead[$TopicID]['PostID']<$LastID) && strtotime($LastTime)>$LoggedUser['CatchupTime'])) { + $Read = 'unread'; + } else { + $Read = 'read'; + } + + $JsonTopics[] = array( + 'topicId' => $TopicID, + 'title' => $Title, + 'authorId' => $AuthorID, + 'authorName' => $AuthorName, + 'locked' => $Locked, + 'sticky' => $Sticky, + 'postCount' => $PostCount, + 'lastID' => $LastID, + 'lastTime' => $LastTime, + 'lastAuthorId' => $LastAuthorID, + 'lastAuthorName' => $LastAuthorName, + 'lastReadPage' => $LastRead[$TopicID]['Page'], + 'lastReadPostId' => $LastRead[$TopicID]['PostID'] + ); + } + + print + json_encode( + array( + 'status' => 'success', + 'response' => array( + 'forumName' => $Forums[$ForumID]['Name'], + 'specificRules' => $JsonSpecificRules, + 'currentPage' => intval($Page), + 'pages' => ceil($Forums[$ForumID]['NumTopics']/TOPICS_PER_PAGE), + 'threads' => $JsonTopics + ) + ) + ); +} +?> \ No newline at end of file diff --git a/sections/ajax/forum/index.php b/sections/ajax/forum/index.php new file mode 100644 index 00000000..77bbd50f --- /dev/null +++ b/sections/ajax/forum/index.php @@ -0,0 +1,95 @@ + 'failure')); +} +else { + include(SERVER_ROOT.'/sections/forums/functions.php'); + //This variable contains all our lovely forum data + if(!$Forums = $Cache->get_value('forums_list')) { + $DB->query("SELECT + f.ID, + f.CategoryID, + f.Name, + f.Description, + f.MinClassRead, + f.MinClassWrite, + f.MinClassCreate, + f.NumTopics, + f.NumPosts, + f.LastPostID, + f.LastPostAuthorID, + um.Username, + f.LastPostTopicID, + f.LastPostTime, + COUNT(sr.ThreadID) AS SpecificRules, + t.Title, + t.IsLocked, + t.IsSticky + FROM forums AS f + LEFT JOIN forums_topics as t ON t.ID = f.LastPostTopicID + LEFT JOIN users_main AS um ON um.ID=f.LastPostAuthorID + LEFT JOIN forums_specific_rules AS sr ON sr.ForumID = f.ID + GROUP BY f.ID + ORDER BY f.CategoryID, f.Sort"); + $Forums = $DB->to_array('ID', MYSQLI_ASSOC, false); + foreach($Forums as $ForumID => $Forum) { + if(count($Forum['SpecificRules'])) { + $DB->query("SELECT ThreadID FROM forums_specific_rules WHERE ForumID = ".$ForumID); + $ThreadIDs = $DB->collect('ThreadID'); + $Forums[$ForumID]['SpecificRules'] = $ThreadIDs; + } + } + unset($ForumID, $Forum); + $Cache->cache_value('forums_list', $Forums, 0); //Inf cache. + } + + if(empty($_GET['type']) || $_GET['type'] == 'main') { + include(SERVER_ROOT.'/sections/ajax/forum/main.php'); + } else { + switch($_GET['type']) { + case 'viewforum': + include(SERVER_ROOT.'/sections/ajax/forum/forum.php'); + break; + case 'viewthread': + include(SERVER_ROOT.'/sections/ajax/forum/thread.php'); + break; + default: + print json_encode(array('status' => 'failure')); + break; + } + } +} + +// Function to get basic information on a forum +// Uses class CACHE +function get_forum_info($ForumID) { + global $DB, $Cache; + $Forum = $Cache->get_value('ForumInfo_'.$ForumID); + if(!$Forum) { + $DB->query("SELECT + Name, + MinClassRead, + MinClassWrite, + MinClassCreate, + COUNT(forums_topics.ID) AS Topics + FROM forums + LEFT JOIN forums_topics ON forums_topics.ForumID=forums.ID + WHERE forums.ID='$ForumID' + GROUP BY ForumID"); + if($DB->record_count() == 0) { + return false; + } + // Makes an array, with $Forum['Name'], etc. + $Forum = $DB->next_record(MYSQLI_ASSOC); + + $Cache->cache_value('ForumInfo_'.$ForumID, $Forum, 86400); // Cache for a day + } + return $Forum; +} + +?> diff --git a/sections/ajax/forum/main.php b/sections/ajax/forum/main.php new file mode 100644 index 00000000..35fb493d --- /dev/null +++ b/sections/ajax/forum/main.php @@ -0,0 +1,93 @@ +query("SELECT + l.TopicID, + l.PostID, + CEIL((SELECT COUNT(ID) FROM forums_posts WHERE forums_posts.TopicID = l.TopicID AND forums_posts.ID<=l.PostID)/$PerPage) AS Page + FROM forums_last_read_topics AS l + WHERE TopicID IN(".implode(',',$TopicIDs).") AND + UserID='$LoggedUser[ID]'"); + $LastRead = $DB->to_array('TopicID', MYSQLI_ASSOC); +} else { + $LastRead = array(); +} + +$DB->query("SELECT RestrictedForums FROM users_info WHERE UserID = ".$LoggedUser['ID']); +list($RestrictedForums) = $DB->next_record(); +$RestrictedForums = explode(',', $RestrictedForums); +$PermittedForums = array_keys($LoggedUser['PermittedForums']); + +$JsonCategories = array(); +$JsonCategory = array(); +$JsonForums = array(); +foreach ($Forums as $Forum) { + list($ForumID, $CategoryID, $ForumName, $ForumDescription, $MinRead, $MinWrite, $MinCreate, $NumTopics, $NumPosts, $LastPostID, $LastAuthorID, $LastPostAuthorName, $LastTopicID, $LastTime, $SpecificRules, $LastTopic, $Locked, $Sticky) = array_values($Forum); + if ($LoggedUser['CustomForums'][$ForumID] != 1 && ($MinRead>$LoggedUser['Class'] || array_search($ForumID, $RestrictedForums) !== FALSE)) { + continue; + } + $ForumDescription = display_str($ForumDescription); + + if($CategoryID!=$LastCategoryID) { + if (!empty($JsonForums) && !empty($JsonCategory)) { + $JsonCategory['forums'] = $JsonForums; + $JsonCategories[] = $JsonCategory; + } + $LastCategoryID = $CategoryID; + $JsonCategory = array( + 'categoryID' => $CategoryID, + 'categoryName' => $ForumCats[$CategoryID] + ); + $JsonForums = array(); + } + + if((!$Locked || $Sticky) && $LastPostID != 0 && ((empty($LastRead[$LastTopicID]) || $LastRead[$LastTopicID]['PostID'] < $LastPostID) && strtotime($LastTime)>$LoggedUser['CatchupTime'])) { + $Read = 'unread'; + } else { + $Read = 'read'; + } + + $JsonForums[] = array( + 'forumId' => $ForumID, + 'forumName' => $ForumName, + 'forumDescription' => $ForumDescription, + 'numTopics' => $NumTopics, + 'numPosts' => $NumPosts, + 'lastPostId' => $LastPostID, + 'lastAuthorId' => $LastAuthorID, + 'lastPostAuthorName' => $LastPostAuthorName, + 'lastTopicId' => $LastTopicID, + 'lastTime' => $LastTime, + 'specificRules' => $SpecificRules, + 'lastTopic' => $LastTopic, + 'read' => $Read, + 'locked' => $Locked, + 'sticky' => $Sticky + ); +} + +print json_encode( + array( + 'status' => 'success', + 'response' => array( + 'categories' => $JsonCategories + ) + ) +); diff --git a/sections/ajax/forum/thread.php b/sections/ajax/forum/thread.php new file mode 100644 index 00000000..1de527f0 --- /dev/null +++ b/sections/ajax/forum/thread.php @@ -0,0 +1,257 @@ +query("SELECT TopicID FROM forums_posts WHERE ID = $_GET[postid]"); + list($ThreadID) = $DB->next_record(); + if($ThreadID) { + header("Location: ajax.php?action=forum&type=viewthread&threadid=$ThreadID&postid=$_GET[postid]"); + die(); + } else { + print json_encode(array('status' => 'failure')); + } + } else { + print json_encode(array('status' => 'failure')); + } +} else { + $ThreadID = $_GET['threadid']; +} + +if (isset($_GET['pp'])) { + $PerPage = $_GET['pp']; +} +else if (isset($LoggedUser['PostsPerPage'])) { + $PerPage = $LoggedUser['PostsPerPage']; +} else { + $PerPage = POSTS_PER_PAGE; +} + +//---------- Get some data to start processing + +// Thread information, constant across all pages +$ThreadInfo = get_thread_info($ThreadID, true, true); +$ForumID = $ThreadInfo['ForumID']; + +// Make sure they're allowed to look at the page +if(!check_forumperm($ForumID)) { + print json_encode(array('status' => 'failure')); +} + +//Post links utilize the catalogue & key params to prevent issues with custom posts per page +if($ThreadInfo['Posts'] > $PerPage) { + if(isset($_GET['post']) && is_number($_GET['post'])) { + $PostNum = $_GET['post']; + } elseif(isset($_GET['postid']) && is_number($_GET['postid'])) { + $DB->query("SELECT COUNT(ID) FROM forums_posts WHERE TopicID = $ThreadID AND ID <= $_GET[postid]"); + list($PostNum) = $DB->next_record(); + } else { + $PostNum = 1; + } +} else { + $PostNum = 1; +} +list($Page,$Limit) = page_limit($PerPage, min($ThreadInfo['Posts'],$PostNum)); +list($CatalogueID,$CatalogueLimit) = catalogue_limit($Page,$PerPage,THREAD_CATALOGUE); + +// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page +if(!$Catalogue = $Cache->get_value('thread_'.$ThreadID.'_catalogue_'.$CatalogueID)) { + $DB->query("SELECT + p.ID, + p.AuthorID, + p.AddedTime, + p.Body, + p.EditedUserID, + p.EditedTime, + ed.Username + FROM forums_posts as p + LEFT JOIN users_main AS ed ON ed.ID = p.EditedUserID + WHERE p.TopicID = '$ThreadID' AND p.ID != '".$ThreadInfo['StickyPostID']."' + LIMIT $CatalogueLimit"); + $Catalogue = $DB->to_array(false,MYSQLI_ASSOC); + if (!$ThreadInfo['IsLocked'] || $ThreadInfo['IsSticky']) { + $Cache->cache_value('thread_'.$ThreadID.'_catalogue_'.$CatalogueID, $Catalogue, 0); + } +} +$Thread = catalogue_select($Catalogue,$Page,$PerPage,THREAD_CATALOGUE); + +$LastPost = end($Thread); +$LastPost = $LastPost['ID']; +reset($Thread); + +//Handle last read +if (!$ThreadInfo['IsLocked'] || $ThreadInfo['IsSticky']) { + $DB->query("SELECT PostID From forums_last_read_topics WHERE UserID='$LoggedUser[ID]' AND TopicID='$ThreadID'"); + list($LastRead) = $DB->next_record(); + if($LastRead < $LastPost) { + $DB->query("INSERT INTO forums_last_read_topics + (UserID, TopicID, PostID) VALUES + ('$LoggedUser[ID]', '".$ThreadID ."', '".db_string($LastPost)."') + ON DUPLICATE KEY UPDATE PostID='$LastPost'"); + } +} + +//Handle subscriptions +if(($UserSubscriptions = $Cache->get_value('subscriptions_user_'.$LoggedUser['ID'])) === FALSE) { + $DB->query("SELECT TopicID FROM users_subscriptions WHERE UserID = '$LoggedUser[ID]'"); + $UserSubscriptions = $DB->collect(0); + $Cache->cache_value('subscriptions_user_'.$LoggedUser['ID'],$UserSubscriptions,0); +} + +if(empty($UserSubscriptions)) { + $UserSubscriptions = array(); +} + +if(in_array($ThreadID, $UserSubscriptions)) { + $Cache->delete_value('subscriptions_user_new_'.$LoggedUser['ID']); +} + +$JsonPoll = array(); +if ($ThreadInfo['NoPoll'] == 0) { + if (!list($Question,$Answers,$Votes,$Featured,$Closed) = $Cache->get_value('polls_'.$ThreadID)) { + $DB->query("SELECT Question, Answers, Featured, Closed FROM forums_polls WHERE TopicID='".$ThreadID."'"); + list($Question, $Answers, $Featured, $Closed) = $DB->next_record(MYSQLI_NUM, array(1)); + $Answers = unserialize($Answers); + $DB->query("SELECT Vote, COUNT(UserID) FROM forums_polls_votes WHERE TopicID='$ThreadID' GROUP BY Vote"); + $VoteArray = $DB->to_array(false, MYSQLI_NUM); + + $Votes = array(); + foreach ($VoteArray as $VoteSet) { + list($Key,$Value) = $VoteSet; + $Votes[$Key] = $Value; + } + + foreach(array_keys($Answers) as $i) { + if (!isset($Votes[$i])) { + $Votes[$i] = 0; + } + } + $Cache->cache_value('polls_'.$ThreadID, array($Question,$Answers,$Votes,$Featured,$Closed), 0); + } + + if (!empty($Votes)) { + $TotalVotes = array_sum($Votes); + $MaxVotes = max($Votes); + } else { + $TotalVotes = 0; + $MaxVotes = 0; + } + + $RevealVoters = in_array($ForumID, $ForumsRevealVoters); + //Polls lose the you voted arrow thingy + $DB->query("SELECT Vote FROM forums_polls_votes WHERE UserID='".$LoggedUser['ID']."' AND TopicID='$ThreadID'"); + list($UserResponse) = $DB->next_record(); + if (!empty($UserResponse) && $UserResponse != 0) { + $Answers[$UserResponse] = '» '.$Answers[$UserResponse]; + } else { + if(!empty($UserResponse) && $RevealVoters) { + $Answers[$UserResponse] = '» '.$Answers[$UserResponse]; + } + } + + $JsonPoll['closed'] = $Closed; + $JsonPoll['featured'] = $Featured; + $JsonPoll['question'] = $Question; + $JsonPoll['maxVotes'] = $MaxVotes; + $JsonPoll['totalVotes'] = $TotalVotes; + $JsonPollAnswers = array(); + + foreach($Answers as $i => $Answer) { + if (!empty($Votes[$i]) && $TotalVotes > 0) { + $Ratio = $Votes[$i]/$MaxVotes; + $Percent = $Votes[$i]/$TotalVotes; + } else { + $Ratio=0; + $Percent=0; + } + $JsonPollAnswers[] = array( + 'answer' => $Answer, + 'ratio' => $Ratio, + 'percent' => $Percent + ); + } + + if ($UserResponse !== null || $Closed || $ThreadInfo['IsLocked'] || $LoggedUser['Class'] < $Forums[$ForumID]['MinClassWrite']) { + $JsonPoll['voted'] = True; + } else { + $JsonPoll['voted'] = False; + } + + $JsonPoll['answers'] = $JsonPollAnswers; +} + +//Sqeeze in stickypost +if($ThreadInfo['StickyPostID']) { + if($ThreadInfo['StickyPostID'] != $Thread[0]['ID']) { + array_unshift($Thread, $ThreadInfo['StickyPost']); + } + if($ThreadInfo['StickyPostID'] != $Thread[count($Thread)-1]['ID']) { + $Thread[] = $ThreadInfo['StickyPost']; + } +} + +$JsonPosts = array(); +foreach ($Thread as $Key => $Post) { + list($PostID, $AuthorID, $AddedTime, $Body, $EditedUserID, $EditedTime, $EditedUsername) = array_values($Post); + list($AuthorID, $Username, $PermissionID, $Paranoia, $Artist, $Donor, $Warned, $Avatar, $Enabled, $UserTitle) = array_values(user_info($AuthorID)); + $JsonPosts[] = array( + 'postId' => $PostID, + 'addedTime' => $AddedTime, + 'body' => $Text->full_format($Body), + 'editedUserId' => $EditedUserID, + 'editedTime' => $EditedTime, + 'editedUsername' => $EditedUsername, + 'author' => array( + 'authorId' => $AuthorID, + 'authorName' => $Username, + 'paranoia' => $Paranoia, + 'artist' => $Artist, + 'donor' => $Donor, + 'warned' => $Warned, + 'avatar' => $Avatar, + 'enabled' => $Enabled == 2 ? false : true, + 'userTitle' => $UserTitle + ), + + ); +} + +print + json_encode( + array( + 'status' => 'success', + 'response' => array( + 'forumId' => $ForumID, + 'forumName' => $Forums[$ForumID]['Name'], + 'threadId' => $ThreadID, + 'threadTitle' => $ThreadInfo['Title'], + 'subscribed' => in_array($ThreadID, $UserSubscriptions), + 'locked' => $ThreadInfo['IsLocked'], + 'sticky' => $ThreadInfo['IsSticky'], + 'currentPage' => intval($Page), + 'pages' => ceil($ThreadInfo['Posts']/$PerPage), + 'poll' => $JsonPoll, + 'posts' => $JsonPosts + ) + ) + ); \ No newline at end of file diff --git a/sections/ajax/inbox/inbox.php b/sections/ajax/inbox/inbox.php index e5987a97..8e3a613d 100644 --- a/sections/ajax/inbox/inbox.php +++ b/sections/ajax/inbox/inbox.php @@ -103,7 +103,7 @@ array( 'status' => 'success', 'response' => array( - 'currentPage' => $Page, + 'currentPage' => intval($Page), 'pages' => ceil($NumResults/MESSAGES_PER_PAGE), 'messages' => $JsonMessages ) diff --git a/sections/ajax/index.php b/sections/ajax/index.php index eac474f2..19c6232c 100644 --- a/sections/ajax/index.php +++ b/sections/ajax/index.php @@ -38,6 +38,12 @@ case 'torrentgroup': require('torrentgroup.php'); break; + case 'user': + require(SERVER_ROOT.'/sections/ajax/user.php'); + break; + case 'forum': + require(SERVER_ROOT.'/sections/ajax/forum/index.php'); + break; case 'top10': require(SERVER_ROOT.'/sections/ajax/top10/index.php'); break; @@ -53,6 +59,12 @@ case 'index': require(SERVER_ROOT.'/sections/ajax/info.php'); break; + case 'usersearch': + require(SERVER_ROOT.'/sections/ajax/usersearch.php'); + break; + case 'bookmarks': + require(SERVER_ROOT.'/sections/ajax/bookmarks.php'); + break; default: // If they're screwing around with the query string error(403); diff --git a/sections/ajax/info.php b/sections/ajax/info.php index ffa9507d..2056f065 100644 --- a/sections/ajax/info.php +++ b/sections/ajax/info.php @@ -3,34 +3,32 @@ //authorize(true); -$UserID == $LoggedUser['ID']; +global $DB, $Cache; +$HeavyInfo = $Cache->get_value('user_info_heavy_'.$UserID); - global $DB, $Cache; - $HeavyInfo = $Cache->get_value('user_info_heavy_'.$UserID); +$DB->query("SELECT + m.Username, + m.torrent_pass, + i.AuthKey, + Uploaded AS BytesUploaded, + Downloaded AS BytesDownloaded, + RequiredRatio, + p.Level AS Class + FROM users_main AS m + INNER JOIN users_info AS i ON i.UserID=m.ID + LEFT JOIN permissions AS p ON p.ID=m.PermissionID + WHERE m.ID='$UserID'"); - $DB->query("SELECT - m.Username, - m.torrent_pass, - i.AuthKey, - Uploaded AS BytesUploaded, - Downloaded AS BytesDownloaded, - RequiredRatio, - p.Level AS Class - FROM users_main AS m - INNER JOIN users_info AS i ON i.UserID=m.ID - LEFT JOIN permissions AS p ON p.ID=m.PermissionID - WHERE m.ID='$UserID'"); - - list($Username,$torrent_pass,$AuthKey,$Uploaded,$Downloaded,$RequiredRatio,$Class) = $DB->next_record(MYSQLI_NUM, array(9,11)); +list($Username,$torrent_pass,$AuthKey,$Uploaded,$Downloaded,$RequiredRatio,$Class) = $DB->next_record(MYSQLI_NUM, array(9,11)); //calculate ratio --Gwindow //returns 0 for DNE and -1 for infiinity, because we dont want strings being returned for a numeric value in our java - if($Uploaded == 0 && $Downloaded == 0) { - $Ratio = '0'; - } elseif($Downloaded == 0) { - $Ratio = '-1';} - else { -$Ratio = number_format(max($Uploaded/$Downloaded-0.005,0), 2); //Subtract .005 to floor to 2 decimals +if($Uploaded == 0 && $Downloaded == 0) { + $Ratio = '0'; +} elseif($Downloaded == 0) { + $Ratio = '-1'; +} else { + $Ratio = number_format(max($Uploaded/$Downloaded-0.005,0), 2); //Subtract .005 to floor to 2 decimals } @@ -55,5 +53,4 @@ ) ); - ?> diff --git a/sections/ajax/subscriptions.php b/sections/ajax/subscriptions.php index 3df1b345..6ef2b599 100644 --- a/sections/ajax/subscriptions.php +++ b/sections/ajax/subscriptions.php @@ -13,6 +13,7 @@ 'status' => 'failure' ) ); + die(); } include(SERVER_ROOT.'/classes/class_text.php'); // Text formatting class diff --git a/sections/ajax/user.php b/sections/ajax/user.php new file mode 100644 index 00000000..fbcff70f --- /dev/null +++ b/sections/ajax/user.php @@ -0,0 +1,271 @@ +query("SELECT + m.Username, + m.Email, + m.LastAccess, + m.IP, + p.Level AS Class, + m.Uploaded, + m.Downloaded, + m.RequiredRatio, + m.Enabled, + m.Paranoia, + m.Invites, + m.Title, + m.torrent_pass, + m.can_leech, + i.JoinDate, + i.Info, + i.Avatar, + i.Country, + i.Donor, + i.Warned, + COUNT(posts.id) AS ForumPosts, + i.Inviter, + i.DisableInvites, + inviter.username + FROM users_main AS m + JOIN users_info AS i ON i.UserID = m.ID + LEFT JOIN permissions AS p ON p.ID=m.PermissionID + LEFT JOIN users_main AS inviter ON i.Inviter = inviter.ID + LEFT JOIN forums_posts AS posts ON posts.AuthorID = m.ID + WHERE m.ID = $UserID GROUP BY AuthorID"); + +//TODO: Handle this more gracefully. +if ($DB->record_count() == 0) { // If user doesn't exist + die(); + //header("Location: log.php?search=User+".$UserID); +} + +list($Username, $Email, $LastAccess, $IP, $Class, $Uploaded, $Downloaded, $RequiredRatio, $Enabled, $Paranoia, $Invites, $CustomTitle, $torrent_pass, $DisableLeech, $JoinDate, $Info, $Avatar, $Country, $Donor, $Warned, $ForumPosts, $InviterID, $DisableInvites, $InviterName, $RatioWatchEnds, $RatioWatchDownload) = $DB->next_record(MYSQLI_NUM, array(9,11)); + +$Paranoia = unserialize($Paranoia); +if(!is_array($Paranoia)) { + $Paranoia = array(); +} +$ParanoiaLevel = 0; +foreach($Paranoia as $P) { + $ParanoiaLevel++; + if(strpos($P, '+')) { + $ParanoiaLevel++; + } +} + +// Raw time is better for JSON. +//$JoinedDate = time_diff($JoinDate); +//$LastAccess = time_diff($LastAccess); + +function check_paranoia_here($Setting) { + global $Paranoia, $Class, $UserID; + return check_paranoia($Setting, $Paranoia, $Class, $UserID); +} + +$Friend = false; +$DB->query("SELECT FriendID FROM friends WHERE UserID='$LoggedUser[ID]' AND FriendID='$UserID'"); +if($DB->record_count() != 0) { + $Friend = true; +} + +if (check_paranoia_here('requestsfilled_count') || check_paranoia_here('requestsfilled_bounty')) { + $DB->query("SELECT COUNT(DISTINCT r.ID), SUM(rv.Bounty) FROM requests AS r LEFT JOIN requests_votes AS rv ON r.ID=rv.RequestID WHERE r.FillerID = ".$UserID); + list($RequestsFilled, $TotalBounty) = $DB->next_record(); + $DB->query("SELECT COUNT(rv.RequestID), SUM(rv.Bounty) FROM requests_votes AS rv WHERE rv.UserID = ".$UserID); + list($RequestsVoted, $TotalSpent) = $DB->next_record(); + + $DB->query("SELECT COUNT(ID) FROM torrents WHERE UserID='$UserID'"); + list($Uploads) = $DB->next_record(); +} else { + $RequestsVoted = 0; + $TotalSpent = 0; +} +if(check_paranoia_here('uploads+')) { + $DB->query("SELECT COUNT(ID) FROM torrents WHERE UserID='$UserID'"); + list($Uploads) = $DB->next_record(); +} else { + $Uploads = 0; +} + +if (check_paranoia_here('artistsadded')) { + $DB->query("SELECT COUNT(ta.ArtistID) FROM torrents_artists AS ta WHERE ta.UserID = ".$UserID); + list($ArtistsAdded) = $DB->next_record(); +} else { + $ArtistsAdded = 0; +} + +// Do the ranks. +include(SERVER_ROOT.'/classes/class_user_rank.php'); +$Rank = new USER_RANK; + +if (check_paranoia_here('uploaded')) { + $UploadedRank = $Rank->get_rank('uploaded', $Uploaded); +} +if (check_paranoia_here('downloaded')) { + $DownloadedRank = $Rank->get_rank('downloaded', $Downloaded); +} +if (check_paranoia_here('uploads+')) { + $UploadsRank = $Rank->get_rank('uploads', $Uploads); +} +if (check_paranoia_here('requestsfilled_count')) { + $RequestRank = $Rank->get_rank('requests', $RequestsFilled); +} +$PostRank = $Rank->get_rank('posts', $ForumPosts); +if (check_paranoia_here('requestsvoted_bounty')) { + $BountyRank = $Rank->get_rank('bounty', $TotalSpent); +} +if (check_paranoia_here('artistsadded')) { + $ArtistsRank = $Rank->get_rank('artists', $ArtistsAdded); +} + +if($Downloaded == 0) { + $Ratio = 1; +} elseif($Uploaded == 0) { + $Ratio = 0.5; +} else { + $Ratio = round($Uploaded/$Downloaded, 2); +} +if (!check_paranoia_here(array('uploaded', 'downloaded', 'uploads+', 'requestsfilled_count', 'requestsvoted_bounty', 'artistsadded'))) { + $OverallRank = $Rank->overall_score($UploadedRank, $DownloadedRank, $UploadsRank, $RequestRank, $PostRank, $BountyRank, $ArtistsRank, $Ratio); +} + +// Community section +$DB->query("SELECT COUNT(x.uid), COUNT(DISTINCT x.fid) FROM xbt_snatched AS x INNER JOIN torrents AS t ON t.ID=x.fid WHERE x.uid='$UserID'"); +list($Snatched, $UniqueSnatched) = $DB->next_record(); + +if (check_paranoia_here(array('torrentcomments', 'torrentcomments+'))) { + $DB->query("SELECT COUNT(ID) FROM torrents_comments WHERE AuthorID='$UserID'"); + list($NumComments) = $DB->next_record(); +} + +if (check_paranoia_here(array('collages', 'collages+'))) { + $DB->query("SELECT COUNT(ID) FROM collages WHERE Deleted='0' AND UserID='$UserID'"); + list($NumCollages) = $DB->next_record(); +} + +if (check_paranoia_here(array('collagecontribs', 'collagecontribs+'))) { + $DB->query("SELECT COUNT(DISTINCT CollageID) FROM collages_torrents AS ct JOIN collages ON CollageID = ID WHERE Deleted='0' AND ct.UserID='$UserID'"); + list($NumCollageContribs) = $DB->next_record(); +} + +if (check_paranoia_here(array('uniquegroups', 'uniquegroups+'))) { + $DB->query("SELECT COUNT(DISTINCT GroupID) FROM torrents WHERE UserID = '$UserID'"); + list($UniqueGroups) = $DB->next_record(); +} + +if (check_paranoia_here(array('perfectflacs', 'perfectflacs+'))) { + $DB->query("SELECT COUNT(ID) FROM torrents WHERE ((LogScore = 100 AND Format = 'FLAC') OR (Media = 'Vinyl' AND Format = 'FLAC') OR (Media = 'WEB' AND Format = 'FLAC') OR (Media = 'DVD' AND Format = 'FLAC') OR (Media = 'Soundboard' AND Format = 'FLAC') OR (Media = 'Cassette' AND Format = 'FLAC') OR (Media = 'SACD' AND Format = 'FLAC') OR (Media = 'Blu-ray' AND Format = 'FLAC') OR (Media = 'DAT' AND Format = 'FLAC')) AND UserID = '$UserID'"); + list($PerfectFLACs) = $DB->next_record(); +} + +if (check_paranoia_here('seeding+')) { + $DB->query("SELECT COUNT(x.uid) FROM xbt_files_users AS x INNER JOIN torrents AS t ON t.ID=x.fid WHERE x.uid='$UserID' AND x.remaining=0"); + list($Seeding) = $DB->next_record(); +} + +if (check_paranoia_here('leeching+')) { + $DB->query("SELECT COUNT(x.uid) FROM xbt_files_users AS x INNER JOIN torrents AS t ON t.ID=x.fid WHERE x.uid='$UserID' AND x.remaining>0"); + list($Leeching) = $DB->next_record(); +} + +if(check_paranoia_here('invitedcount')) { + $DB->query("SELECT COUNT(UserID) FROM users_info WHERE Inviter='$UserID'"); + list($Invited) = $DB->next_record(); +} + +if (!$OwnProfile) { + unset($torrent_pass); +} + +// Run through some paranoia stuff to decide what we can send out. +if (!check_paranoia_here('lastseen')) { + unset($LastAccess); +} +if (!check_paranoia_here('uploaded')) { + unset($Uploaded); +} +if (!check_paranoia_here('downloaded')) { + unset($Downloaded); +} +if (isset($RequiredRatio) && !check_paranoia_here('requiredratio')) { + unset($RequiredRatio); +} +if($ParanoiaLevel == 0) { + $ParanoiaLevelText = 'Off'; +} elseif($ParanoiaLevel == 1) { + $ParanoiaLevelText = 'Very Low'; +} elseif($ParanoiaLevel <= 5) { + $ParanoiaLevelText = 'Low'; +} elseif($ParanoiaLevel <= 20) { + $ParanoiaLevelText = 'High'; +} else { + $ParanoiaLevelText = 'Very high'; +} + +header('Content-Type: text/plain; charset=utf-8'); + +print json_encode(array('status' => 'success', + 'response' => array( + 'username' => $Username, + 'avatar' => $Avatar, + 'isFriend' => $Friend, + 'stats' => array( + 'joinedDate' => $JoinDate, + 'lastAccess' => $LastAccess, + 'uploaded' => $Uploaded, + 'downloaded' => $Downloaded, + 'ratio' => $Ratio, + 'requiredRatio' => $RequiredRatio + ), + 'ranks' => array( + 'uploaded' => $UploadedRank, + 'downloaded' => $DownloadedRank, + 'uploads' => $UploadsRank, + 'requests' => $RequestRank, + 'bounty' => $BountyRank, + 'posts' => $PostRank, + 'artists' => $ArtistsRank, + 'overall' => $OverallRank + ), + 'personal' => array( + 'class' => $ClassLevels[$Class]['Name'], + 'paranoia' => $ParanoiaLevel, + 'paranoiaText' => $ParanoiaLevelText, + 'donor' => $Donor, + 'warned' => ($Warned!='0000-00-00 00:00:00'), + 'enabled' => ($Enabled == '1' || $Enabled == '0' || !$Enabled), + 'passkey' => $torrent_pass + ), + 'community' => array( + 'posts' => $ForumPosts, + 'torrentComments' => $NumComments, + 'collagesStarted' => $NumCollages, + 'collagesContrib' => $NumCollageContribs, + 'requestsFilled' => $RequestsFilled, + 'requestsVoted' => $RequestsVoted, + 'uploaded' => $Uploads, + 'groups' => $UniqueGroups, + 'seeding' => $Seeding, + 'leeching' => $Leeching, + 'snatched' => $Snatched, + 'invited' => $Invited + ) + ) + ) + ); // <- He's sad. +?> diff --git a/sections/ajax/usersearch.php b/sections/ajax/usersearch.php new file mode 100644 index 00000000..d96ed933 --- /dev/null +++ b/sections/ajax/usersearch.php @@ -0,0 +1,60 @@ +>>>>>>>>>>>>>>>>>>>>>>>>>> User search <<<<<<<<<<<<<<<<<<<<<<<<<<<<* + **********************************************************************/ +authorize(true); + +if (!empty($_GET['search'])) { + + $_GET['username'] = $_GET['search']; +} + +define('USERS_PER_PAGE', 30); + +if(isset($_GET['username'])){ + $_GET['username'] = trim($_GET['username']); + + list($Page,$Limit) = page_limit(USERS_PER_PAGE); + $DB->query("SELECT SQL_CALC_FOUND_ROWS + ID, + Username, + Enabled, + PermissionID, + Donor, + Warned + FROM users_main AS um + JOIN users_info AS ui ON ui.UserID=um.ID + WHERE Username LIKE '%".db_string($_GET['username'])."%' + ORDER BY Username + LIMIT $Limit"); + $Results = $DB->to_array(); + $DB->query('SELECT FOUND_ROWS();'); + list($NumResults) = $DB->next_record(); + +} + +$JsonUsers = array(); +foreach($Results as $Result) { + list($UserID, $Username, $Enabled, $PermissionID, $Donor, $Warned) = $Result; + + $JsonUsers[] = array( + 'userId' => $UserID, + 'username' => $Username, + 'donor' => $Donor, + 'warned' => $Warned, + 'enabled' => ($Enabled == 2 ? false : true), + 'class' => make_class_string($PermissionID) + ); +} + +print + json_encode( + array( + 'status' => 'success', + 'response' => array( + 'currentPage' => $Page, + 'pages' => ceil($NumResults/USERS_PER_PAGE), + 'results' => $JsonUsers + ) + ) + ); \ No newline at end of file