Empty commit

This commit is contained in:
Git 2013-08-28 23:08:41 +00:00
parent db7ddd0378
commit 3e3fdfb804
292 changed files with 11507 additions and 7493 deletions

View File

@ -1,2 +0,0 @@
<?
require('classes/script_start.php');

View File

@ -6,23 +6,25 @@ function convert($str) {
//Alternative approach with potential.
function flush() {
global $Cache, $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Alias, ArticleID
FROM wiki_aliases");
$Aliases = $DB->to_array('Alias');
$Cache->cache_value('wiki_aliases', $Aliases, 3600 * 24 * 14); // 2 weeks
$Aliases = G::$DB->to_array('Alias');
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('wiki_aliases', $Aliases, 3600 * 24 * 14); // 2 weeks
}
function to_id($Alias) {
global $Cache, $DB;
$Aliases = $Cache->get_value('wiki_aliases');
$Aliases = G::$Cache->get_value('wiki_aliases');
if (!$Aliases) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Alias, ArticleID
FROM wiki_aliases");
$Aliases = $DB->to_array('Alias');
$Cache->cache_value('wiki_aliases', $Aliases, 3600 * 24 * 14); // 2 weeks
$Aliases = G::$DB->to_array('Alias');
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('wiki_aliases', $Aliases, 3600 * 24 * 14); // 2 weeks
}
return $Aliases[$this->convert($Alias)]['ArticleID'];
}
@ -32,21 +34,20 @@ function flush() {
}
function to_id($Alias) {
global $DB;
$Alias = $this->convert($Alias);
$DB->query("
G::$DB->query("
SELECT ArticleID
FROM wiki_aliases
WHERE Alias LIKE '$Alias'");
list($ArticleID) = $DB->next_record();
list($ArticleID) = G::$DB->next_record();
return $ArticleID;
}
*/
function article($ArticleID, $Error = true) {
global $Cache, $DB;
$Contents = $Cache->get_value('wiki_article_'.$ArticleID);
$Contents = G::$Cache->get_value('wiki_article_'.$ArticleID);
if (!$Contents) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
w.Revision,
w.Title,
@ -63,11 +64,12 @@ function article($ArticleID, $Error = true) {
LEFT JOIN users_main AS u ON u.ID=w.Author
WHERE w.ID='$ArticleID'
GROUP BY w.ID");
if (!$DB->has_results() && $Error) {
if (!G::$DB->has_results() && $Error) {
error(404);
}
$Contents = $DB->to_array();
$Cache->cache_value('wiki_article_'.$ArticleID, $Contents, 3600 * 24 * 14); // 2 weeks
$Contents = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('wiki_article_'.$ArticleID, $Contents, 3600 * 24 * 14); // 2 weeks
}
return $Contents;
}

View File

@ -18,14 +18,13 @@ class Artists {
* 6 => DJ
*/
public static function get_artists($GroupIDs) {
global $Cache, $DB;
$Results = array();
$DBs = array();
foreach ($GroupIDs as $GroupID) {
if (!is_number($GroupID)) {
continue;
}
$Artists = $Cache->get_value('groups_artists_'.$GroupID);
$Artists = G::$Cache->get_value('groups_artists_'.$GroupID);
if (is_array($Artists)) {
$Results[$GroupID] = $Artists;
} else {
@ -37,7 +36,8 @@ public static function get_artists($GroupIDs) {
if (empty($IDs)) {
$IDs = "null";
}
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT ta.GroupID,
ta.ArtistID,
aa.Name,
@ -49,16 +49,17 @@ public static function get_artists($GroupIDs) {
ORDER BY ta.GroupID ASC,
ta.Importance ASC,
aa.Name ASC;");
while (list($GroupID, $ArtistID, $ArtistName, $ArtistImportance, $AliasID) = $DB->next_record(MYSQLI_BOTH, false)) {
while (list($GroupID, $ArtistID, $ArtistName, $ArtistImportance, $AliasID) = G::$DB->next_record(MYSQLI_BOTH, false)) {
$Results[$GroupID][$ArtistImportance][] = array('id' => $ArtistID, 'name' => $ArtistName, 'aliasid' => $AliasID);
$New[$GroupID][$ArtistImportance][] = array('id' => $ArtistID, 'name' => $ArtistName, 'aliasid' => $AliasID);
}
G::$DB->set_query_id($QueryID);
foreach ($DBs as $GroupID) {
if (isset($New[$GroupID])) {
$Cache->cache_value('groups_artists_'.$GroupID, $New[$GroupID]);
G::$Cache->cache_value('groups_artists_'.$GroupID, $New[$GroupID]);
}
else {
$Cache->cache_value('groups_artists_'.$GroupID, array());
G::$Cache->cache_value('groups_artists_'.$GroupID, array());
}
}
$Missing = array_diff($GroupIDs, array_keys($Results));
@ -216,50 +217,53 @@ public static function display_artist($Artist, $MakeLink = true, $Escape = true)
* @param int $ArtistID
*/
public static function delete_artist($ArtistID) {
global $DB, $LoggedUser, $Cache;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Name
FROM artists_group
WHERE ArtistID = ".$ArtistID);
list($Name) = $DB->next_record(MYSQLI_NUM, false);
list($Name) = G::$DB->next_record(MYSQLI_NUM, false);
// Delete requests
$DB->query("
G::$DB->query("
SELECT RequestID
FROM requests_artists
WHERE ArtistID = $ArtistID
AND ArtistID != 0");
$Requests = $DB->to_array();
$Requests = G::$DB->to_array();
foreach ($Requests AS $Request) {
list($RequestID) = $Request;
$DB->query('DELETE FROM requests WHERE ID='.$RequestID);
$DB->query('DELETE FROM requests_votes WHERE RequestID='.$RequestID);
$DB->query('DELETE FROM requests_tags WHERE RequestID='.$RequestID);
$DB->query('DELETE FROM requests_artists WHERE RequestID='.$RequestID);
G::$DB->query('DELETE FROM requests WHERE ID='.$RequestID);
G::$DB->query('DELETE FROM requests_votes WHERE RequestID='.$RequestID);
G::$DB->query('DELETE FROM requests_tags WHERE RequestID='.$RequestID);
G::$DB->query('DELETE FROM requests_artists WHERE RequestID='.$RequestID);
}
// Delete artist
$DB->query('DELETE FROM artists_group WHERE ArtistID='.$ArtistID);
$DB->query('DELETE FROM artists_alias WHERE ArtistID='.$ArtistID);
$Cache->decrement('stats_artist_count');
G::$DB->query('DELETE FROM artists_group WHERE ArtistID='.$ArtistID);
G::$DB->query('DELETE FROM artists_alias WHERE ArtistID='.$ArtistID);
G::$Cache->decrement('stats_artist_count');
// Delete wiki revisions
$DB->query('DELETE FROM wiki_artists WHERE PageID='.$ArtistID);
G::$DB->query('DELETE FROM wiki_artists WHERE PageID='.$ArtistID);
// Delete tags
$DB->query('DELETE FROM artists_tags WHERE ArtistID='.$ArtistID);
G::$DB->query('DELETE FROM artists_tags WHERE ArtistID='.$ArtistID);
$Cache->delete_value('artist_'.$ArtistID);
$Cache->delete_value('artist_groups_'.$ArtistID);
// Delete artist comments, subscriptions and quote notifications
Comments::delete_page('artist', $ArtistID);
G::$Cache->delete_value('artist_'.$ArtistID);
G::$Cache->delete_value('artist_groups_'.$ArtistID);
// Record in log
if (!empty($LoggedUser['Username'])) {
$Username = $LoggedUser['Username'];
if (!empty(G::$LoggedUser['Username'])) {
$Username = G::$LoggedUser['Username'];
} else {
$Username = 'System';
}
Misc::write_log("Artist $ArtistID ($Name) was deleted by $Username");
G::$DB->set_query_id($QueryID);
}

View File

@ -39,17 +39,18 @@ function load_data($Data) {
}
function set_up() {
$QueryID = G::$DB->get_query_id();
$this->x = ceil(WIDTH / 2);
$this->y = ceil(HEIGHT / 2);
$this->xValues[$this->x] = $this->ID;
$this->yValues[$this->y] = $this->ID;
global $DB;
// Get artists that are directly similar to the artist
$ArtistIDs = array();
$DB->query("
G::$DB->query("
SELECT
s2.ArtistID,
ag.Name,
@ -62,12 +63,12 @@ function set_up() {
ORDER BY ass.Score DESC
LIMIT 14");
if (!$DB->has_results()) {
if (!G::$DB->has_results()) {
return;
}
// Build into array. Each artist is its own object in $this->Artists
while (list($ArtistID, $Name, $Score) = $DB->next_record(MYSQLI_NUM, false)) {
while (list($ArtistID, $Name, $Score) = G::$DB->next_record(MYSQLI_NUM, false)) {
if ($Score < 0) {
continue;
}
@ -78,7 +79,7 @@ function set_up() {
}
// Get similarities between artists on the map
$DB->query("
G::$DB->query("
SELECT
s1.ArtistID,
s2.ArtistID
@ -90,7 +91,7 @@ function set_up() {
AND s2.ArtistID IN('.implode(',', $ArtistIDs).')');
// Build into array
while (list($Artist1ID, $Artist2ID) = $DB->next_record()) {
while (list($Artist1ID, $Artist2ID) = G::$DB->next_record()) {
$this->Artists[$Artist1ID]->Similar[$Artist2ID] = array('ID'=>$Artist2ID);
}
@ -107,6 +108,8 @@ function set_up() {
}
}
reset($this->Artists);
G::$DB->set_query_id($QueryID);
}
function set_positions() {

View File

@ -0,0 +1,32 @@
<?php
class BitcoinRpc {
public static function __callStatic($Method, $Args) {
if (!defined('BITCOIN_RPC_URL')) {
return false;
}
$MessageID = mt_rand();
$Params = json_encode(array(
'method' => $Method,
'params' => $Args,
'id' => $MessageID)
);
$Request = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/json',
'content' => $Params
)
);
if (!$Response = file_get_contents(BITCOIN_RPC_URL, false, stream_context_create($Request))) {
return false;
}
$Response = json_decode($Response);
if ($Response->id != $MessageID || !empty($Response->error) || empty($Response->result)) {
return false;
}
return $Response->result;
}
}

View File

@ -69,7 +69,7 @@ public static function has_bookmarked($Type, $ID) {
/**
* Fetch all bookmarks of a certain type for a user.
* If UserID is false than defaults to $LoggedUser['ID']
* If UserID is false than defaults to G::$LoggedUser['ID']
*
* @param string $Type
* type of bookmarks to fetch
@ -78,19 +78,20 @@ public static function has_bookmarked($Type, $ID) {
* @return array the bookmarks
*/
public static function all_bookmarks($Type, $UserID = false) {
global $DB, $Cache, $LoggedUser;
if ($UserID === false) {
$UserID = $LoggedUser['ID'];
$UserID = G::$LoggedUser['ID'];
}
$CacheKey = 'bookmarks_' . $Type . '_' . $UserID;
if (($Bookmarks = $Cache->get_value($CacheKey)) === false) {
if (($Bookmarks = G::$Cache->get_value($CacheKey)) === false) {
list ($Table, $Col) = self::bookmark_schema($Type);
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT $Col
FROM $Table
WHERE UserID = '$UserID'");
$Bookmarks = $DB->collect($Col);
$Cache->cache_value($CacheKey, $Bookmarks, 0);
$Bookmarks = G::$DB->collect($Col);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value($CacheKey, $Bookmarks, 0);
}
return $Bookmarks;
}

View File

@ -40,15 +40,18 @@ class CACHE extends Memcache {
protected $InTransaction = false;
public $Time = 0;
private $PersistentKeys = array(
'stats_*',
'percentiles_*',
'top10tor_*',
'ajax_requests_*',
'query_lock_*',
'stats_*',
'top10tor_*',
'top10votes_*',
// 'similar_albums_*',
'users_snatched_*',
'ajax_requests_*'
// Cache-based features
'global_notification',
'notifications_one_reads_*',
);
private $ClearedKeys = array();
public $CanClear = false;
public $InternalCache = true;
@ -110,21 +113,27 @@ public function get_value($Key, $NoCache = false) {
// Because of this, not user cache data will require a secondary pageload following the clearcache to update
if (count($this->CacheHits) > 0) {
foreach (array_keys($this->CacheHits) as $HitKey) {
if (!Misc::in_array_partial($HitKey, $this->PersistentKeys)) {
if (!isset($this->ClearedKeys[$HitKey]) && !Misc::in_array_partial($HitKey, $this->PersistentKeys)) {
$this->delete($HitKey);
unset($this->CacheHits[$HitKey]);
$this->ClearedKeys[$HitKey] = true;
}
}
}
if (!isset($this->ClearedKeys[$Key])) {
$this->delete($Key);
$this->ClearedKeys[$Key] = true;
$this->Time += (microtime(true) - $StartTime) * 1000;
return false;
}
} elseif (!isset($this->ClearedKeys[$Key]) && $_GET['clearcache'] == $Key) {
$this->delete($Key);
$this->ClearedKeys[$Key] = true;
$this->Time += (microtime(true) - $StartTime) * 1000;
return false;
} elseif ($_GET['clearcache'] == $Key) {
$this->delete($Key);
$this->Time += (microtime(true) - $StartTime) * 1000;
return false;
} elseif (in_array($_GET['clearcache'], $this->CacheHits)) {
} elseif (!isset($this->ClearedKeys[$_GET['clearcache']]) && in_array($_GET['clearcache'], $this->CacheHits)) {
unset($this->CacheHits[$_GET['clearcache']]);
$this->ClearedKeys[$_GET['clearcache']] = true;
$this->delete($_GET['clearcache']);
}
}

139
classes/calendar.class.php Normal file
View File

@ -0,0 +1,139 @@
<?
class Calendar {
public static $Categories = array(1 => "IRC Meeting", "IRC Brainstorm", "Poll Deadline", "Feature Release", "Blog Post", "Announcement", "Featured Album", "Product Release", "Staff Picks", "Forum Brainstorm", "Forum Discussion", "Promotion");
public static $Importances = array(1 => "Critical", "Important", "Average", "Meh");
public static $Colors = array(
"Critical" => "red",
"Important" => "yellow",
"Average" => "green",
"Meh" => "blue");
public static $Teams = array(
0 => "Everyone",
1 => "Staff"
);
public static function can_view() {
return check_perms('users_mod')
;
}
private static function get_teams_query() {
$Teams = array(0);
$IsMod = check_perms("users_mod");
if ($IsMod) {
$Teams[] = 1;
}
return "Team IN (" . implode(",", $Teams) . ") ";
}
public static function get_events($Month, $Year) {
if (empty($Month) || empty($Year)) {
$Date = getdate();
$Month = $Date['mon'];
$Year = $Date['year'];
}
$Month = (int) $Month;
$Year = (int) $Year;
$TeamsSQL = self::get_teams_query();
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ID, Team, Title, Category, Importance, DAY(StartDate) AS StartDay, DAY(EndDate) AS EndDay
FROM calendar
WHERE
MONTH(StartDate) = '$Month'
AND
YEAR(StartDate) = '$Year'
AND
$TeamsSQL");
$Events = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
return $Events;
}
public static function get_event($ID) {
$ID = (int) $ID;
if (empty($ID)) {
error("Invalid ID");
}
$TeamsSQL = self::get_teams_query();
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ID, Team, Title, Body, Category, Importance, AddedBy, StartDate, EndDate
FROM calendar
WHERE
ID = '$ID'
AND
$TeamsSQL");
$Event = G::$DB->next_record(MYSQLI_ASSOC);
G::$DB->set_query_id($QueryID);
return $Event;
}
public static function create_event($Title, $Body, $Category, $Importance, $Team, $UserID, $StartDate, $EndDate = null) {
if (empty($Title) || empty($Body) || !is_number($Category) || !is_number($Importance) || !is_number($Team) || empty($StartDate)) {
error("Error adding event");
}
$Title = db_string($Title);
$Body = db_string($Body);
$Category = (int) $Category;
$Importance = (int) $Importance;
$UserID = (int) $UserID;
$Team = (int) $Team;
$StartDate = db_string($StartDate);
$EndDate = db_string($EndDate);
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO calendar
(Title, Body, Category, Importance, Team, StartDate, EndDate, AddedBy)
VALUES
('$Title', '$Body', '$Category', '$Importance', '$Team' '$StartDate', '$EndDate', '$UserID')");
G::$DB->set_query_id($QueryID);
}
public static function update_event($ID, $Title, $Body, $Category, $Importance, $Team, $StartDate, $EndDate = null) {
if (!is_number($ID) || empty($Title) || empty($Body) || !is_number($Category) || !is_number($Importance) || !is_number($Team) || empty($StartDate)) {
error("Error updating event");
}
$ID = (int) $ID;
$Title = db_string($Title);
$Body = db_string($Body);
$Category = (int) $Category;
$Importance = (int) $Importance;
$Team = (int) $Team;
$StartDate = db_string($StartDate);
$EndDate = db_string($EndDate);
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE calendar
SET
Title = '$Title',
Body = '$Body',
Category = '$Category',
Importance = '$Importance',
Team = '$Team',
StartDate = '$StartDate',
EndDate = '$EndDate'
WHERE
ID = '$ID'");
G::$DB->set_query_id($QueryID);
}
public static function remove_event($ID) {
$ID = (int) $ID;
if (!empty($ID)) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("DELETE FROM calendar WHERE ID = '$ID'");
G::$DB->set_query_id($QueryID);
}
}
}

View File

@ -0,0 +1,109 @@
<?
class CalendarView {
private static $Days = array('S','M','T','W','T','F','S');
private static $Headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
private static $Events;
public static function render_title($Month, $Year) {
$NextMonth = $Month % 12 == 0 ? 1 : $Month + 1;
$PreviousMonth = $Month == 1 ? 12 : $Month - 1;
$NextYear = $Year;
if ($NextMonth == 1) {
$NextYear++;
}
$PreviousYear = $Year;
if ($PreviousMonth == 12) {
$PreviousYear--;
}
?>
<h1 class="center">
<a href="tools.php?action=calendar&amp;month=<?=$PreviousMonth?>&amp;year=<?=$PreviousYear?>"><</a>
<?=date("F", mktime(0, 0, 0, $Month, 10)) . " " . $Year?>
<a href="tools.php?action=calendar&amp;month=<?=$NextMonth?>&amp;year=<?=$NextYear?>">></a>
</h1>
<input type="hidden" id="month" value="<?=$Month?>"/>
<input type="hidden" id="year" value="<?=$Year?>"/>
<? }
private static function get_events_on($Day, $Events) {
// Linear search, Lol.
$Results = array();
foreach($Events as $Event) {
if ($Event['StartDay'] == $Day || ($Event['StartDay'] <= $Day && $Event['EndDay'] >= $Day)) {
$Results[] = $Event;
}
}
return $Results;
}
private static function render_events_day($Day, $Events) {
$Events = self::get_events_on($Day, $Events);
foreach ($Events as $Event) {
$Color = Calendar::$Colors[Calendar::$Importances[$Event['Importance']]];
$Category = Calendar::$Categories[$Event['Category']];
$Tooltip = $Event['Title'] . " - " . Calendar::$Categories[$Event['Category']] . " - " . Calendar::$Importances[$Event['Importance']];
?>
<p><a href="#" class="event_day tooltip" title="<?=$Tooltip?>" data-gazelle-id="<?=$Event['ID']?>" style="color: <?=$Color?>;"><?=Format::cut_string($Event['Title'], 8, true)?></a></p>
<? }
}
public static function render_calendar($Month, $Year, $Events) {
$RunningDay = date('w',mktime(0, 0, 0, $Month, 1, $Year));
$DaysInMonth = date('t',mktime(0 ,0 ,0, $Month, 1, $Year));
$DaysThisWeek = 1;
$DayCounter = 0;
$DatesArray = array();
?>
<table class="calendar">
<? foreach(self::$Headings as $Heading) { ?>
<td class="calendar-row calendar-heading">
<strong><?=$Heading?></strong>
</td>
<? } ?>
<tr class="calendar-row">
<? for ($x = 0; $x < $RunningDay; $x++) { ?>
<td class="calendar-day-np"></td>
<? $DaysThisWeek++;
}
for ($i = 1; $i <= $DaysInMonth; $i++) { ?>
<td class="calendar-day">
<div class="day-events">
<? self::render_events_day($i, $Events); ?>
</div>
<div class="day-number">
<?=$i?>
</div>
</td>
<? if ($RunningDay == 6) { ?>
</tr>
<? if (($DayCounter+1) != $DaysInMonth) { ?>
<tr class="calendar-row">
<? }
$RunningDay = -1;
$DaysThisWeek = 0;
}
$DaysThisWeek++;
$RunningDay++;
$DayCounter++;
}
if ($DaysThisWeek < 8) {
for ($x = 1; $x <= (8 - $DaysThisWeek); $x++) { ?>
<td class="calendar-day-np"></td>
<? }
}
?>
</tr>
</table>
<?
echo $Calendar;
}
}

View File

@ -1,82 +1,48 @@
<?
class Collages {
public static function get_comment_count($CollageID) {
global $DB, $Cache;
$NumComments = $Cache->get_value('collage_comments_'.$CollageID);
if ($NumComments === false) {
$DB->query("
SELECT COUNT(ID)
FROM collages_comments
WHERE CollageID = '$CollageID'");
list($NumComments) = $DB->next_record();
$Cache->cache_value('collage_comments_'.$CollageID, $NumComments, 0);
}
return $NumComments;
}
public static function get_comment_catalogue($CollageID, $CatalogueID) {
global $DB, $Cache;
$Catalogue = $Cache->get_value('collage_comments_'.$CollageID.'_catalogue_'.$CatalogueID);
if ($Catalogue === false) {
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
$DB->query("
SELECT
ID,
UserID,
Time,
Body
FROM collages_comments
WHERE CollageID = '$CollageID'
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false, MYSQLI_ASSOC);
$Cache->cache_value('collage_comments_'.$CollageID.'_catalogue_'.$CatalogueID, $Catalogue, 0);
}
return $Catalogue;
}
public static function increase_subscriptions($CollageID) {
global $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE collages
SET Subscribers = Subscribers + 1
WHERE ID = '$CollageID'");
G::$DB->set_query_id($QueryID);
}
public static function decrease_subscriptions($CollageID) {
global $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE collages
SET Subscribers = IF(Subscribers < 1, 0, Subscribers - 1)
WHERE ID = '$CollageID'");
G::$DB->set_query_id($QueryID);
}
public static function create_personal_collage() {
global $DB, $LoggedUser;
$DB->query("
G::$DB->query("
SELECT
COUNT(ID)
FROM collages
WHERE UserID = '$LoggedUser[ID]'
WHERE UserID = '" . G::$LoggedUser['ID'] . "'
AND CategoryID = '0'
AND Deleted = '0'");
list($CollageCount) = $DB->next_record();
list($CollageCount) = G::$DB->next_record();
if ($CollageCount >= $LoggedUser['Permissions']['MaxCollages']) {
list($CollageID) = $DB->next_record();
if ($CollageCount >= G::$LoggedUser['Permissions']['MaxCollages']) {
// TODO: fix this, the query was for COUNT(ID), so I highly doubt that this works... - Y
list($CollageID) = G::$DB->next_record();
header('Location: collage.php?id='.$CollageID);
die();
}
$NameStr = ($CollageCount > 0) ? ' no. ' . ($CollageCount + 1) : '';
$DB->query("
$NameStr = db_string(G::$LoggedUser['Username'] . "'s personal collage" . ($CollageCount > 0 ? ' no. ' . ($CollageCount + 1) : ''));
$Description = db_string('Personal collage for ' . G::$LoggedUser['Username'] . '. The first 5 albums will appear on his or her [url=https://' . SSL_SITE_URL . '/user.php?id= ' . G::$LoggedUser['ID'] . ']profile[/url].');
G::$DB->query("
INSERT INTO collages
(Name, Description, CategoryID, UserID)
VALUES
('$LoggedUser[Username]\'s personal collage$NameStr', 'Personal collage for $LoggedUser[Username]. The first 5 albums will appear on his or her [url=https:\/\/".SSL_SITE_URL."\/user.php?id=$LoggedUser[ID]]profile[\/url].', '0', $LoggedUser[ID])");
$CollageID = $DB->inserted_id();
('$NameStr', '$Description', '0', " . G::$LoggedUser['ID'] . ")");
$CollageID = G::$DB->inserted_id();
header('Location: collage.php?id='.$CollageID);
die();
}
}

395
classes/comments.class.php Normal file
View File

@ -0,0 +1,395 @@
<?
class Comments {
/*
* For all functions:
* $Page = 'artist', 'collages', 'requests' or 'torrents'
* $PageID = ArtistID, CollageID, RequestID or GroupID, respectively
*/
/**
* Post a comment on an artist, request or torrent page.
* @param string $Page
* @param int $PageID
* @param string $Body
* @return int ID of the new comment
*/
public static function post($Page, $PageID, $Body) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
CEIL(
(
SELECT COUNT(ID)+1
FROM comments
WHERE Page = '$Page'
AND PageID = $PageID
)/" . TORRENT_COMMENTS_PER_PAGE . "
) AS Pages");
list($Pages) = G::$DB->next_record();
G::$DB->query("
INSERT INTO comments (Page, PageID, AuthorID, AddedTime, Body)
VALUES ('$Page', $PageID, " . G::$LoggedUser['ID'] . ", '" . sqltime() . "', '" . db_string($Body) . "')");
$PostID = G::$DB->inserted_id();
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Pages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
G::$Cache->delete_value($Page.'_comments_'.$PageID.'_catalogue_'.$CatalogueID);
G::$Cache->delete_value($Page.'_comments_'.$PageID);
Subscriptions::flush_subscriptions($Page, $PageID);
Subscriptions::quote_notify($Body, $PostID, $Page, $PageID);
G::$DB->set_query_id($QueryID);
return $PostID;
}
/**
* Edit a comment
* @param int $PostID
* @param string $NewBody
* @todo move permission check out of here/remove hardcoded error(404)
*/
public static function edit($PostID, $NewBody) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
Body,
AuthorID,
Page,
PageID,
AddedTime
FROM comments
WHERE ID = $PostID");
if (!G::$DB->has_results()) {
return false;
}
list($OldBody, $AuthorID, $Page, $PageID, $AddedTime) = G::$DB->next_record();
if (G::$LoggedUser['ID'] != $AuthorID && !check_perms('site_moderate_forums')) {
return false;
}
G::$DB->query("
SELECT CEIL(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Page
FROM comments
WHERE Page = '$Page'
AND PageID = $PageID
AND ID <= $PostID");
list($CommPage) = G::$DB->next_record();
// Perform the update
G::$DB->query("
UPDATE comments
SET
Body = '" . db_string($NewBody) . "',
EditedUserID = " . G::$LoggedUser['ID'] . ",
EditedTime = '" . sqltime() . "'
WHERE ID = $PostID");
// Update the cache
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $CommPage - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
G::$Cache->delete_value($Page . '_comments_' . $PageID . '_catalogue_' . $CatalogueID);
if ($Page == 'collages') {
// On collages, we also need to clear the collage key (collage_$CollageID), because it has the comments in it... (why??)
G::$Cache->delete_value('collage_' . $PageID);
}
G::$DB->query("
INSERT INTO comments_edits (Page, PostID, EditUser, EditTime, Body)
VALUES ('$Page', $PostID, " . G::$LoggedUser['ID'] . ", '" . sqltime() . "', '" . db_string($OldBody) . "')");
G::$DB->set_query_id($QueryID);
return true; // TODO: this should reflect whether or not the update was actually successful, e.g. by checking G::$DB->affected_rows after the UPDATE query
}
/**
* Delete a comment
* @param int $PostID
*/
public static function delete($PostID) {
$QueryID = G::$DB->get_query_id();
// Get page, pageid
G::$DB->query("SELECT Page, PageID FROM comments WHERE ID = $PostID");
if (!G::$DB->has_results()) {
// no such comment?
G::$DB->set_query_id($QueryID);
return false;
}
list ($Page, $PageID) = G::$DB->next_record();
// get number of pages
G::$DB->query("
SELECT
CEIL(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Pages,
CEIL(SUM(IF(ID <= $PostID, 1, 0)) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Page
FROM comments
WHERE Page = '$Page' AND PageID = $PageID
GROUP BY PageID");
if (!G::$DB->has_results()) {
// the comment $PostID was probably not posted on $Page
G::$DB->set_query_id($QueryID);
return false;
}
list($CommPages, $CommPage) = G::$DB->next_record();
// $CommPages = number of pages in the thread
// $CommPage = which page the post is on
// These are set for cache clearing.
G::$DB->query("DELETE FROM comments WHERE ID = $PostID");
G::$DB->query("DELETE FROM comments_edits WHERE Page = '$Page' AND PostID = $PostID");
G::$DB->query("DELETE FROM users_notify_quoted WHERE Page = '$Page' AND PostID = $PostID");
Subscriptions::flush_subscriptions($Page, $PageID);
Subscriptions::flush_quote_notifications($Page, $PageID);
//We need to clear all subsequential catalogues as they've all been bumped with the absence of this post
$ThisCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $CommPage - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$LastCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $CommPages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
for ($i = $ThisCatalogue; $i <= $LastCatalogue; ++$i) {
G::$Cache->delete_value($Page . '_comments_' . $PageID . '_catalogue_' . $i);
}
G::$Cache->delete_value($Page . '_comments_' . $PageID);
if ($Page == 'collages') {
// On collages, we also need to clear the collage key (collage_$CollageID), because it has the comments in it... (why??)
G::$Cache->delete_value('collage_' . $PageID);
}
G::$DB->set_query_id($QueryID);
return true;
}
/**
* Get the URL to a comment, already knowing the Page and PostID
* @param string $Page
* @param int $PageID
* @param int $PostID
* @return string|bool The URL to the comment or false on error
*/
public static function get_url($Page, $PageID, $PostID = null) {
$Post = (!empty($PostID) ? "&postid=$PostID#post$PostID" : '');
switch ($Page) {
case 'artist':
return "artist.php?id=$PageID$Post";
case 'collages':
return "collages.php?action=comments&collageid=$PageID$Post";
case 'requests':
return "requests.php?action=view&id=$PageID$Post";
case 'torrents':
return "torrents.php?id=$PageID$Post";
default:
return false;
}
}
/**
* Get the URL to a comment
* @param int $PostID
* @return string|bool The URL to the comment or false on error
*/
public static function get_url_query($PostID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT Page, PageID FROM comments WHERE ID = $PostID");
if (!G::$DB->has_results()) {
error(404);
}
list($Page, $PageID) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
return self::get_url($Page, $PageID, $PostID);
}
/**
* Load a page's comments. This takes care of `postid` and (indirectly) `page` parameters passed in $_GET.
* Quote notifications and last read are also handled here, unless $HandleSubscriptions = false is passed.
* @param string $Page
* @param int $PageID
* @param bool $HandleSubscriptions Whether or not to handle subscriptions (last read & quote notifications)
* @return array ($NumComments, $Page, $Thread, $LastRead)
* $NumComments: the total number of comments on this artist/request/torrent group
* $Page: the page we're currently on
* $Thread: an array of all posts on this page
* $LastRead: ID of the last comment read by the current user in this thread;
* will be false if $HandleSubscriptions == false or if there are no comments on this page
*/
public static function load($Page, $PageID, $HandleSubscriptions = true) {
$QueryID = G::$DB->get_query_id();
// Get the total number of comments
$NumComments = G::$Cache->get_value($Page.'_comments_'.$PageID);
if ($NumComments === false) {
G::$DB->query("
SELECT COUNT(ID)
FROM comments
WHERE Page = '$Page'
AND PageID = $PageID");
list($NumComments) = G::$DB->next_record();
G::$Cache->cache_value($Page.'_comments_'.$PageID, $NumComments, 0);
}
// If a postid was passed, we need to determine which page that comment is on.
// Format::page_limit handles a potential $_GET['page']
if (isset($_GET['postid']) && is_number($_GET['postid']) && $NumComments > TORRENT_COMMENTS_PER_PAGE) {
G::$DB->query("
SELECT COUNT(ID)
FROM comments
WHERE Page = '$Page'
AND PageID = $PageID
AND ID <= $_GET[postid]");
list($PostNum) = G::$DB->next_record();
list($CommPage, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $PostNum);
} else {
list($CommPage, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $NumComments);
}
// Get the cache catalogue
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $CommPage - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page
$Catalogue = G::$Cache->get_value($Page.'_comments_'.$PageID.'_catalogue_'.$CatalogueID);
if ($Catalogue === false) {
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
G::$DB->query("
SELECT
c.ID,
c.AuthorID,
c.AddedTime,
c.Body,
c.EditedUserID,
c.EditedTime,
u.Username
FROM comments AS c
LEFT JOIN users_main AS u ON u.ID = c.EditedUserID
WHERE c.Page = '$Page' AND c.PageID = $PageID
ORDER BY c.ID
LIMIT $CatalogueLimit");
$Catalogue = G::$DB->to_array(false, MYSQLI_ASSOC);
G::$Cache->cache_value($Page.'_comments_'.$PageID.'_catalogue_'.$CatalogueID, $Catalogue, 0);
}
//This is a hybrid to reduce the catalogue down to the page elements: We use the page limit % catalogue
$Thread = array_slice($Catalogue, ((TORRENT_COMMENTS_PER_PAGE * $CommPage - TORRENT_COMMENTS_PER_PAGE) % THREAD_CATALOGUE), TORRENT_COMMENTS_PER_PAGE, true);
if ($HandleSubscriptions && count($Thread) > 0) {
// quote notifications
$LastPost = end($Thread);
$LastPost = $LastPost['ID'];
$FirstPost = reset($Thread);
$FirstPost = $FirstPost['ID'];
G::$DB->query("
UPDATE users_notify_quoted
SET UnRead = false
WHERE UserID = " . G::$LoggedUser['ID'] . "
AND Page = '$Page'
AND PageID = $PageID
AND PostID >= $FirstPost
AND PostID <= $LastPost");
if (G::$DB->affected_rows()) {
G::$Cache->delete_value('notify_quoted_' . G::$LoggedUser['ID']);
}
// last read
G::$DB->query("SELECT PostID FROM users_comments_last_read WHERE UserID = " . G::$LoggedUser['ID'] . " AND Page = '$Page' AND PageID = $PageID");
list($LastRead) = G::$DB->next_record();
if($LastRead < $LastPost) {
G::$DB->query("INSERT INTO users_comments_last_read
(UserID, Page, PageID, PostID) VALUES
(" . G::$LoggedUser['ID'] . ", '$Page', $PageID, $LastPost)
ON DUPLICATE KEY UPDATE PostID = $LastPost");
G::$Cache->delete_value('subscriptions_user_new_' . G::$LoggedUser['ID']);
}
} else {
$LastRead = false;
}
G::$DB->set_query_id($QueryID);
return array($NumComments, $CommPage, $Thread, $LastRead);
}
/**
* Merges all comments from $Page/$PageID into $Page/$TargetPageID. This also takes care of quote notifications, subscriptions and cache.
* @param type $Page
* @param type $PageID
* @param type $TargetPageID
*/
public static function merge($Page, $PageID, $TargetPageID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("UPDATE comments SET PageID = $TargetPageID WHERE Page = '$Page' AND PageID = $PageID");
// quote notifications
G::$DB->query("UPDATE users_notify_quoted SET PageID = $TargetPageID WHERE Page = '$Page' AND PageID = $PageID");
// comment subscriptions
Subscriptions::move_subscriptions($Page, $PageID, $TargetPageID);
// cache (we need to clear all comment catalogues)
G::$DB->query("
SELECT
CEIL(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Pages
FROM comments
WHERE Page = '$Page'
AND PageID = $TargetPageID
GROUP BY PageID");
list($CommPages) = G::$DB->next_record();
$LastCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $CommPages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
for ($i = 0; $i <= $LastCatalogue; ++$i) {
G::$Cache->delete_value($Page . '_comments_' . $TargetPageID . '_catalogue_' . $i);
}
G::$Cache->delete_value($Page.'_comments_'.$TargetPageID);
G::$DB->set_query_id($QueryID);
}
/**
* Delete all comments on $Page/$PageID (deals with quote notifications and subscriptions as well)
* @param string $Page
* @param int $PageID
* @return boolean
*/
public static function delete_page($Page, $PageID) {
$QueryID = G::$DB->get_query_id();
// get number of pages
G::$DB->query("
SELECT
CEIL(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Pages
FROM comments
WHERE Page = '$Page' AND PageID = $PageID
GROUP BY PageID");
if (!G::$DB->has_results()) {
return false;
}
list($CommPages) = G::$DB->next_record();
// Delete comments
G::$DB->query("DELETE FROM comments WHERE Page = '$Page' AND PageID = $PageID");
// Delete quote notifications
Subscriptions::flush_quote_notifications($Page, $PageID);
G::$DB->query("DELETE FROM users_notify_quoted WHERE Page = '$Page' AND PageID = $PageID");
// Deal with subscriptions
Subscriptions::move_subscriptions($Page, $PageID, null);
// Clear cache
$LastCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $CommPages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
for ($i = 0; $i <= $LastCatalogue; ++$i) {
G::$Cache->delete_value($Page . '_comments_' . $PageID . '_catalogue_' . $i);
}
G::$Cache->delete_value($Page.'_comments_'.$PageID);
G::$DB->set_query_id($QueryID);
return true;
}
}

View File

@ -0,0 +1,94 @@
<?
class CommentsView {
/**
* Render a thread of comments
* @param array $Thread An array as returned by Comments::load
* @param int $LastRead PostID of the last read post
* @param string $Baselink Link to the site these comments are on
*/
public static function render_comments($Thread, $LastRead, $Baselink) {
foreach ($Thread as $Post) {
list($PostID, $AuthorID, $AddedTime, $CommentBody, $EditedUserID, $EditedTime, $EditedUsername) = array_values($Post);
self::render_comment($AuthorID, $PostID, $CommentBody, $AddedTime, $EditedUserID, $EditedTime, $Baselink . "&amp;postid=$PostID#post$PostID", ($PostID > $LastRead));
}
}
/**
* Render one comment
* @param int $AuthorID
* @param int $PostID
* @param string $Body
* @param string $AddedTime
* @param int $EditedUserID
* @param string $EditedTime
* @param string $Link The link to the post elsewhere on the site
* @param string $Header The header used in the post
* @param bool $Tools Whether or not to show [Edit], [Report] etc.
* @todo Find a better way to pass the page (artist, collages, requests, torrents) to this function than extracting it from $Link
*/
function render_comment($AuthorID, $PostID, $Body, $AddedTime, $EditedUserID, $EditedTime, $Link, $Unread = false, $Header = '', $Tools = true) {
global $Text; // TODO: convert Text class to static and get rid of this crap
$UserInfo = Users::user_info($AuthorID);
$Header = '<strong>' . Users::format_username($AuthorID, true, true, true, true, false) . '</strong> ' . time_diff($AddedTime) . $Header;
?>
<table class="forum_post box vertical_margin<?=(!Users::has_avatars_enabled() ? ' noavatar' : '') . ($Unread ? ' forum_unread' : '')?>" id="post<?=$PostID?>">
<colgroup>
<? if (Users::has_avatars_enabled()) { ?>
<col class="col_avatar" />
<? } ?>
<col class="col_post_body" />
</colgroup>
<tr class="colhead_dark">
<td colspan="<?=(Users::has_avatars_enabled() ? 2 : 1)?>">
<div style="float: left;"><a class="post_id" href="<?=$Link?>">#<?=$PostID?></a>
<?=$Header?>
<? if ($Tools) { ?>
- <a href="#quickpost" onclick="Quote('<?=$PostID?>','<?=$UserInfo['Username']?>', true);" class="brackets">Quote</a>
<? if ($AuthorID == G::$LoggedUser['ID'] || check_perms('site_moderate_forums')) { ?>
- <a href="#post<?=$PostID?>" onclick="Edit_Form('<?=$PostID?>','<?=$Key?>');" class="brackets">Edit</a>
<? }
if (check_perms('site_moderate_forums')) { ?>
- <a href="#post<?=$PostID?>" onclick="Delete('<?=$PostID?>');" class="brackets">Delete</a>
<? } ?>
</div>
<div id="bar<?=$PostID?>" style="float: right;">
<a href="reports.php?action=report&amp;type=comment&amp;id=<?=$PostID?>" class="brackets">Report</a>
<?
if (check_perms('users_warn') && $AuthorID != G::$LoggedUser['ID'] && G::$LoggedUser['Class'] >= $UserInfo['Class']) {
?>
<form class="manage_form hidden" name="user" id="warn<?=$PostID?>" action="comments.php" method="post">
<input type="hidden" name="action" value="warn" />
<input type="hidden" name="postid" value="<?=$PostID?>" />
</form>
- <a href="#" onclick="$('#warn<?=$PostID?>').raw().submit(); return false;" class="brackets">Warn</a>
<? } ?>
&nbsp;
<a href="#">&uarr;</a>
<? } ?>
</div>
</td>
</tr>
<tr>
<? if (Users::has_avatars_enabled()) { ?>
<td class="avatar" valign="top">
<?=Users::show_avatar($UserInfo['Avatar'], $AuthorID, $UserInfo['Username'], G::$LoggedUser['DisableAvatars'])?>
</td>
<? } ?>
<td class="body" valign="top">
<div id="content<?=$PostID?>">
<?=$Text->full_format($Body)?>
<? if ($EditedUserID) { ?>
<br />
<br />
<? if (check_perms('site_admin_forums')) { ?>
<a href="#content<?=$PostID?>" onclick="LoadEdit('<?=substr($Link, 0, strcspn($Link, '.'))?>', <?=$PostID?>, 1); return false;">&laquo;</a>
<? } ?>
Last edited by
<?=Users::format_username($EditedUserID, false, false, false) ?> <?=time_diff($EditedTime, 2, true, true)?>
<? } ?>
</div>
</td>
</tr>
</table>
<? }
}

View File

@ -127,6 +127,16 @@ define('LAB_CHAN', '#');
define('STATUS_CHAN', '#');
// Miscellaneous values
define('RANK_ONE_COST', 5);
define('RANK_TWO_COST', 10);
define('RANK_THREE_COST', 15);
define('RANK_FOUR_COST', 20);
define('RANK_FIVE_COST', 30);
define('MAX_RANK', 6);
define('MAX_EXTRA_RANK', 8);
define('DONOR_FORUM_RANK', 6);
define('DONOR_FORUM', 70);
define('MAX_SPECIAL_RANK', 3);
$ForumsRevealVoters = array();
$ForumsDoublePost = array();

View File

@ -13,7 +13,7 @@ class DEBUG {
private $LoggedVars = array();
public function profile($Automatic = '') {
global $ScriptStartTime, $DB;
global $ScriptStartTime;
$Reason = array();
if (!empty($Automatic)) {
@ -40,7 +40,7 @@ public function profile($Automatic = '') {
$Reason[] = Format::get_size($Ram).' RAM used';
}
$DB->warnings(); // see comment in MYSQL::query
G::$DB->warnings(); // see comment in MYSQL::query
/*$Queries = $this->get_queries();
$DBWarningCount = 0;
foreach ($Queries as $Query) {
@ -53,8 +53,7 @@ public function profile($Automatic = '') {
}*/
if (isset($_REQUEST['profile'])) {
global $LoggedUser;
$Reason[] = 'Requested by '.$LoggedUser['Username'];
$Reason[] = 'Requested by ' . G::$LoggedUser['Username'];
}
$this->Perf['Memory usage'] = (($Ram>>10) / 1024).' MB';
@ -70,12 +69,12 @@ public function profile($Automatic = '') {
}
public function analysis($Message, $Report = '', $Time = 43200) {
global $Cache, $Document;
global $Document;
if (empty($Report)) {
$Report = $Message;
}
$Identifier = Users::make_secret(5);
$Cache->cache_value(
G::$Cache->cache_value(
'analysis_'.$Identifier,
array(
'url' => $_SERVER['REQUEST_URI'],
@ -269,13 +268,11 @@ public function get_includes() {
}
public function get_cache_time() {
global $Cache;
return $Cache->Time;
return G::$Cache->Time;
}
public function get_cache_keys() {
global $Cache;
return array_keys($Cache->CacheHits);
return array_keys(G::$Cache->CacheHits);
}
public function get_sphinx_queries() {
@ -301,13 +298,11 @@ public function get_sphinxql_time() {
}
public function get_queries() {
global $DB;
return $DB->Queries;
return G::$DB->Queries;
}
public function get_query_time() {
global $DB;
return $DB->Time;
return G::$DB->Time;
}
public function get_logged_vars() {
@ -467,7 +462,6 @@ public function constant_table($Constants = false) {
}
public function cache_table($CacheKeys = false) {
global $Cache;
$Header = 'Cache keys';
if (!is_array($CacheKeys)) {
$CacheKeys = $this->get_cache_keys();
@ -492,7 +486,7 @@ public function cache_table($CacheKeys = false) {
<a href="tools.php?action=clear_cache&amp;key=<?=$Key?>&amp;type=clear" target="_blank" class="brackets">Clear this cache key</a>
</td>
<td align="left" class="debug_data debug_cache_data">
<pre id="debug_cache_<?=$Key?>" class="hidden"><?=display_str(print_r($Cache->get_value($Key, true), true))?></pre>
<pre id="debug_cache_<?=$Key?>" class="hidden"><?=display_str(print_r(G::$Cache->get_value($Key, true), true))?></pre>
</td>
</tr>
<? } ?>

836
classes/donations.class.php Normal file
View File

@ -0,0 +1,836 @@
<?
define('BTC_API_URL', 'https://blockchain.info/ticker');
define('USD_API_URL', 'http://www.google.com/ig/calculator?hl=en&q=1USD=?EUR');
class Donations {
private static $ForumDescriptions = array(
"I want only two houses, rather than seven... I feel like letting go of things",
"A billion here, a billion there, sooner or later it adds up to real money.",
"I've cut back, because I'm buying a house in the West Village.",
"Some girls are just born with glitter in their veins.",
"I get half a million just to show up at parties. My life is, like, really, really fun.",
"Some people change when they think they're a star or something",
"I'd rather not talk about money. Its kind of gross.",
"I have not been to my house in Bermuda for two or three years, and the same goes for my house in Portofino. How long do I have to keep leading this life of sacrifice?",
"When I see someone who is making anywhere from $300,000 to $750,000 a year, that's middle class.",
"Money doesn't make you happy. I now have $50 million but I was just as happy when I had $48 million.",
"I'd rather smoke crack than eat cheese from a tin.",
"I am who I am. I cant pretend to be somebody who makes $25,000 a year.",
"A girl never knows when she might need a couple of diamonds at ten 'o' clock in the morning.",
"I wouldn't run for president. I wouldn't want to move to a smaller house.",
"I have the stardom glow.",
"What's Walmart? Do they like, sell wall stuff?",
"Whenever I watch TV and see those poor starving kids all over the world, I can't help but cry. I mean I'd love to be skinny like that, but not with all those flies and death and stuff.",
"Too much money ain't enough money.",
"What's a soup kitchen?",
"I work very hard and Im worth every cent!",
"To all my Barbies out there who date Benjamin Franklin, George Washington, Abraham Lincoln, you'll be better off in life. Get that money."
);
private static $IsSchedule = false;
public static function regular_donate($UserID, $DonationAmount, $Source, $Reason, $Currency = "EUR") {
self::donate($UserID, array(
"Source" => $Source,
"Price" => $DonationAmount,
"Currency" => $Currency,
"Source" => $Source,
"Reason" => $Reason,
"SendPM" => true));
}
public static function donate($UserID, $Args) {
$UserID = (int) $UserID;
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT 1 FROM users_main WHERE ID = '$UserID'");
if (G::$DB->has_results()) {
G::$Cache->InternalCache = false;
foreach($Args as &$Arg) {
$Arg = db_string($Arg);
}
extract($Args);
// We don't always get a date passed in.
if (empty($Date)) {
$Date = sqltime();
}
// Get the ID of the staff member making the edit
$AddedBy = 0;
if (!self::$IsSchedule) {
$AddedBy = G::$LoggedUser['ID'];
}
// Legacy donor, should remove at some point
G::$DB->query("UPDATE users_info SET Donor = '1' WHERE UserID = '$UserID'");
// Give them the extra invite
$ExtraInvite = G::$DB->affected_rows();
// A staff member is directly manipulating donor points
if ($Manipulation == "Direct") {
$DonorPoints = $Rank;
$AdjustedRank = $Rank >= MAX_EXTRA_RANK ? MAX_EXTRA_RANK : $Rank;
G::$DB->query("
INSERT INTO users_donor_ranks
(UserID, Rank, TotalRank, DonationTime)
VALUES
('$UserID', '$AdjustedRank', '$TotalRank', '$Date')
ON DUPLICATE KEY UPDATE
Rank = '$AdjustedRank',
TotalRank = '$TotalRank',
DonationTime = '$Date'");
}
else {
// Donations from the store get donor points directly, no need to calculate them
if ($Source == "Store Parser") {
$ConvertedPrice = self::currency_exchange($Amount * $Price, $Currency);
} else {
$ConvertedPrice = self::currency_exchange($Price, $Currency);
$DonorPoints = self::calculate_rank($ConvertedPrice);
}
$IncreaseRank = $DonorPoints;
// Rank is the same thing as DonorPoints
$CurrentRank = self::get_rank($UserID);
// A user's donor rank can never exceed MAX_EXTRA_RANK
// If the amount they donated causes it to overflow, chnage it to MAX_EXTRA_RANK
// The total rank isn't affected by this, so their original donor point value is added to it
if (($CurrentRank + $DonorPoints) >= MAX_EXTRA_RANK) {
$AdjustedRank = MAX_EXTRA_RANK;
} else {
$AdjustedRank = $CurrentRank + $DonorPoints;
}
G::$DB->query("
INSERT INTO users_donor_ranks
(UserID, Rank, TotalRank, DonationTime)
VALUES
('$UserID', '$AdjustedRank', '$DonorPoints', '$Date')
ON DUPLICATE KEY UPDATE
Rank = '$AdjustedRank',
TotalRank = TotalRank + '$DonorPoints',
DonationTime = '$Date'");
}
// Clear the rank cache key
G::$Cache->delete_value("donor_rank_$UserID");
// Get their rank
$Rank = self::get_rank($UserID);
$TotalRank = self::get_total_rank($UserID);
// Now that their rank and total rank has been set, we can calculate their special rank
self::calculate_special_rank($UserID);
// Hand out invites
G::$DB->query("SELECT InvitesRecievedRank FROM users_donor_ranks WHERE UserID = '$UserID'");
list($InvitesRecievedRank) = G::$DB->next_record();
$AdjustedRank = $Rank >= MAX_RANK ? (MAX_RANK - 1) : $Rank;
$InviteRank = $AdjustedRank - $InvitesRecievedRank;
if ($InviteRank > 0) {
$Invites = $ExtraInvite ? ($InviteRank + 1) : $InviteRank;
G::$DB->query("UPDATE users_main SET Invites = Invites + '$Invites' WHERE ID = $UserID");
G::$DB->query("UPDATE users_donor_ranks SET InvitesRecievedRank = '$AdjustedRank' WHERE UserID = '$UserID'");
}
// Send them a thank you PM
if ($SendPM) {
$Subject = "Your contribution has been received and credited. Thank you!";
$Body = self::get_pm_body($Source, $Currency, $Price, $IncreaseRank, $Rank);
Misc::send_pm($UserID, 0, $Subject, $Body);
}
// Lastly, add this donation to our history
G::$DB->query("
INSERT INTO donations
(UserID, Amount, Source, Reason, Currency, Email, Time, AddedBy, Rank, TotalRank)
VALUES
('$UserID', '$ConvertedPrice', '$Source', '$Reason', '$Currency', '$Email', '$Date', '$AddedBy', '$DonorPoints', '$TotalRank')");
// Clear their user cache keys because the users_info values has been modified
G::$Cache->delete_value("user_info_$UserID");
G::$Cache->delete_value("user_info_heavy_$UserID");
G::$Cache->delete_value("donor_rank_$UserID");
G::$Cache->delete_value("donor_special_rank_$UserID");
}
G::$DB->set_query_id($QueryID);
}
private static function calculate_special_rank($UserID) {
$UserID = (int) $UserID;
$QueryID = G::$DB->get_query_id();
// Are they are special?
G::$DB->query("
SELECT TotalRank, SpecialRank
FROM users_donor_ranks
WHERE UserID = '$UserID'");
if (G::$DB->has_results()) {
// Adjust their special rank depending on the total rank.
list($TotalRank, $SpecialRank) = G::$DB->next_record();
if ($TotalRank < 10) {
$SpecialRank = 0;
}
if ($TotalRank >= 10) {
Misc::send_pm($UserID, 0, "You've Reached Special Donor Rank #1! You've Earned: One User Pick. Details Inside.", self::get_special_rank_one_pm());
$SpecialRank = 1;
}
if ($TotalRank >= 20) {
Misc::send_pm($UserID, 0, "You've Reached Special Donor Rank #2! You've Earned: The Double-Avatar. Details Inside.", self::get_special_rank_two_pm());
$SpecialRank = 2;
}
if ($TotalRank >= 50) {
Misc::send_pm($UserID, 0, "You've Reached Special Donor Rank #3! You've Earned: Diamond Rank. Details Inside.", self::get_special_rank_three_pm());
$SpecialRank = 3;
}
// Make them special
G::$DB->query("
UPDATE users_donor_ranks
SET SpecialRank = '$SpecialRank'
WHERE UserID = '$UserID'");
G::$Cache->delete_value("donor_special_rank_$UserID");
}
G::$DB->set_query_id($QueryID);
}
public static function schedule() {
self::$IsSchedule = true;
DonationsBitcoin::find_new_donations();
//self::expire_ranks();
}
public static function expire_ranks() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT UserID, Rank
FROM users_donor_ranks
WHERE Rank > 1
AND SpecialRank != 3
AND DonationTime < NOW() - INTERVAL 32 DAY");
if (G::$DB->record_count() > 0) {
$UserIDs = array();
while (list($UserID, $Rank) = G::$DB->next_record()) {
G::$Cache->delete_value("donor_rank_$UserID");
G::$Cache->delete_value("donor_rewards_$UserID");
$UserIDs[] = $UserID;
}
$In = implode(',', $UserIDs);
G::$DB->query("
UPDATE users_donor_ranks
SET Rank = Rank - IF(Rank = " . MAX_RANK . ", 2, 1)
WHERE UserID IN ($In)");
}
G::$DB->set_query_id($QueryID);
}
private static function calculate_rank($Amount) {
return floor($Amount / 5);
}
public static function update_rank($UserID, $Rank, $TotalRank, $Reason) {
$Rank = (int)$Rank;
$TotalRank = (int)$TotalRank;
self::donate($UserID, array(
"Manipulation" => "Direct",
"Rank" => $Rank,
"TotalRank" => $TotalRank,
"Reason" => $Reason,
"Source" => "Modify Values",
"Currency" => "EUR"));
}
public static function hide_stats($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO users_donor_ranks
(UserID, Hidden)
VALUES
('$UserID', '1')
ON DUPLICATE KEY UPDATE
Hidden = '1'");
G::$DB->set_query_id($QueryID);
}
public static function show_stats($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO users_donor_ranks
(UserID, Hidden)
VALUES
('$UserID', '0')
ON DUPLICATE KEY UPDATE
Hidden = '0'");
G::$DB->set_query_id($QueryID);
}
public static function is_visible($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Hidden
FROM users_donor_ranks
WHERE Hidden = '0'
AND UserID = '$UserID'");
$HasResults = G::$DB->has_results();
G::$DB->set_query_id($QueryID);
return $HasResults;
}
public static function has_donor_forum($UserID) {
return self::get_rank($UserID) >= DONOR_FORUM_RANK || self::get_special_rank($UserID) >= MAX_SPECIAL_RANK;
}
public static function is_mod($UserID) {
$Permissions = Permissions::get_permissions_for_user($UserID);
return $Permissions['users_mod'];
}
public static function get_rank($UserID) {
$Rank = G::$Cache->get_value("donor_rank_$UserID");
if ($Rank === false) {
if (self::is_mod($UserID)) {
$Rank = MAX_EXTRA_RANK;
} else {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Rank
FROM users_donor_ranks
WHERE UserID = '$UserID'");
list($Rank) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
}
G::$Cache->cache_value("donor_rank_$UserID", $Rank, 0);
}
return $Rank;
}
public static function get_special_rank($UserID) {
$SpecialRank = G::$Cache->get_value("donor_special_rank_$UserID");
if ($SpecialRank === false) {
if (self::is_mod($UserID)) {
$SpecialRank = MAX_SPECIAL_RANK;
} else {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT SpecialRank
FROM users_donor_ranks
WHERE UserID = '$UserID'");
list($SpecialRank) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
}
G::$Cache->cache_value("donor_special_rank_$UserID", $SpecialRank, 0);
}
return $SpecialRank;
}
public static function get_total_rank($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT TotalRank
FROM users_donor_ranks
WHERE UserID = '$UserID'");
list($Rank) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
return $Rank;
}
public static function get_donation_time($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT DonationTime
FROM users_donor_ranks
WHERE UserID = '$UserID'");
list($DonationTime) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
return $DonationTime;
}
public static function get_titles($UserID) {
$Results = G::$Cache->get_value("donor_title_$UserID");
if ($Results === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Prefix, Suffix, UseComma
FROM donor_forum_usernames
WHERE UserID = '$UserID'");
$Results = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("donor_title_$UserID", $Results, 0);
}
return $Results;
}
public static function get_enabled_rewards($UserID) {
$Rewards = array();
$Rank = self::get_rank($UserID);
$SpecialRank = self::get_special_rank($UserID);
$HasAll = $SpecialRank == 3;
if ($Rank >= 1 || $HasAll) {
}
if ($Rank >= 2 || $HasAll) {
$Rewards["HasDonorIconMouseOverText"] = true;
$Rewards["HasProfileInfo1"] = true;
}
if ($Rank >= 3 || $HasAll) {
$Rewards["HasAvatarMouseOverText"] = true;
$Rewards["HasProfileInfo2"] = true;
}
if ($Rank >= 4 || $HasAll) {
$Rewards["HasDonorIconLink"] = true;
$Rewards["HasProfileInfo3"] = true;
}
if ($Rank >= MAX_RANK || $HasAll) {
$Rewards["HasCustomDonorIcon"] = true;
$Rewards["HasDonorForum"] = true;
$Rewards["HasProfileInfo4"] = true;
}
if ($SpecialRank >= 2) {
$Rewards["HasSecondAvatar"] = true;
}
return $Rewards;
}
public static function get_rewards($UserID) {
$Results = G::$Cache->get_value("donor_rewards_$UserID");
if ($Results === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
IconMouseOverText,
AvatarMouseOverText,
CustomIcon,
CustomIconLink,
SecondAvatar
FROM donor_rewards
WHERE UserID = '$UserID'");
$Results = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("donor_rewards_$UserID", $Results, 0);
}
return $Results;
}
public static function get_profile_rewards($UserID) {
$Results = G::$Cache->get_value("donor_profile_rewards_$UserID");
if ($Results === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ProfileInfo1,
ProfileInfoTitle1,
ProfileInfo2,
ProfileInfoTitle2,
ProfileInfo3,
ProfileInfoTitle3,
ProfileInfo4,
ProfileInfoTitle4
FROM donor_rewards
WHERE UserID = '$UserID'");
$Results = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("donor_profile_rewards_$UserID", $Results, 0);
}
return $Results;
}
private static function add_profile_info_reward($Counter, &$Insert, &$Values, &$Update) {
if (isset($_POST["profile_title_" . $Counter]) && isset($_POST["profile_info_" . $Counter])) {
$ProfileTitle = db_string($_POST["profile_title_" . $Counter]);
$ProfileInfo = db_string($_POST["profile_info_" . $Counter]);
$ProfileInfoTitleSQL = "ProfileInfoTitle" . $Counter;
$ProfileInfoSQL = "ProfileInfo" . $Counter;
$Insert[] = "$ProfileInfoTitleSQL";
$Values[] = "'$ProfileInfoTitle'";
$Update[] = "$ProfileInfoTitleSQL = '$ProfileTitle'";
$Insert[] = "$ProfileInfoSQL";
$Values[] = "'$ProfileInfo'";
$Update[] = "$ProfileInfoSQL = '$ProfileInfo'";
}
}
public static function update_rewards($UserID) {
$Rank = self::get_rank($UserID);
$SpecialRank = self::get_special_rank($UserID);
$HasAll = $SpecialRank == 3;
$Counter = 0;
$Insert = array();
$Values = array();
$Update = array();
$Insert[] = "UserID";
$Values[] = "'$UserID'";
if ($Rank >= 1 || $HasAll) {
}
if ($Rank >= 2 || $HasAll) {
if (isset($_POST['donor_icon_mouse_over_text'])) {
$IconMouseOverText = db_string($_POST['donor_icon_mouse_over_text']);
$Insert[] = "IconMouseOverText";
$Values[] = "'$IconMouseOverText'";
$Update[] = "IconMouseOverText = '$IconMouseOverText'";
}
$Counter++;
}
if ($Rank >= 3 || $HasAll) {
if (isset($_POST['avatar_mouse_over_text'])) {
$AvatarMouseOverText = db_string($_POST['avatar_mouse_over_text']);
$Insert[] = "AvatarMouseOverText";
$Values[] = "'$AvatarMouseOverText'";
$Update[] = "AvatarMouseOverText = '$AvatarMouseOverText'";
}
$Counter++;
}
if ($Rank >= 4 || $HasAll) {
if (isset($_POST['donor_icon_link'])) {
$CustomIconLink = db_string($_POST['donor_icon_link']);
if (!Misc::is_valid_url($CustomIconLink)) {
$CustomIconLink = '';
}
$Insert[] = "CustomIconLink";
$Values[] = "'$CustomIconLink'";
$Update[] = "CustomIconLink = '$CustomIconLink'";
}
$Counter++;
}
if ($Rank >= MAX_RANK || $HasAll) {
if (isset($_POST['donor_icon_custom_url'])) {
$CustomIcon = db_string($_POST['donor_icon_custom_url']);
if (!Misc::is_valid_url($CustomIcon)) {
$CustomIcon = '';
}
$Insert[] = "CustomIcon";
$Values[] = "'$CustomIcon'";
$Update[] = "CustomIcon = '$CustomIcon'";
}
self::update_titles($UserID, $_POST['donor_title_prefix'], $_POST['donor_title_suffix'], $_POST['donor_title_comma']);
$Counter++;
}
for ($i = 1; $i <= $Counter; $i++) {
self::add_profile_info_reward($i, $Insert, $Values, $Update);
}
if ($SpecialRank >= 2) {
if (isset($_POST['second_avatar'])) {
$SecondAvatar = db_string($_POST['second_avatar']);
if (!Misc::is_valid_url($SecondAvatar)) {
$SecondAvatar = '';
}
$Insert[] = "SecondAvatar";
$Values[] = "'$SecondAvatar'";
$Update[] = "SecondAvatar = '$SecondAvatar'";
}
}
$Insert = implode(', ', $Insert);
$Values = implode(', ', $Values);
$Update = implode(', ', $Update);
if ($Counter > 0) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO donor_rewards
($Insert)
VALUES
($Values)
ON DUPLICATE KEY UPDATE
$Update");
G::$DB->set_query_id($QueryID);
}
G::$Cache->delete_value("donor_profile_rewards_$UserID");
G::$Cache->delete_value("donor_rewards_$UserID");
}
public static function update_titles($UserID, $Prefix, $Suffix, $UseComma) {
$QueryID = G::$DB->get_query_id();
$Prefix = trim(db_string($Prefix));
$Suffix = trim(db_string($Suffix));
$UseComma = empty($UseComma) ? true : false;
G::$DB->query("
INSERT INTO donor_forum_usernames
(UserID, Prefix, Suffix, UseComma)
VALUES
('$UserID', '$Prefix', '$Suffix', '$UseComma')
ON DUPLICATE KEY UPDATE
Prefix = '$Prefix',
Suffix = '$Suffix',
UseComma = '$UseComma'");
G::$Cache->delete_value("donor_title_$UserID");
G::$DB->set_query_id($QueryID);
}
public static function get_donation_history($UserID) {
$UserID = (int) $UserID;
if (empty($UserID)) {
error(404);
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Amount, Email, Time, Currency, Reason, Source, AddedBy, Rank, TotalRank
FROM donations
WHERE UserID = '$UserID'
ORDER BY Time DESC");
$DonationHistory = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
return $DonationHistory;
}
public static function get_rank_expiration($UserID) {
$UserID = (int) $UserID;
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT Rank, SpecialRank, (DonationTime + INTERVAL 32 DAY) AS Expiration FROM users_donor_ranks WHERE UserID = '$UserID'");
$Return = "";
if (G::$DB->has_results()) {
list($Rank, $SpecialRank, $Expiration) = G::$DB->next_record();
$Expiration = time_diff($Expiration);
if ($Expiration != "Never") {
$Expiration = "in " . $Expiration;
}
$Return = $SpecialRank == MAX_SPECIAL_RANK || $Rank == 1 ? "Never" : $Expiration;
}
G::$DB->set_query_id($QueryID);
return $Return;
}
public static function get_leaderboard_position($UserID) {
$UserID = (int) $UserID;
$QueryID = G::$DB->get_query_id();
G::$DB->query("SET @RowNum := 0");
G::$DB->query("SELECT Position FROM (SELECT d.UserID, @RowNum := @RowNum + 1 AS Position FROM users_donor_ranks d ORDER BY TotalRank DESC) l WHERE UserID = '$UserID'");
if (G::$DB->has_results()) {
list($Position) = G::$DB->next_record();
} else {
$Position = 0;
}
G::$DB->set_query_id($QueryID);
return $Position;
}
public static function is_donor($UserID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT 1 FROM users_donor_ranks WHERE UserID = '$UserID'");
$HasResults = G::$DB->has_results();
G::$DB->set_query_id($QueryID);
return $HasResults;
}
public static function currency_exchange($Amount, $Currency) {
if (!self::is_valid_currency($Currency)) {
error("$Currency is not valid currency");
}
switch ($Currency) {
case 'USD':
$Amount = self::usd_to_euro($Amount);
break;
case 'BTC':
$Amount = self::btc_to_euro($Amount);
break;
default:
break;
}
return round($Amount, 2);
}
public static function is_valid_currency($Currency) {
return $Currency == 'EUR' || $Currency == 'BTC' || $Currency == 'USD';
}
public static function btc_to_euro($Amount) {
$Rate = G::$Cache->get_value('btc_rate');
if (empty($Rate)) {
if ($Response = file_get_contents(BTC_API_URL)) {
$Response = json_decode($Response, true);
if (isset($Response['EUR'])) {
$Rate = round($Response['EUR']['24h'], 4); // We don't need good precision
self::set_stored_conversion_rate('BTC', $Rate);
$CacheTime = 86400; // Cache fresh value for 24 hours;
}
}
if (empty($Rate)) {
$Rate = self::get_stored_conversion_rate('BTC');
$CacheTime = 3600; // Cache old value for 1 hour;
}
G::$Cache->cache_value('btc_rate', $Rate, $CacheTime);
}
return $Rate * $Amount;
}
public static function usd_to_euro($Amount) {
$Rate = G::$Cache->get_value('usd_rate');
if (empty($Rate)) {
if ($Response = file_get_contents(USD_API_URL)) {
// Valid JSON isn't returned so we make it valid.
$Replace = array(
'lhs' => '"lhs"',
'rhs' => '"rhs"',
'error' => '"error"',
'icc' => '"icc"'
);
$Response = str_replace(array_keys($Replace), array_values($Replace), $Response);
$Response = json_decode($Response, true);
if (isset($Response['rhs'])) {
// The response is in format "# Euroes", extracts the numbers.
$Rate = preg_split("/[\s,]+/", $Response['rhs']);
$Rate = round($Rate[0], 4); // We don't need good precision
self::set_stored_conversion_rate('USD', $Rate);
$CacheTime = 86400; // Cache fresh value for 24 hours;
}
}
if (empty($Rate)) {
$Rate = self::get_stored_conversion_rate('USD');
$CacheTime = 3600; // Cache old value for 1 hour;
}
G::$Cache->cache_value('usd_rate', $Rate, $CacheTime);
}
return $Rate * $Amount;
}
public static function get_stored_conversion_rate($Currency) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Rate
FROM currency_conversion_rates
WHERE Currency = '$Currency'");
list($Rate) = G::$DB->next_record(MYSQLI_NUM, false);
G::$DB->set_query_id($QueryID);
return $Rate;
}
private static function set_stored_conversion_rate($Currency, $Rate) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
REPLACE INTO currency_conversion_rates
(Currency, Rate, Time)
VALUES
('$Currency', $Rate, NOW())");
G::$DB->set_query_id($QueryID);
}
public static function get_forum_description() {
return self::$ForumDescriptions[rand(0, count(self::$ForumDescriptions) - 1)];
}
private static function get_pm_body($Source, $Currency, $DonationAmount, $ReceivedRank, $CurrentRank) {
if ($Source == 'Store Parser') {
$String = "[*][b]You Purchased:[/b] $DonationAmount $Currency";
} else {
$String = "[*][b]You Donated:[/b] $DonationAmount $Currency";
}
return 'Thank you for your generosity and support. It\'s users like you who make all of this possible. What follows is a brief description of your transaction:
' . $String . '
[*][b]You Received:[/b] ' . $ReceivedRank . ' Donor Point' . ($ReceivedRank == 1 ? '' : 's') . '
[*][b]Your Donor Rank:[/b] Donor Rank # ' . $CurrentRank . '
Once again, thank you for your continued support of the site.
Sincerely,
'.SITE_NAME.' Staff
[align=center][If you have any questions or concerns, please [url=https://'.SSL_SITE_URL.'/staffpm.php]send a Staff PM[/url].]';
}
private static function get_special_rank_one_pm() {
return 'Congratulations on reaching [url=https://'.SSL_SITE_URL.'/staffpm.php]Special Rank #1[/url]! You\'ve been awarded [b]one user pick[/b]! This user pick will be featured on the '.SITE_NAME.' front page during an upcoming event. After you submit your pick, there is no guarantee as to how long it will take before your pick is featured. Picks will be featured on a first-submitted, first-served basis. Please abide by the following guidelines when making your selection:
[*]Pick something that hasn\'t been chosen. You can tell if a pick has been used previously by looking at the collages it\'s in.
[*]Complete the enclosed form carefully and completely.
[*]Send a [url=https://'.SSL_SITE_URL.'/forums.php?action=viewthread&threadid=178640&postid=4839790#post4839790]Staff PM[/url] with the completed form. Title this PM "Special Rank User Pick".
[important][align=center]**The following form must be used. Do not edit the BBCode. Send a Staff PM with the completed form.**[/align][/important]
[quote][plain]FRONT PAGE:------------------------------------------------------------------------------------------------------------------------------------------
[b][size=5][user]<NAME>[/user]\'s Special Donor Pick[/size][/b]
[b]Artist Name - Album Title[/b]
[b]Genre:[/b] Alternative, Rock, Grunge
[b]Torrents:[/b] Link Goes Here
[b]Review:[/b] [quote]Review Here (Limit: 1 Paragraph)[/quote]
FORUM POST:------------------------------------------------------------------------------------------------------------------------------------------
[b][size=5][user]<NAME>[/user]\'s Special Donor Pick[/size][/b]
[img=Album Cover]
[b]Artist Name - Album Title[/b]
[b]Genre:[/b] Alternative, Rock, Grunge
[b]Torrents:[/b] Link Goes Here
[b]Release Info[/b]
[u]Release Date:[/u] Date
[u]Tracks:[/u] Tracks
[u]Length:[/u] Length
[u]Label:[/u] Label
[u]Band Member Instruments[/u]
Member 1 Guitar
Member 2 Drums
[b]Track Listing:[/b]
01. Remove
02. These
03. As Is
04. Necessary
05. Track 05
06. Track 06
07. Track 07
08. Track 08
09. Track 09
10. Track 10
[b]Web site:[/b] Link
[b]Review:[/b] [quote]Review Here (No Length Limit)[/quote]
[/plain][/quote]Alternately, you may use this [url=http://pick.thehash.es/]pick generator tool[/url] to assist you in properly formatting your pick.
At this time, we\'d like to thank you for your continued support of the site. The fact that you\'ve reached this milestone is testament to your belief in '.SITE_NAME.' as a project. It\'s dedicated users like you that keep us alive. We look forward to featuring your pick in an upcoming announcement.
Sincerely,
'.SITE_NAME.' Staff';
}
private static function get_special_rank_two_pm() {
return 'Congratulations on reaching [url=https://'.SSL_SITE_URL.'/forums.php?action=viewthread&threadid=178640&postid=4839790#post4839790]Special Rank #2[/url]! You\'ve been awarded [b]double avatar functionality[/b]! To set a second avatar, please enter a URL leading to a valid image in the new field which has been unlocked in your [b]Personal Settings[/b]. Any avatar you choose must abide by normal avatar rules. When running your cursor over your avatar, it will flip to the alternate choice you\'ve established. Other users will also be able to view both of your avatars using this method.
At this time, we\'d like to thank you for your continued support of the site. The fact that you\'ve reached this milestone is testament to your belief in '.SITE_NAME.' as a project. It\'s dedicated users like you that keep us alive. Have fun with the new toy.
Sincerely,
'.SITE_NAME.' Staff';
}
private static function get_special_rank_three_pm() {
return 'Congratulations on reaching [url=https://'.SSL_SITE_URL.'/forums.php?action=viewthread&threadid=178640&postid=4839790#post4839790]Special Rank #3[/url]! You\'ve been awarded [b]Diamond Rank[/b]! Diamond Rank grants you the benefits associated with every Donor Rank up to and including Gold ([url=https://'.SSL_SITE_URL.'/forums.php?action=viewthread&threadid=178640&postid=4839789#post4839789]Donor Rank #5[/url]). But unlike Donor Rank #5 - because Diamond Rank is a Special Rank - it will never expire.
At this time, we\'d like to thank you for your continued support of the site. The fact that you\'ve reached this milestone is testament to your belief in '.SITE_NAME.' as a project. It\'s dedicated users like you that keep us alive. Consider yourself one of our top supporters!
Sincerely,
'.SITE_NAME.' Staff';
}
}

View File

@ -0,0 +1,186 @@
<?
class DonationsBitcoin {
/**
* Ask bitcoind for a list of all addresses that have received bitcoins
*
* @return array (BitcoinAddress => Amount, ...)
*/
public static function get_received() {
if (defined('BITCOIN_RPC_URL')) {
$Donations = BitcoinRpc::listreceivedbyaddress();
}
if (empty($Donations)) {
return array();
}
$BTCUsers = array();
foreach ($Donations as $Account) {
$BTCUsers[$Account->address] = $Account->amount;
}
return $BTCUsers;
}
/**
* Ask bitcoind for the current account balance
*
* @return float balance
*/
public static function get_balance() {
if (defined('BITCOIN_RPC_URL')) {
return BitcoinRpc::getbalance();
}
}
/**
* Get a user's existing bitcoin address or generate a new one
*
* @param int $UserID
* @param bool $GenAddress whether to create a new address if it doesn't exist
* @return false if no address exists and $GenAddress is false
* string bitcoin address otherwise
*/
public static function get_address($UserID, $GenAddress = false) {
$UserID = (int)$UserID;
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT BitcoinAddress
FROM users_info
WHERE UserID = '$UserID'");
list($Addr) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
if (!empty($Addr)) {
return $Addr;
} elseif ($GenAddress) {
if (defined('BITCOIN_RPC_URL')) {
$NewAddr = BitcoinRpc::getnewaddress();
}
if (empty($NewAddr)) {
error(0);
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE users_info
SET BitcoinAddress = '".db_string($NewAddr)."'
WHERE UserID = '$UserID'
AND BitcoinAddress IS NULL");
G::$DB->set_query_id($QueryID);
return $NewAddr;
} else {
return false;
}
}
/**
* Ask bitcoind for the total amount of bitcoins received
*
* @return float amount
*/
public static function get_total_received() {
if (defined('BITCOIN_RPC_URL')) {
$Accounts = BitcoinRpc::listreceivedbyaccount();
}
if (empty($Accounts)) {
return 0.0;
}
foreach ($Accounts as $Account) {
if ($Account->account == '') {
return $Account->amount;
}
}
return 0.0;
}
/**
* Translate bitcoin addresses to user IDs
*
* @param array $Addresses list of bitcoin addresses
* @return array (BitcoinAddress => UserID, ...)
*/
public static function get_userids($Addresses) {
if (!is_array($Addresses) || empty($Addresses)) {
return false;
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT BitcoinAddress, UserID
FROM users_info
WHERE BitcoinAddress IN ('" . implode("', '", $Addresses) . "')");
if (G::$DB->has_results()) {
$UserIDs = G::$DB->to_pair(0, 1);
} else {
$UserIDs = array();
}
G::$DB->set_query_id($QueryID);
return $UserIDs;
}
/**
* Find and process new donations since the last time this function was called.
*/
public static function find_new_donations() {
global $Debug;
if (($OldAmount = G::$Cache->get_value('btc_total_received')) === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT IFNULL(SUM(Amount), 0)
FROM donations_bitcoin");
list($OldAmount) = G::$DB->next_record(MYSQLI_NUM, false);
G::$DB->set_query_id($QueryID);
}
$NewAmount = self::get_total_received();
if ($NewAmount < $OldAmount) {
// This shouldn't happen. Perhaps bitcoind was restarted recently
// or the block index was removed. Either way, try again later
send_irc('PRIVMSG ' . LAB_CHAN . " :Bad bitcoin donation data (is $NewAmount, was $OldAmount). If this persists, something is probably wrong");
return false;
}
if ($NewAmount > $OldAmount) {
// I really wish we didn't have to do it like this
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT BitcoinAddress, SUM(Amount)
FROM donations_bitcoin
GROUP BY BitcoinAddress");
$OldDonations = G::$DB->to_pair(0, 1, false);
G::$DB->set_query_id($QueryID);
$NewDonations = self::get_received();
foreach ($NewDonations as $Address => &$Amount) {
if (isset($OldDonations[$Address])) {
if ($Amount == $OldDonations[$Address]) { // Direct comparison should be fine as everything comes from bitcoind
unset($NewDonations[$Address]);
continue;
}
$Debug->log_var(array('old' => $OldDonations[$Address], 'new' => $Amount), "New donations from $Address");
// PHP doesn't do fixed-point math, and json_decode has already botched the precision
// so let's just round this off to satoshis and pray that we're on a 64 bit system
$Amount = round($Amount - $OldDonations[$Address], 8);
}
$NewDonations[$Address] = $Amount;
}
$Debug->log_var($NewDonations, '$NewDonations');
foreach (self::get_userids(array_keys($NewDonations)) as $Address => $UserID) {
Donations::regular_donate($UserID, $NewDonations[$Address], 'Bitcoin Parser', '', 'BTC');
self::store_donation($Address, $NewDonations[$Address]);
}
G::$Cache->cache_value('btc_total_received', $NewAmount, 0);
}
}
/**
* Record a donation in the database
*
* @param string $Address bitcoin address
* @param double $Amount amount of bitcoins transferred
*/
public static function store_donation($Address, $Amount) {
if (!is_numeric($Amount) || $Amount <= 0) {
// Panic!
return false;
}
G::$DB->query("
INSERT INTO donations_bitcoin
(BitcoinAddress, Amount)
VALUES
('$Address', $Amount)");
}
}

View File

@ -0,0 +1,212 @@
<?
class DonationsView {
public static function render_mod_donations($UserID) { ?>
<table class="layout" id="donation_box">
<tr class="colhead">
<td colspan="2">
<a href="#donor_ranks" class="brackets anchor">#</a> Donor System (add points)
</td>
</tr>
<tr>
<td class="label">Value</td>
<td>
<input type="text" name="donation_value" onkeypress="return isNumberKey(event);" />
<select name="donation_currency">
<option value="EUR">EUR</option>
<option value="USD">USD</option>
<option value="BTC">BTC</option>
</select>
</td>
</tr>
<tr>
<td class="label">Reason</td>
<td><input type="text" class="wide_input_text" name="donation_reason" /></td>
</tr>
<tr>
<td align="right" colspan="2">
<input type="submit" name="donor_points_submit" value="Add donor points" />
</td>
</tr>
</table>
<table class="layout" id="donor_points_box">
<tr class="colhead">
<td colspan="3" class="tooltip" title='Use this tool only when manually correcting values. If crediting donations normally, use the "Donor System (add points)" tool'>
<a href="#donor_points" class="brackets anchor">#</a> Donor System (modify values)
</td>
</tr>
<tr>
<td class="label tooltip" title="Active points determine a user's Donor Rank and do expire.">Active points</td>
<td><input type="text" name="donor_rank" onkeypress="return isNumberKey(event);" value="<?=Donations::get_rank($UserID)?>" /></td>
</tr>
<tr>
<td class="label tooltip" title="Total points represent a user's overall total and never expire. Total points determines a user's Special Rank and Donor Leaderboard placement.">Total points</td>
<td><input type="text" name="total_donor_rank" onkeypress="return isNumberKey(event);" value="<?=Donations::get_total_rank($UserID)?>" /></td>
</tr>
<tr>
<td class="label">Reason</td>
<td><input type="text" class="wide_input_text" name="reason" /></td>
</tr>
<tr>
<td align="right" colspan="2">
<input type="submit" name="donor_values_submit" value="Change point values" />
</td>
</tr>
</table>
<?
}
public static function render_donor_stats($UserID) {
$OwnProfile = G::$LoggedUser['ID'] == $UserID;
if (check_perms("users_mod") || $OwnProfile || Donations::is_visible($UserID)) { ?>
<div class="box box_info box_userinfo_donor_stats">
<div class="head colhead_dark">Donor Statistics</div>
<ul class="stats nobullet">
<?
if (Donations::is_donor($UserID)) {
if (check_perms('users_mod') || $OwnProfile) { ?>
<li>
Total donor points: <?=Donations::get_total_rank($UserID)?>
</li>
<? } ?>
<li>
Current donor rank: <?=self::render_rank(Donations::get_rank($UserID), Donations::get_special_rank($UserID), true)?>
</li>
<li>
Leaderboard position: <?=Donations::get_leaderboard_position($UserID)?>
</li>
<li>
Last donated: <?=time_diff(Donations::get_donation_time($UserID))?>
</li>
<li>
Rank expires: <?=(Donations::get_rank_expiration($UserID))?>
</li>
<? } else { ?>
<li>
This user hasn't donated.
</li>
<? } ?>
</ul>
</div>
<?
}
}
public static function render_profile_rewards($EnabledRewards, $ProfileRewards) {
$Text = new Text;
for ($i = 1; $i <= 4; $i++) {
if (isset($EnabledRewards['HasProfileInfo' . $i]) && $ProfileRewards['ProfileInfo' . $i]) { ?>
<div class="box">
<div class="head" style="height: 13px;">
<span style="float: left;"><?=!empty($ProfileRewards['ProfileInfoTitle' . $i]) ? display_str($ProfileRewards['ProfileInfoTitle' . $i]) : "Extra Profile " . ($i + 1)?></span>
<span style="float: right;"><a href="#" onclick="$('#profilediv_<?=$i?>').gtoggle(); this.innerHTML = (this.innerHTML == 'Hide' ? 'Show' : 'Hide'); return false;" class="brackets">Hide</a></span>
</div>
<div class="pad" id="profilediv_<?=$i?>">
<? echo $Text->full_format($ProfileRewards['ProfileInfo' . $i]); ?>
</div>
</div>
<?
}
}
}
public static function render_donation_history($DonationHistory) {
if (empty($DonationHistory)) {
return;
}
?>
<div class="box box2" id="donation_history_box">
<div class="head">
<a href="#donation_history_box" class="brackets anchor">#</a> Donation History <a href="#" onclick="$('#donation_history').gtoggle(); return false;" class="brackets">View</a>
</div>
<? $Row = 'b'; ?>
<div class="hidden" id="donation_history">
<table cellpadding="6" cellspacing="1" border="0" class="border" width="100%">
<tbody>
<tr class="colhead_dark">
<td>
<strong>Source</strong>
</td>
<td>
<strong>Date</strong>
</td>
<td>
<strong>Amount (EUR)</strong>
</td>
<td>
<strong>Added Points</strong>
</td>
<td>
<strong>Total Points</strong>
</td>
<td>
<strong>Email</strong>
</td>
<td style="width: 30%;">
<strong>Reason</strong>
</td>
</tr>
<? foreach ($DonationHistory as $Donation) { ?>
<tr class="row<?=$Row?>">
<td>
<?=$Donation['Source']?> (<?=Users::format_username($Donation['AddedBy'])?>)
</td>
<td>
<?=$Donation['Time']?>
</td>
<td>
<?=$Donation['Amount']?>
</td>
<td>
<?=$Donation['Rank']?>
</td>
<td>
<?=$Donation['TotalRank']?>
</td>
<td>
<?=$Donation['Email']?>
</td>
<td>
<?=$Donation['Reason']?>
</td>
</tr>
<?
$Row = $Row == 'b' ? 'a' : 'b';
} ?>
</tbody>
</table>
</div>
</div>
<?
}
public static function render_rank($Rank, $SpecialRank, $ShowOverflow = false) {
if ($SpecialRank == 3) {
$Display = '∞ [Diamond]';
} else {
$CurrentRank = $Rank >= MAX_RANK ? MAX_RANK : $Rank;
$Overflow = $Rank - $CurrentRank;
$Display = $CurrentRank;
if ($Display == 5 || $Display == 6) {
$Display--;
}
if ($ShowOverflow && $Overflow) {
$Display .= " (+$Overflow)";
}
if ($Rank >= 6) {
$Display .= ' [Gold]';
} elseif ($Rank >= 4) {
$Display .= ' [Silver]';
} elseif ($Rank >= 3) {
$Display .= ' [Bronze]';
} elseif ($Rank >= 2) {
$Display .= ' [Copper]';
} elseif ($Rank >= 1) {
$Display .= ' [Red]';
}
}
echo $Display;
}
}

View File

@ -53,6 +53,7 @@ public static function cut_string($Str, $Length, $Hard = false, $ShowDots = true
$CutDesc = implode(' ', $DescArr);
}
if ($ShowDots) {
//TODO: should we replace the three dots with an ellipsis character?
$CutDesc .= '...';
}
} else {
@ -123,7 +124,7 @@ public static function get_ratio_html($Dividend, $Divisor, $Color = true) {
* Returns ratio
* @param int $Dividend
* @param int $Divisor
* @param int $Decimal floor to n decimals (e.g. Subtract .005 to floor to 2 decimals)
* @param int $Decimal floor to n decimals (e.g. subtract .005 to floor to 2 decimals)
* @return boolean|string
*/
public function get_ratio ($Dividend, $Divisor, $Decimal = 2) {
@ -170,7 +171,7 @@ public static function get_url($Exclude = false) {
* @param $DefaultResult Optional, which result's page we want if no page is specified
* If this parameter is not specified, we will default to page 1
*
* @return array(int,string) What page we are on, and what to use in the LIMIT section of a query
* @return array(int, string) What page we are on, and what to use in the LIMIT section of a query
* e.g. "SELECT [...] LIMIT $Limit;"
*/
public static function page_limit($PerPage, $DefaultResult = 1) {
@ -188,7 +189,7 @@ public static function page_limit($PerPage, $DefaultResult = 1) {
if ($Page <= 0) {
$Page = 1;
}
$Limit = $PerPage * $Page - $PerPage . ', ' . $PerPage;
$Limit = $PerPage * $Page - $PerPage . ", $PerPage";
}
return array($Page, $Limit);
}
@ -196,8 +197,8 @@ public static function page_limit($PerPage, $DefaultResult = 1) {
// A9 magic. Some other poor soul can write the phpdoc.
// For data stored in memcached catalogues (giant arrays), e.g. forum threads
public static function catalogue_limit($Page, $PerPage, $CatalogueSize = 500) {
$CatalogueID = floor(($PerPage * $Page - $PerPage) / $CatalogueSize);;
$CatalogueLimit = ($CatalogueID * $CatalogueSize).', '.$CatalogueSize;
$CatalogueID = floor(($PerPage * $Page - $PerPage) / $CatalogueSize);
$CatalogueLimit = ($CatalogueID * $CatalogueSize).", $CatalogueSize";
return array($CatalogueID, $CatalogueLimit);
}
@ -224,7 +225,7 @@ public static function catalogue_select($Catalogue, $Page, $PerPage, $CatalogueS
*/
public static function get_pages($StartPage, $TotalRecords, $ItemsPerPage, $ShowPages = 11, $Anchor = '') {
global $Document, $Method, $Mobile;
$Location = $Document.'.php';
$Location = "$Document.php";
$StartPage = ceil($StartPage);
$TotalPages = 0;
if ($TotalRecords > 0) {
@ -253,37 +254,37 @@ public static function get_pages($StartPage, $TotalRecords, $ItemsPerPage, $Show
$StartPosition = max($StartPosition, 1);
$QueryString = self::get_url(array('page','post'));
$QueryString = self::get_url(array('page', 'post'));
if ($QueryString != '') {
$QueryString = '&amp;'.$QueryString;
$QueryString = "&amp;$QueryString";
}
$Pages = '';
if ($StartPage > 1) {
$Pages .= '<a href="'.$Location.'?page=1'.$QueryString.$Anchor.'"><strong>&lt;&lt; First</strong></a> ';
$Pages .= '<a href="'.$Location.'?page='.($StartPage - 1).$QueryString.$Anchor.'" class="pager_prev"><strong>&lt; Prev</strong></a> | ';
$Pages .= "<a href=\"$Location?page=1$QueryString$Anchor\"><strong>&lt;&lt; First</strong></a> ";
$Pages .= "<a href=\"$Location?page=".($StartPage - 1).$QueryString.$Anchor.'" class="pager_prev"><strong>&lt; Prev</strong></a> | ';
}
//End change
if (!$Mobile) {
for ($i = $StartPosition; $i <= $StopPage; $i++) {
if ($i != $StartPage) {
$Pages .= '<a href="'.$Location.'?page='.$i.$QueryString.$Anchor.'">';
$Pages .= "<a href=\"$Location?page=$i$QueryString$Anchor\">";
}
$Pages .= "<strong>";
$Pages .= '<strong>';
if ($i * $ItemsPerPage > $TotalRecords) {
$Pages .= ((($i - 1) * $ItemsPerPage) + 1).'-'.($TotalRecords);
$Pages .= ((($i - 1) * $ItemsPerPage) + 1)."-$TotalRecords";
} else {
$Pages .= ((($i - 1) * $ItemsPerPage) + 1).'-'.($i * $ItemsPerPage);
}
$Pages .= '</strong>';
if ($i != $StartPage) {
$Pages.='</a>';
$Pages .= '</a>';
}
if ($i < $StopPage) {
$Pages.=' | ';
$Pages .= ' | ';
}
}
} else {
@ -291,8 +292,8 @@ public static function get_pages($StartPage, $TotalRecords, $ItemsPerPage, $Show
}
if ($StartPage && $StartPage < $TotalPages) {
$Pages .= ' | <a href="'.$Location.'?page='.($StartPage + 1).$QueryString.$Anchor.'" class="pager_next"><strong>Next &gt;</strong></a> ';
$Pages .= '<a href="'.$Location.'?page='.$TotalPages.$QueryString.$Anchor.'"><strong> Last &gt;&gt;</strong></a>';
$Pages .= " | <a href=\"$Location?page=".($StartPage + 1).$QueryString.$Anchor.'" class="pager_next"><strong>Next &gt;</strong></a> ';
$Pages .= "<a href=\"$Location?page=$TotalPages$QueryString$Anchor\"><strong> Last &gt;&gt;</strong></a>";
}
}
if ($TotalPages > 1) {
@ -303,14 +304,16 @@ public static function get_pages($StartPage, $TotalRecords, $ItemsPerPage, $Show
/**
* Format a size in bytes as a human readable string in KiB/MiB/...
* Note: KiB, MiB, etc. are the IEC units, which are in base 2.
* KB, MB are the SI units, which are in base 10.
*
* @param int $Size
* @param int $Levels Number of decimal places. Defaults to 2, unless the size >= 1TB, in which case it defaults to 4.
* @return string formatted number.
*/
public static function get_size($Size, $Levels = 2) {
$Units = array(' B',' KB',' MB',' GB',' TB',' PB',' EB',' ZB',' YB');
$Size = (double) $Size;
$Units = array(' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB');
$Size = (double)$Size;
for ($Steps = 0; abs($Size) >= 1024; $Size /= 1024, $Steps++) {
}
if (func_num_args() == 1 && $Steps >= 4) {
@ -334,13 +337,13 @@ public static function human_format($Number) {
}
switch ($Steps) {
case 0: return round($Number); break;
case 1: return round($Number,2).'k'; break;
case 2: return round($Number,2).'M'; break;
case 3: return round($Number,2).'G'; break;
case 4: return round($Number,2).'T'; break;
case 5: return round($Number,2).'P'; break;
case 1: return round($Number, 2).'k'; break;
case 2: return round($Number, 2).'M'; break;
case 3: return round($Number, 2).'G'; break;
case 4: return round($Number, 2).'T'; break;
case 5: return round($Number, 2).'P'; break;
default:
return round($Number,2).'E + '.$Steps*3;
return round($Number, 2).'E + '.$Steps * 3;
}
}
@ -413,7 +416,7 @@ public static function selected($Name, $Value, $Attribute = 'selected', $Array =
}
if (isset($Array[$Name]) && $Array[$Name] !== '') {
if ($Array[$Name] == $Value) {
echo ' '.$Attribute.'="'.$Attribute.'"';
echo " $Attribute=\"$Attribute\"";
}
}
}
@ -428,13 +431,12 @@ public static function selected($Name, $Value, $Attribute = 'selected', $Array =
* 2-dimensional array: At least one array must be identical to $Target
* @param string $ClassName CSS class name to return
* @param bool $AddAttribute Whether to include the "class" attribute in the output
* @param string $UserIDKey Key in _REQUEST for a user id parameter, which if given will be compared to $LoggedUser[ID]
* @param string $UserIDKey Key in _REQUEST for a user ID parameter, which if given will be compared to G::$LoggedUser[ID]
*
* @return class name on match, otherwise an empty string
*/
public static function add_class($Target, $Tests, $ClassName, $AddAttribute, $UserIDKey = false) {
global $LoggedUser;
if ($UserIDKey && isset($_REQUEST[$UserIDKey]) && $LoggedUser['ID'] != $_REQUEST[$UserIDKey]) {
if ($UserIDKey && isset($_REQUEST[$UserIDKey]) && G::$LoggedUser['ID'] != $_REQUEST[$UserIDKey]) {
return '';
}
$Pass = true;
@ -469,7 +471,7 @@ public static function add_class($Target, $Tests, $ClassName, $AddAttribute, $Us
return '';
}
if ($AddAttribute) {
return ' class="'.$ClassName.'"';
return " class=\"$ClassName\"";
}
return " $ClassName";
}
@ -508,14 +510,14 @@ public static function make_utf8($Str) {
*/
public static function is_utf8($Str) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] // ASCII
| [\xC2-\xDF][\x80-\xBF] // non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] // excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} // straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] // excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} // planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} // planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} // plane 16
[\x09\x0A\x0D\x20-\x7E] // ASCII
| [\xC2-\xDF][\x80-\xBF] // non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] // excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} // straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] // excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} // planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} // planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} // plane 16
)*$%xs', $Str
);
}

View File

@ -1,71 +1,286 @@
<?
class Forums {
/**
* @param string $Body
* @param int $PostID
* @param string $Page
* @param int $PageID
* Get information on a thread.
*
* @param int $ThreadID
* the thread ID.
* @param boolean $Return
* indicates whether thread info should be returned.
* @param Boolean $SelectiveCache
* cache thread info/
* @return array holding thread information.
*/
public static function quote_notify($Body, $PostID, $Page, $PageID) {
/*
* Explanation of the parameters PageID and Page:
* Page contains where this quote comes from and can be forums, artist,
* collages, requests or torrents. The PageID contains the additional
* value that is necessary for the users_notify_quoted table.
* The PageIDs for the different Page are:
* forums: TopicID
* artist: ArtistID
* collages: CollageID
* requests: RequestID
* torrents: GroupID
*/
global $LoggedUser, $Cache, $DB;
$Matches = array();
preg_match_all('/\[quote(?:=(.*)(?:\|.*)?)?]|\[\/quote]/iU', $Body, $Matches, PREG_SET_ORDER);
if (count($Matches)) {
$Usernames = array();
$Level = 0;
foreach ($Matches as $M) {
if ($M[0] != '[/quote]') {
if ($Level == 0 && isset($M[1]) && strlen($M[1]) > 0 && preg_match(USERNAME_REGEX, $M[1])) {
$Usernames[] = preg_replace('/(^[.,]*)|([.,]*$)/', '', $M[1]); // wut?
}
++$Level;
} else {
--$Level;
}
public static function get_thread_info($ThreadID, $Return = true, $SelectiveCache = false) {
if ((!$ThreadInfo = G::$Cache->get_value('thread_' . $ThreadID . '_info')) || !isset($ThreadInfo['OP'])) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT
t.Title,
t.ForumID,
t.IsLocked,
t.IsSticky,
COUNT(fp.id) AS Posts,
t.LastPostAuthorID,
ISNULL(p.TopicID) AS NoPoll,
t.StickyPostID,
t.AuthorID as OP
FROM forums_topics AS t
JOIN forums_posts AS fp ON fp.TopicID = t.ID
LEFT JOIN forums_polls AS p ON p.TopicID=t.ID
WHERE t.ID = '$ThreadID'
GROUP BY fp.TopicID");
if (G::$DB->record_count() == 0) {
error(404);
}
$ThreadInfo = G::$DB->next_record(MYSQLI_ASSOC, false);
if ($ThreadInfo['StickyPostID']) {
$ThreadInfo['Posts']--;
G::$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'] . "'");
list ($ThreadInfo['StickyPost']) = G::$DB->to_array(false, MYSQLI_ASSOC);
}
G::$DB->set_query_id($QueryID);
if (!$SelectiveCache || !$ThreadInfo['IsLocked'] || $ThreadInfo['IsSticky']) {
G::$Cache->cache_value('thread_' . $ThreadID . '_info', $ThreadInfo, 0);
}
}
//remove any dupes in the array (the fast way)
$Usernames = array_flip(array_flip($Usernames));
$DB->query("
SELECT m.ID, p.PushService
FROM users_main AS m
LEFT JOIN users_info AS i ON i.UserID = m.ID
LEFT JOIN users_push_notifications AS p ON p.UserID = m.ID
WHERE m.Username IN ('" . implode("', '", $Usernames) . "')
AND i.NotifyOnQuote = '1'
AND i.UserID != $LoggedUser[ID]");
$Results = $DB->to_array();
foreach ($Results as $Result) {
$UserID = db_string($Result['ID']);
$PushService = $Result['PushService'];
$QuoterID = db_string($LoggedUser['ID']);
$Page = db_string($Page);
$PageID = db_string($PageID);
$PostID = db_string($PostID);
$DB->query("
INSERT IGNORE INTO users_notify_quoted
(UserID, QuoterID, Page, PageID, PostID, Date)
VALUES
('$UserID', '$QuoterID', '$Page', '$PageID', '$PostID', '" . sqltime() . "')");
$Cache->delete_value('notify_quoted_' . $UserID);
if ($Return) {
return $ThreadInfo;
}
}
/**
* Checks whether user has permissions on a forum.
*
* @param int $ForumID
* the forum ID.
* @param string $Perm
* the permissision to check, defaults to 'Read'
* @return boolean true if user has permission
*/
public static function check_forumperm($ForumID, $Perm = 'Read') {
$Forums = self::get_forums();
if (G::$LoggedUser['CustomForums'][$ForumID] == 1) {
return true;
}
if ($ForumID == DONOR_FORUM && Donations::has_donor_forum(G::$LoggedUser['ID'])) {
return true;
}
if ($Forums[$ForumID]['MinClass' . $Perm] > G::$LoggedUser['Class'] && (!isset(G::$LoggedUser['CustomForums'][$ForumID]) || G::$LoggedUser['CustomForums'][$ForumID] == 0)) {
return false;
}
if (isset(G::$LoggedUser['CustomForums'][$ForumID]) && G::$LoggedUser['CustomForums'][$ForumID] == 0) {
return false;
}
return true;
}
/**
* Gets basic info on a forum.
*
* @param int $ForumID
* the forum ID.
*/
public static function get_forum_info($ForumID) {
$Forum = G::$Cache->get_value('ForumInfo_' . $ForumID);
if (!$Forum) {
$QueryID = G::$DB->get_query_id();
G::$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 (G::$DB->record_count() == 0) {
return false;
}
// Makes an array, with $Forum['Name'], etc.
$Forum = G::$DB->next_record(MYSQLI_ASSOC);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('ForumInfo_' . $ForumID, $Forum, 86400);
}
return $Forum;
}
/**
* Get the forum categories
* @return array ForumCategoryID => Name
*/
public static function get_forum_categories() {
$ForumCats = G::$Cache->get_value('forums_categories');
if ($ForumCats === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT ID, Name FROM forums_categories");
$ForumCats = array();
while (list ($ID, $Name) = G::$DB->next_record()) {
$ForumCats[$ID] = $Name;
}
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('forums_categories', $ForumCats, 0);
}
return $ForumCats;
}
/**
* Get the forums
* @return array ForumID => (various information about the forum)
*/
public static function get_forums() {
if (!$Forums = G::$Cache->get_value('forums_list')) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
f.ID,
f.CategoryID,
f.Name,
f.Description,
f.MinClassRead AS MinClassRead,
f.MinClassWrite AS MinClassWrite,
f.MinClassCreate AS MinClassCreate,
f.NumTopics,
f.NumPosts,
f.LastPostID,
f.LastPostAuthorID,
f.LastPostTopicID,
f.LastPostTime,
0 AS SpecificRules,
t.Title,
t.IsLocked AS Locked,
t.IsSticky AS Sticky
FROM forums AS f
JOIN forums_categories AS fc ON fc.ID = f.CategoryID
LEFT JOIN forums_topics as t ON t.ID = f.LastPostTopicID
GROUP BY f.ID
ORDER BY fc.Sort, fc.Name, f.CategoryID, f.Sort");
$Forums = G::$DB->to_array('ID', MYSQLI_ASSOC, false);
G::$DB->query("SELECT ForumID, ThreadID FROM forums_specific_rules");
$SpecificRules = array();
while (list($ForumID, $ThreadID) = G::$DB->next_record(MYSQLI_NUM, false)) {
$SpecificRules[$ForumID][] = $ThreadID;
}
G::$DB->set_query_id($QueryID);
foreach ($Forums as $ForumID => &$Forum) {
if (isset($SpecificRules[$ForumID])) {
$Forum['SpecificRules'] = $SpecificRules[$ForumID];
} else {
$Forum['SpecificRules'] = array();
}
}
G::$Cache->cache_value('forums_list', $Forums, 0);
}
return $Forums;
}
/**
* Get all forums that the current user has special access to ("Extra forums" in the profile)
* @return array Array of ForumIDs
*/
public static function get_permitted_forums() {
return (array)array_keys(G::$LoggedUser['CustomForums'], 1);
}
/**
* Get all forums that the current user does not have access to ("Restricted forums" in the profile)
* @return array Array of ForumIDs
*/
public static function get_restricted_forums() {
return (array)array_keys(G::$LoggedUser['CustomForums'], 0);
}
/**
* Get the last read posts for the current user
* @param array $Forums Array of forums as returned by self::get_forums()
* @return array TopicID => array(TopicID, PostID, Page) where PostID is the ID of the last read post and Page is the page on which that post is
*/
public static function get_last_read($Forums) {
if (isset(G::$LoggedUser['PostsPerPage'])) {
$PerPage = G::$LoggedUser['PostsPerPage'];
} else {
$PerPage = POSTS_PER_PAGE;
}
$TopicIDs = array();
foreach ($Forums as $Forum) {
if (!empty($Forum['LastPostTopicID'])) {
$TopicIDs[] = $Forum['LastPostTopicID'];
}
}
if (!empty($TopicIDs)) {
$QueryID = G::$DB->get_query_id();
G::$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(',', $TopicIDs) . ") AND
UserID='" . G::$LoggedUser['ID'] . "'");
$LastRead = G::$DB->to_array('TopicID', MYSQLI_ASSOC);
G::$DB->set_query_id($QueryID);
} else {
$LastRead = array();
}
return $LastRead;
}
/**
* Determine if a thread is unread
* @param bool $Locked
* @param bool $Sticky
* @param int $LastPostID
* @param array $LastRead An array as returned by self::get_last_read
* @param int $LastTopicID TopicID of the thread where the most recent post was made
* @param string $LastTime Datetime of the last post
* @return bool
*/
public static function is_unread($Locked, $Sticky, $LastPostID, $LastRead, $LastTopicID, $LastTime) {
return (!$Locked || $Sticky) && $LastPostID != 0 && ((empty($LastRead[$LastTopicID]) || $LastRead[$LastTopicID]['PostID'] < $LastPostID) && strtotime($LastTime) > G::$LoggedUser['CatchupTime']);
}
/**
* Create the part of WHERE in the sql queries used to filter forums for a
* specific user (MinClassRead, restricted and permitted forums).
* @return string
*/
public static function user_forums_sql() {
// I couldn't come up with a good name, please rename this if you can. -- Y
$RestrictedForums = self::get_restricted_forums();
$PermittedForums = self::get_permitted_forums();
if (Donations::has_donor_forum(G::$LoggedUser['ID']) && !in_array(DONOR_FORUM, $PermittedForums)) {
$PermittedForums[] = DONOR_FORUM;
}
$SQL = "((f.MinClassRead <= '" . G::$LoggedUser['Class'] . "'";
if (count($RestrictedForums)) {
$SQL .= " AND f.ID NOT IN ('" . implode("', '", $RestrictedForums) . "')";
}
$SQL .= ')';
if (count($PermittedForums)) {
$SQL .= " OR f.ID IN ('" . implode("', '", $PermittedForums) . "')";
}
$SQL .= ')';
return $SQL;
}
}

View File

@ -8,6 +8,6 @@ public static function initialize() {
global $DB, $Cache, $LoggedUser;
self::$DB = $DB;
self::$Cache = $Cache;
self::$LoggedUser = $LoggedUser;
self::$LoggedUser =& $LoggedUser;
}
}

View File

@ -9,9 +9,8 @@ class Inbox {
* @return string - the URL to a user's inbox
*/
public static function get_inbox_link($WhichBox = 'inbox') {
global $LoggedUser;
$ListFirst = $LoggedUser['ListUnreadPMsFirst'];
$ListFirst = G::$LoggedUser['ListUnreadPMsFirst'];
if ($WhichBox == 'inbox') {
if ($ListFirst) {

View File

@ -19,21 +19,22 @@ function INVITE_TREE($UserID, $Options = array()) {
}
function make_tree() {
$QueryID = G::$DB->get_query_id();
$UserID = $this->UserID;
global $DB;
?>
<div class="invitetree pad">
<?
$DB->query("
G::$DB->query("
SELECT TreePosition, TreeID, TreeLevel
FROM invite_tree
WHERE UserID = $UserID");
list($TreePosition, $TreeID, $TreeLevel) = $DB->next_record(MYSQLI_NUM, false);
list($TreePosition, $TreeID, $TreeLevel) = G::$DB->next_record(MYSQLI_NUM, false);
if (!$TreeID) {
return;
}
$DB->query("
G::$DB->query("
SELECT TreePosition
FROM invite_tree
WHERE TreeID = $TreeID
@ -41,12 +42,12 @@ function make_tree() {
AND TreePosition > $TreePosition
ORDER BY TreePosition ASC
LIMIT 1");
if ($DB->has_results()) {
list($MaxPosition) = $DB->next_record(MYSQLI_NUM, false);
if (G::$DB->has_results()) {
list($MaxPosition) = G::$DB->next_record(MYSQLI_NUM, false);
} else {
$MaxPosition = false;
}
$TreeQuery = $DB->query("
$TreeQuery = G::$DB->query("
SELECT
it.UserID,
Enabled,
@ -90,7 +91,7 @@ function make_tree() {
// We store this in an output buffer, so we can show the summary at the top without having to loop through twice
ob_start();
while (list($ID, $Enabled, $Class, $Donor, $Uploaded, $Downloaded, $Paranoia, $TreePosition, $TreeLevel) = $DB->next_record()) {
while (list($ID, $Enabled, $Class, $Donor, $Uploaded, $Downloaded, $Paranoia, $TreePosition, $TreeLevel) = G::$DB->next_record()) {
// Do stats
$Count++;
@ -146,7 +147,7 @@ function make_tree() {
?>
<? $PreviousTreeLevel = $TreeLevel;
$DB->set_query_id($TreeQuery);
G::$DB->set_query_id($TreeQuery);
}
$Tree = ob_get_clean();
@ -235,6 +236,7 @@ function make_tree() {
<?=$Tree?>
</div>
<?
G::$DB->set_query_id($QueryID);
}
}
?>

View File

@ -2,7 +2,6 @@
class IRC_DB extends DB_MYSQL {
function halt($Msg) {
global $Bot;
global $DB;
$Bot->send_to($Bot->get_channel(),'The database is currently unavailable; try again later.');
}
}
@ -135,7 +134,6 @@ protected function whois($Nick) {
This function uses blacklisted_ip, which is no longer in RC2.
You can probably find it in old RC1 code kicking aronud if you need it.
protected function ip_check($IP, $Gline = false, $Channel = BOT_REPORT_CHAN) {
global $Cache, $DB;
if (blacklisted_ip($IP)) {
$this->send_to($Channel, 'TOR IP Detected: '.$IP);
if ($Gline) {
@ -151,8 +149,7 @@ protected function ip_check($IP, $Gline = false, $Channel = BOT_REPORT_CHAN) {
}*/
protected function listen() {
global $Cache, $DB;
$Cache->InternalCache = false;
G::$Cache->InternalCache = false;
stream_set_timeout($this->Socket, 10000000000);
while ($this->State == 1) {
if ($this->Data = fgets($this->Socket, 256)) {
@ -182,20 +179,20 @@ protected function listen() {
unset($this->Identified[$Nick[1]]);
}
if (isset($this->DisabledUsers[$Nick[1]])) {
$DB->query("
G::$DB->query("
DELETE FROM disable_list
WHERE Nick = '$Nick[1]'");
$Cache->increment_value('num_disablees', -1);
G::$Cache->increment_value('num_disablees', -1);
unset($this->DisabledUsers[$Nick[1]]);
}
}
if (preg_match("/:([^!]+)![^\s]* PART ".BOT_DISABLED_CHAN.'/', $this->Data, $Nick)) {
if (isset($this->DisabledUsers[$Nick[1]])) {
$DB->query("
G::$DB->query("
DELETE FROM disable_list
WHERE Nick = '$Nick[1]'");
$Cache->increment_value('num_disablees', -1);
G::$Cache->increment_value('num_disablees', -1);
unset($this->DisabledUsers[$Nick[1]]);
}
}
@ -203,10 +200,10 @@ protected function listen() {
if (preg_match("/:([^!]+)![^\s]* KICK ".BOT_DISABLED_CHAN.'.* /', $this->Data, $Nick)) {
$Nick = explode(' ', $Nick[0]);
if (isset($this->DisabledUsers[$Nick[3]])) {
$DB->query("
G::$DB->query("
DELETE FROM disable_list
WHERE Nick = '$Nick[3]'");
$Cache->increment_value('num_disablees', -1);
G::$Cache->increment_value('num_disablees', -1);
unset($this->DisabledUsers[$Nick[3]]);
}
}
@ -232,8 +229,8 @@ protected function listen() {
$this->listener_events();
}
$DB->LinkID = false;
$DB->Queries = array();
G::$DB->LinkID = false;
G::$DB->Queries = array();
usleep(5000);
}
}

View File

@ -4,123 +4,121 @@
class LastFM {
public static function get_artist_events($ArtistID, $Artist, $Limit = 15) {
global $Cache;
$ArtistEvents = $Cache->get_value("artist_events_$ArtistID");
$ArtistEvents = G::$Cache->get_value("artist_events_$ArtistID");
if (empty($ArtistEvents)) {
$ArtistEvents = self::lastfm_request("artist.getEvents", array("artist" => $Artist, "limit" => $Limit));
$Cache->cache_value("artist_events_$ArtistID", $ArtistEvents, 432000);
G::$Cache->cache_value("artist_events_$ArtistID", $ArtistEvents, 432000);
}
return $ArtistEvents;
}
public static function get_user_info($Username) {
global $Cache;
$Response = $Cache->get_value("lastfm_user_info_$Username");
$Response = G::$Cache->get_value("lastfm_user_info_$Username");
if (empty($Response)) {
$Response = self::lastfm_request("user.getInfo", array("user" => $Username));
$Cache->cache_value("lastfm_user_info_$Username", $Response, 86400);
G::$Cache->cache_value("lastfm_user_info_$Username", $Response, 86400);
}
return $Response;
}
public static function compare_user_with($Username1, $Limit = 15) {
global $Cache, $LoggedUser, $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT username
FROM lastfm_users
WHERE ID = '$LoggedUser[ID]'");
if ($DB->has_results()) {
list($Username2) = $DB->next_record();
WHERE ID = '" . G::$LoggedUser['ID'] . "'");
if (G::$DB->has_results()) {
list($Username2) = G::$DB->next_record();
//Make sure the usernames are in the correct order to avoid dupe cache keys.
if (strcasecmp($Username1, $Username2)) {
$Temp = $Username1;
$Username1 = $Username2;
$Username2 = $Temp;
}
$Response = $Cache->get_value("lastfm_compare_$Username1" . "_$Username2");
$Response = G::$Cache->get_value("lastfm_compare_$Username1" . "_$Username2");
if (empty($Response)) {
$Response = self::lastfm_request("tasteometer.compare", array("type1" => "user", "type2" => "user", "value1" => $Username1, "value2" => $Username2, "limit" => $Limit));
$Response = json_encode($Response);
$Cache->cache_value("lastfm_compare_$Username1" . "_$Username2", $Response, 86400);
G::$Cache->cache_value("lastfm_compare_$Username1" . "_$Username2", $Response, 86400);
}
return $Response;
} else {
$Response = null;
}
G::$DB->set_query_id($QueryID);
return $Response;
}
public static function get_last_played_track($Username) {
global $Cache;
$Response = $Cache->get_value("lastfm_last_played_track_$Username");
$Response = G::$Cache->get_value("lastfm_last_played_track_$Username");
if (empty($Response)) {
$Response = self::lastfm_request("user.getRecentTracks", array("user" => $Username, "limit" => 1));
// Take the single last played track out of the response.
$Response = $Response['recenttracks']['track'];
$Response = json_encode($Response);
$Cache->cache_value("lastfm_last_played_track_$Username", $Response, 7200);
G::$Cache->cache_value("lastfm_last_played_track_$Username", $Response, 7200);
}
return $Response;
}
public static function get_top_artists($Username, $Limit = 15) {
global $Cache;
$Response = $Cache->get_value("lastfm_top_artists_$Username");
$Response = G::$Cache->get_value("lastfm_top_artists_$Username");
if (empty($Response)) {
sleep(1);
$Response = self::lastfm_request("user.getTopArtists", array("user" => $Username, "limit" => $Limit));
$Response = json_encode($Response);
$Cache->cache_value("lastfm_top_artists_$Username", $Response, 86400);
G::$Cache->cache_value("lastfm_top_artists_$Username", $Response, 86400);
}
return $Response;
}
public static function get_top_albums($Username, $Limit = 15) {
global $Cache;
$Response = $Cache->get_value("lastfm_top_albums_$Username");
$Response = G::$Cache->get_value("lastfm_top_albums_$Username");
if (empty($Response)) {
sleep(2);
$Response = self::lastfm_request("user.getTopAlbums", array("user" => $Username, "limit" => $Limit));
$Response = json_encode($Response);
$Cache->cache_value("lastfm_top_albums_$Username", $Response, 86400);
G::$Cache->cache_value("lastfm_top_albums_$Username", $Response, 86400);
}
return $Response;
}
public static function get_top_tracks($Username, $Limit = 15) {
global $Cache;
$Response = $Cache->get_value("lastfm_top_tracks_$Username");
$Response = G::$Cache->get_value("lastfm_top_tracks_$Username");
if (empty($Response)) {
sleep(3);
$Response = self::lastfm_request("user.getTopTracks", array("user" => $Username, "limit" => $Limit));
$Response = json_encode($Response);
$Cache->cache_value("lastfm_top_tracks_$Username", $Response, 86400);
G::$Cache->cache_value("lastfm_top_tracks_$Username", $Response, 86400);
}
return $Response;
}
public static function clear_cache($Username, $Uid) {
global $Cache, $LoggedUser, $DB;
$Response = $Cache->get_value("lastfm_clear_cache_$LoggedUser" . '_' . $_GET['id']);
$Response = G::$Cache->get_value('lastfm_clear_cache_' . G::$LoggedUser['ID'] . '_' . $_GET['id']);
if (empty($Response)) {
// Prevent clearing the cache on the same uid page for the next 10 minutes.
$Response = $Cache->cache_value("lastfm_clear_cache_$LoggedUser" . "_$Uid", $Username, 600);
$Cache->delete_value("lastfm_user_info_$Username");
$Cache->delete_value("lastfm_last_played_track_$Username");
$Cache->delete_value("lastfm_top_artists_$Username");
$Cache->delete_value("lastfm_top_albums_$Username");
$Cache->delete_value("lastfm_top_tracks_$Username");
$DB->query("
$Response = G::$Cache->cache_value('lastfm_clear_cache_' . G::$LoggedUser['ID'] . "_$Uid", $Username, 600);
G::$Cache->delete_value("lastfm_user_info_$Username");
G::$Cache->delete_value("lastfm_last_played_track_$Username");
G::$Cache->delete_value("lastfm_top_artists_$Username");
G::$Cache->delete_value("lastfm_top_albums_$Username");
G::$Cache->delete_value("lastfm_top_tracks_$Username");
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT username
FROM lastfm_users
WHERE ID = '$LoggedUser[ID]'");
if ($DB->has_results()) {
list($Username2) = $DB->next_record();
WHERE ID = '" . G::$LoggedUser['ID'] . "'");
if (G::$DB->has_results()) {
list($Username2) = G::$DB->next_record();
//Make sure the usernames are in the correct order to avoid dupe cache keys.
if (strcasecmp($Username, $Username2)) {
$Temp = $Username;
$Username = $Username2;
$Username2 = $Temp;
}
$Cache->delete_value("lastfm_compare_$Username" . "_$Username2");
G::$Cache->delete_value("lastfm_compare_$Username" . "_$Username2");
}
G::$DB->set_query_id($QueryID);
}
}

View File

@ -17,13 +17,15 @@ public function __construct ($Table = 'bookmarks_torrents') {
/**
* Runs a SQL query and clears the Cache key
*
* $Cache->delete_value didn't always work, but setting the key to null, did. (?)
* G::$Cache->delete_value didn't always work, but setting the key to null, did. (?)
*
* @param string $sql
*/
protected function query_and_clear_cache ($sql) {
if (is_string($sql) && $this->DB->query($sql))
$this->Cache->delete_value('bookmarks_group_ids_' . $this->UserID);
$QueryID = G::$DB->get_query_id();
if (is_string($sql) && G::$DB->query($sql))
G::$Cache->delete_value('bookmarks_group_ids_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
/**
@ -41,7 +43,7 @@ public function mass_remove () {
if (!empty($SQL)) {
$SQL = sprintf('DELETE FROM %s WHERE UserID = %d AND GroupID IN (%s)',
$this->Table,
$this->UserID,
G::$LoggedUser['ID'],
implode(', ', $SQL)
);
$this->query_and_clear_cache($SQL);
@ -55,7 +57,7 @@ public function mass_update () {
$SQL = array();
foreach ($_POST['sort'] as $GroupID => $Sort) {
if (is_number($Sort) && is_number($GroupID))
$SQL[] = sprintf('(%d, %d, %d)', $GroupID, $Sort, $this->UserID);
$SQL[] = sprintf('(%d, %d, %d)', $GroupID, $Sort, G::$LoggedUser['ID']);
}
if (!empty($SQL)) {

View File

@ -13,87 +13,49 @@
*
* It could also be used for other types like collages.
*/
abstract class MASS_USER_TORRENTS_EDITOR
{
/**
* Internal access to the Cache
* @var Cache $Cache
*/
protected $Cache;
/**
* Internal access to the Database
* @var DB_MYSQL $DB
*/
protected $DB;
/**
* Current User's ID
* @var str|int $UserID
*/
protected $UserID;
abstract class MASS_USER_TORRENTS_EDITOR {
/**
* The affected DB table
* @var string $Table
*/
protected $Table;
/**
* Extended classes should call this method.
* @example parent::__construct()
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @global string|int $UserID
*/
public function __construct (/*CACHE &$Cache, DB_MYSQL &$DB, $UserID*/)
{
global $Cache, $DB, $UserID;
$this->Cache = $Cache;
$this->DB = $DB;
$this->UserID = (int) $UserID;
if ($this->UserID < 1) error(403);
}
/**
* Set the Table
* @param string $Table
*/
final public function set_table ($Table)
{
final public function set_table($Table) {
$this->Table = db_string($Table);
}
/**
* Get the Table
* @param sting $Table
* @return string $Table
*/
final public function get_table ()
{
final public function get_table() {
return $this->Table;
}
/**
* The extending class must provide a method to send a query and clear the cache
*/
abstract protected function query_and_clear_cache ($sql);
abstract protected function query_and_clear_cache($sql);
/**
* A method to insert many rows into a single table
* Not required in subsequent classes
*/
public function mass_add () {}
public function mass_add() {}
/**
* A method to remove many rows from a table
* The extending class must have a mass_remove method
*/
abstract public function mass_remove ();
abstract public function mass_remove();
/**
* A method to update many rows in a table
* The extending class must have a mass_update method
*/
abstract public function mass_update ();
abstract public function mass_update();
}

View File

@ -36,24 +36,12 @@ class MASS_USER_TORRENTS_TABLE_VIEW {
*/
private $TorrentList;
/**
* Ref. to $LoggedUser
* @var array $LoggedUser
*/
private $LoggedUser;
/**
* Ref. to $CollageDataList
* @var array $CollageDataList
*/
private $CollageDataList;
/**
* The UserID
* @var int $UserID
*/
private $UserID;
/**
* Counter for number of groups
* @var in $NumGroups
@ -64,22 +52,15 @@ class MASS_USER_TORRENTS_TABLE_VIEW {
* When creating a new instance of this class, TorrentList and
* CollageDataList must be passed. Additionally, a heading can be added.
*
* @global int|string $UserID
* @global array $LoggedUser
* @param array $TorrentList
* @param array $CollageDataList
* @param string $EditType
* @param string $Heading
*/
public function __construct (array &$TorrentList, array &$CollageDataList, $EditType, $Heading = null) {
global $UserID, $LoggedUser;
$this->set_heading($Heading);
$this->set_edit_type($EditType);
$this->UserID = (int) $UserID;
$this->LoggedUser = &$LoggedUser;
$this->TorrentList = $TorrentList;
$this->CollageDataList = $CollageDataList;
@ -116,7 +97,7 @@ public function render_all () {
* form, table, etc.
*/
public function header () {
if ($this->HasTorrents) :
if ($this->HasTorrents) {
?>
<div class="thin">
@ -134,14 +115,13 @@ public function header () {
<li>Click and drag any row to change its order.</li>
<li>Double-click on a row to check it.</li>
</ul>
<noscript><ul><li><strong class="important_text">Enable JavaScript!</strong></li></ul></noscript>
</td>
</tr>
</table>
<form action="bookmarks.php" method="post" id="drag_drop_collage_form">
<? $this->buttons(); ?>
<? $this->buttons(); ?>
<table id="manage_collage_table">
<thead>
@ -157,31 +137,31 @@ public function header () {
</thead>
<tbody>
<?
endif;
}
}
/**
* Closes header code
*/
public function footer () {
if ($this->HasTorrents) :
if ($this->HasTorrents) {
?>
</tbody>
</table>
<? $this->buttons(); ?>
<? $this->buttons(); ?>
<div>
<input type="hidden" name="action" value="mass_edit" />
<input type="hidden" name="type" value="<?=display_str($this->EditType)?>" />
<input type="hidden" name="auth" value="<?=$this->LoggedUser['AuthKey']?>" />
<input type="hidden" name="auth" value="<?=G::$LoggedUser['AuthKey']?>" />
</div>
</form>
</div>
<?
endif;
}
}
/**

View File

@ -43,26 +43,29 @@ public static function file_string($EscapeStr) {
* @return
*/
public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
global $DB, $Cache, $Time;
global $Time;
$Subject = db_string($Subject);
$Body = db_string($Body);
if ($ToID == 0 || $ToID == $FromID) {
// Don't allow users to send messages to the system or themselves
return;
}
$QueryID = G::$DB->get_query_id();
if ($ConvID == '') {
// Create a new conversation.
$DB->query("
G::$DB->query("
INSERT INTO pm_conversations (Subject)
VALUES ('$Subject')");
$ConvID = $DB->inserted_id();
$DB->query("
$ConvID = G::$DB->inserted_id();
G::$DB->query("
INSERT INTO pm_conversations_users
(UserID, ConvID, InInbox, InSentbox, SentDate, ReceivedDate, UnRead)
VALUES
('$ToID', '$ConvID', '1','0','".sqltime()."', '".sqltime()."', '1')");
if ($FromID != 0) {
$DB->query("
G::$DB->query("
INSERT INTO pm_conversations_users
(UserID, ConvID, InInbox, InSentbox, SentDate, ReceivedDate, UnRead)
VALUES
@ -71,7 +74,7 @@ public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
$ToID = array($ToID);
} else {
// Update the pre-existing conversations.
$DB->query("
G::$DB->query("
UPDATE pm_conversations_users
SET
InInbox='1',
@ -80,7 +83,7 @@ public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
WHERE UserID IN (".implode(',', $ToID).")
AND ConvID='$ConvID'");
$DB->query("
G::$DB->query("
UPDATE pm_conversations_users
SET
InSentbox='1',
@ -90,7 +93,7 @@ public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
}
// Now that we have a $ConvID for sure, send the message.
$DB->query("
G::$DB->query("
INSERT INTO pm_messages
(SenderID, ConvID, SentDate, Body)
VALUES
@ -98,33 +101,35 @@ public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
// Update the cached new message count.
foreach ($ToID as $ID) {
$DB->query("
G::$DB->query("
SELECT COUNT(ConvID)
FROM pm_conversations_users
WHERE UnRead = '1'
AND UserID='$ID'
AND InInbox = '1'");
list($UnRead) = $DB->next_record();
$Cache->cache_value('inbox_new_'.$ID, $UnRead);
list($UnRead) = G::$DB->next_record();
G::$Cache->cache_value('inbox_new_'.$ID, $UnRead);
}
$DB->query("
G::$DB->query("
SELECT Username
FROM users_main
WHERE ID = '$FromID'");
list($SenderName) = $DB->next_record();
list($SenderName) = G::$DB->next_record();
foreach ($ToID as $ID) {
$DB->query("
G::$DB->query("
SELECT COUNT(ConvID)
FROM pm_conversations_users
WHERE UnRead = '1'
AND UserID='$ID'
AND InInbox = '1'");
list($UnRead) = $DB->next_record();
$Cache->cache_value('inbox_new_'.$ID, $UnRead);
list($UnRead) = G::$DB->next_record();
G::$Cache->cache_value('inbox_new_'.$ID, $UnRead);
}
G::$DB->set_query_id($QueryID);
return $ConvID;
}
@ -139,40 +144,43 @@ public static function send_pm($ToID, $FromID, $Subject, $Body, $ConvID = '') {
* @return -1 on error, -2 on user not existing, thread id on success.
*/
public static function create_thread($ForumID, $AuthorID, $Title, $PostBody) {
global $DB, $Cache, $Time;
global $Time;
if (!$ForumID || !$AuthorID || !is_number($AuthorID) || !$Title || !$PostBody) {
return -1;
}
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Username
FROM users_main
WHERE ID=".$AuthorID);
if (!$DB->has_results()) {
if (!G::$DB->has_results()) {
G::$DB->set_query_id($QueryID);
return -2;
}
list($AuthorName) = $DB->next_record();
list($AuthorName) = G::$DB->next_record();
$ThreadInfo = array();
$ThreadInfo['IsLocked'] = 0;
$ThreadInfo['IsSticky'] = 0;
$DB->query("
G::$DB->query("
INSERT INTO forums_topics
(Title, AuthorID, ForumID, LastPostTime, LastPostAuthorID)
VALUES
('$Title', '$AuthorID', '$ForumID', '".sqltime()."', '$AuthorID')");
$TopicID = $DB->inserted_id();
$TopicID = G::$DB->inserted_id();
$Posts = 1;
$DB->query("
G::$DB->query("
INSERT INTO forums_posts
(TopicID, AuthorID, AddedTime, Body)
VALUES
('$TopicID', '$AuthorID', '".sqltime()."', '$PostBody')");
$PostID = $DB->inserted_id();
$PostID = G::$DB->inserted_id();
$DB->query("
G::$DB->query("
UPDATE forums
SET
NumPosts = NumPosts+1,
@ -183,7 +191,7 @@ public static function create_thread($ForumID, $AuthorID, $Title, $PostBody) {
LastPostTime = '".sqltime()."'
WHERE ID = '$ForumID'");
$DB->query("
G::$DB->query("
UPDATE forums_topics
SET
NumPosts = NumPosts+1,
@ -193,16 +201,16 @@ public static function create_thread($ForumID, $AuthorID, $Title, $PostBody) {
WHERE ID = '$TopicID'");
// Bump this topic to head of the cache
list($Forum,,, $Stickies) = $Cache->get_value('forums_'.$ForumID);
list($Forum,,, $Stickies) = G::$Cache->get_value('forums_'.$ForumID);
if (!empty($Forum)) {
if (count($Forum) == TOPICS_PER_PAGE && $Stickies < TOPICS_PER_PAGE) {
array_pop($Forum);
}
$DB->query("
G::$DB->query("
SELECT f.IsLocked, f.IsSticky, f.NumPosts
FROM forums_topics AS f
WHERE f.ID ='$TopicID'");
list($IsLocked, $IsSticky, $NumPosts) = $DB->next_record();
list($IsLocked, $IsSticky, $NumPosts) = G::$DB->next_record();
$Part1 = array_slice($Forum, 0, $Stickies, true); //Stickys
$Part2 = array(
$TopicID => array(
@ -228,11 +236,11 @@ public static function create_thread($ForumID, $AuthorID, $Title, $PostBody) {
if (is_null($Part1)) { $Part1 = array(); }
if (is_null($Part3)) { $Part3 = array(); }
$Forum = $Part1 + $Part2 + $Part3;
$Cache->cache_value('forums_'.$ForumID, array($Forum, '', 0, $Stickies), 0);
G::$Cache->cache_value('forums_'.$ForumID, array($Forum, '', 0, $Stickies), 0);
}
//Update the forum root
$Cache->begin_transaction('forums_list');
G::$Cache->begin_transaction('forums_list');
$UpdateArray = array(
'NumPosts'=>'+1',
'NumTopics'=>'+1',
@ -247,26 +255,28 @@ public static function create_thread($ForumID, $AuthorID, $Title, $PostBody) {
$UpdateArray['NumTopics'] = '+1';
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
G::$Cache->update_row($ForumID, $UpdateArray);
G::$Cache->commit_transaction(0);
$CatalogueID = floor((POSTS_PER_PAGE * ceil($Posts / POSTS_PER_PAGE) - POSTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->begin_transaction('thread_'.$TopicID.'_catalogue_'.$CatalogueID);
G::$Cache->begin_transaction('thread_'.$TopicID.'_catalogue_'.$CatalogueID);
$Post = array(
'ID'=>$PostID,
'AuthorID'=>$LoggedUser['ID'],
'AuthorID'=>G::$LoggedUser['ID'],
'AddedTime'=>sqltime(),
'Body'=>$PostBody,
'EditedUserID'=>0,
'EditedTime'=>'0000-00-00 00:00:00',
'Username'=>''
);
$Cache->insert('', $Post);
$Cache->commit_transaction(0);
G::$Cache->insert('', $Post);
G::$Cache->commit_transaction(0);
$Cache->begin_transaction('thread_'.$TopicID.'_info');
$Cache->update_row(false, array('Posts'=>'+1', 'LastPostAuthorID'=>$AuthorID));
$Cache->commit_transaction(0);
G::$Cache->begin_transaction('thread_'.$TopicID.'_info');
G::$Cache->update_row(false, array('Posts'=>'+1', 'LastPostAuthorID'=>$AuthorID));
G::$Cache->commit_transaction(0);
G::$DB->set_query_id($QueryID);
return $TopicID;
}
@ -355,24 +365,25 @@ public static function assert_isset_request($Request, $Keys = NULL, $AllowEmpty
* @return array IDs
*/
public static function get_tags($TagNames) {
global $Cache, $DB;
$TagIDs = array();
foreach ($TagNames as $Index => $TagName) {
$Tag = $Cache->get_value('tag_id_'.$TagName);
$Tag = G::$Cache->get_value('tag_id_'.$TagName);
if (is_array($Tag)) {
unset($TagNames[$Index]);
$TagIDs[$Tag['ID']] = $Tag['Name'];
}
}
if (count($TagNames) > 0) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT ID, Name
FROM tags
WHERE Name IN ('".implode("', '", $TagNames)."')");
$SQLTagIDs = $DB->to_array();
$SQLTagIDs = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
foreach ($SQLTagIDs as $Tag) {
$TagIDs[$Tag['ID']] = $Tag['Name'];
$Cache->cache_value('tag_id_'.$Tag['Name'], $Tag, 0);
G::$Cache->cache_value('tag_id_'.$Tag['Name'], $Tag, 0);
}
}
@ -387,17 +398,19 @@ public static function get_tags($TagNames) {
* @return string The aliased tag.
*/
public static function get_alias_tag($BadTag) {
global $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT AliasTag
FROM tag_aliases
WHERE BadTag = '$BadTag'
LIMIT 1");
if ($DB->has_results()) {
list($AliasTag) = $DB->next_record();
return $AliasTag;
if (G::$DB->has_results()) {
list($AliasTag) = G::$DB->next_record();
} else {
$AliasTag = $BadTag;
}
return $BadTag;
G::$DB->set_query_id($QueryID);
return $AliasTag;
}
@ -407,10 +420,12 @@ public static function get_alias_tag($BadTag) {
* @param string $Message the message to write.
*/
public static function write_log($Message) {
global $DB, $Time;
$DB->query("
global $Time;
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO log (Message, Time)
VALUES ('" . db_string($Message) . "', '" . sqltime() . "')");
G::$DB->set_query_id($QueryID);
}
@ -491,7 +506,6 @@ public static function is_new_torrent(&$Data) {
}
public static function display_recommend($ID, $Type, $Hide = true) {
global $DB, $LoggedUser;
if ($Hide) {
$Hide = ' style="display: none;"';
}
@ -509,5 +523,9 @@ public static function display_recommend($ID, $Type, $Hide = true) {
</div>
<?
}
public static function is_valid_url($URL) {
return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $URL);
}
}
?>

View File

@ -95,7 +95,7 @@
This class can only hold one result set at a time. Using set_query_id allows
you to set the result set that the class is using to the result set in
$ResultSet. This result set should have been obtained earlier by using
$DB-query().
$DB->query().
Example:
@ -173,7 +173,7 @@ function __construct($Database = SQLDB, $User = SQLLOGIN, $Pass = SQLPASS, $Serv
}
function halt($Msg) {
global $LoggedUser, $Cache, $Debug, $argv;
global $Debug, $argv;
$DBError = 'MySQL: '.strval($Msg).' SQL error: '.strval($this->Errno).' ('.strval($this->Error).')';
if ($this->Errno == 1194) {
send_irc('PRIVMSG '.ADMIN_CHAN.' :'.$this->Error);
@ -205,7 +205,7 @@ function connect() {
}
function query($Query, $AutoHandle = 1) {
global $LoggedUser, $Debug;
global $Debug;
/*
* If there was a previous query, we store the warnings. We cannot do
* this immediately after mysqli_query because mysqli_insert_id will

View File

@ -0,0 +1,659 @@
<?
class NotificationsManager {
// Importances
const IMPORTANT = "information";
const CRITICAL = "error";
const WARNING = "warning";
const INFO = "confirmation";
public static $Importances = array(
"important" => "information",
"critical" => "error",
"warning" => "warning",
"info" => "confirmation");
// Types. These names must correspond to column names in users_notifications_settings
const NEWS = "News";
const BLOG = "Blog";
const STAFFBLOG = "StaffBlog";
const STAFFPM = "StaffPM";
const INBOX = "Inbox";
const QUOTES = "Quotes";
const SUBSCRIPTIONS = "Subscriptions";
const TORRENTS = "Torrents";
const COLLAGES = "Collages";
const SITEALERTS = "SiteAlerts";
const FORUMALERTS = "ForumAlerts";
const REQUESTALERTS = "RequestAlerts";
const COLLAGEALERTS = "CollageAlerts";
const TORRENTALERTS = "TorrentAlerts";
const GLOBALNOTICE = "Global";
public static $Types = array(
"News",
"Blog",
"StaffPM",
"Inbox",
"Quotes",
"Subscriptions",
"Torrents",
"Collages",
"SiteAlerts",
"ForumAlerts",
"RequestAlerts",
"CollageAlerts",
"TorrentAlerts");
private $UserID;
private $Notifications;
private $Settings;
function __construct($UserID, $Skip = array(), $Load = true, $AutoSkip = true) {
$this->UserID = $UserID;
$this->Notifications = array();
$this->Settings = self::get_settings($UserID);
if ($AutoSkip) {
foreach ($this->Settings as $Key => $Value) {
// Skip disabled and traditional settings
if ($Value == 0 || $Value == 2) {
$Skip[] = $Key;
}
}
}
if ($Load) {
$this->load_global_notification();
if (!in_array(self::NEWS, $Skip)) {
$this->load_news();
}
if (!in_array(self::BLOG, $Skip)) {
$this->load_blog();
}
// if (!in_array(self::STAFFBLOG, $Skip)) {
// $this->load_staff_blog();
// }
if (!in_array(self::STAFFPM, $Skip)) {
$this->load_staff_pms();
}
if (!in_array(self::INBOX, $Skip)) {
$this->load_inbox();
}
if (!in_array(self::TORRENTS, $Skip)) {
$this->load_torrent_notifications();
}
if (!in_array(self::COLLAGES, $Skip)) {
$this->load_collage_subscriptions();
}
if (!in_array(self::QUOTES, $Skip)) {
$this->load_quote_notifications();
}
if (!in_array(self::SUBSCRIPTIONS, $Skip)) {
$this->load_subscriptions();
}
$this->load_one_reads();
}
}
public function get_notifications() {
return $this->Notifications;
}
public function clear_notifications_array() {
unset($this->Notifications);
$this->Notifications = array();
}
private function create_notification($Type, $ID, $Message, $URL, $Importance) {
$this->Notifications[$Type] = array("contents" => array("id" => (int) $ID, "message" => $Message, "url" => $URL, "importance" => $Importance));
}
public static function notify_user($UserID, $Type, $Message, $URL, $Importance) {
self::notify_users(array($UserID), $Type, $Message, $URL, $Importance);
}
public static function notify_users($UserIDs, $Type, $Message, $URL, $Importance) {
/**
if (!isset($Importance)) {
$Importance = self::INFO;
}
$Type = db_string($Type);
if (!empty($UserIDs)) {
$UserIDs = implode(',', $UserIDs);
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT UserID
FROM users_notifications_settings
WHERE $Type != 0
AND UserID IN ($UserIDs)");
$UserIDs = array();
while (list($ID) = G::$DB->next_record()) {
$UserIDs[] = $ID;
}
G::$DB->set_query_id($QueryID);
foreach ($UserIDs as $UserID) {
$OneReads = G::$Cache->get_value("notifications_one_reads_$UserID");
if (!$OneReads) {
$OneReads = array();
}
array_unshift($OneReads, $this->create_notification($OneReads, "oneread_" . uniqid(), null, $Message, $URL, $Importance));
$OneReads = array_filter($OneReads);
G::$Cache->cache_value("notifications_one_reads_$UserID", $OneReads, 0);
}
}
**/
}
public static function get_notification_enabled_users($Type, $UserID) {
$Type = db_string($Type);
$UserWhere = '';
if (isset($UserID)) {
$UserID = (int) $UserID;
$UserWhere = " AND UserID = '$UserID'";
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT UserID
FROM users_notifications_settings
WHERE $Type != 0
$UserWhere");
$IDs = array();
while (list($ID) = G::$DB->next_record()) {
$IDs[] = $ID;
}
G::$DB->set_query_id($QueryID);
return $IDs;
}
public function load_one_reads() {
$OneReads = G::$Cache->get_value('notifications_one_reads_' . G::$LoggedUser['ID']);
if (is_array($OneReads)) {
$this->Notifications = $this->Notifications + $OneReads;
}
}
public static function clear_one_read($ID) {
$OneReads = G::$Cache->get_value('notifications_one_reads_' . G::$LoggedUser['ID']);
if ($OneReads) {
unset($OneReads[$ID]);
if (count($OneReads) > 0) {
G::$Cache->cache_value('notifications_one_reads_' . G::$LoggedUser['ID'], $OneReads, 0);
} else {
G::$Cache->delete_value('notifications_one_reads_' . G::$LoggedUser['ID']);
}
}
}
public function load_global_notification() {
$GlobalNotification = G::$Cache->get_value('global_notification');
if ($GlobalNotification) {
$Read = G::$Cache->get_value('user_read_global_' . G::$LoggedUser['ID']);
if (!$Read) {
$this->create_notification(self::GLOBALNOTICE, null, $GlobalNotification['Message'], $GlobalNotification['URL'], $GlobalNotification['Importance']);
}
}
}
public static function get_global_notification() {
return G::$Cache->get_value('global_notification');
}
public static function set_global_notification($Message, $URL, $Importance, $Expiration) {
if (empty($Message) || empty($Expiration)) {
error('Error setting notification');
}
G::$Cache->cache_value('global_notification', array("Message" => $Message, "URL" => $URL, "Importance" => $Importance, "Expiration" => $Expiration), $Expiration);
}
public static function delete_global_notification() {
G::$Cache->delete_value('global_notification');
}
public static function clear_global_notification() {
$GlobalNotification = G::$Cache->get_value('global_notification');
if ($GlobalNotification) {
// This is some trickery
// since we can't know which users have the read cache key set
// wet set the expiration time of their cache key to that of the length of the notification
// this gaurantees that their cache key will expire after the notification expires
G::$Cache->cache_value('user_read_global_' . G::$LoggedUser['ID'], true, $GlobalNotification['Expiration']);
}
}
public function load_news() {
$MyNews = G::$LoggedUser['LastReadNews'];
$CurrentNews = G::$Cache->get_value('news_latest_id');
$Title = G::$Cache->get_value('news_latest_title');
if ($CurrentNews === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT ID, Title
FROM news
ORDER BY Time DESC
LIMIT 1');
if (G::$DB->has_results()) {
list($CurrentNews, $Title) = G::$DB->next_record();
} else {
$CurrentNews = -1;
}
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('news_latest_id', $CurrentNews, 0);
G::$Cache->cache_value('news_latest_title', $Title, 0);
}
if ($MyNews < $CurrentNews) {
$this->create_notification(self::NEWS, $CurrentNews, "Announcement: $Title", "index.php#news$CurrentNews", self::IMPORTANT);
}
}
public function load_blog() {
$MyBlog = G::$LoggedUser['LastReadBlog'];
$CurrentBlog = G::$Cache->get_value('blog_latest_id');
$Title = G::$Cache->get_value('blog_latest_title');
if ($CurrentBlog === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT ID, Title
FROM blog
WHERE Important = 1
ORDER BY Time DESC
LIMIT 1');
if (G::$DB->has_results()) {
list($CurrentBlog, $Title) = G::$DB->next_record();
} else {
$CurrentBlog = -1;
}
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('blog_latest_id', $CurrentBlog, 0);
G::$Cache->cache_value('blog_latest_title', $Title, 0);
}
if ($MyBlog < $CurrentBlog) {
$this->create_notification(self::BLOG, $CurrentBlog, "Blog: $Title", "blog.php#blog$CurrentBlog", self::IMPORTANT);
}
}
public function load_staff_blog() {
if (check_perms('users_mod')) {
global $SBlogReadTime, $LatestSBlogTime;
if (!$SBlogReadTime && ($SBlogReadTime = G::$Cache->get_value('staff_blog_read_' . G::$LoggedUser['ID'])) === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Time
FROM staff_blog_visits
WHERE UserID = " . G::$LoggedUser['ID']);
if (list($SBlogReadTime) = G::$DB->next_record()) {
$SBlogReadTime = strtotime($SBlogReadTime);
} else {
$SBlogReadTime = 0;
}
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('staff_blog_read_' . G::$LoggedUser['ID'], $SBlogReadTime, 1209600);
}
if (!$LatestSBlogTime && ($LatestSBlogTime = G::$Cache->get_value('staff_blog_latest_time')) === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT MAX(Time)
FROM staff_blog');
if (list($LatestSBlogTime) = G::$DB->next_record()) {
$LatestSBlogTime = strtotime($LatestSBlogTime);
} else {
$LatestSBlogTime = 0;
}
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('staff_blog_latest_time', $LatestSBlogTime, 1209600);
}
if ($SBlogReadTime < $LatestSBlogTime) {
$this->create_notification(self::STAFFBLOG, '', 'New Staff Blog Post!', 'staffblog.php', self::IMPORTANT);
}
}
}
public function load_staff_pms() {
$NewStaffPMs = G::$Cache->get_value('staff_pm_new_' . G::$LoggedUser['ID']);
if ($NewStaffPMs === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT COUNT(ID)
FROM staff_pm_conversations
WHERE UserID = '" . G::$LoggedUser['ID'] . "'
AND Unread = '1'");
list($NewStaffPMs) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('staff_pm_new_' . G::$LoggedUser['ID'], $NewStaffPMs, 0);
}
if ($NewStaffPMs > 0) {
$Title = 'You have new ' . ($NewStaffPMs == 1 ? 'a' : $NewStaffPMs) . ' Staff PM' . ($NewStaffPMs > 1 ? 's' : '');
$this->create_notification(self::STAFFPM, '', $Title, 'staffpm.php', self::INFO);
}
}
public function load_inbox() {
$NewMessages = G::$Cache->get_value('inbox_new_' . G::$LoggedUser['ID']);
if ($NewMessages === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT COUNT(UnRead)
FROM pm_conversations_users
WHERE UserID = '" . G::$LoggedUser['ID'] . "'
AND UnRead = '1'
AND InInbox = '1'");
list($NewMessages) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('inbox_new_' . G::$LoggedUser['ID'], $NewMessages, 0);
}
if ($NewMessages > 0) {
$Title = 'You have ' . ($NewMessages == 1 ? 'a' : $NewMessages) . ' new message' . ($NewMessages > 1 ? 's' : '');
$this->create_notification(self::INBOX, '', $Title, Inbox::get_inbox_link(), self::INFO);
}
}
public function load_torrent_notifications() {
if (check_perms('site_torrents_notify')) {
$NewNotifications = G::$Cache->get_value('notifications_new_' . G::$LoggedUser['ID']);
if ($NewNotifications === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT COUNT(UserID)
FROM users_notify_torrents
WHERE UserID = ' " . G::$LoggedUser['ID'] . "'
AND UnRead = '1'");
list($NewNotifications) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('notifications_new_' . G::$LoggedUser['ID'], $NewNotifications, 0);
}
}
if ($NewNotifications > 0) {
$Title = 'You have ' . ($NewNotifications == 1 ? 'a' : $NewNotifications) . ' new torrent notification' . ($NewNotifications > 1 ? 's' : '');
$this->create_notification(self::TORRENTS, '', $Title, 'torrents.php?action=notify', self::INFO);
}
}
public function load_collage_subscriptions() {
if (check_perms('site_collages_subscribe')) {
$NewCollages = G::$Cache->get_value('collage_subs_user_new_' . G::$LoggedUser['ID']);
if ($NewCollages === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT COUNT(DISTINCT s.CollageID)
FROM users_collage_subs as s
JOIN collages as c ON s.CollageID = c.ID
JOIN collages_torrents as ct on ct.CollageID = c.ID
WHERE s.UserID = " . G::$LoggedUser['ID'] . "
AND ct.AddedOn > s.LastVisit
AND c.Deleted = '0'");
list($NewCollages) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('collage_subs_user_new_' . G::$LoggedUser['ID'], $NewCollages, 0);
}
if ($NewCollages > 0) {
$Title = 'You have ' . ($NewCollages == 1 ? 'a' : $NewCollages) . ' new collage update' . ($NewCollages > 1 ? 's' : '');
$this->create_notification(self::COLLAGES, '', $Title, 'userhistory.php?action=subscribed_collages', self::INFO);
}
}
}
public function load_quote_notifications() {
if (G::$LoggedUser['NotifyOnQuote']) {
$QuoteNotificationsCount = Subscriptions::has_new_quote_notifications();
if ($QuoteNotificationsCount > 0) {
$Title = 'New quote' . ($QuoteNotificationsCount > 1 ? 's' : '');
$this->create_notification(self::QUOTES, null, $Title, 'userhistory.php?action=quote_notifications', self::INFO);
}
}
}
public function load_subscriptions() {
$SubscriptionsCount = Subscriptions::has_new_subscriptions();
if ($SubscriptionsCount > 0) {
$Title = 'New subscription' . ($SubscriptionsCount > 1 ? 's' : '');
$this->create_notification(self::SUBSCRIPTIONS, null, $Title, 'userhistory.php?action=subscriptions', self::INFO);
}
}
public static function clear_news($News) {
$QueryID = G::$DB->get_query_id();
if (!$News) {
if (!$News = G::$Cache->get_value('news')) {
G::$DB->query('
SELECT
ID,
Title,
Body,
Time
FROM news
ORDER BY Time DESC
LIMIT 1');
$News = G::$DB->to_array(false, MYSQLI_NUM, false);
G::$Cache->cache_value('news_latest_id', $News[0][0], 0);
}
}
if (G::$LoggedUser['LastReadNews'] != $News[0][0]) {
G::$Cache->begin_transaction('user_info_heavy_' . G::$LoggedUser['ID']);
G::$Cache->update_row(false, array('LastReadNews' => $News[0][0]));
G::$Cache->commit_transaction(0);
G::$DB->query("
UPDATE users_info
SET LastReadNews = '".$News[0][0]."'
WHERE UserID = " . G::$LoggedUser['ID']);
G::$LoggedUser['LastReadNews'] = $News[0][0];
}
G::$DB->set_query_id($QueryID);
}
public static function clear_blog($Blog) {
$QueryID = G::$DB->get_query_id();
if (!$Blog) {
if (!$Blog = G::$Cache->get_value('blog')) {
G::$DB->query("
SELECT
b.ID,
um.Username,
b.Title,
b.Body,
b.Time,
b.ThreadID
FROM blog AS b
LEFT JOIN users_main AS um ON b.UserID = um.ID
ORDER BY Time DESC
LIMIT 1");
$Blog = G::$DB->to_array();
}
}
if (G::$LoggedUser['LastReadBlog'] < $Blog[0][0]) {
G::$Cache->begin_transaction('user_info_heavy_' . G::$LoggedUser['ID']);
G::$Cache->update_row(false, array('LastReadBlog' => $Blog[0][0]));
G::$Cache->commit_transaction(0);
G::$DB->query("
UPDATE users_info
SET LastReadBlog = '". $Blog[0][0]."'
WHERE UserID = " . G::$LoggedUser['ID']);
G::$LoggedUser['LastReadBlog'] = $Blog[0][0];
}
G::$DB->set_query_id($QueryID);
}
public static function clear_staff_pms() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT ID
FROM staff_pm_conversations
WHERE Unread = true
AND UserID = " . G::$LoggedUser['ID']);
$IDs = array();
while (list($ID) = G::$DB->next_record()) {
$IDs[] = $ID;
}
$IDs = implode(',', $IDs);
if (!empty($IDs)) {
G::$DB->query("
UPDATE staff_pm_conversations
SET Unread = false
WHERE ID IN ($IDs)");
}
G::$Cache->delete_value('staff_pm_new_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function clear_inbox() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT ConvID
FROM pm_conversations_users
WHERE Unread = '1'
AND UserID = " . G::$LoggedUser['ID']);
$IDs = array();
while (list($ID) = G::$DB->next_record()) {
$IDs[] = $ID;
}
$IDs = implode(',', $IDs);
if (!empty($IDs)) {
G::$DB->query("
UPDATE pm_conversations_users
SET Unread = '0'
WHERE ConvID IN ($IDs)
AND UserID = " . G::$LoggedUser['ID']);
}
G::$Cache->delete_value('inbox_new_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function clear_torrents() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT TorrentID
FROM users_notify_torrents
WHERE UserID = ' " . G::$LoggedUser['ID'] . "'
AND UnRead = '1'");
$IDs = array();
while (list($ID) = G::$DB->next_record()) {
$IDs[] = $ID;
}
$IDs = implode(',', $IDs);
if (!empty($IDs)) {
G::$DB->query("
UPDATE users_notify_torrents
SET Unread = '0'
WHERE TorrentID IN ($IDs)
AND UserID = " . G::$LoggedUser['ID']);
}
G::$Cache->delete_value('notifications_new_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function clear_collages() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE users_collage_subs
SET LastVisit = NOW()
WHERE UserID = " . G::$LoggedUser['ID']);
G::$Cache->delete_value('collage_subs_user_new_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function clear_quotes() {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE users_notify_quoted
SET UnRead = '0'
WHERE UserID = " . G::$LoggedUser['ID']);
G::$Cache->delete_value('notify_quoted_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function clear_subscriptions() {
$QueryID = G::$DB->get_query_id();
if (($UserSubscriptions = G::$Cache->get_value('subscriptions_user_' . G::$LoggedUser['ID'])) === false) {
G::$DB->query("
SELECT TopicID
FROM users_subscriptions
WHERE UserID = " . G::$LoggedUser['ID']);
if ($UserSubscriptions = G::$DB->collect(0)) {
G::$Cache->cache_value('subscriptions_user_' . G::$LoggedUser['ID'], $UserSubscriptions, 0);
}
}
if (!empty($UserSubscriptions)) {
G::$DB->query("
INSERT INTO forums_last_read_topics (UserID, TopicID, PostID)
SELECT '" . G::$LoggedUser['ID'] . "', ID, LastPostID
FROM forums_topics
WHERE ID IN (".implode(',', $UserSubscriptions).')
ON DUPLICATE KEY
UPDATE PostID = LastPostID');
}
G::$Cache->delete_value('subscriptions_user_new_' . G::$LoggedUser['ID']);
G::$DB->set_query_id($QueryID);
}
public static function send_notification($UserID, $ID, $Type, $Message, $URL, $Importance = 'alert', $AutoExpire = false) {
$Notifications = G::$Cache->get_value("user_cache_notifications_$UserID");
if (empty($Notifications)) {
$Notifications = array();
}
array_unshift($Notifications, $this->create_notification($Type, $ID, $Message, $URL, $Importance, $AutoExpire));
G::$Cache->cache_value("user_cache_notifications_$UserID", $Notifications, 0);
}
public static function clear_notification($UserID, $Index) {
$Notifications = G::$Cache->get_value("user_cache_notifications_$UserID");
if (count($Notifications)) {
unset($Notifications[$Index]);
$Notifications = array_values($Notifications);
G::$Cache->cache_value("user_cache_notifications_$UserID", $Notifications, 0);
}
}
public static function get_settings($UserID) {
$Results = G::$Cache->get_value("users_notifications_settings_$UserID");
if (!$Results) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT *
FROM users_notifications_settings
WHERE UserID = '$UserID'");
$Results = G::$DB->next_record(MYSQLI_ASSOC);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("users_notifications_settings_$UserID", $Results, 0);
}
return $Results;
}
public static function save_settings($UserID, $Settings) {
if (!is_array($Settings)) {
// A little cheat technique, gets all keys in the $_POST array starting with 'notifications_'
$Settings = array_intersect_key($_POST, array_flip(preg_grep('/^notifications_/', array_keys($_POST))));
}
$Update = array();
$Types = self::$Types;
foreach ($Types as $Type) {
$Popup = array_key_exists("notifications_$Type" . '_popup', $Settings);
$Traditional = array_key_exists("notifications_$Type" . '_traditional', $Settings);
$Result = 0;
if ($Popup) {
$Result = 1;
} elseif ($Traditional) {
$Result = 2;
}
$Update[] = "$Type = $Result";
}
$Update = implode(',', $Update);
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE users_notifications_settings
SET $Update
WHERE UserID = '$UserID'");
G::$DB->set_query_id($QueryID);
G::$Cache->delete_value("users_notifications_settings_$UserID");
}
public function is_traditional($Type) {
return $this->Settings[$Type] == 2;
}
}

View File

@ -0,0 +1,151 @@
<?
class NotificationsManagerView {
private static $Settings;
public static function load_js() { ?>
<script type="text/javascript" src="<?=STATIC_SERVER?>functions/noty/noty.js"></script>
<script type="text/javascript" src="<?=STATIC_SERVER?>functions/noty/layouts/bottomRight.js"></script>
<script type="text/javascript" src="<?=STATIC_SERVER?>functions/noty/themes/default.js"></script>
<script type="text/javascript" src="<?=STATIC_SERVER?>functions/user_notifications.js"></script>
<?
}
public static function render_settings($Settings) {
self::$Settings = $Settings;
?>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when a new sitewide news announcement is made.">
<strong>News announcements</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::NEWS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when a new sitewide blog post is made.">
<strong>Blog announcements</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::BLOG); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when you receive a new private message.">
<strong>Inbox messages</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::INBOX, true); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when you receive a new private message from a member of the <?=SITE_NAME?> staff.">
<strong>Staff messages</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::STAFFPM); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when a thread you have subscribed to receives a new post.">
<strong>Thread subscriptions</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::SUBSCRIPTIONS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification whenever someone quotes you in the forums.">
<strong>Quote notifications</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::QUOTES); ?>
</td>
</tr>
<? if (check_perms('site_torrents_notify')) { ?>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when the torrent notification filters you have established are triggered.">
<strong>Torrent notifications</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::TORRENTS, true); ?>
</td>
</tr>
<? } ?>
<tr>
<td class="label tooltip" title="Enabling this will give you a notification when a torrent is added to a collage you are subscribed to.">
<strong>Collage subscriptions</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::COLLAGES); ?>
</td>
</tr>
<? /**
<tr>
<td class="label tooltip" title="">
<strong>Site alerts</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::SITEALERTS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="">
<strong>Forum alerts</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::FORUMALERTS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="">
<strong>Request alerts</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::REQUESTALERTS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="">
<strong>Collage alerts</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::COLLAGEALERTS); ?>
</td>
</tr>
<tr>
<td class="label tooltip" title="">
<strong>Torrent alerts</strong>
</td>
<td>
<? self::render_checkbox(NotificationsManager::TORRENTALERTS); ?>
</td>
</tr>
<? **/
}
/*
* FIXME: The use of radio buttons with different "name" attributes is an ugly
* workaround for how NotificationsManager::save_settings() is coded.
*/
private static function render_checkbox($Name, $Both = false) {
$Checked = self::$Settings[$Name];
if ($Both) {
$IsChecked = $Checked == 2 ? ' checked="checked"' : '';
?>
<input type="radio" value="1" name="notifications_<?=$Name?>_traditional" id="notifications_<?=$Name?>_traditional"<?=$IsChecked?> />
<label for="notifications_<?=$Name?>_traditional">Traditional</label>
<?
}
$IsChecked = $Checked == 1 || !isset($Checked) ? ' checked="checked"' : '';
?>
<input <?=$Both ? 'type="radio" value="1"' : 'type="checkbox"'?> name="notifications_<?=$Name?>_popup" id="notifications_<?=$Name?>_popup"<?=$IsChecked?> />
<label for="notifications_<?=$Name?>_popup">Pop-up</label>
<?
}
public static function format_traditional($Contents) {
return '<a href="' . $Contents['url'] . '">' . $Contents['message'] . '</a>';
}
}

View File

@ -46,7 +46,7 @@
define("PARANOIA_OVERRIDDEN", 2);
function check_paranoia($Property, $Paranoia, $UserClass, $UserID = false) {
global $LoggedUser, $Classes;
global $Classes;
if ($Property == false) {
return false;
}
@ -63,7 +63,7 @@ function check_paranoia($Property, $Paranoia, $UserClass, $UserID = false) {
}
return $all;
} else {
if (($UserID !== false) && ($LoggedUser['ID'] == $UserID)) {
if (($UserID !== false) && (G::$LoggedUser['ID'] == $UserID)) {
return PARANOIA_ALLOWED;
}

View File

@ -7,12 +7,11 @@ class Permissions {
* @param string $MinClass Return false if the user's class level is below this.
*/
public static function check_perms($PermissionName, $MinClass = 0) {
global $LoggedUser;
return (
isset($LoggedUser['Permissions'][$PermissionName])
&& $LoggedUser['Permissions'][$PermissionName]
&& ($LoggedUser['Class'] >= $MinClass
|| $LoggedUser['EffectiveClass'] >= $MinClass)
isset(G::$LoggedUser['Permissions'][$PermissionName])
&& G::$LoggedUser['Permissions'][$PermissionName]
&& (G::$LoggedUser['Class'] >= $MinClass
|| G::$LoggedUser['EffectiveClass'] >= $MinClass)
) ? true : false;
}
@ -23,16 +22,17 @@ public static function check_perms($PermissionName, $MinClass = 0) {
* @return array permissions
*/
public static function get_permissions($PermissionID) {
global $DB, $Cache;
$Permission = $Cache->get_value('perm_'.$PermissionID);
$Permission = G::$Cache->get_value('perm_'.$PermissionID);
if (empty($Permission)) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT p.Level AS Class, p.Values as Permissions, p.Secondary, p.PermittedForums
FROM permissions AS p
WHERE ID='$PermissionID'");
$Permission = $DB->next_record(MYSQLI_ASSOC, array('Permissions'));
$Permission = G::$DB->next_record(MYSQLI_ASSOC, array('Permissions'));
G::$DB->set_query_id($QueryID);
$Permission['Permissions'] = unserialize($Permission['Permissions']);
$Cache->cache_value('perm_'.$PermissionID, $Permission, 2592000);
G::$Cache->cache_value('perm_'.$PermissionID, $Permission, 2592000);
}
return $Permission;
}
@ -47,17 +47,18 @@ public static function get_permissions($PermissionID) {
* @return array Mapping of PermissionName=>bool/int
*/
public static function get_permissions_for_user($UserID, $CustomPermissions = false) {
global $DB;
$UserInfo = Users::user_info($UserID);
// Fetch custom permissions if they weren't passed in.
if ($CustomPermissions === false) {
$DB->query('
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT um.CustomPermissions
FROM users_main AS um
WHERE um.ID = '.((int)$UserID));
list($CustomPermissions) = $DB->next_record(MYSQLI_NUM, false);
list($CustomPermissions) = G::$DB->next_record(MYSQLI_NUM, false);
G::$DB->set_query_id($QueryID);
}
if (!empty($CustomPermissions) && !is_array($CustomPermissions)) {
@ -89,10 +90,12 @@ public static function get_permissions_for_user($UserID, $CustomPermissions = fa
$DonorPerms = array('Permissions' => array());
}
$DonorCollages = self::get_personal_collages($UserID, $Permissions['Permissions']['users_mod']);
$MaxCollages = $Permissions['Permissions']['MaxCollages']
+ $BonusCollages
+ $CustomPerms['MaxCollages']
+ $DonorPerms['Permissions']['MaxCollages'];
+ $DonorCollages;
//Combine the permissions
return array_merge(
@ -102,5 +105,39 @@ public static function get_permissions_for_user($UserID, $CustomPermissions = fa
$DonorPerms['Permissions'],
array('MaxCollages' => $MaxCollages));
}
private static function get_personal_collages($UserID, $HasAll) {
$QueryID = G::$DB->get_query_id();
if (!$HasAll) {
$SpecialRank = G::$Cache->get_value("donor_special_rank_$UserID");
if ($SpecialRank === false) {
G::$DB->query("SELECT SpecialRank FROM users_donor_ranks WHERE UserID = '$UserID'");
list($SpecialRank) = G::$DB->next_record();
$HasAll = $SpecialRank == MAX_SPECIAL_RANK ? true : false;
G::$Cache->cache_value("donor_special_rank_$UserID", $SpecialRank, 0);
}
} else {
G::$Cache->cache_value("donor_special_rank_$UserID", MAX_SPECIAL_RANK, 0);
}
if ($HasAll) {
$Collages = 5;
} else {
$Collages = 0;
$Rank = G::$Cache->get_value("donor_rank_$UserID");
if ($Rank === false) {
G::$DB->query("SELECT Rank FROM users_donor_ranks WHERE UserID = '$UserID'");
list($Rank) = G::$DB->next_record();
G::$Cache->cache_value("donor_rank_$UserID", $Rank, 0);
}
$Rank = min($Rank, 5);
for ($i = 1; $i <= $Rank; $i++) {
$Collages++;
}
}
G::$DB->set_query_id($QueryID);
return $Collages;
}
}
?>

View File

@ -229,7 +229,6 @@ function permissions_form() { ?>
<? display_perm('edit_unknowns', 'Can edit unknown release information.'); ?>
<? display_perm('torrents_edit_vanityhouse', 'Can mark groups as part of Vanity House.'); ?>
<? display_perm('artist_edit_vanityhouse', 'Can mark artists as part of Vanity House.'); ?>
<? display_perm('site_add_logs', 'Can add logs to torrents after upload'); ?>
<? display_perm('torrents_hide_dnu', 'Hide the Do Not Upload list by default.'); ?>
<? display_perm('torrents_fix_ghosts', 'Can fix ghost groups on artist pages.'); ?>
</td>

View File

@ -6,9 +6,8 @@ class Requests {
* @param $RequestID
*/
public static function update_sphinx_requests($RequestID) {
global $DB, $Cache;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
REPLACE INTO sphinx_requests_delta (
ID, UserID, TimeAdded, LastVote, CategoryID, Title,
Year, ReleaseType, CatalogueNumber, BitrateList,
@ -25,8 +24,7 @@ public static function update_sphinx_requests($RequestID) {
LEFT JOIN requests_votes AS rv ON rv.RequestID = r.ID
WHERE ID = $RequestID
GROUP BY r.ID");
$DB->query("
G::$DB->query("
UPDATE sphinx_requests_delta
SET ArtistList = (
SELECT GROUP_CONCAT(aa.Name SEPARATOR ' ')
@ -36,8 +34,9 @@ public static function update_sphinx_requests($RequestID) {
GROUP BY NULL
)
WHERE ID = $RequestID");
G::$DB->set_query_id($QueryID);
$Cache->delete_value("requests_$RequestID");
G::$Cache->delete_value("requests_$RequestID");
}
@ -55,14 +54,13 @@ public static function update_sphinx_requests($RequestID) {
//
//In places where the output from this is merged with sphinx filters, it will be in a different order.
public static function get_requests($RequestIDs, $Return = true) {
global $DB, $Cache;
// Try to fetch the requests from the cache first.
$Found = array_flip($RequestIDs);
$NotFound = array_flip($RequestIDs);
foreach ($RequestIDs as $RequestID) {
$Data = $Cache->get_value("request_$RequestID");
$Data = G::$Cache->get_value("request_$RequestID");
if (!empty($Data)) {
unset($NotFound[$RequestID]);
$Found[$RequestID] = $Data;
@ -76,7 +74,9 @@ public static function get_requests($RequestIDs, $Return = true) {
*/
if (count($NotFound) > 0) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
r.ID AS ID,
r.UserID,
@ -106,13 +106,14 @@ public static function get_requests($RequestIDs, $Return = true) {
LEFT JOIN users_main AS filler ON filler.ID = FillerID AND FillerID != 0
WHERE r.ID IN ($IDs)
ORDER BY ID");
$Requests = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
$Requests = $DB->to_array();
foreach ($Requests as $Request) {
unset($NotFound[$Request['ID']]);
$Request['Tags'] = self::get_tags($Request['ID']);
$Found[$Request['ID']] = $Request;
$Cache->cache_value('request_'.$Request['ID'], $Request, 0);
G::$Cache->cache_value('request_'.$Request['ID'], $Request, 0);
}
}
@ -122,53 +123,14 @@ public static function get_requests($RequestIDs, $Return = true) {
}
}
public static function get_comment_count($RequestID) {
global $Cache, $DB;
$NumComments = $Cache->get_value("request_comments_$RequestID");
if ($NumComments === false) {
$DB->query("
SELECT COUNT(ID)
FROM requests_comments
WHERE RequestID = '$RequestID'");
list($NumComments) = $DB->next_record();
$Cache->cache_value("request_comments_$RequestID", $NumComments, 0);
}
return $NumComments;
}
public static function get_comment_catalogue($RequestID, $CatalogueID) {
global $Cache, $DB;
$Catalogue = $Cache->get_value("request_comments_$RequestID"."_catalogue_$CatalogueID");
if ($Catalogue === false) {
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
$DB->query("
SELECT
c.ID,
c.AuthorID,
c.AddedTime,
c.Body,
c.EditedUserID,
c.EditedTime,
u.Username
FROM requests_comments as c
LEFT JOIN users_main AS u ON u.ID = c.EditedUserID
WHERE c.RequestID = '$RequestID'
ORDER BY c.ID
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false, MYSQLI_ASSOC);
$Cache->cache_value("request_comments_$RequestID"."_catalogue_$CatalogueID", $Catalogue, 0);
}
return $Catalogue;
}
public static function get_artists($RequestID) {
global $Cache, $DB;
$Artists = $Cache->get_value("request_artists_$RequestID");
$Artists = G::$Cache->get_value("request_artists_$RequestID");
if (is_array($Artists)) {
$Results = $Artists;
} else {
$Results = array();
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ra.ArtistID,
aa.Name,
@ -177,20 +139,20 @@ public static function get_artists($RequestID) {
JOIN artists_alias AS aa ON ra.AliasID = aa.AliasID
WHERE ra.RequestID = $RequestID
ORDER BY ra.Importance ASC, aa.Name ASC;");
$ArtistRaw = $DB->to_array();
$ArtistRaw = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
foreach ($ArtistRaw as $ArtistRow) {
list($ArtistID, $ArtistName, $ArtistImportance) = $ArtistRow;
$Results[$ArtistImportance][] = array('id' => $ArtistID, 'name' => $ArtistName);
}
$Cache->cache_value("request_artists_$RequestID", $Results);
G::$Cache->cache_value("request_artists_$RequestID", $Results);
}
return $Results;
}
public static function get_tags($RequestID) {
global $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
rt.TagID,
t.Name
@ -198,7 +160,8 @@ public static function get_tags($RequestID) {
JOIN tags AS t ON rt.TagID = t.ID
WHERE rt.RequestID = $RequestID
ORDER BY rt.TagID ASC");
$Tags = $DB->to_array();
$Tags = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
$Results = array();
foreach ($Tags as $TagsRow) {
list($TagID, $TagName) = $TagsRow;
@ -208,11 +171,11 @@ public static function get_tags($RequestID) {
}
public static function get_votes_array($RequestID) {
global $Cache, $DB;
$RequestVotes = $Cache->get_value("request_votes_$RequestID");
$RequestVotes = G::$Cache->get_value("request_votes_$RequestID");
if (!is_array($RequestVotes)) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
rv.UserID,
rv.Bounty,
@ -221,13 +184,13 @@ public static function get_votes_array($RequestID) {
LEFT JOIN users_main AS u ON u.ID = rv.UserID
WHERE rv.RequestID = $RequestID
ORDER BY rv.Bounty DESC");
if (!$DB->has_results()) {
if (!G::$DB->has_results()) {
error(0);
} else {
$Votes = $DB->to_array();
$Votes = G::$DB->to_array();
$RequestVotes = array();
$RequestVotes['TotalBounty'] = array_sum($DB->collect('Bounty'));
$RequestVotes['TotalBounty'] = array_sum(G::$DB->collect('Bounty'));
foreach ($Votes as $Vote) {
list($UserID, $Bounty, $Username) = $Vote;
@ -236,8 +199,9 @@ public static function get_votes_array($RequestID) {
}
$RequestVotes['Voters'] = $VotesArray;
$Cache->cache_value("request_votes_$RequestID", $RequestVotes);
G::$Cache->cache_value("request_votes_$RequestID", $RequestVotes);
}
G::$DB->set_query_id($QueryID);
}
return $RequestVotes;
}

View File

@ -81,6 +81,10 @@
// Autoload classes.
require(SERVER_ROOT.'/classes/classloader.php');
// Note: G::initialize is called twice.
// This is necessary as the code inbetween (initialization of $LoggedUser) makes use of G::$DB and G::$Cache.
// TODO: remove one of the calls once we're moving everything into that class
G::initialize();
//Begin browser identification
@ -310,24 +314,24 @@
* Log out the current session
*/
function logout() {
global $SessionID, $LoggedUser, $DB, $Cache;
global $SessionID;
setcookie('session', '', time() - 60 * 60 * 24 * 365, '/', '', false);
setcookie('keeplogged', '', time() - 60 * 60 * 24 * 365, '/', '', false);
setcookie('session', '', time() - 60 * 60 * 24 * 365, '/', '', false);
if ($SessionID) {
$DB->query("
G::$DB->query("
DELETE FROM users_sessions
WHERE UserID = '$LoggedUser[ID]'
WHERE UserID = '" . G::$LoggedUser['ID'] . "'
AND SessionID = '".db_string($SessionID)."'");
$Cache->begin_transaction('users_sessions_'.$LoggedUser['ID']);
$Cache->delete_row($SessionID);
$Cache->commit_transaction(0);
G::$Cache->begin_transaction('users_sessions_' . G::$LoggedUser['ID']);
G::$Cache->delete_row($SessionID);
G::$Cache->commit_transaction(0);
}
$Cache->delete_value('user_info_'.$LoggedUser['ID']);
$Cache->delete_value('user_stats_'.$LoggedUser['ID']);
$Cache->delete_value('user_info_heavy_'.$LoggedUser['ID']);
G::$Cache->delete_value('user_info_' . G::$LoggedUser['ID']);
G::$Cache->delete_value('user_stats_' . G::$LoggedUser['ID']);
G::$Cache->delete_value('user_info_heavy_' . G::$LoggedUser['ID']);
header('Location: login.php');
@ -335,8 +339,8 @@ function logout() {
}
function enforce_login() {
global $SessionID, $LoggedUser;
if (!$SessionID || !$LoggedUser) {
global $SessionID;
if (!$SessionID || !G::$LoggedUser) {
setcookie('redirect', $_SERVER['REQUEST_URI'], time() + 60 * 30, '/', '', false);
logout();
}
@ -350,9 +354,8 @@ function enforce_login() {
* @return authorisation status. Prints an error message to LAB_CHAN on IRC on failure.
*/
function authorize($Ajax = false) {
global $LoggedUser;
if (empty($_REQUEST['auth']) || $_REQUEST['auth'] != $LoggedUser['AuthKey']) {
send_irc("PRIVMSG ".LAB_CHAN." :".$LoggedUser['Username']." just failed authorize on ".$_SERVER['REQUEST_URI']." coming from ".$_SERVER['HTTP_REFERER']);
if (empty($_REQUEST['auth']) || $_REQUEST['auth'] != G::$LoggedUser['AuthKey']) {
send_irc("PRIVMSG ".LAB_CHAN." :".G::$LoggedUser['Username']." just failed authorize on ".$_SERVER['REQUEST_URI']." coming from ".$_SERVER['HTTP_REFERER']);
error('Invalid authorization key. Go back, refresh, and try again.', $Ajax);
return false;
}

View File

@ -45,7 +45,6 @@ function SPHINX_SEARCH() {
****************************************************************/
function search($Query = '', $CachePrefix = '', $CacheLength = 0, $ReturnData = array(), $SQL = '', $IDColumn = 'ID') {
global $Cache, $DB;
$QueryStartTime = microtime(true);
$Result = $this->Query($Query, $this->Index);
$QueryEndTime = microtime(true);
@ -61,9 +60,9 @@ function search($Query = '', $CachePrefix = '', $CacheLength = 0, $ReturnData =
$this->Time += ($QueryEndTime - $QueryStartTime) * 1000;
if ($Result === false) {
if ($this->_connerror && !$Cache->get_value('sphinx_crash_reported')) {
if ($this->_connerror && !G::$Cache->get_value('sphinx_crash_reported')) {
send_irc('PRIVMSG '.ADMIN_CHAN.' :!dev Connection to searchd failed');
$Cache->cache_value('sphinx_crash_reported', 1, 3600);
G::$Cache->cache_value('sphinx_crash_reported', 1, 3600);
}
send_irc('PRIVMSG '.LAB_CHAN." :Search for \"$Query\" (".str_replace("\n", '', print_r($this->Filters, true)).') failed: '.$this->GetLastError());
}
@ -89,7 +88,7 @@ function search($Query = '', $CachePrefix = '', $CacheLength = 0, $ReturnData =
foreach ($MatchIDs as $Match) {
$Matches[$Match] = $Matches[$Match]['attrs'];
if (!empty($CachePrefix)) {
$Data = $Cache->get_value($CachePrefix."_$Match");
$Data = G::$Cache->get_value($CachePrefix."_$Match");
if ($Data == false) {
$NotFound[] = $Match;
continue;
@ -121,11 +120,13 @@ function search($Query = '', $CachePrefix = '', $CacheLength = 0, $ReturnData =
if ($SQL != '') {
if (!empty($NotFound)) {
$DB->query(str_replace('%ids', implode(',', $NotFound), $SQL));
while ($Data = $DB->next_record(MYSQLI_ASSOC)) {
$QueryID = G::$DB->get_query_id();
G::$DB->query(str_replace('%ids', implode(',', $NotFound), $SQL));
while ($Data = G::$DB->next_record(MYSQLI_ASSOC)) {
$Matches[$Data[$IDColumn]] = array_merge($Matches[$Data[$IDColumn]], $Data);
$Cache->cache_value($CachePrefix.'_'.$Data[$IDColumn], $Data, $CacheLength);
G::$Cache->cache_value($CachePrefix.'_'.$Data[$IDColumn], $Data, $CacheLength);
}
G::$DB->set_query_id($QueryID);
}
} else {
$Matches = array('matches' => $Matches, 'notfound' => $NotFound);

View File

@ -67,12 +67,14 @@ class SiteHistory {
public static function get_months() {
$Results = G::$Cache->get_value("site_history_months");
if (!$Results) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT DISTINCT
YEAR(DATE) AS Year, MONTH(Date) AS Month, MONTHNAME(Date) AS MonthName
FROM site_history
ORDER BY Date DESC");
$Results = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("site_history_months", $Results, 0);
}
return $Results;
@ -80,13 +82,16 @@ public static function get_months() {
public static function get_event($ID) {
if (!empty($ID)) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ID, Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date
FROM site_history
WHERE ID = '$ID'
ORDER BY Date DESC");
return G::$DB->next_record();
SELECT
ID, Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date
FROM site_history
WHERE ID = '$ID'
ORDER BY Date DESC");
$Event = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
return $Event;
}
}
@ -95,13 +100,13 @@ public static function get_latest_events($Limit) {
}
public static function get_events($Month, $Year, $Title, $Category, $SubCategory, $Tags, $Limit) {
$Month = (int) $Month;
$Year = (int) $Year;
$Month = (int)$Month;
$Year = (int)$Year;
$Title = db_string($Title);
$Category = (int) $Category;
$SubCategory = (int) $SubCategory;
$Category = (int)$Category;
$SubCategory = (int)$SubCategory;
$Tags = db_string($Tags);
$Limit = (int) $Limit;
$Limit = (int)$Limit;
$Where = array();
if (!empty($Month)) {
$Where[] = " MONTH(Date) = '$Month' ";
@ -119,37 +124,40 @@ public static function get_events($Month, $Year, $Title, $Category, $SubCategory
$Where[] = " SubCategory = '$SubCategory '";
}
if (!empty($Tags)) {
$Tags = explode(",", $Tags);
$Or = "(";
foreach($Tags as $Tag) {
$Tags = explode(',', $Tags);
$Or = '(';
foreach ($Tags as $Tag) {
$Tag = trim($Tag);
$Or .= " Tags LIKE '%$Tag%' OR ";
}
if (strlen($Or) > 1) {
$Or = rtrim($Or, "OR ");
$Or .= ")";
$Or = rtrim($Or, 'OR ');
$Or .= ')';
$Where[] = $Or;
}
}
if (!empty($Limit)) {
$Limit = " LIMIT $Limit";
} else {
$Limit = "";
$Limit = '';
}
if (count($Where) > 0) {
$Query = " WHERE " . implode("AND", $Where);
$Query = ' WHERE ' . implode('AND', $Where);
} else {
$Query = "";
$Query = '';
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ID, Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date
FROM site_history
$Query
ORDER BY Date DESC
$Limit");
return G::$DB->to_array();
SELECT
ID, Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date
FROM site_history
$Query
ORDER BY Date DESC
$Limit");
$Events = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
return $Events;
}
public static function add_event($Date, $Title, $Link, $Category, $SubCategory, $Tags, $Body, $UserID) {
@ -163,27 +171,29 @@ public static function add_event($Date, $Title, $Link, $Category, $SubCategory,
}
$Title = db_string($Title);
$Link = db_string($Link);
$Category = (int) $Category;
$SubCategory = (int) $SubCategory;
$Category = (int)$Category;
$SubCategory = (int)$SubCategory;
$Tags = db_string(strtolower((preg_replace('/\s+/', '', $Tags))));
$ExplodedTags = explode(",", $Tags);
foreach($ExplodedTags as $Tag) {
$ExplodedTags = explode(',', $Tags);
foreach ($ExplodedTags as $Tag) {
if (!in_array($Tag, self::get_tags())) {
error("Invalid tag");
}
}
$Body = db_string($Body);
$UserID = (int) $UserID;
$UserID = (int)$UserID;
if (empty($Title) || empty($Category) || empty($SubCategory)) {
error("Error");
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO site_history
(Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date)
VALUES
('$Title', '$Link', '$Category', '$SubCategory', '$Tags', '$Body', '$UserID', '$Date')");
INSERT INTO site_history
(Title, Url, Category, SubCategory, Tags, Body, AddedBy, Date)
VALUES
('$Title', '$Link', '$Category', '$SubCategory', '$Tags', '$Body', '$UserID', '$Date')");
G::$DB->set_query_id($QueryID);
G::$Cache->delete_value("site_history_months");
}
@ -197,14 +207,14 @@ public static function update_event($ID, $Date, $Title, $Link, $Category, $SubCa
error("Error");
}
}
$ID = (int) $ID;
$ID = (int)$ID;
$Title = db_string($Title);
$Link = db_string($Link);
$Category = (int) $Category;
$SubCategory = (int) $SubCategory;
$Category = (int)$Category;
$SubCategory = (int)$SubCategory;
$Tags = db_string(strtolower((preg_replace('/\s+/', '', $Tags))));
$ExplodedTags = explode(",", $Tags);
foreach($ExplodedTags as $Tag) {
foreach ($ExplodedTags as $Tag) {
if (!in_array($Tag, self::get_tags())) {
error("Invalid tag");
}
@ -216,6 +226,7 @@ public static function update_event($ID, $Date, $Title, $Link, $Category, $SubCa
error("Error");
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE site_history
SET
@ -229,6 +240,7 @@ public static function update_event($ID, $Date, $Title, $Link, $Category, $SubCa
Date = '$Date'
WHERE
ID = '$ID'");
G::$DB->set_query_id($QueryID);
G::$Cache->delete_value("site_history_months");
}
@ -236,7 +248,9 @@ public static function delete_event($ID) {
if (empty($ID)) {
error(404);
}
$QueryID = G::$DB->get_query_id();
G::$DB->query("DELETE FROM site_history WHERE ID = '$ID'");
G::$DB->set_query_id($QueryID);
G::$Cache->delete_value("site_history_months");
}
@ -251,4 +265,4 @@ public static function get_sub_categories() {
public static function get_tags() {
return self::$Tags;
}
}
}

View File

@ -16,7 +16,7 @@ public static function render_events($Events) {
$Categories = SiteHistory::get_categories();
$SubCategories = SiteHistory::get_sub_categories();
$CanEdit = check_perms('users_mod') ;
foreach($Events as $Event) { ?>
foreach ($Events as $Event) { ?>
<div class="box">
<div class="head colhead_dark">
<div class="title">
@ -51,8 +51,8 @@ public static function render_events($Events) {
private static function render_tags($Tags) {
$Tags = explode(',', $Tags);
natcasesort($Tags);
$FormattedTags = "";
foreach($Tags as $Tag) {
$FormattedTags = '';
foreach ($Tags as $Tag) {
$FormattedTags .= "<a href='sitehistory.php?action=search&amp;tags=". $Tag . "'>" . $Tag . "</a>, ";
}
echo rtrim($FormattedTags, ', ');
@ -87,7 +87,7 @@ public static function render_search() { ?>
<select name="category" id="category">
<option value="0">Choose a category</option>
<? $Categories = SiteHistory::get_categories();
foreach($Categories as $Key => $Value) { ?>
foreach ($Categories as $Key => $Value) { ?>
<option <?=$Key == $Event['Category'] ? 'selected="selected"' : ''?> value="<?=$Key?>"><?=$Value?></option>
<? } ?>
</select>
@ -95,7 +95,7 @@ public static function render_search() { ?>
<select name="subcategory">
<option value="0">Choose a subcategory</option>
<? $SubCategories = SiteHistory::get_sub_categories();
foreach($SubCategories as $Key => $Value) { ?>
foreach ($SubCategories as $Key => $Value) { ?>
<option <?=$Key == $Event['SubCategory'] ? 'selected="selected"' : ''?> value="<?=$Key?>"><?=$Value?></option>
<? } ?>
</select>
@ -143,7 +143,7 @@ public static function render_edit_form($Event) { ?>
<select id="category" name="category" class="required">
<option value="0">Choose a category</option>
<? $Categories = SiteHistory::get_categories();
foreach($Categories as $Key => $Value) { ?>
foreach ($Categories as $Key => $Value) { ?>
<option <?=$Key == $Event['Category'] ? 'selected="selected"' : ''?> value="<?=$Key?>"><?=$Value?></option>
<? } ?>
</select>
@ -155,7 +155,7 @@ public static function render_edit_form($Event) { ?>
<select id="category" name="sub_category" class="required">
<option value="0">Choose a subcategory</option>
<? $SubCategories = SiteHistory::get_sub_categories();
foreach($SubCategories as $Key => $Value) { ?>
foreach ($SubCategories as $Key => $Value) { ?>
<option <?=$Key == $Event['SubCategory'] ? 'selected="selected"' : ''?> value="<?=$Key?>"><?=$Value?></option>
<? } ?>
</select>
@ -168,7 +168,7 @@ public static function render_edit_form($Event) { ?>
<select id="tag_list">
<option>Choose tags</option>
<? $Tags = SiteHistory::get_tags();
foreach($Tags as $Tag) { ?>
foreach ($Tags as $Tag) { ?>
<option><?=$Tag?></option>
<? } ?>
</select>
@ -207,4 +207,4 @@ public static function render_recent_sidebar($Events) { ?>
</ul>
</div>
<? }
}
}

View File

@ -0,0 +1,334 @@
<?
class Subscriptions {
/**
* Parse a post/comment body for quotes and notify all quoted users that have quote notifications enabled.
* @param string $Body
* @param int $PostID
* @param string $Page
* @param int $PageID
*/
public static function quote_notify($Body, $PostID, $Page, $PageID) {
$QueryID = G::$DB->get_query_id();
/*
* Explanation of the parameters PageID and Page: Page contains where
* this quote comes from and can be forums, artist, collages, requests
* or torrents. The PageID contains the additional value that is
* necessary for the users_notify_quoted table. The PageIDs for the
* different Page are: forums: TopicID artist: ArtistID collages:
* CollageID requests: RequestID torrents: GroupID
*/
$Matches = array();
preg_match_all('/\[quote(?:=(.*)(?:\|.*)?)?]|\[\/quote]/iU', $Body, $Matches, PREG_SET_ORDER);
if (count($Matches)) {
$Usernames = array();
$Level = 0;
foreach ($Matches as $M) {
if ($M[0] != '[/quote]') {
if ($Level == 0 && isset($M[1]) && strlen($M[1]) > 0 && preg_match(USERNAME_REGEX, $M[1])) {
$Usernames[] = preg_replace('/(^[.,]*)|([.,]*$)/', '', $M[1]); // wut?
}
++$Level;
} else {
--$Level;
}
}
}
// remove any dupes in the array (the fast way)
$Usernames = array_flip(array_flip($Usernames));
G::$DB->query("
SELECT m.ID
FROM users_main AS m
LEFT JOIN users_info AS i ON i.UserID = m.ID
WHERE m.Username IN ('" . implode("', '", $Usernames) . "')
AND i.NotifyOnQuote = '1'
AND i.UserID != " . G::$LoggedUser['ID']);
$Results = G::$DB->to_array();
foreach ($Results as $Result) {
$UserID = db_string($Result['ID']);
$QuoterID = db_string(G::$LoggedUser['ID']);
$Page = db_string($Page);
$PageID = db_string($PageID);
$PostID = db_string($PostID);
G::$DB->query("
INSERT IGNORE INTO users_notify_quoted
(UserID, QuoterID, Page, PageID, PostID, Date)
VALUES
('$UserID', '$QuoterID', '$Page', '$PageID', '$PostID', '" . sqltime() . "')");
G::$Cache->delete_value('notify_quoted_' . $UserID);
}
G::$DB->set_query_id($QueryID);
}
/**
* (Un)subscribe from a forum thread.
* If UserID == 0, G::$LoggedUser[ID] is used
* @param int $TopicID
* @param int $UserID
*/
public static function subscribe($TopicID, $UserID = 0) {
if ($UserID == 0) {
$UserID = G::$LoggedUser['ID'];
}
$QueryID = G::$DB->get_query_id();
$UserSubscriptions = self::get_subscriptions();
$Key = self::has_subscribed($TopicID);
if ($Key !== false) {
G::$DB->query('DELETE FROM users_subscriptions WHERE UserID = ' . db_string($UserID) . ' AND TopicID = ' . db_string($TopicID));
unset($UserSubscriptions[$Key]);
} else {
G::$DB->query("INSERT IGNORE INTO users_subscriptions (UserID, TopicID) VALUES ($UserID, " . db_string($TopicID) . ")");
array_push($UserSubscriptions, $TopicID);
}
G::$Cache->replace_value('subscriptions_user_' . $UserID, $UserSubscriptions, 0);
G::$Cache->delete_value('subscriptions_user_new_' . $UserID);
G::$DB->set_query_id($QueryID);
}
/**
* (Un)subscribe from comments.
* If UserID == 0, G::$LoggedUser[ID] is used
* @param string $Page 'artist', 'collages', 'requests' or 'torrents'
* @param int $PageID ArtistID, CollageID, RequestID or GroupID
* @param int $UserID
*/
public static function subscribe_comments($Page, $PageID, $UserID = 0) {
if ($UserID == 0) {
$UserID = G::$LoggedUser['ID'];
}
$QueryID = G::$DB->get_query_id();
$UserCommentSubscriptions = self::get_comment_subscriptions();
$Key = self::has_subscribed_comments($Page, $PageID);
if ($Key !== false) {
G::$DB->query("DELETE FROM users_subscriptions_comments WHERE UserID = " . db_string($UserID) . " AND Page = '" . db_string($Page) . "' AND PageID = " . db_string($PageID));
unset($UserCommentSubscriptions[$Key]);
} else {
G::$DB->query("INSERT IGNORE INTO users_subscriptions_comments (UserID, Page, PageID) VALUES ($UserID, '" . db_string($Page) . "', " . db_string($PageID) . ")");
array_push($UserCommentSubscriptions, array($Page, $PageID));
}
G::$Cache->replace_value('subscriptions_comments_user_' . $UserID, $UserCommentSubscriptions, 0);
G::$Cache->delete_value('subscriptions_comments_user_new_' . $UserID);
G::$DB->set_query_id($QueryID);
}
/**
* Read $UserID's subscriptions. If the cache key isn't set, it gets filled.
* If UserID == 0, G::$LoggedUser[ID] is used
* @param int $UserID
* @return array Array of TopicIDs
*/
public static function get_subscriptions($UserID = 0) {
if ($UserID == 0) {
$UserID = G::$LoggedUser['ID'];
}
$QueryID = G::$DB->get_query_id();
$UserSubscriptions = G::$Cache->get_value('subscriptions_user_' . $UserID);
if ($UserSubscriptions === false) {
G::$DB->query('SELECT TopicID FROM users_subscriptions WHERE UserID = ' . db_string($UserID));
$UserSubscriptions = G::$DB->collect(0);
G::$Cache->cache_value('subscriptions_user_' . $UserID, $UserSubscriptions, 0);
}
G::$DB->set_query_id($QueryID);
return $UserSubscriptions;
}
/**
* Same as self::get_subscriptions, but for comment subscriptions
* @param int $UserID
* @return array Array of ($Page, $PageID)
*/
public static function get_comment_subscriptions($UserID = 0) {
if ($UserID == 0) {
$UserID = G::$LoggedUser['ID'];
}
$QueryID = G::$DB->get_query_id();
$UserCommentSubscriptions = G::$Cache->get_value('subscriptions_comments_user_' . $UserID);
if ($UserCommentSubscriptions === false) {
G::$DB->query('SELECT Page, PageID FROM users_subscriptions_comments WHERE UserID = ' . db_string($UserID));
$UserCommentSubscriptions = G::$DB->to_array(false, MYSQLI_NUM);
G::$Cache->cache_value('subscriptions_comments_user_' . $UserID, $UserCommentSubscriptions, 0);
}
G::$DB->set_query_id($QueryID);
return $UserCommentSubscriptions;
}
/**
* Returns whether or not the current user has new subscriptions. This handles both forum and comment subscriptions.
* @return int Number of unread subscribed threads/comments
*/
public static function has_new_subscriptions() {
$QueryID = G::$DB->get_query_id();
$NewSubscriptions = G::$Cache->get_value('subscriptions_user_new_' . G::$LoggedUser['ID']);
if ($NewSubscriptions === false) {
// forum subscriptions
G::$DB->query("SELECT COUNT(1)
FROM users_subscriptions AS s
LEFT JOIN forums_last_read_topics AS l ON l.UserID = s.UserID AND l.TopicID = s.TopicID
JOIN forums_topics AS t ON t.ID = s.TopicID
JOIN forums AS f ON f.ID = t.ForumID
WHERE " . Forums::user_forums_sql() . "
AND IF(t.IsLocked = '1' AND t.IsSticky = '0'" . ", t.LastPostID, IF(l.PostID IS NULL, 0, l.PostID)) < t.LastPostID
AND s.UserID = " . G::$LoggedUser['ID']);
list($NewForumSubscriptions) = G::$DB->next_record();
// comment subscriptions
G::$DB->query("SELECT COUNT(1)
FROM users_subscriptions_comments AS s
LEFT JOIN users_comments_last_read AS lr ON lr.UserID = s.UserID AND lr.Page = s.Page AND lr.PageID = s.PageID
LEFT JOIN comments AS c ON c.ID = (SELECT MAX(ID) FROM comments WHERE Page = s.Page AND PageID = s.PageID)
LEFT JOIN collages AS co ON s.Page = 'collages' AND co.ID = s.PageID
WHERE s.UserID = " . G::$LoggedUser['ID'] . "
AND (s.Page != 'collages' OR co.Deleted = '0')
AND IF(lr.PostID IS NULL, 0, lr.PostID) < c.ID");
list($NewCommentSubscriptions) = G::$DB->next_record();
$NewSubscriptions = $NewForumSubscriptions + $NewCommentSubscriptions;
G::$Cache->cache_value('subscriptions_user_new_' . G::$LoggedUser['ID'], $NewSubscriptions, 0);
}
G::$DB->set_query_id($QueryID);
return (int)$NewSubscriptions;
}
/**
* Returns whether or not the current user has new quote notifications.
* @return int Number of unread quote notifications
*/
public static function has_new_quote_notifications() {
$QuoteNotificationsCount = G::$Cache->get_value('notify_quoted_' . G::$LoggedUser['ID']);
if ($QuoteNotificationsCount === false) {
$sql = "
SELECT COUNT(1)
FROM users_notify_quoted AS q
LEFT JOIN forums_topics AS t ON t.ID = q.PageID
LEFT JOIN forums AS f ON f.ID = t.ForumID
LEFT JOIN collages AS c ON q.Page = 'collages' AND c.ID = q.PageID
WHERE q.UserID = " . G::$LoggedUser['ID'] . "
AND q.UnRead
AND (q.Page != 'forums' OR " . Forums::user_forums_sql() . ")
AND (q.Page != 'collages' OR c.Deleted = '0')";
$QueryID = G::$DB->get_query_id();
G::$DB->query($sql);
list($QuoteNotificationsCount) = G::$DB->next_record();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('notify_quoted_' . G::$LoggedUser['ID'], $QuoteNotificationsCount, 0);
}
return (int)$QuoteNotificationsCount;
}
/**
* Returns the key which holds this $TopicID in the subscription array.
* Use type-aware comparison operators with this! (ie. if (self::has_subscribed($TopicID) !== false) { ... })
* @param int $TopicID
* @return bool|int
*/
public static function has_subscribed($TopicID) {
$UserSubscriptions = self::get_subscriptions();
return array_search($TopicID, $UserSubscriptions);
}
/**
* Same as has_subscribed, but for comment subscriptions.
* @param string $Page 'artist', 'collages', 'requests' or 'torrents'
* @param int $PageID
* @return bool|int
*/
public static function has_subscribed_comments($Page, $PageID) {
$UserCommentSubscriptions = self::get_comment_subscriptions();
return array_search(array($Page, $PageID), $UserCommentSubscriptions);
}
/**
* Clear the subscription cache for all subscribers of a forum thread or artist/collage/request/torrent comments.
* @param type $Page 'forums', 'artist', 'collages', 'requests' or 'torrents'
* @param type $PageID TopicID, ArtistID, CollageID, RequestID or GroupID, respectively
*/
public static function flush_subscriptions($Page, $PageID) {
$QueryID = G::$DB->get_query_id();
if ($Page == 'forums') {
G::$DB->query("SELECT UserID FROM users_subscriptions WHERE TopicID = '$PageID'");
} else {
G::$DB->query("SELECT UserID FROM users_subscriptions_comments WHERE Page = '$Page' AND PageID = '$PageID'");
}
$Subscribers = G::$DB->collect('UserID');
foreach($Subscribers as $Subscriber) {
G::$Cache->delete_value('subscriptions_user_new_'.$Subscriber);
}
G::$DB->set_query_id($QueryID);
}
/**
* Move all $Page subscriptions from $OldPageID to $NewPageID (for example when merging torrent groups).
* Passing $NewPageID = null will delete the subscriptions.
* @param string $Page 'forums', 'artist', 'collages', 'requests' or 'torrents'
* @param int $OldPageID TopicID, ArtistID, CollageID, RequestID or GroupID, respectively
* @param int|null $NewPageID As $OldPageID, or null to delete the subscriptions
*/
public static function move_subscriptions($Page, $OldPageID, $NewPageID) {
self::flush_subscriptions($Page, $OldPageID);
$QueryID = G::$DB->get_query_id();
if ($Page == 'forums') {
if ($NewPageID !== null) {
G::$DB->query("UPDATE IGNORE users_subscriptions SET TopicID = '$NewPageID' WHERE TopicID = '$OldPageID'");
// explanation see below
G::$DB->query("UPDATE IGNORE forums_last_read_topics SET TopicID = $NewPageID WHERE TopicID = $OldPageID");
G::$DB->query("
SELECT UserID, MIN(PostID)
FROM forums_last_read_topics
WHERE TopicID IN ($OldPageID, $NewPageID)
GROUP BY UserID
HAVING COUNT(1) = 2");
$Results = G::$DB->to_array(false, MYSQLI_NUM);
foreach ($Results as $Result) {
G::$DB->query("UPDATE forums_last_read_topics SET PostID = $Result[1] WHERE TopicID = $NewPageID AND UserID = $Result[0]");
}
}
G::$DB->query("DELETE FROM users_subscriptions WHERE TopicID = '$OldPageID'");
G::$DB->query("DELETE FROM forums_last_read_topics WHERE TopicID = $OldPageID");
} else {
if($NewPageID !== null) {
G::$DB->query("UPDATE IGNORE users_subscriptions_comments SET PageID = '$NewPageID' WHERE Page = '$Page' AND PageID = '$OldPageID'");
// last read handling
// 1) update all rows that have no key collisions (i.e. users that haven't previously read both pages or if there are only comments on one page)
G::$DB->query("UPDATE IGNORE users_comments_last_read SET PageID = '$NewPageID' WHERE Page = '$Page' AND PageID = $OldPageID");
// 2) get all last read records with key collisions (i.e. there are records for one user for both PageIDs)
G::$DB->query("
SELECT UserID, MIN(PostID)
FROM users_comments_last_read
WHERE Page = '$Page'
AND PageID IN ($OldPageID, $NewPageID)
GROUP BY UserID
HAVING COUNT(1) = 2");
$Results = G::$DB->to_array(false, MYSQLI_NUM);
// 3) update rows for those people found in 2) to the earlier post
foreach ($Results as $Result) {
G::$DB->query("UPDATE users_comments_last_read SET PostID = $Result[1] WHERE Page = '$Page' AND PageID = $NewPageID AND UserID = $Result[0]");
}
}
G::$DB->query("DELETE FROM users_subscriptions_comments WHERE Page = '$Page' AND PageID = '$OldPageID'");
G::$DB->query("DELETE FROM users_comments_last_read WHERE Page = '$Page' AND PageID = '$OldPageID'");
}
G::$DB->set_query_id($QueryID);
}
/**
* Clear the quote notification cache for all subscribers of a forum thread or artist/collage/request/torrent comments.
* @param string $Page 'forums', 'artist', 'collages', 'requests' or 'torrents'
* @param int $PageID TopicID, ArtistID, CollageID, RequestID or GroupID, respectively
*/
public static function flush_quote_notifications($Page, $PageID) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("SELECT UserID FROM users_notify_quoted WHERE Page = '$Page' AND PageID = $PageID");
$Subscribers = G::$DB->collect('UserID');
foreach($Subscribers as $Subscriber) {
G::$Cache->delete_value('notify_quoted_'.$Subscriber);
}
G::$DB->set_query_id($QueryID);
}
}

View File

@ -727,9 +727,10 @@ private function to_html ($Array) {
}
if (!empty($Block['Attr'])) {
$Exploded = explode('|', $this->to_html($Block['Attr']));
if (isset($Exploded[1]) && is_numeric($Exploded[1])) {
if (isset($Exploded[1]) && (is_numeric($Exploded[1]) || (in_array($Exploded[1][0], array('a', 't', 'c', 'r')) && is_numeric(substr($Exploded[1], 1))))) {
// the part after | is either a number or starts with a, t, c or r, followed by a number (forum post, artist comment, torrent comment, collage comment or request comment, respectively)
$PostID = trim($Exploded[1]);
$Str .= '<a href="forums.php?action=viewthread&amp;postid='.$PostID.'" onclick="QuoteJump(event, '.$PostID.'); return false;"><strong class="quoteheader">'.$Exploded[0].'</strong> wrote: </a>';
$Str .= '<a href="#" onclick="QuoteJump(event, \''.$PostID.'\'); return false;"><strong class="quoteheader">'.$Exploded[0].'</strong> wrote: </a>';
}
else {
$Str .= '<strong class="quoteheader">'.$Exploded[0].'</strong> wrote: ';
@ -747,8 +748,7 @@ private function to_html ($Array) {
$Str .= '<blockquote class="hidden spoiler">'.$this->to_html($Block['Val']).'</blockquote>';
break;
case 'mature':
global $LoggedUser;
if ($LoggedUser['EnableMatureContent']) {
if (G::$LoggedUser['EnableMatureContent']) {
if (!empty($Block['Attr'])) {
$Str .= '<strong class="mature" style="font-size: 1.2em;">Mature content:</strong><strong> ' . $Block['Attr'] . '</strong><br /> <a href="javascript:void(0);" onclick="BBCode.spoiler(this);">Show</a>';
$Str .= '<blockquote class="hidden spoiler">'.$this->to_html($Block['Val']).'</blockquote>';
@ -758,7 +758,7 @@ private function to_html ($Array) {
}
}
else {
$Str .= '<span class="mature_blocked" style="font-style: italic;"><a href="wiki.php?action=article&amp;id=1063">Mature content</a> has been blocked. You can choose to view mature content by editing your <a href="user.php?action=edit&amp;userid=' . $LoggedUser['ID'] . '">settings</a>.</span>';
$Str .= '<span class="mature_blocked" style="font-style: italic;"><a href="wiki.php?action=article&amp;id=1063">Mature content</a> has been blocked. You can choose to view mature content by editing your <a href="user.php?action=edit&amp;userid=' . G::$LoggedUser['ID'] . '">settings</a>.</span>';
}
break;
case 'img':
@ -905,8 +905,7 @@ private function raw_text ($Array) {
}
private function smileys ($Str) {
global $LoggedUser;
if (!empty($LoggedUser['DisableSmileys'])) {
if (!empty(G::$LoggedUser['DisableSmileys'])) {
return $Str;
}
$Str = strtr($Str, $this->Smileys);

View File

@ -62,69 +62,69 @@ function time_diff($TimeStamp, $Levels = 2, $Span = true, $Lowercase = false) {
if ($Years > 0 && $Levels > 0) {
if ($Years > 1) {
$Return .= $Years.' years';
$Return .= "$Years years";
} else {
$Return .= $Years.' year';
$Return .= "$Years year";
}
$Levels--;
}
if ($Months > 0 && $Levels > 0) {
if ($Return != '') {
$Return.=', ';
$Return .= ', ';
}
if ($Months > 1) {
$Return.=$Months.' months';
$Return .= "$Months months";
} else {
$Return.=$Months.' month';
$Return .= "$Months month";
}
$Levels--;
}
if ($Weeks > 0 && $Levels > 0) {
if ($Return != '') {
$Return.=', ';
$Return .= ', ';
}
if ($Weeks>1) {
$Return.=$Weeks.' weeks';
if ($Weeks > 1) {
$Return .= "$Weeks weeks";
} else {
$Return.=$Weeks.' week';
$Return .= "$Weeks week";
}
$Levels--;
}
if ($Days > 0 && $Levels > 0) {
if ($Return != '') {
$Return.=', ';
$Return .= ', ';
}
if ($Days > 1) {
$Return.=$Days.' days';
$Return .= "$Days days";
} else {
$Return.=$Days.' day';
$Return .= "$Days day";
}
$Levels--;
}
if ($Hours > 0 && $Levels > 0) {
if ($Return != '') {
$Return.=', ';
$Return .= ', ';
}
if ($Hours > 1) {
$Return.=$Hours.' hours';
$Return .= "$Hours hours";
} else {
$Return.=$Hours.' hour';
$Return .= "$Hours hour";
}
$Levels--;
}
if ($Minutes > 0 && $Levels > 0) {
if ($Return != '') {
$Return.=' and ';
$Return .= ' and ';
}
if ($Minutes > 1) {
$Return.=$Minutes.' mins';
$Return .= "$Minutes mins";
} else {
$Return.=$Minutes.' min';
$Return .= "$Minutes min";
}
$Levels--;
}
@ -140,7 +140,7 @@ function time_diff($TimeStamp, $Levels = 2, $Span = true, $Lowercase = false) {
}
if ($Span) {
return '<span class="time" title="'.date('M d Y, H:i', $TimeStamp).'">'.$Return.'</span>';
return '<span class="time tooltip" title="'.date('M d Y, H:i', $TimeStamp).'">'.$Return.'</span>';
} else {
return $Return;
}

View File

@ -6,18 +6,20 @@ class Tools {
* @param string $IP
*/
public static function site_ban_ip($IP) {
global $DB, $Cache, $Debug;
global $Debug;
$A = substr($IP, 0, strcspn($IP, '.'));
$IPNum = Tools::ip_to_unsigned($IP);
$IPBans = $Cache->get_value('ip_bans_'.$A);
$IPBans = G::$Cache->get_value('ip_bans_'.$A);
if (!is_array($IPBans)) {
$SQL = sprintf("
SELECT ID, FromIP, ToIP
FROM ip_bans
WHERE FromIP BETWEEN %d << 24 AND (%d << 24) - 1", $A, $A + 1);
$DB->query($SQL);
$IPBans = $DB->to_array(0, MYSQLI_NUM);
$Cache->cache_value('ip_bans_'.$A, $IPBans, 0);
$QueryID = G::$DB->get_query_id();
G::$DB->query($SQL);
$IPBans = G::$DB->to_array(0, MYSQLI_NUM);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('ip_bans_'.$A, $IPBans, 0);
}
$Debug->log_var($IPBans, 'IP bans for class '.$A);
foreach ($IPBans as $Index => $IPBan) {
@ -59,16 +61,17 @@ public static function geoip($IP) {
if (!$Long || $Long == 2130706433) { // No need to check cc for 127.0.0.1
return false;
}
global $DB;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT EndIP, Code
FROM geoip_country
WHERE $Long >= StartIP
ORDER BY StartIP DESC
LIMIT 1");
if ((!list($EndIP, $Country) = $DB->next_record()) || $EndIP < $Long) {
if ((!list($EndIP, $Country) = G::$DB->next_record()) || $EndIP < $Long) {
$Country = '?';
}
G::$DB->set_query_id($QueryID);
$IPs[$IP] = $Country;
return $Country;
}
@ -115,7 +118,7 @@ public static function get_host_by_ajax($IP) {
* @return string the host.
*/
public static function lookup_ip($IP) {
//TODO: use the $Cache
//TODO: use the G::$Cache
$Output = explode(' ',shell_exec('host -W 1 '.escapeshellarg($IP)));
if (count($Output) == 1 && empty($Output[0])) {
//No output at all implies the command failed
@ -145,7 +148,7 @@ public static function display_ip($IP) {
public static function get_country_code_by_ajax($IP) {
static $ID = 0;
++$ID;
return '<span id="cc_'.$ID.'">Resolving CC...<script type="text/javascript">ajax.get(\'tools.php?action=get_cc&ip='.$IP.'\',function(cc) {$(\'#cc_'.$ID.'\').raw().innerHTML=cc;});</script></span>';
return '<span id="cc_'.$ID.'">Resolving CC...<script type="text/javascript">ajax.get(\'tools.php?action=get_cc&ip='.$IP.'\', function(cc) {$(\'#cc_'.$ID.'\').raw().innerHTML = cc;});</script></span>';
}
@ -156,11 +159,11 @@ public static function get_country_code_by_ajax($IP) {
* @param BanReason 0 - Unknown, 1 - Manual, 2 - Ratio, 3 - Inactive, 4 - Unused.
*/
public static function disable_users($UserIDs, $AdminComment, $BanReason = 1) {
global $Cache, $DB;
$QueryID = G::$DB->get_query_id();
if (!is_array($UserIDs)) {
$UserIDs = array($UserIDs);
}
$DB->query("
G::$DB->query("
UPDATE users_info AS i
JOIN users_main AS m ON m.ID=i.UserID
SET m.Enabled='2',
@ -170,35 +173,35 @@ public static function disable_users($UserIDs, $AdminComment, $BanReason = 1) {
i.BanReason='$BanReason',
i.RatioWatchDownload=".($BanReason == 2 ? 'm.Downloaded' : "'0'")."
WHERE m.ID IN(".implode(',', $UserIDs).') ');
$Cache->decrement('stats_user_count', $DB->affected_rows());
G::$Cache->decrement('stats_user_count', G::$DB->affected_rows());
foreach ($UserIDs as $UserID) {
$Cache->delete_value('enabled_'.$UserID);
$Cache->delete_value('user_info_'.$UserID);
$Cache->delete_value('user_info_heavy_'.$UserID);
$Cache->delete_value('user_stats_'.$UserID);
G::$Cache->delete_value("enabled_$UserID");
G::$Cache->delete_value("user_info_$UserID");
G::$Cache->delete_value("user_info_heavy_$UserID");
G::$Cache->delete_value("user_stats_$UserID");
$DB->query("
G::$DB->query("
SELECT SessionID
FROM users_sessions
WHERE UserID='$UserID'
WHERE UserID = '$UserID'
AND Active = 1");
while (list($SessionID) = $DB->next_record()) {
$Cache->delete_value('session_'.$UserID.'_'.$SessionID);
while (list($SessionID) = G::$DB->next_record()) {
G::$Cache->delete_value("session_$UserID"."_$SessionID");
}
$Cache->delete_value('users_sessions_'.$UserID);
G::$Cache->delete_value("users_sessions_$UserID");
$DB->query("
G::$DB->query("
DELETE FROM users_sessions
WHERE UserID='$UserID'");
WHERE UserID = '$UserID'");
}
// Remove the users from the tracker.
$DB->query("
G::$DB->query('
SELECT torrent_pass
FROM users_main
WHERE ID in (".implode(', ', $UserIDs).')');
$PassKeys = $DB->collect('torrent_pass');
WHERE ID in ('.implode(', ', $UserIDs).')');
$PassKeys = G::$DB->collect('torrent_pass');
$Concat = '';
foreach ($PassKeys as $PassKey) {
if (strlen($Concat) > 3950) { // Ocelot's read buffer is 4 KiB and anything exceeding it is truncated
@ -209,6 +212,7 @@ public static function disable_users($UserIDs, $AdminComment, $BanReason = 1) {
}
}
Tracker::update_tracker('remove_users', array('passkeys' => $Concat));
G::$DB->set_query_id($QueryID);
}
/**
@ -219,49 +223,51 @@ public static function disable_users($UserIDs, $AdminComment, $BanReason = 1) {
* @param string $reason
*/
public static function warn_user($UserID, $Duration, $Reason) {
global $LoggedUser, $DB, $Cache, $Time;
global $Time;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Warned
FROM users_info
WHERE UserID=$UserID
WHERE UserID = $UserID
AND Warned != '0000-00-00 00:00:00'");
if ($DB->has_results()) {
if (G::$DB->has_results()) {
//User was already warned, appending new warning to old.
list($OldDate) = $DB->next_record();
list($OldDate) = G::$DB->next_record();
$NewExpDate = date('Y-m-d H:i:s', strtotime($OldDate) + $Duration);
Misc::send_pm($UserID, 0,
'You have received multiple warnings.',
"When you received your latest warning (set to expire on ".date('Y-m-d', (time() + $Duration)).'), you already had a different warning (set to expire on '.date('Y-m-d', strtotime($OldDate)).").\n\n Due to this collision, your warning status will now expire at ".$NewExpDate.'.');
"When you received your latest warning (set to expire on ".date('Y-m-d', (time() + $Duration)).'), you already had a different warning (set to expire on '.date('Y-m-d', strtotime($OldDate)).").\n\n Due to this collision, your warning status will now expire at $NewExpDate.");
$AdminComment = date('Y-m-d').' - Warning (Clash) extended to expire at '.$NewExpDate.' by '.$LoggedUser['Username']."\nReason: $Reason\n\n";
$AdminComment = date('Y-m-d')." - Warning (Clash) extended to expire at $NewExpDate by " . G::$LoggedUser['Username'] . "\nReason: $Reason\n\n";
$DB->query('
G::$DB->query('
UPDATE users_info
SET
Warned=\''.db_string($NewExpDate).'\',
WarnedTimes=WarnedTimes+1,
AdminComment=CONCAT(\''.db_string($AdminComment).'\',AdminComment)
WHERE UserID=\''.db_string($UserID).'\'');
Warned = \''.db_string($NewExpDate).'\',
WarnedTimes = WarnedTimes + 1,
AdminComment = CONCAT(\''.db_string($AdminComment).'\', AdminComment)
WHERE UserID = \''.db_string($UserID).'\'');
} else {
//Not changing, user was not already warned
$WarnTime = time_plus($Duration);
$Cache->begin_transaction('user_info_'.$UserID);
$Cache->update_row(false, array('Warned' => $WarnTime));
$Cache->commit_transaction(0);
G::$Cache->begin_transaction("user_info_$UserID");
G::$Cache->update_row(false, array('Warned' => $WarnTime));
G::$Cache->commit_transaction(0);
$AdminComment = date('Y-m-d').' - Warned until '.$WarnTime.' by '.$LoggedUser['Username']."\nReason: $Reason\n\n";
$AdminComment = date('Y-m-d')." - Warned until $WarnTime by " . G::$LoggedUser['Username'] . "\nReason: $Reason\n\n";
$DB->query('
G::$DB->query('
UPDATE users_info
SET
Warned=\''.db_string($WarnTime).'\',
WarnedTimes=WarnedTimes+1,
AdminComment=CONCAT(\''.db_string($AdminComment).'\',AdminComment)
WHERE UserID=\''.db_string($UserID).'\'');
Warned = \''.db_string($WarnTime).'\',
WarnedTimes = WarnedTimes + 1,
AdminComment = CONCAT(\''.db_string($AdminComment).'\',AdminComment)
WHERE UserID = \''.db_string($UserID).'\'');
}
G::$DB->set_query_id($QueryID);
}
/**
@ -270,11 +276,12 @@ public static function warn_user($UserID, $Duration, $Reason) {
* @param unknown $AdminComment Comment to update with
*/
public static function update_user_notes($UserID, $AdminComment) {
global $DB;
$DB->query('
$QueryID = G::$DB->get_query_id();
G::$DB->query('
UPDATE users_info
SET AdminComment=CONCAT(\''.db_string($AdminComment).'\',AdminComment)
WHERE UserID=\''.db_string($UserID).'\'');
SET AdminComment = CONCAT(\''.db_string($AdminComment).'\',AdminComment)
WHERE UserID = \''.db_string($UserID).'\'');
G::$DB->set_query_id($QueryID);
}
}
?>

View File

@ -45,14 +45,13 @@ function TORRENT_FORM($Torrent = false, $Error = false, $NewTorrent = true) {
}
function head() {
global $LoggedUser;
?>
<div class="thin">
<? if ($this->NewTorrent) { ?>
<p style="text-align: center;">
Your personal announce URL is:<br />
<input type="text" value="<?= ANNOUNCE_URL.'/'.$LoggedUser['torrent_pass'].'/announce'?>" size="71" onclick="this.select()" readonly="readonly" />
<input type="text" value="<?= ANNOUNCE_URL . '/' . G::$LoggedUser['torrent_pass'] . '/announce'?>" size="71" onclick="this.select()" readonly="readonly" />
</p>
<? }
if ($this->Error) {
@ -62,7 +61,7 @@ function head() {
<form class="create_form" name="torrent" action="" enctype="multipart/form-data" method="post" id="upload_table" onsubmit="$('#post').raw().disabled = 'disabled'">
<div>
<input type="hidden" name="submit" value="true" />
<input type="hidden" name="auth" value="<?=$LoggedUser['AuthKey']?>" />
<input type="hidden" name="auth" value="<?=G::$LoggedUser['AuthKey']?>" />
<? if (!$this->NewTorrent) { ?>
<input type="hidden" name="action" value="takeedit" />
<input type="hidden" name="torrentid" value="<?=display_str($this->TorrentID)?>" />
@ -150,13 +149,13 @@ function foot() {
function music_form($GenreTags) {
$QueryID = G::$DB->get_query_id();
$Torrent = $this->Torrent;
$IsRemaster = !empty($Torrent['Remastered']);
$UnknownRelease = !$this->NewTorrent && $IsRemaster && !$Torrent['RemasterYear'];
if ($Torrent['GroupID']) {
global $DB;
$DB->query('
G::$DB->query('
SELECT
ID,
RemasterYear,
@ -172,12 +171,11 @@ function music_form($GenreTags) {
RemasterRecordLabel DESC,
RemasterCatalogueNumber DESC");
if ($DB->has_results()) {
$GroupRemasters = $DB->to_array(false, MYSQLI_BOTH, false);
if (G::$DB->has_results()) {
$GroupRemasters = G::$DB->to_array(false, MYSQLI_BOTH, false);
}
}
global $DB;
$HasLog = $Torrent['HasLog'];
$HasCue = $Torrent['HasCue'];
$BadTags = $Torrent['BadTags'];
@ -244,7 +242,7 @@ function music_form($GenreTags) {
</td>
</tr>
<tr id="musicbrainz_tr">
<td class="label" title="Click the &quot;Find Info&quot; button to automatically fill out parts of the upload form by selecting an entry in MusicBrainz">MusicBrainz:</td>
<td class="label tooltip" title="Click the &quot;Find Info&quot; button to automatically fill out parts of the upload form by selecting an entry in MusicBrainz">MusicBrainz:</td>
<td><input type="button" value="Find Info" id="musicbrainz_button" /></td>
</tr>
<div id="musicbrainz_popup">
@ -336,7 +334,7 @@ function show() {
<input type="checkbox" id="remaster" name="remaster"<? if ($IsRemaster) { echo ' checked="checked"';} ?> onclick="Remaster();<? if ($this->NewTorrent) { ?> CheckYear();<? } ?>" />
<label for="remaster">Check this box if this torrent is a different release to the original, for example a limited or country specific edition or a release that includes additional bonus tracks or is a bonus disc.</label>
<div id="remaster_true"<? if (!$IsRemaster) { echo ' class="hidden"';} ?>>
<? if (check_perms('edit_unknowns') || $LoggedUser['ID'] == $Torrent['UserID']) { ?>
<? if (check_perms('edit_unknowns') || G::$LoggedUser['ID'] == $Torrent['UserID']) { ?>
<br />
<input type="checkbox" id="unknown" name="unknown"<? if ($UnknownRelease) { echo ' checked="checked"';} ?> onclick="<? if ($this->NewTorrent) { ?> CheckYear();<? } ?>ToggleUnknown();" /> <label for="unknown">Unknown Release</label>
<? } ?>
@ -509,16 +507,15 @@ function show() {
<input type="checkbox" id="flac_log" name="flac_log"<? if ($HasLog) { echo ' checked="checked"';} ?> /> <label for="flac_log">Check this box if the torrent has, or should have, a log file.</label><br />
<input type="checkbox" id="flac_cue" name="flac_cue"<? if ($HasCue) { echo ' checked="checked"';} ?> /> <label for="flac_cue">Check this box if the torrent has, or should have, a cue file.</label><br />
<? }
global $LoggedUser;
if ((check_perms('users_mod') || $LoggedUser['ID'] == $Torrent['UserID']) && ($Torrent['LogScore'] == 100 || $Torrent['LogScore'] == 99)) {
if ((check_perms('users_mod') || G::$LoggedUser['ID'] == $Torrent['UserID']) && ($Torrent['LogScore'] == 100 || $Torrent['LogScore'] == 99)) {
$DB->query('
G::$DB->query('
SELECT LogID
FROM torrents_logs_new
WHERE TorrentID = '.$this->TorrentID."
AND Log LIKE 'EAC extraction logfile%'
AND (Adjusted = '0' OR Adjusted = '')");
list($LogID) = $DB->next_record();
list($LogID) = G::$DB->next_record();
if ($LogID) {
if (!check_perms('users_mod')) { ?>
<tr>
@ -613,12 +610,13 @@ function show() {
</table>
<?
// For AJAX requests (e.g. when changing the type from Music to Applications),
// we don't need to include all scripts, but we do need to include the code
// that generates previews. It will have to be eval'd after an AJAX request.
if ($_SERVER['SCRIPT_NAME'] === '/ajax.php')
TEXTAREA_PREVIEW::JavaScript(false);
// For AJAX requests (e.g. when changing the type from Music to Applications),
// we don't need to include all scripts, but we do need to include the code
// that generates previews. It will have to be eval'd after an AJAX request.
if ($_SERVER['SCRIPT_NAME'] === '/ajax.php')
TEXTAREA_PREVIEW::JavaScript(false);
G::$DB->set_query_id($QueryID);
}//function music_form
@ -718,7 +716,7 @@ function audiobook_form() {
</tr>
</table>
<?
TEXTAREA_PREVIEW::JavaScript(false);
TEXTAREA_PREVIEW::JavaScript(false);
}//function audiobook_form

View File

@ -47,7 +47,7 @@ class Torrents {
* }
*/
public static function get_groups($GroupIDs, $Return = true, $GetArtists = true, $Torrents = true) {
global $DB, $Cache, $Debug;
global $Debug;
// Make sure there's something in $GroupIDs, otherwise the SQL
// will break
@ -59,7 +59,7 @@ public static function get_groups($GroupIDs, $Return = true, $GetArtists = true,
$Key = $Torrents ? 'torrent_group_' : 'torrent_group_light_';
foreach ($GroupIDs as $GroupID) {
$Data = $Cache->get_value($Key.$GroupID, true);
$Data = G::$Cache->get_value($Key.$GroupID, true);
if (!empty($Data) && (@$Data['ver'] == CACHE::GROUP_VERSION)) {
unset($NotFound[$GroupID]);
$Found[$GroupID] = $Data['d'];
@ -77,18 +77,20 @@ public static function get_groups($GroupIDs, $Return = true, $GetArtists = true,
*/
if (count($NotFound) > 0) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
g.ID, g.Name, g.Year, g.RecordLabel, g.CatalogueNumber, g.TagList, g.ReleaseType, g.VanityHouse, g.WikiImage, g.CategoryID
FROM torrents_group AS g
WHERE g.ID IN ($IDs)");
while ($Group = $DB->next_record(MYSQLI_ASSOC, true)) {
while ($Group = G::$DB->next_record(MYSQLI_ASSOC, true)) {
unset($NotFound[$Group['ID']]);
$Found[$Group['ID']] = $Group;
$Found[$Group['ID']]['Torrents'] = array();
$Found[$Group['ID']]['Artists'] = array();
}
G::$DB->set_query_id($QueryID);
// Orphan torrents. There shouldn't ever be any
if (count($NotFound) > 0) {
@ -98,7 +100,8 @@ public static function get_groups($GroupIDs, $Return = true, $GetArtists = true,
}
if ($Torrents) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
ID, GroupID, Media, Format, Encoding, RemasterYear, Remastered, RemasterTitle,
RemasterRecordLabel, RemasterCatalogueNumber, Scene, HasLog, HasCue, LogScore,
@ -107,21 +110,22 @@ public static function get_groups($GroupIDs, $Return = true, $GetArtists = true,
WHERE GroupID IN($IDs)
ORDER BY GroupID, Remastered, (RemasterYear != 0) DESC, RemasterYear, RemasterTitle,
RemasterRecordLabel, RemasterCatalogueNumber, Media, Format, Encoding, ID");
while ($Torrent = $DB->next_record(MYSQLI_ASSOC, true)) {
while ($Torrent = G::$DB->next_record(MYSQLI_ASSOC, true)) {
$Found[$Torrent['GroupID']]['Torrents'][$Torrent['ID']] = $Torrent;
}
G::$DB->set_query_id($QueryID);
// Cache it all
foreach ($Found as $GroupID => $GroupInfo) {
$Cache->cache_value("torrent_group_$GroupID",
G::$Cache->cache_value("torrent_group_$GroupID",
array('ver' => CACHE::GROUP_VERSION, 'd' => $GroupInfo), 0);
$Cache->cache_value("torrent_group_light_$GroupID",
G::$Cache->cache_value("torrent_group_light_$GroupID",
array('ver' => CACHE::GROUP_VERSION, 'd' => $GroupInfo), 0);
}
} else {
foreach ($Found as $Group) {
$Cache->cache_value('torrent_group_light_'.$Group['ID'], array('ver' => CACHE::GROUP_VERSION, 'd' => $Found[$Group['ID']]), 0);
G::$Cache->cache_value('torrent_group_light_'.$Group['ID'], array('ver' => CACHE::GROUP_VERSION, 'd' => $Found[$Group['ID']]), 0);
}
}
}
@ -214,12 +218,14 @@ public static function torrent_properties(&$Torrent, &$Flags) {
* @param boolean $Hidden Currently does fuck all. TODO: Fix that.
*/
public static function write_group_log($GroupID, $TorrentID, $UserID, $Message, $Hidden) {
global $DB, $Time;
$DB->query("
global $Time;
$QueryID = G::$DB->get_query_id();
G::$DB->query("
INSERT INTO group_log
(GroupID, TorrentID, UserID, Info, Time, Hidden)
VALUES
($GroupID, $TorrentID, $UserID, '".db_string($Message)."', '".sqltime()."', $Hidden)");
G::$DB->set_query_id($QueryID);
}
@ -231,49 +237,49 @@ public static function write_group_log($GroupID, $TorrentID, $UserID, $Message,
* @param string $OcelotReason The deletion reason for ocelot to report to users.
*/
public static function delete_torrent($ID, $GroupID = 0, $OcelotReason = -1) {
global $DB, $Cache, $LoggedUser;
$QueryID = G::$DB->get_query_id();
if (!$GroupID) {
$DB->query("
G::$DB->query("
SELECT GroupID, UserID
FROM torrents
WHERE ID = '$ID'");
list($GroupID, $UploaderID) = $DB->next_record();
list($GroupID, $UploaderID) = G::$DB->next_record();
}
if (empty($UserID)) {
$DB->query("
G::$DB->query("
SELECT UserID
FROM torrents
WHERE ID = '$ID'");
list($UserID) = $DB->next_record();
list($UserID) = G::$DB->next_record();
}
$RecentUploads = $Cache->get_value("recent_uploads_$UserID");
$RecentUploads = G::$Cache->get_value("recent_uploads_$UserID");
if (is_array($RecentUploads)) {
foreach ($RecentUploads as $Key => $Recent) {
if ($Recent['ID'] == $GroupID) {
$Cache->delete_value("recent_uploads_$UserID");
G::$Cache->delete_value("recent_uploads_$UserID");
}
}
}
$DB->query("
G::$DB->query("
SELECT info_hash
FROM torrents
WHERE ID = $ID");
list($InfoHash) = $DB->next_record(MYSQLI_BOTH, false);
$DB->query("
list($InfoHash) = G::$DB->next_record(MYSQLI_BOTH, false);
G::$DB->query("
DELETE FROM torrents
WHERE ID = $ID");
Tracker::update_tracker('delete_torrent', array('info_hash' => rawurlencode($InfoHash), 'id' => $ID, 'reason' => $OcelotReason));
$Cache->decrement('stats_torrent_count');
G::$Cache->decrement('stats_torrent_count');
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM torrents
WHERE GroupID = '$GroupID'");
list($Count) = $DB->next_record();
list($Count) = G::$DB->next_record();
if ($Count == 0) {
Torrents::delete_group($GroupID);
@ -282,18 +288,18 @@ public static function delete_torrent($ID, $GroupID = 0, $OcelotReason = -1) {
}
// Torrent notifications
$DB->query("
G::$DB->query("
SELECT UserID
FROM users_notify_torrents
WHERE TorrentID = '$ID'");
while (list($UserID) = $DB->next_record()) {
$Cache->delete_value("notifications_new_$UserID");
while (list($UserID) = G::$DB->next_record()) {
G::$Cache->delete_value("notifications_new_$UserID");
}
$DB->query("
G::$DB->query("
DELETE FROM users_notify_torrents
WHERE TorrentID = '$ID'");
$DB->query("
G::$DB->query("
UPDATE reportsv2
SET
Status = 'Resolved',
@ -301,41 +307,42 @@ public static function delete_torrent($ID, $GroupID = 0, $OcelotReason = -1) {
ModComment = 'Report already dealt with (torrent deleted)'
WHERE TorrentID = $ID
AND Status != 'Resolved'");
$Reports = $DB->affected_rows();
$Reports = G::$DB->affected_rows();
if ($Reports) {
$Cache->decrement('num_torrent_reportsv2', $Reports);
G::$Cache->decrement('num_torrent_reportsv2', $Reports);
}
$DB->query("
G::$DB->query("
DELETE FROM torrents_files
WHERE TorrentID = '$ID'");
$DB->query("
G::$DB->query("
DELETE FROM torrents_bad_tags
WHERE TorrentID = $ID");
$DB->query("
G::$DB->query("
DELETE FROM torrents_bad_folders
WHERE TorrentID = $ID");
$DB->query("
G::$DB->query("
DELETE FROM torrents_bad_files
WHERE TorrentID = $ID");
$DB->query("
G::$DB->query("
DELETE FROM torrents_cassette_approved
WHERE TorrentID = $ID");
$DB->query("
G::$DB->query("
DELETE FROM torrents_lossymaster_approved
WHERE TorrentID = $ID");
$DB->query("
G::$DB->query("
DELETE FROM torrents_lossyweb_approved
WHERE TorrentID = $ID");
// Tells Sphinx that the group is removed
$DB->query("
G::$DB->query("
REPLACE INTO sphinx_delta (ID, Time)
VALUES ($ID, UNIX_TIMESTAMP())");
$Cache->delete_value("torrent_download_$ID");
$Cache->delete_value("torrent_group_$GroupID");
$Cache->delete_value("torrents_details_$GroupID");
G::$Cache->delete_value("torrent_download_$ID");
G::$Cache->delete_value("torrent_group_$GroupID");
G::$Cache->delete_value("torrents_details_$GroupID");
G::$DB->set_query_id($QueryID);
}
@ -346,52 +353,52 @@ public static function delete_torrent($ID, $GroupID = 0, $OcelotReason = -1) {
* @param int $GroupID
*/
public static function delete_group($GroupID) {
global $DB, $Cache;
$QueryID = G::$DB->get_query_id();
Misc::write_log("Group $GroupID automatically deleted (No torrents have this group).");
$DB->query("
G::$DB->query("
SELECT CategoryID
FROM torrents_group
WHERE ID = '$GroupID'");
list($Category) = $DB->next_record();
list($Category) = G::$DB->next_record();
if ($Category == 1) {
$Cache->decrement('stats_album_count');
G::$Cache->decrement('stats_album_count');
}
$Cache->decrement('stats_group_count');
G::$Cache->decrement('stats_group_count');
// Collages
$DB->query("
G::$DB->query("
SELECT CollageID
FROM collages_torrents
WHERE GroupID = '$GroupID'");
if ($DB->has_results()) {
$CollageIDs = $DB->collect('CollageID');
$DB->query("
if (G::$DB->has_results()) {
$CollageIDs = G::$DB->collect('CollageID');
G::$DB->query("
UPDATE collages
SET NumTorrents = NumTorrents - 1
WHERE ID IN (".implode(', ', $CollageIDs).')');
$DB->query("
G::$DB->query("
DELETE FROM collages_torrents
WHERE GroupID = '$GroupID'");
foreach ($CollageIDs as $CollageID) {
$Cache->delete_value("collage_$CollageID");
G::$Cache->delete_value("collage_$CollageID");
}
$Cache->delete_value("torrent_collages_$GroupID");
G::$Cache->delete_value("torrent_collages_$GroupID");
}
// Artists
// Collect the artist IDs and then wipe the torrents_artist entry
$DB->query("
G::$DB->query("
SELECT ArtistID
FROM torrents_artists
WHERE GroupID = $GroupID");
$Artists = $DB->collect('ArtistID');
$Artists = G::$DB->collect('ArtistID');
$DB->query("
G::$DB->query("
DELETE FROM torrents_artists
WHERE GroupID = '$GroupID'");
@ -400,65 +407,66 @@ public static function delete_group($GroupID) {
continue;
}
// Get a count of how many groups or requests use the artist ID
$DB->query("
G::$DB->query("
SELECT COUNT(ag.ArtistID)
FROM artists_group as ag
LEFT JOIN requests_artists AS ra ON ag.ArtistID = ra.ArtistID
WHERE ra.ArtistID IS NOT NULL
AND ag.ArtistID = '$ArtistID'");
list($ReqCount) = $DB->next_record();
$DB->query("
list($ReqCount) = G::$DB->next_record();
G::$DB->query("
SELECT COUNT(ag.ArtistID)
FROM artists_group as ag
LEFT JOIN torrents_artists AS ta ON ag.ArtistID = ta.ArtistID
WHERE ta.ArtistID IS NOT NULL
AND ag.ArtistID = '$ArtistID'");
list($GroupCount) = $DB->next_record();
list($GroupCount) = G::$DB->next_record();
if (($ReqCount + $GroupCount) == 0) {
//The only group to use this artist
Artists::delete_artist($ArtistID);
} else {
//Not the only group, still need to clear cache
$Cache->delete_value("artist_groups_$ArtistID");
G::$Cache->delete_value("artist_groups_$ArtistID");
}
}
// Requests
$DB->query("
G::$DB->query("
SELECT ID
FROM requests
WHERE GroupID = '$GroupID'");
$Requests = $DB->collect('ID');
$DB->query("
$Requests = G::$DB->collect('ID');
G::$DB->query("
UPDATE requests
SET GroupID = NULL
WHERE GroupID = '$GroupID'");
foreach ($Requests as $RequestID) {
$Cache->delete_value("request_$RequestID");
G::$Cache->delete_value("request_$RequestID");
}
$DB->query("
// comments
Comments::delete_page('torrents', $GroupID);
G::$DB->query("
DELETE FROM torrents_group
WHERE ID = '$GroupID'");
$DB->query("
G::$DB->query("
DELETE FROM torrents_tags
WHERE GroupID = '$GroupID'");
$DB->query("
G::$DB->query("
DELETE FROM torrents_tags_votes
WHERE GroupID = '$GroupID'");
$DB->query("
DELETE FROM torrents_comments
WHERE GroupID = '$GroupID'");
$DB->query("
G::$DB->query("
DELETE FROM bookmarks_torrents
WHERE GroupID = '$GroupID'");
$DB->query("
G::$DB->query("
DELETE FROM wiki_torrents
WHERE PageID = '$GroupID'");
$Cache->delete_value("torrents_details_$GroupID");
$Cache->delete_value("torrent_group_$GroupID");
$Cache->delete_value("groups_artists_$GroupID");
G::$Cache->delete_value("torrents_details_$GroupID");
G::$Cache->delete_value("torrent_group_$GroupID");
G::$Cache->delete_value("groups_artists_$GroupID");
G::$DB->set_query_id($QueryID);
}
@ -468,8 +476,9 @@ public static function delete_group($GroupID) {
* @param int $GroupID
*/
public static function update_hash($GroupID) {
global $DB, $Cache;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE torrents_group
SET TagList = (
SELECT REPLACE(GROUP_CONCAT(tags.Name SEPARATOR ' '), '.', '_')
@ -481,31 +490,31 @@ public static function update_hash($GroupID) {
WHERE ID = '$GroupID'");
// Fetch album vote score
$DB->query("
G::$DB->query("
SELECT Score
FROM torrents_votes
WHERE GroupID = $GroupID");
if ($DB->has_results()) {
list($VoteScore) = $DB->next_record();
if (G::$DB->has_results()) {
list($VoteScore) = G::$DB->next_record();
} else {
$VoteScore = 0;
}
// Fetch album artists
$DB->query("
G::$DB->query("
SELECT GROUP_CONCAT(aa.Name separator ' ')
FROM torrents_artists AS ta
JOIN artists_alias AS aa ON aa.AliasID = ta.AliasID
WHERE ta.GroupID = $GroupID
AND ta.Importance IN ('1', '4', '5', '6')
GROUP BY ta.GroupID");
if ($DB->has_results()) {
list($ArtistName) = $DB->next_record(MYSQLI_NUM, false);
if (G::$DB->has_results()) {
list($ArtistName) = G::$DB->next_record(MYSQLI_NUM, false);
} else {
$ArtistName = '';
}
$DB->query("
G::$DB->query("
REPLACE INTO sphinx_delta
(ID, GroupID, GroupName, TagList, Year, CategoryID, Time, ReleaseType, RecordLabel,
CatalogueNumber, VanityHouse, Size, Snatched, Seeders, Leechers, LogScore, Scene,
@ -522,7 +531,7 @@ public static function update_hash($GroupID) {
JOIN torrents_group AS g ON g.ID = t.GroupID
WHERE g.ID = $GroupID");
/* $DB->query("
/* G::$DB->query("
INSERT INTO sphinx_delta
(ID, ArtistName)
SELECT torrents.ID, artists.ArtistName
@ -539,17 +548,18 @@ public static function update_hash($GroupID) {
JOIN torrents USING(GroupID)
ON DUPLICATE KEY UPDATE ArtistName = VALUES(ArtistName)");
*/
$Cache->delete_value("torrents_details_$GroupID");
$Cache->delete_value("torrent_group_$GroupID");
G::$Cache->delete_value("torrents_details_$GroupID");
G::$Cache->delete_value("torrent_group_$GroupID");
$ArtistInfo = Artists::get_artist($GroupID);
foreach ($ArtistInfo as $Importances => $Importance) {
foreach ($Importance as $Artist) {
$Cache->delete_value('artist_groups_'.$Artist['id']); //Needed for at least freeleech change, if not others.
G::$Cache->delete_value('artist_groups_'.$Artist['id']); //Needed for at least freeleech change, if not others.
}
}
$Cache->delete_value("groups_artists_$GroupID");
G::$Cache->delete_value("groups_artists_$GroupID");
G::$DB->set_query_id($QueryID);
}
/**
@ -559,16 +569,17 @@ public static function update_hash($GroupID) {
* @param int $TorrentID
*/
public static function regenerate_filelist($TorrentID) {
global $DB, $Cache;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT tg.ID,
tf.File
FROM torrents_files AS tf
JOIN torrents AS t ON t.ID = tf.TorrentID
JOIN torrents_group AS tg ON tg.ID = t.GroupID
WHERE tf.TorrentID = $TorrentID");
if ($DB->has_results()) {
list($GroupID, $Contents) = $DB->next_record(MYSQLI_NUM, false);
if (G::$DB->has_results()) {
list($GroupID, $Contents) = G::$DB->next_record(MYSQLI_NUM, false);
if (Misc::is_new_torrent($Contents)) {
$Tor = new BencodeTorrent($Contents);
$FilePath = (isset($Tor->Dec['info']['files']) ? Format::make_utf8($Tor->get_name()) : '');
@ -581,12 +592,13 @@ public static function regenerate_filelist($TorrentID) {
$TmpFileList[] = self::filelist_format_file($File);
}
$FileString = implode("\n", $TmpFileList);
$DB->query("
G::$DB->query("
UPDATE torrents
SET Size = $TotalSize, FilePath = '".db_string($FilePath)."', FileList = '".db_string($FileString)."'
WHERE ID = $TorrentID");
$Cache->delete_value("torrents_details_$GroupID");
G::$Cache->delete_value("torrents_details_$GroupID");
}
G::$DB->set_query_id($QueryID);
}
/**
@ -714,31 +726,31 @@ public static function torrent_info($Data, $ShowMedia = false, $ShowEdition = fa
* @param int $FreeLeechType 0 = Unknown, 1 = Staff picks, 2 = Perma-FL (Toolbox, etc.), 3 = Vanity House
*/
public static function freeleech_torrents($TorrentIDs, $FreeNeutral = 1, $FreeLeechType = 0) {
global $DB, $Cache, $LoggedUser;
if (!is_array($TorrentIDs)) {
$TorrentIDs = array($TorrentIDs);
}
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
UPDATE torrents
SET FreeTorrent = '$FreeNeutral', FreeLeechType = '$FreeLeechType'
WHERE ID IN (".implode(', ', $TorrentIDs).')');
$DB->query('
G::$DB->query('
SELECT ID, GroupID, info_hash
FROM torrents
WHERE ID IN ('.implode(', ', $TorrentIDs).')
ORDER BY GroupID ASC');
$Torrents = $DB->to_array(false, MYSQLI_NUM, false);
$GroupIDs = $DB->collect('GroupID');
$Torrents = G::$DB->to_array(false, MYSQLI_NUM, false);
$GroupIDs = G::$DB->collect('GroupID');
G::$DB->set_query_id($QueryID);
foreach ($Torrents as $Torrent) {
list($TorrentID, $GroupID, $InfoHash) = $Torrent;
Tracker::update_tracker('update_torrent', array('info_hash' => rawurlencode($InfoHash), 'freetorrent' => $FreeNeutral));
$Cache->delete_value("torrent_download_$TorrentID");
Misc::write_log($LoggedUser['Username']." marked torrent $TorrentID freeleech type $FreeLeechType!");
Torrents::write_group_log($GroupID, $TorrentID, $LoggedUser['ID'], "marked as freeleech type $FreeLeechType!", 0);
G::$Cache->delete_value("torrent_download_$TorrentID");
Misc::write_log(G::$LoggedUser['Username']." marked torrent $TorrentID freeleech type $FreeLeechType!");
Torrents::write_group_log($GroupID, $TorrentID, G::$LoggedUser['ID'], "marked as freeleech type $FreeLeechType!", 0);
}
foreach ($GroupIDs as $GroupID) {
@ -755,20 +767,21 @@ public static function freeleech_torrents($TorrentIDs, $FreeNeutral = 1, $FreeLe
* @param int $FreeLeechType see Torrents::freeleech_torrents()
*/
public static function freeleech_groups($GroupIDs, $FreeNeutral = 1, $FreeLeechType = 0) {
global $DB;
$QueryID = G::$DB->get_query_id();
if (!is_array($GroupIDs)) {
$GroupIDs = array($GroupIDs);
}
$DB->query('
G::$DB->query('
SELECT ID
FROM torrents
WHERE GroupID IN ('.implode(', ', $GroupIDs).')');
if ($DB->has_results()) {
$TorrentIDs = $DB->collect('ID');
if (G::$DB->has_results()) {
$TorrentIDs = G::$DB->collect('ID');
Torrents::freeleech_torrents($TorrentIDs, $FreeNeutral, $FreeLeechType);
}
G::$DB->set_query_id($QueryID);
}
@ -779,23 +792,24 @@ public static function freeleech_groups($GroupIDs, $FreeNeutral = 1, $FreeLeechT
* @return true if an active token exists
*/
public static function has_token($TorrentID) {
global $DB, $Cache, $LoggedUser;
if (empty($LoggedUser)) {
if (empty(G::$LoggedUser)) {
return false;
}
static $TokenTorrents;
$UserID = $LoggedUser['ID'];
$UserID = G::$LoggedUser['ID'];
if (!isset($TokenTorrents)) {
$TokenTorrents = $Cache->get_value("users_tokens_$UserID");
$TokenTorrents = G::$Cache->get_value("users_tokens_$UserID");
if ($TokenTorrents === false) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT TorrentID
FROM users_freeleeches
WHERE UserID = $UserID
AND Expired = 0");
$TokenTorrents = array_fill_keys($DB->collect('TorrentID', false), true);
$Cache->cache_value("users_tokens_$UserID", $TokenTorrents);
$TokenTorrents = array_fill_keys(G::$DB->collect('TorrentID', false), true);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("users_tokens_$UserID", $TokenTorrents);
}
}
return isset($TokenTorrents[$TorrentID]);
@ -809,25 +823,23 @@ public static function has_token($TorrentID) {
* @return boolen True if user is allowed to use a token
*/
public static function can_use_token($Torrent) {
global $LoggedUser;
if (empty($LoggedUser)) {
if (empty(G::$LoggedUser)) {
return false;
}
return ($LoggedUser['FLTokens'] > 0
return (G::$LoggedUser['FLTokens'] > 0
&& $Torrent['Size'] < 1073741824
&& !$Torrent['PersonalFL']
&& empty($Torrent['FreeTorrent'])
&& $LoggedUser['CanLeech'] == '1');
&& G::$LoggedUser['CanLeech'] == '1');
}
public static function has_snatched($TorrentID, $AllUsers = false) {
global $DB, $Cache, $LoggedUser;
if (!$AllUsers && (empty($LoggedUser) || !$LoggedUser['ShowSnatched'])) {
if (!$AllUsers && (empty(G::$LoggedUser) || !G::$LoggedUser['ShowSnatched'])) {
return false;
}
$UserID = $LoggedUser['ID'];
$UserID = G::$LoggedUser['ID'];
$Buckets = 64;
$LastBucket = $Buckets - 1;
$BucketID = $TorrentID & $LastBucket;
@ -835,7 +847,7 @@ public static function has_snatched($TorrentID, $AllUsers = false) {
if (empty($SnatchedTorrents)) {
$SnatchedTorrents = array_fill(0, $Buckets, false);
$LastUpdate = $Cache->get_value("users_snatched_{$UserID}_lastupdate") ?: 0;
$LastUpdate = G::$Cache->get_value("users_snatched_{$UserID}_lastupdate") ?: 0;
} elseif (isset($SnatchedTorrents[$BucketID][$TorrentID])) {
return true;
}
@ -845,19 +857,20 @@ public static function has_snatched($TorrentID, $AllUsers = false) {
if ($CurSnatchedTorrents === false) {
$CurTime = time();
// This bucket hasn't been checked before
$CurSnatchedTorrents = $Cache->get_value("users_snatched_{$UserID}_$BucketID", true);
$CurSnatchedTorrents = G::$Cache->get_value("users_snatched_{$UserID}_$BucketID", true);
if ($CurSnatchedTorrents === false || $CurTime - $LastUpdate > 1800) {
$Updated = array();
$QueryID = G::$DB->get_query_id();
if ($CurSnatchedTorrents === false || $LastUpdate == 0) {
for ($i = 0; $i < $Buckets; $i++) {
$SnatchedTorrents[$i] = array();
}
// Not found in cache. Since we don't have a suitable index, it's faster to update everything
$DB->query("
G::$DB->query("
SELECT fid, tstamp AS TorrentID
FROM xbt_snatched
WHERE uid = '$UserID'");
while (list($ID) = $DB->next_record(MYSQLI_NUM, false)) {
while (list($ID) = G::$DB->next_record(MYSQLI_NUM, false)) {
$SnatchedTorrents[$ID & $LastBucket][(int)$ID] = true;
}
$Updated = array_fill(0, $Buckets, true);
@ -866,15 +879,15 @@ public static function has_snatched($TorrentID, $AllUsers = false) {
return true;
} else {
// Old cache, check if torrent has been snatched recently
$DB->query("
G::$DB->query("
SELECT fid
FROM xbt_snatched
WHERE uid = '$UserID'
AND tstamp >= $LastUpdate");
while (list($ID) = $DB->next_record(MYSQLI_NUM, false)) {
while (list($ID) = G::$DB->next_record(MYSQLI_NUM, false)) {
$CurBucketID = $ID & $LastBucket;
if ($SnatchedTorrents[$CurBucketID] === false) {
$SnatchedTorrents[$CurBucketID] = $Cache->get_value("users_snatched_{$UserID}_$CurBucketID", true);
$SnatchedTorrents[$CurBucketID] = G::$Cache->get_value("users_snatched_{$UserID}_$CurBucketID", true);
if ($SnatchedTorrents[$CurBucketID] === false) {
$SnatchedTorrents[$CurBucketID] = array();
}
@ -883,12 +896,13 @@ public static function has_snatched($TorrentID, $AllUsers = false) {
$Updated[$CurBucketID] = true;
}
}
G::$DB->set_query_id($QueryID);
for ($i = 0; $i < $Buckets; $i++) {
if ($Updated[$i]) {
$Cache->cache_value("users_snatched_{$UserID}_$i", $SnatchedTorrents[$i], 0);
G::$Cache->cache_value("users_snatched_{$UserID}_$i", $SnatchedTorrents[$i], 0);
}
}
$Cache->cache_value("users_snatched_{$UserID}_lastupdate", $CurTime, 0);
G::$Cache->cache_value("users_snatched_{$UserID}_lastupdate", $CurTime, 0);
$LastUpdate = $CurTime;
}
}
@ -937,6 +951,7 @@ public static function edition_string(array $Torrent, array $Group) {
public static function get_reports($TorrentID) {
$Reports = G::$Cache->get_value("reports_torrent_$TorrentID");
if ($Reports === false) {
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
r.ID,
@ -949,6 +964,7 @@ public static function get_reports($TorrentID) {
AND Type != 'edited'
AND Status != 'Resolved'");
$Reports = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("reports_torrent_$TorrentID", $Reports, 0);
}
return $Reports;

View File

@ -14,7 +14,7 @@ class TorrentsDL {
private $NumFound = 0;
private $Size = 0;
private $Title;
private $Username;
private $User;
private $AnnounceURL;
/**
@ -25,13 +25,12 @@ class TorrentsDL {
* @param string $AnnounceURL URL to add to the created torrents
*/
public function __construct(&$QueryResult, $Title) {
global $Cache, $LoggedUser;
$Cache->InternalCache = false; // The internal cache is almost completely useless for this
G::$Cache->InternalCache = false; // The internal cache is almost completely useless for this
Zip::unlimit(); // Need more memory and longer timeout
$this->QueryResult = $QueryResult;
$this->Title = $Title;
$this->User = $LoggedUser;
$this->AnnounceURL = ANNOUNCE_URL . "/$LoggedUser[torrent_pass]/announce";
$this->User = G::$LoggedUser;
$this->AnnounceURL = ANNOUNCE_URL . '/' . G::$LoggedUser['torrent_pass'] . '/announce';
$this->Zip = new Zip(Misc::file_string($Title));
}
@ -42,19 +41,18 @@ public function __construct(&$QueryResult, $Title) {
* @return array with results and torrent group IDs or false if there are no results left
*/
public function get_downloads($Key) {
global $DB;
$GroupIDs = $Downloads = array();
$OldQuery = $DB->get_query_id();
$DB->set_query_id($this->QueryResult);
$OldQuery = G::$DB->get_query_id();
G::$DB->set_query_id($this->QueryResult);
if (!isset($this->IDBoundaries)) {
if ($Key == 'TorrentID') {
$this->IDBoundaries = false;
} else {
$this->IDBoundaries = $DB->to_pair($Key, 'TorrentID', false);
$this->IDBoundaries = G::$DB->to_pair($Key, 'TorrentID', false);
}
}
$Found = 0;
while ($Download = $DB->next_record(MYSQLI_ASSOC, false)) {
while ($Download = G::$DB->next_record(MYSQLI_ASSOC, false)) {
if (!$this->IDBoundaries || $Download['TorrentID'] == $this->IDBoundaries[$Download[$Key]]) {
$Found++;
$Downloads[$Download[$Key]] = $Download;
@ -65,7 +63,7 @@ public function get_downloads($Key) {
}
}
$this->NumFound += $Found;
$DB->set_query_id($OldQuery);
G::$DB->set_query_id($OldQuery);
if (empty($Downloads)) {
return false;
}

View File

@ -11,7 +11,6 @@ class Tracker {
* @param boolean $ToIRC Sends a message to the channel #tracker with the GET URL.
*/
public static function update_tracker($Action, $Updates, $ToIRC = false) {
global $Cache;
//Build request
$Get = '/update?action='.$Action;
foreach ($Updates as $Key => $Value) {
@ -62,9 +61,9 @@ public static function update_tracker($Action, $Updates, $ToIRC = false) {
if ($Return != "success") {
send_irc("PRIVMSG #tracker :{$Attempts} {$Err} {$Get}");
if ($Cache->get_value('ocelot_error_reported') === false) {
if (G::$Cache->get_value('ocelot_error_reported') === false) {
send_irc("PRIVMSG ".ADMIN_CHAN." :Failed to update ocelot: ".$Err." : ".$Get);
$Cache->cache_value('ocelot_error_reported', true, 3600);
G::$Cache->cache_value('ocelot_error_reported', true, 3600);
}
}
return ($Return == "success");

View File

@ -7,35 +7,37 @@ class UserRank {
// Returns a 101 row array (101 percentiles - 0 - 100), with the minimum value for that percentile as the value for each row
// BTW - ingenious
private static function build_table($MemKey, $Query) {
global $Cache, $DB;
$QueryID = G::$DB->get_query_id();
$DB->query("
G::$DB->query("
DROP TEMPORARY TABLE IF EXISTS temp_stats");
$DB->query("
G::$DB->query("
CREATE TEMPORARY TABLE temp_stats (
ID int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
Val bigint(20) NOT NULL
);");
$DB->query("
G::$DB->query("
INSERT INTO temp_stats (Val) ".
$Query);
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM temp_stats");
list($UserCount) = $DB->next_record();
list($UserCount) = G::$DB->next_record();
$DB->query("
G::$DB->query("
SELECT MIN(Val)
FROM temp_stats
GROUP BY CEIL(ID / (".(int)$UserCount." / 100));");
$Table = $DB->to_array();
$Table = G::$DB->to_array();
G::$DB->set_query_id($QueryID);
// Give a little variation to the cache length, so all the tables don't expire at the same time
$Cache->cache_value($MemKey, $Table, 3600 * 24 * rand(800, 1000) * 0.001);
G::$Cache->cache_value($MemKey, $Table, 3600 * 24 * rand(800, 1000) * 0.001);
return $Table;
}
@ -112,18 +114,17 @@ public static function get_rank($TableName, $Value) {
if ($Value == 0) {
return 0;
}
global $Cache, $DB;
$Table = $Cache->get_value(PREFIX.$TableName);
$Table = G::$Cache->get_value(PREFIX.$TableName);
if (!$Table) {
//Cache lock!
$Lock = $Cache->get_value(PREFIX.$TableName.'_lock');
$Lock = G::$Cache->get_value(PREFIX.$TableName.'_lock');
if ($Lock) {
return false;
} else {
$Cache->cache_value(PREFIX.$TableName.'_lock', '1', 300);
G::$Cache->cache_value(PREFIX.$TableName.'_lock', '1', 300);
$Table = self::build_table(PREFIX.$TableName, self::table_query($TableName));
$Cache->delete_value(PREFIX.$TableName.'_lock');
G::$Cache->delete_value(PREFIX.$TableName.'_lock');
}
}
$LastPercentile = 0;

View File

@ -6,17 +6,19 @@ class Users {
* @return array ($Classes, $ClassLevels)
*/
public static function get_classes() {
global $Cache, $DB, $Debug;
global $Debug;
// Get permissions
list($Classes, $ClassLevels) = $Cache->get_value('classes');
list($Classes, $ClassLevels) = G::$Cache->get_value('classes');
if (!$Classes || !$ClassLevels) {
$DB->query('
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT ID, Name, Level, Secondary
FROM permissions
ORDER BY Level');
$Classes = $DB->to_array('ID');
$ClassLevels = $DB->to_array('Level');
$Cache->cache_value('classes', array($Classes, $ClassLevels), 0);
$Classes = G::$DB->to_array('ID');
$ClassLevels = G::$DB->to_array('Level');
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('classes', array($Classes, $ClassLevels), 0);
}
$Debug->set_flag('Loaded permissions');
@ -45,13 +47,12 @@ public static function get_classes() {
* int EffectiveClass - the highest level of their main and secondary classes
*/
public static function user_info($UserID) {
global $DB, $Cache, $Classes, $SSL;
$UserInfo = $Cache->get_value("user_info_$UserID");
global $Classes, $SSL;
$UserInfo = G::$Cache->get_value("user_info_$UserID");
// the !isset($UserInfo['Paranoia']) can be removed after a transition period
if (empty($UserInfo) || empty($UserInfo['ID']) || !isset($UserInfo['Paranoia']) || empty($UserInfo['Class'])) {
$OldQueryID = $DB->get_query_id();
$DB->query("
$OldQueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
m.ID,
m.Username,
@ -71,11 +72,12 @@ public static function user_info($UserID) {
LEFT JOIN users_levels AS ul ON ul.UserID = m.ID
WHERE m.ID = '$UserID'
GROUP BY m.ID");
if (!$DB->has_results()) { // Deleted user, maybe?
if (!G::$DB->has_results()) { // Deleted user, maybe?
$UserInfo = array(
'ID' => '',
'ID' => $UserID,
'Username' => '',
'PermissionID' => 0,
'Paranoia' => array(),
'Artist' => false,
'Donor' => false,
'Warned' => '0000-00-00 00:00:00',
@ -83,10 +85,10 @@ public static function user_info($UserID) {
'Enabled' => 0,
'Title' => '',
'CatchupTime' => 0,
'Visible' => '1');
'Visible' => '1',
'Levels' => '');
} else {
$UserInfo = $DB->next_record(MYSQLI_ASSOC, array('Paranoia', 'Title'));
$UserInfo = G::$DB->next_record(MYSQLI_ASSOC, array('Paranoia', 'Title'));
$UserInfo['CatchupTime'] = strtotime($UserInfo['CatchupTime']);
$UserInfo['Paranoia'] = unserialize($UserInfo['Paranoia']);
if ($UserInfo['Paranoia'] === false) {
@ -109,12 +111,12 @@ public static function user_info($UserID) {
}
$UserInfo['EffectiveClass'] = $EffectiveClass;
$Cache->cache_value("user_info_$UserID", $UserInfo, 2592000);
$DB->set_query_id($OldQueryID);
G::$Cache->cache_value("user_info_$UserID", $UserInfo, 2592000);
G::$DB->set_query_id($OldQueryID);
}
if (strtotime($UserInfo['Warned']) < time()) {
$UserInfo['Warned'] = '0000-00-00 00:00:00';
$Cache->cache_value("user_info_$UserID", $UserInfo, 2592000);
G::$Cache->cache_value("user_info_$UserID", $UserInfo, 2592000);
}
return $UserInfo;
@ -129,12 +131,12 @@ public static function user_info($UserID) {
* Just read the goddamn code, I don't have time to comment this shit.
*/
public static function user_heavy_info($UserID) {
global $DB, $Cache;
$HeavyInfo = $Cache->get_value("user_info_heavy_$UserID");
$HeavyInfo = G::$Cache->get_value("user_info_heavy_$UserID");
if (empty($HeavyInfo)) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT
m.Invites,
m.torrent_pass,
@ -154,7 +156,7 @@ public static function user_heavy_info($UserID) {
i.DisablePM,
i.DisableRequests,
i.DisableForums,
i.DisableTagging,
i.DisableTagging," . "
i.SiteOptions,
i.DownloadAlt,
i.LastReadNews,
@ -166,7 +168,7 @@ public static function user_heavy_info($UserID) {
FROM users_main AS m
INNER JOIN users_info AS i ON i.UserID = m.ID
WHERE m.ID = '$UserID'");
$HeavyInfo = $DB->next_record(MYSQLI_ASSOC, array('CustomPermissions', 'SiteOptions'));
$HeavyInfo = G::$DB->next_record(MYSQLI_ASSOC, array('CustomPermissions', 'SiteOptions'));
if (!empty($HeavyInfo['CustomPermissions'])) {
$HeavyInfo['CustomPermissions'] = unserialize($HeavyInfo['CustomPermissions']);
@ -187,11 +189,11 @@ public static function user_heavy_info($UserID) {
}
unset($HeavyInfo['PermittedForums']);
$DB->query("
G::$DB->query("
SELECT PermissionID
FROM users_levels
WHERE UserID = $UserID");
$PermIDs = $DB->collect('PermissionID');
$PermIDs = G::$DB->collect('PermissionID');
foreach ($PermIDs AS $PermID) {
$Perms = Permissions::get_permissions($PermID);
if (!empty($Perms['PermittedForums'])) {
@ -225,7 +227,9 @@ public static function user_heavy_info($UserID) {
}
unset($HeavyInfo['SiteOptions']);
$Cache->cache_value("user_info_heavy_$UserID", $HeavyInfo, 0);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("user_info_heavy_$UserID", $HeavyInfo, 0);
}
return $HeavyInfo;
}
@ -244,14 +248,15 @@ public static function update_site_options($UserID, $NewOptions) {
if (empty($NewOptions)) {
return false;
}
global $DB, $Cache, $LoggedUser;
$QueryID = G::$DB->get_query_id();
// Get SiteOptions
$DB->query("
G::$DB->query("
SELECT SiteOptions
FROM users_info
WHERE UserID = $UserID");
list($SiteOptions) = $DB->next_record(MYSQLI_NUM, false);
list($SiteOptions) = G::$DB->next_record(MYSQLI_NUM, false);
$SiteOptions = unserialize($SiteOptions);
// Get HeavyInfo
@ -262,18 +267,19 @@ public static function update_site_options($UserID, $NewOptions) {
$HeavyInfo = array_merge($HeavyInfo, $NewOptions);
// Update DB
$DB->query("
G::$DB->query("
UPDATE users_info
SET SiteOptions = '".db_string(serialize($SiteOptions))."'
WHERE UserID = $UserID");
G::$DB->set_query_id($QueryID);
// Update cache
$Cache->cache_value("user_info_heavy_$UserID", $HeavyInfo, 0);
G::$Cache->cache_value("user_info_heavy_$UserID", $HeavyInfo, 0);
// Update $LoggedUser if the options are changed for the current
if ($LoggedUser['ID'] == $UserID) {
$LoggedUser = array_merge($LoggedUser, $NewOptions);
$LoggedUser['ID'] = $UserID; // We don't want to allow userid switching
// Update G::$LoggedUser if the options are changed for the current
if (G::$LoggedUser['ID'] == $UserID) {
G::$LoggedUser = array_merge(G::$LoggedUser, $NewOptions);
G::$LoggedUser['ID'] = $UserID; // We don't want to allow userid switching
}
return true;
}
@ -448,8 +454,8 @@ public static function gen_crypt_salt() {
* @param boolean $Title whether or not to show the title
* @return HTML formatted username
*/
public static function format_username($UserID, $Badges = false, $IsWarned = true, $IsEnabled = true, $Class = false, $Title = false) {
global $Classes, $LoggedUser;
public static function format_username($UserID, $Badges = false, $IsWarned = true, $IsEnabled = true, $Class = false, $Title = false, $IsDonorForum = false) {
global $Classes;
// This array is a hack that should be made less retarded, but whatevs
// PermID => ShortForm
@ -467,28 +473,58 @@ public static function format_username($UserID, $Badges = false, $IsWarned = tru
$Str = '';
$Username = $UserInfo['Username'];
$Paranoia = $UserInfo['Paranoia'];
$ShowDonorIcon = !in_array('hide_donor_heart', $Paranoia);
if ($IsDonorForum) {
list($Prefix, $Suffix, $HasComma) = Donations::get_titles($UserID);
$Username = "$Prefix $Username" . ($HasComma ? ', ' : ' ') . "$Suffix ";
}
if ($Title) {
$Str .= '<strong><a href="user.php?id='.$UserID.'">'.$UserInfo['Username'].'</a></strong>';
$Str .= "<strong><a href=\"user.php?id=$UserID\">$Username</a></strong>";
} else {
$Str .= '<a href="user.php?id='.$UserID.'">'.$UserInfo['Username'].'</a>';
$Str .= "<a href=\"user.php?id=$UserID\">$Username</a>";
}
if ($Badges) {
$Str .= ($UserInfo['Donor'] == 1) ? '<a href="donate.php"><img src="'.STATIC_SERVER.'common/symbols/donor.png" alt="Donor" title="Donor" /></a>' : '';
$DonorRank = Donations::get_rank($UserID);
$SpecialRank = Donations::get_special_rank($UserID);
if ($DonorRank >= 2 && $ShowDonorIcon) {
$DonorRewards = Donations::get_rewards($UserID);
$IconText = $DonorRewards['IconMouseOverText'];
$IconLink = 'donate.php';
$IconImage = 'donor.png';
$DonorRank = $DonorRank == 5 ? ($DonorRank - 1) : $DonorRank;
if ($DonorRank >= MAX_RANK || $SpecialRank >= MAX_SPECIAL_RANK) {
$IconLink = !empty($DonorRewards['CustomIconLink']) ? $DonorRewards['CustomIconLink'] : 'donate.php';
if ($SpecialRank >= MAX_SPECIAL_RANK) {
$DonorHeart = 6;
} else {
$DonorHeart = 5;
}
$IconImage = !empty($DonorRewards['CustomIcon']) ? ImageTools::process($DonorRewards['CustomIcon']) : STATIC_SERVER . "common/symbols/donor_$DonorHeart" . '.png';
}
else {
$IconImage = STATIC_SERVER . "common/symbols/donor_$DonorRank" . '.png';
}
$Str .= "<a href=\"$IconLink\"><img class=\"donor_icon\" src=\"$IconImage\" alt=\"$IconText\" title=\"$IconText\" /></a>";
} elseif (($DonorRank == 1 || $UserInfo['Donor'] == 1) && $ShowDonorIcon) {
$Str .= '<a href="donate.php"><img src="'.STATIC_SERVER.'common/symbols/donor.png" alt="Donor" title="Donor" /></a>';
}
}
$Str .= (($IsWarned && $UserInfo['Warned'] != '0000-00-00 00:00:00') ? '<a href="wiki.php?action=article&amp;id=218"'
$Str .= ($IsWarned && $UserInfo['Warned'] != '0000-00-00 00:00:00') ? '<a href="wiki.php?action=article&amp;id=218"'
. '><img src="'.STATIC_SERVER.'common/symbols/warned.png" alt="Warned" title="Warned'
. ($LoggedUser['ID'] === $UserID ? ' - Expires ' . date('Y-m-d H:i', strtotime($UserInfo['Warned'])) : '')
. '" /></a>' : '');
$Str .= (($IsEnabled && $UserInfo['Enabled'] == 2) ? '<a href="rules.php"><img src="'.STATIC_SERVER.'common/symbols/disabled.png" alt="Banned" title="Be good, and you won\'t end up like this user" /></a>' : '');
. (G::$LoggedUser['ID'] === $UserID ? ' - Expires ' . date('Y-m-d H:i', strtotime($UserInfo['Warned'])) : '')
. '" /></a>' : '';
$Str .= ($IsEnabled && $UserInfo['Enabled'] == 2) ? '<a href="rules.php"><img src="'.STATIC_SERVER.'common/symbols/disabled.png" alt="Banned" title="Be good, and you won\'t end up like this user" /></a>' : '';
if ($Badges) {
$ClassesDisplay = array();
foreach ($SecondaryClasses as $PermID => $PermHTML) {
if ($UserInfo['ExtraClasses'][$PermID]) {
$ClassesDisplay[] = '<span class="secondary_class" title="'.$Classes[$PermID]['Name'].'">'.$PermHTML.'</span>';
}
foreach (array_intersect_key($SecondaryClasses, $UserInfo['ExtraClasses']) as $PermID => $PermShort) {
$ClassesDisplay[] = '<span class="secondary_class" title="'.$Classes[$PermID]['Name'].'">'.$PermShort.'</span>';
}
if (!empty($ClassesDisplay)) {
$Str .= '&nbsp;'.implode('&nbsp;', $ClassesDisplay);
@ -532,29 +568,26 @@ public static function make_class_string($ClassID) {
}
/**
* Returns an array with User Bookmark data: group ids, collage data, torrent data
* @global CACHE $Cache
* @global DB_MYSQL $DB
* Returns an array with User Bookmark data: group IDs, collage data, torrent data
* @param string|int $UserID
* @return array Group IDs, Bookmark Data, Torrent List
*/
public static function get_bookmarks ($UserID)
{
global $Cache, $DB;
public static function get_bookmarks($UserID) {
$UserID = (int) $UserID;
if (($Data = $Cache->get_value("bookmarks_group_ids_$UserID"))) {
if (($Data = G::$Cache->get_value("bookmarks_group_ids_$UserID"))) {
list($GroupIDs, $BookmarkData) = $Data;
} else {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT GroupID, Sort, `Time`
FROM bookmarks_torrents
WHERE UserID = $UserID
ORDER BY Sort, `Time` ASC");
$GroupIDs = $DB->collect('GroupID');
$BookmarkData = $DB->to_array('GroupID', MYSQLI_ASSOC);
$Cache->cache_value("bookmarks_group_ids_$UserID",
$GroupIDs = G::$DB->collect('GroupID');
$BookmarkData = G::$DB->to_array('GroupID', MYSQLI_ASSOC);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("bookmarks_group_ids_$UserID",
array($GroupIDs, $BookmarkData), 3600);
}
@ -573,23 +606,39 @@ public static function get_bookmarks ($UserID)
* @param string $ReturnHTML
* @return string
*/
public static function show_avatar($Avatar, $Username, $Setting, $Size = 150, $ReturnHTML = True) {
global $LoggedUser;
public static function show_avatar($Avatar, $UserID, $Username, $Setting, $Size = 150, $ReturnHTML = True) {
$Avatar = ImageTools::process($Avatar);
$Style = 'style="max-height: 400px;"';
$AvatarMouseOverText = '';
$SecondAvatar = '';
$Class = 'class="double_avatar"';
$EnabledRewards = Donations::get_enabled_rewards($UserID);
if ($EnabledRewards['HasAvatarMouseOverText']) {
$Rewards = Donations::get_rewards($UserID);
$AvatarMouseOverText = $Rewards['AvatarMouseOverText'];
}
if (!empty($AvatarMouseOverText)) {
$AvatarMouseOverText = "title=\"$AvatarMouseOverText\" alt=\"$AvatarMouseOverText\"";
}
if ($EnabledRewards['HasSecondAvatar'] && !empty($Rewards['SecondAvatar'])) {
$SecondAvatar = 'data-gazelle-second-avatar="' . ImageTools::process($Rewards['SecondAvatar']) . '"';
}
// case 1 is avatars disabled
switch ($Setting) {
case 0:
if (!empty($Avatar)) {
$ToReturn = ($ReturnHTML ? "<img src=\"$Avatar\" width=\"$Size\" style=\"max-height: 400px;\" alt=\"$Username avatar\" />" : $Avatar);
$ToReturn = ($ReturnHTML ? "<img src=\"$Avatar\" width=\"$Size\" $Style $AvatarMouseOverText $SecondAvatar $Class />" : $Avatar);
} else {
$URL = STATIC_SERVER.'common/avatars/default.png';
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" style=\"max-height: 400px;\" alt=\"Default avatar\" />" : $URL);
//TODO: what is the $JS variable for? why is it unassigned?
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" $Style $AvatarMouseOverText $SecondAvatar $JS />" : $URL);
}
break;
case 2:
$ShowAvatar = True;
$ShowAvatar = true;
case 3:
switch ($LoggedUser['Identicons']) {
switch (G::$LoggedUser['Identicons']) {
case 0:
$Type = 'identicon';
break;
@ -604,15 +653,15 @@ public static function show_avatar($Avatar, $Username, $Setting, $Size = 150, $R
break;
case 4:
$Type = '1';
$Robot = True;
$Robot = true;
break;
case 5:
$Type = '2';
$Robot = True;
$Robot = true;
break;
case 6:
$Type = '3';
$Robot = True;
$Robot = true;
break;
default:
$Type = 'identicon';
@ -623,15 +672,15 @@ public static function show_avatar($Avatar, $Username, $Setting, $Size = 150, $R
} else {
$URL = 'https://robohash.org/'.md5($Username)."?set=set$Type&amp;size={$Size}x$Size";
}
if ($ShowAvatar == True && !empty($Avatar)) {
$ToReturn = ($ReturnHTML ? "<img src=\"$Avatar\" width=\"$Size\" style=\"max-height: 400px;\" alt=\"$Username avatar\" />" : $Avatar);
if ($ShowAvatar == true && !empty($Avatar)) {
$ToReturn = ($ReturnHTML ? "<img src=\"$Avatar\" width=\"$Size\" $Style $AvatarMouseOverText $SecondAvatar $Class/>" : $Avatar);
} else {
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" style=\"max-height: 400px;\" alt=\"Default avatar\" />" : $URL);
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" $Style $AvatarMouseOverText $SecondAvatar $Class/>" : $URL);
}
break;
default:
$URL = STATIC_SERVER.'common/avatars/default.png';
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" style=\"max-height: 400px;\" alt=\"Default avatar\" />" : $URL);
$ToReturn = ($ReturnHTML ? "<img src=\"$URL\" width=\"$Size\" $Style $AvatarMouseOverText $SecondAvatar $Class/>" : $URL);
}
return $ToReturn;
}
@ -651,19 +700,18 @@ public static function has_avatars_enabled() {
* @return boolean
*/
public static function has_autocomplete_enabled($Type, $Output = true) {
global $LoggedUser;
$Enabled = false;
if (empty($LoggedUser['AutoComplete'])) {
if (empty(G::$LoggedUser['AutoComplete'])) {
$Enabled = true;
} elseif ($LoggedUser['AutoComplete'] !== 1) {
} elseif (G::$LoggedUser['AutoComplete'] !== 1) {
switch ($Type) {
case 'search':
if ($LoggedUser['AutoComplete'] == 2) {
if (G::$LoggedUser['AutoComplete'] == 2) {
$Enabled = true;
}
break;
case 'other':
if ($LoggedUser['AutoComplete'] != 2) {
if (G::$LoggedUser['AutoComplete'] != 2) {
$Enabled = true;
}
break;

View File

@ -13,8 +13,8 @@ class View {
* the page. ONLY PUT THE RELATIVE LOCATION WITHOUT '.js'
* example: 'somefile,somedir/somefile'
*/
public static function show_header($PageTitle = '', $JSIncludes = '') {
global $Document, $Cache, $DB, $LoggedUser, $Mobile, $Classes;
public static function show_header($PageTitle = '', $JSIncludes = '', $CSSIncludes = '') {
global $Document, $Mobile, $Classes;
if ($PageTitle != '') {
$PageTitle .= ' :: ';
@ -26,7 +26,7 @@ public static function show_header($PageTitle = '', $JSIncludes = '') {
empty($_REQUEST['type']) ? false : $_REQUEST['type'] // Type
);
if (!is_array($LoggedUser) || empty($LoggedUser['ID'])) {
if (!is_array(G::$LoggedUser) || empty(G::$LoggedUser['ID'])) {
require(SERVER_ROOT.'/design/publicheader.php');
} else {
require(SERVER_ROOT.'/design/privateheader.php');
@ -42,8 +42,8 @@ public static function show_header($PageTitle = '', $JSIncludes = '') {
* ['disclaimer'] = [boolean] (False) Displays the disclaimer in the footer
*/
public static function show_footer ($Options = array()) {
global $ScriptStartTime, $LoggedUser, $Cache, $DB, $SessionID, $UserSessions, $Debug, $Time;
if (!is_array($LoggedUser)) {
global $ScriptStartTime, $SessionID, $UserSessions, $Debug, $Time;
if (!is_array(G::$LoggedUser)) {
require(SERVER_ROOT.'/design/publicfooter.php');
} else {
require(SERVER_ROOT.'/design/privatefooter.php');

View File

@ -2,72 +2,66 @@
class Votes {
/**
* Generate voting links for torrent pages, etc.
* @global $LoggedUser
* @param $GroupID
* @param $Vote The pre-existing vote, if it exists 'Up'|'Down'
*/
public static function vote_link($GroupID, $Vote = '') {
global $LoggedUser;
if (!$LoggedUser['NoVoteLinks'] && check_perms('site_album_votes')) { ?>
if (!G::$LoggedUser['NoVoteLinks'] && check_perms('site_album_votes')) { ?>
<span class="votespan brackets" style="white-space: nowrap;">
Vote:
<a href="#" onclick="UpVoteGroup(<?=$GroupID?>, '<?=$LoggedUser['AuthKey']?>'); return false;" class="small_upvote vote_link_<?=$GroupID?><?=(!empty($Vote) ? ' hidden' : '')?>" title="Upvote"></a>
<span class="voted_type small_upvoted voted_up_<?=$GroupID?><?=(($Vote == 'Down' || empty($Vote)) ? ' hidden' : '')?>" title="Upvoted"></span>
<a href="#" onclick="DownVoteGroup(<?=$GroupID?>, '<?=$LoggedUser['AuthKey']?>'); return false;" class="small_downvote vote_link_<?=$GroupID?><?=(!empty($Vote) ? ' hidden' : '')?>" title="Downvote"></a>
<span class="voted_type small_downvoted voted_down_<?=$GroupID?><?=(($Vote == 'Up' || empty($Vote)) ? ' hidden' : '')?>" title="Downvoted"></span>
<a href="#" onclick="UnvoteGroup(<?=$GroupID?>, '<?=$LoggedUser['AuthKey']?>'); return false;" class="small_clearvote vote_clear_<?=$GroupID?><?=(empty($Vote) ? ' hidden' : '')?>" title="Clear your vote">x</a>
<a href="#" onclick="UpVoteGroup(<?=$GroupID?>, '<?=G::$LoggedUser['AuthKey']?>'); return false;" class="tooltip small_upvote vote_link_<?=$GroupID?><?=(!empty($Vote) ? ' hidden' : '')?>" title="Upvote"></a>
<span class="tooltip voted_type small_upvoted voted_up_<?=$GroupID?><?=(($Vote == 'Down' || empty($Vote)) ? ' hidden' : '')?>" title="Upvoted"></span>
<a href="#" onclick="DownVoteGroup(<?=$GroupID?>, '<?=G::$LoggedUser['AuthKey']?>'); return false;" class="tooltip small_downvote vote_link_<?=$GroupID?><?=(!empty($Vote) ? ' hidden' : '')?>" title="Downvote"></a>
<span class="tooltip voted_type small_downvoted voted_down_<?=$GroupID?><?=(($Vote == 'Up' || empty($Vote)) ? ' hidden' : '')?>" title="Downvoted"></span>
<a href="#" onclick="UnvoteGroup(<?=$GroupID?>, '<?=G::$LoggedUser['AuthKey']?>'); return false;" class="tooltip small_clearvote vote_clear_<?=$GroupID?><?=(empty($Vote) ? ' hidden' : '')?>" title="Clear your vote">x</a>
</span>
<? }
}
/**
* Returns an array with User Vote data: GroupID and vote type
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @param string|int $UserID
* @return array GroupID=>(GroupID, 'Up'|'Down')
*/
public static function get_user_votes($UserID) {
global $DB, $Cache;
if ((int)$UserID == 0) {
return array();
}
$UserVotes = $Cache->get_value("voted_albums_$UserID");
$UserVotes = G::$Cache->get_value("voted_albums_$UserID");
if ($UserVotes === false) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT GroupID, Type
FROM users_votes
WHERE UserID = $UserID");
$UserVotes = $DB->to_array('GroupID', MYSQL_ASSOC, false);
$Cache->cache_value("voted_albums_$UserID", $UserVotes);
$UserVotes = G::$DB->to_array('GroupID', MYSQL_ASSOC, false);
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("voted_albums_$UserID", $UserVotes);
}
return $UserVotes;
}
/**
* Returns an array with torrent group vote data
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @param string|int $GroupID
* @return array (Upvotes, Total Votes)
*/
public static function get_group_votes($GroupID) {
global $DB, $Cache;
$GroupVotes = $Cache->get_value("votes_$GroupID");
$GroupVotes = G::$Cache->get_value("votes_$GroupID");
if ($GroupVotes === false) {
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT Ups AS Ups, Total AS Total
FROM torrents_votes
WHERE GroupID = $GroupID");
if (!$DB->has_results()) {
if (!G::$DB->has_results()) {
$GroupVotes = array('Ups' => 0, 'Total' => 0);
} else {
$GroupVotes = $DB->next_record(MYSQLI_ASSOC, false);
$GroupVotes = G::$DB->next_record(MYSQLI_ASSOC, false);
}
$Cache->cache_value("votes_$GroupID", $GroupVotes, 259200); // 3 days
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("votes_$GroupID", $GroupVotes, 259200); // 3 days
}
return $GroupVotes;
}
@ -198,32 +192,30 @@ public static function get_ranking($GroupID, $Year) {
/**
* Gets where this album ranks overall.
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @param int $GroupID GroupID of the album
* @return int Rank
*/
public static function get_rank_all($GroupID) {
global $Cache, $DB;
$GroupID = (int)$GroupID;
if ($GroupID <= 0) {
return false;
}
$Rankings = $Cache->get_value('voting_ranks_overall');
$Rankings = G::$Cache->get_value('voting_ranks_overall');
if ($Rankings === false) {
$Rankings = array();
$i = 0;
$DB->query('
$QueryID = G::$DB->get_query_id();
G::$DB->query('
SELECT GroupID
FROM torrents_votes
ORDER BY Score DESC
LIMIT 100');
while (list($GID) = $DB->next_record()) {
while (list($GID) = G::$DB->next_record()) {
$Rankings[$GID] = ++$i;
}
$Cache->cache_value('voting_ranks_overall', $Rankings, 259200); // 3 days
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value('voting_ranks_overall', $Rankings, 259200); // 3 days
}
return (isset($Rankings[$GroupID]) ? $Rankings[$GroupID] : false);
@ -231,36 +223,34 @@ public static function get_rank_all($GroupID) {
/**
* Gets where this album ranks in its year.
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @param int $GroupID GroupID of the album
* @param int $Year Year it was released
* @return int Rank for its year
*/
public static function get_rank_year($GroupID, $Year) {
global $Cache, $DB;
$GroupID = (int)$GroupID;
$Year = (int)$Year;
if ($GroupID <= 0 || $Year <= 0) {
return false;
}
$Rankings = $Cache->get_value("voting_ranks_year_$Year");
$Rankings = G::$Cache->get_value("voting_ranks_year_$Year");
if ($Rankings === false) {
$Rankings = array();
$i = 0;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT GroupID
FROM torrents_votes AS v
JOIN torrents_group AS g ON g.ID = v.GroupID
WHERE g.Year = $Year
ORDER BY Score DESC
LIMIT 100");
while (list($GID) = $DB->next_record()) {
while (list($GID) = G::$DB->next_record()) {
$Rankings[$GID] = ++$i;
}
$Cache->cache_value("voting_ranks_year_$Year", $Rankings, 259200); // 3 days
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("voting_ranks_year_$Year", $Rankings, 259200); // 3 days
}
return (isset($Rankings[$GroupID]) ? $Rankings[$GroupID] : false);
@ -268,30 +258,26 @@ public static function get_rank_year($GroupID, $Year) {
/**
* Gets where this album ranks in its decade.
* @global CACHE $Cache
* @global DB_MYSQL $DB
* @param int $GroupID GroupID of the album
* @param int $Year Year it was released
* @return int Rank for its year
*/
public static function get_rank_decade($GroupID, $Year) {
global $Cache, $DB;
$GroupID = (int)$GroupID;
$Year = (int)$Year;
$Year = (int)$Year;
if ((int)$GroupID <= 0 || (int)$Year <= 0) {
if ($GroupID <= 0 || $Year <= 0) {
return false;
}
// First year of the decade
$Year = $Year - ($Year % 10);
$Rankings = $Cache->get_value("voting_ranks_decade_$Year");
$Rankings = G::$Cache->get_value("voting_ranks_decade_$Year");
if ($Rankings === false) {
$Rankings = array();
$i = 0;
$DB->query("
$QueryID = G::$DB->get_query_id();
G::$DB->query("
SELECT GroupID
FROM torrents_votes AS v
JOIN torrents_group AS g ON g.ID = v.GroupID
@ -299,10 +285,11 @@ public static function get_rank_decade($GroupID, $Year) {
AND g.CategoryID = 1
ORDER BY Score DESC
LIMIT 100");
while (list($GID) = $DB->next_record()) {
while (list($GID) = G::$DB->next_record()) {
$Rankings[$GID] = ++$i;
}
$Cache->cache_value("voting_ranks_decade_$Year", $Rankings, 259200); // 3 days
G::$DB->set_query_id($QueryID);
G::$Cache->cache_value("voting_ranks_decade_$Year", $Rankings, 259200); // 3 days
}
return (isset($Rankings[$GroupID]) ? $Rankings[$GroupID] : false);

View File

@ -33,9 +33,9 @@
class Wiki {
public static function revision_history($Table = '', $PageID = 0, $BaseURL = '') {
global $DB;
$QueryID = G::$DB->get_query_id();
$DB->query("
G::$DB->query("
SELECT
RevisionID,
Summary,
@ -54,7 +54,7 @@ public static function revision_history($Table = '', $PageID = 0, $BaseURL = '')
</tr>
<?
$Row = 'a';
while (list($RevisionID, $Summary, $Time, $UserID, $Username) = $DB->next_record()) {
while (list($RevisionID, $Summary, $Time, $UserID, $Username) = G::$DB->next_record()) {
$Row = (($Row == 'a') ? 'b' : 'a');
?>
<tr class="row<?=$Row?>">
@ -74,6 +74,7 @@ public static function revision_history($Table = '', $PageID = 0, $BaseURL = '')
<? } // while ?>
</table>
<?
G::$DB->set_query_id($QueryID);
} // function
} // class
?>

View File

@ -21,12 +21,16 @@
?>
<p>Site and design &copy; <?=date('Y')?> <?=SITE_NAME?></p>
<? if (!empty($LastActive)) { ?>
<p><a href="user.php?action=sessions" title="Manage sessions">Last activity <?=time_diff($LastActive['LastUpdate'])?> from <?=$LastActive['IP']?>.</a></p>
<p>
<a href="user.php?action=sessions">
<span class="tooltip" title="Manage sessions">Last activity </span><?=time_diff($LastActive['LastUpdate'])?><span class="tooltip" title="Manage sessions"> from <?=$LastActive['IP']?>.</span>
</a>
</p>
<? } ?>
<p>
<strong>Time:</strong> <?=number_format(((microtime(true) - $ScriptStartTime) * 1000), 5)?> ms
<strong>Used:</strong> <?=Format::get_size(memory_get_usage(true))?>
<strong>Load:</strong> <?=number_format($Load[0], 2).' '.number_format($Load[1], 2).' '.number_format($Load[2],2)?>
<strong>Load:</strong> <?=number_format($Load[0], 2).' '.number_format($Load[1], 2).' '.number_format($Load[2], 2)?>
<strong>Date:</strong> <?=date('M d Y, H:i')?>
</p>

View File

@ -4,112 +4,98 @@
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><?=display_str($PageTitle)?></title>
<meta http-equiv="X-UA-Compatible" content="chrome=1;IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Torrents" href="opensearch.php?type=torrents" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Artists" href="opensearch.php?type=artists" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Requests" href="opensearch.php?type=requests" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Forums" href="opensearch.php?type=forums" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Log" href="opensearch.php?type=log" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Users" href="opensearch.php?type=users" />
<link rel="search" type="application/opensearchdescription+xml"
title="<?=SITE_NAME?> Wiki" href="opensearch.php?type=wiki" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=feed_news&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - News" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=feed_blog&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Blog" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=feed_changelog&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Gazelle Change Log" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_notify_<?=$LoggedUser['torrent_pass']?>&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - P.T.N." />
<head>
<title><?=display_str($PageTitle)?></title>
<meta http-equiv="X-UA-Compatible" content="chrome=1;IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Torrents" href="opensearch.php?type=torrents" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Artists" href="opensearch.php?type=artists" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Requests" href="opensearch.php?type=requests" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Forums" href="opensearch.php?type=forums" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Log" href="opensearch.php?type=log" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Users" href="opensearch.php?type=users" />
<link rel="search" type="application/opensearchdescription+xml" title="<?=SITE_NAME?> Wiki" href="opensearch.php?type=wiki" />
<link rel="alternate" type="application/rss+xml" href="feeds.php?feed=feed_news&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>" title="<?=SITE_NAME?> - News" />
<link rel="alternate" type="application/rss+xml" href="feeds.php?feed=feed_blog&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>" title="<?=SITE_NAME?> - Blog" />
<link rel="alternate" type="application/rss+xml" href="feeds.php?feed=feed_changelog&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>" title="<?=SITE_NAME?> - Gazelle Change Log" />
<link rel="alternate" type="application/rss+xml" href="feeds.php?feed=torrents_notify_<?=G::$LoggedUser['torrent_pass']?>&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>" title="<?=SITE_NAME?> - P.T.N." />
<?
if (isset($LoggedUser['Notify'])) {
foreach ($LoggedUser['Notify'] as $Filter) {
if (isset(G::$LoggedUser['Notify'])) {
foreach (G::$LoggedUser['Notify'] as $Filter) {
list($FilterID, $FilterName) = $Filter;
?>
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_notify_<?=$FilterID?>_<?=$LoggedUser['torrent_pass']?>&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;name=<?=urlencode($FilterName)?>"
title="<?=SITE_NAME?> - <?=display_str($FilterName)?>" />
<link rel="alternate" type="application/rss+xml" href="feeds.php?feed=torrents_notify_<?=$FilterID?>_<?=G::$LoggedUser['torrent_pass']?>&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>&amp;name=<?=urlencode($FilterName)?>" title="<?=SITE_NAME?> - <?=display_str($FilterName)?>" />
<?
}
}
$UseTooltipster = !isset(G::$LoggedUser['Tooltipster']) || G::$LoggedUser['Tooltipster'];
?>
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_all&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_all&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - All Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_music&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_music&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Music Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_apps&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_apps&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Application Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_ebooks&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_ebooks&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - E-Book Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_abooks&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_abooks&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Audiobooks Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_evids&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_evids&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - E-Learning Video Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_comedy&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_comedy&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Comedy Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_comics&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_comics&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Comic Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_mp3&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_mp3&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - MP3 Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_flac&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_flac&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - FLAC Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_vinyl&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_vinyl&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Vinyl Sourced Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_lossless&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_lossless&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - Lossless Torrents" />
<link rel="alternate" type="application/rss+xml"
href="feeds.php?feed=torrents_lossless24&amp;user=<?=$LoggedUser['ID']?>&amp;auth=<?=$LoggedUser['RSS_Auth']?>&amp;passkey=<?=$LoggedUser['torrent_pass']?>&amp;authkey=<?=$LoggedUser['AuthKey']?>"
href="feeds.php?feed=torrents_lossless24&amp;user=<?=G::$LoggedUser['ID']?>&amp;auth=<?=G::$LoggedUser['RSS_Auth']?>&amp;passkey=<?=G::$LoggedUser['torrent_pass']?>&amp;authkey=<?=G::$LoggedUser['AuthKey']?>"
title="<?=SITE_NAME?> - 24bit Lossless Torrents" />
<link
href="<?=STATIC_SERVER?>styles/global.css?v=<?=filemtime(SERVER_ROOT.'/static/styles/global.css')?>"
rel="stylesheet" type="text/css" />
<? if ($Mobile) { ?>
<? if ($UseTooltipster) { ?>
<link rel="stylesheet" href="<?=STATIC_SERVER?>styles/tooltipster/style.css" type="text/css" media="screen"/>
<? }
if ($Mobile) { ?>
<meta name="viewport"
content="width=device-width; initial-scale=1.0; maximum-scale=1.0, user-scalable=no;" />
<link href="<?=STATIC_SERVER ?>styles/mobile/style.css" rel="stylesheet"
type="text/css" />
<?
} else {
if (empty($LoggedUser['StyleURL'])) {
if (empty(G::$LoggedUser['StyleURL'])) {
?>
<link
href="<?=STATIC_SERVER?>styles/<?=$LoggedUser['StyleName']?>/style.css?v=<?=filemtime(SERVER_ROOT.'/static/styles/'.$LoggedUser['StyleName'].'/style.css')?>"
title="<?=$LoggedUser['StyleName']?>" rel="stylesheet" type="text/css"
href="<?=STATIC_SERVER?>styles/<?=G::$LoggedUser['StyleName']?>/style.css?v=<?=filemtime(SERVER_ROOT.'/static/styles/'.G::$LoggedUser['StyleName'].'/style.css')?>"
title="<?=G::$LoggedUser['StyleName']?>" rel="stylesheet" type="text/css"
media="screen" />
<? } else { ?>
<link href="<?=$LoggedUser['StyleURL']?>" title="External CSS"
<link href="<?=G::$LoggedUser['StyleURL']?>" title="External CSS"
rel="stylesheet" type="text/css" media="screen" />
<?
}
if ($LoggedUser['UseOpenDyslexic']) {
if (!empty(G::$LoggedUser['UseOpenDyslexic'])) {
// load the OpenDyslexic font ?>
<link rel="stylesheet"
href="<?=STATIC_SERVER?>styles/opendyslexic/style.css?v=<?=filemtime(SERVER_ROOT.'/static/styles/opendyslexic/style.css')?>"
@ -119,9 +105,16 @@
<?
}
}
?>
$ExtraCSS = explode(',', $CSSIncludes);
foreach ($ExtraCSS as $CSS) {
if (empty($CSS)) {
continue;
} ?>
<link rel="stylesheet" href="<?=STATIC_SERVER?>styles/<?=$CSS?>/style.css" type="text/css" media="screen"/>
<?
} ?>
<script src="<?=STATIC_SERVER?>functions/jquery.js"
<script src="<?=STATIC_SERVER?>functions/jquery.js"
type="text/javascript"></script>
<script
src="<?=STATIC_SERVER?>functions/script_start.js?v=<?=filemtime(SERVER_ROOT.'/static/functions/script_start.js')?>"
@ -130,8 +123,8 @@
src="<?=STATIC_SERVER?>functions/ajax.class.js?v=<?=filemtime(SERVER_ROOT.'/static/functions/ajax.class.js')?>"
type="text/javascript"></script>
<script type="text/javascript">//<![CDATA[
var authkey = "<?=$LoggedUser['AuthKey']?>";
var userid = <?=$LoggedUser['ID']?>;
var authkey = "<?=G::$LoggedUser['AuthKey']?>";
var userid = <?=G::$LoggedUser['ID']?>;
//]]></script>
<script
src="<?=STATIC_SERVER?>functions/global.js?v=<?=filemtime(SERVER_ROOT.'/static/functions/global.js')?>"
@ -140,8 +133,14 @@
type="text/javascript"></script>
<script src="<?=STATIC_SERVER?>functions/autocomplete.js"
type="text/javascript"></script>
<? if ($UseTooltipster) { ?>
<script src="<?=STATIC_SERVER?>functions/tooltipster.js"
type="text/javascript"></script>
<? } ?>
<script src="<?=STATIC_SERVER?>functions/tooltipster_settings.js"
type="text/javascript"></script>
<?
NotificationsManagerView::load_js();
$Scripts = explode(',', $JSIncludes);
foreach ($Scripts as $Script) {
@ -173,12 +172,12 @@
<ul id="userinfo_username">
<li id="nav_userinfo"
<?=Format::add_class($PageID, array('user',false,false), 'active', true, 'id')?>><a
href="user.php?id=<?=$LoggedUser['ID']?>" class="username"><?=$LoggedUser['Username']?></a></li>
href="user.php?id=<?=G::$LoggedUser['ID']?>" class="username"><?=G::$LoggedUser['Username']?></a></li>
<li id="nav_useredit"
class="brackets<?=Format::add_class($PageID, array('user','edit'), 'active', false)?>"><a
href="user.php?action=edit&amp;userid=<?=$LoggedUser['ID']?>">Edit</a></li>
href="user.php?action=edit&amp;userid=<?=G::$LoggedUser['ID']?>">Edit</a></li>
<li id="nav_logout" class="brackets"><a
href="logout.php?auth=<?=$LoggedUser['AuthKey']?>">Logout</a></li>
href="logout.php?auth=<?=G::$LoggedUser['AuthKey']?>">Logout</a></li>
</ul>
<ul id="userinfo_major">
<li id="nav_upload"
@ -187,8 +186,8 @@ class="brackets<?=Format::add_class($PageID, array('upload'), 'active', false)?>
<?
if (check_perms('site_send_unlimited_invites')) {
$Invites = ' (∞)';
} elseif ($LoggedUser['Invites'] > 0) {
$Invites = ' ('.$LoggedUser['Invites'].')';
} elseif (G::$LoggedUser['Invites'] > 0) {
$Invites = ' ('.G::$LoggedUser['Invites'].')';
} else {
$Invites = '';
}
@ -203,49 +202,26 @@ class="brackets<?=Format::add_class($PageID, array('donate'), 'active', false)?>
</ul>
<ul id="userinfo_stats">
<li id="stats_seeding"><a
href="torrents.php?type=seeding&amp;userid=<?=$LoggedUser['ID']?>">Up</a>:
href="torrents.php?type=seeding&amp;userid=<?=G::$LoggedUser['ID']?>">Up</a>:
<span class="stat"
title="<?=Format::get_size($LoggedUser['BytesUploaded'], 5)?>"><?=Format::get_size($LoggedUser['BytesUploaded'])?></span></li>
title="<?=Format::get_size(G::$LoggedUser['BytesUploaded'], 5)?>"><?=Format::get_size(G::$LoggedUser['BytesUploaded'])?></span></li>
<li id="stats_leeching"><a
href="torrents.php?type=leeching&amp;userid=<?=$LoggedUser['ID']?>">Down</a>:
href="torrents.php?type=leeching&amp;userid=<?=G::$LoggedUser['ID']?>">Down</a>:
<span class="stat"
title="<?=Format::get_size($LoggedUser['BytesDownloaded'], 5)?>"><?=Format::get_size($LoggedUser['BytesDownloaded'])?></span></li>
<li id="stats_ratio">Ratio: <span class="stat"><?=Format::get_ratio_html($LoggedUser['BytesUploaded'], $LoggedUser['BytesDownloaded'])?></span></li>
<? if (!empty($LoggedUser['RequiredRatio'])) { ?>
title="<?=Format::get_size(G::$LoggedUser['BytesDownloaded'], 5)?>"><?=Format::get_size(G::$LoggedUser['BytesDownloaded'])?></span></li>
<li id="stats_ratio">Ratio: <span class="stat"><?=Format::get_ratio_html(G::$LoggedUser['BytesUploaded'], G::$LoggedUser['BytesDownloaded'])?></span></li>
<? if (!empty(G::$LoggedUser['RequiredRatio'])) { ?>
<li id="stats_required"><a href="rules.php?p=ratio">Required</a>: <span
class="stat"
title="<?=number_format($LoggedUser['RequiredRatio'], 5)?>"><?=number_format($LoggedUser['RequiredRatio'], 2)?></span></li>
title="<?=number_format(G::$LoggedUser['RequiredRatio'], 5)?>"><?=number_format(G::$LoggedUser['RequiredRatio'], 2)?></span></li>
<? }
if ($LoggedUser['FLTokens'] > 0) { ?>
if (G::$LoggedUser['FLTokens'] > 0) { ?>
<li id="fl_tokens"><a href="wiki.php?action=article&amp;id=754">Tokens</a>:
<span class="stat"><a
href="userhistory.php?action=token_history&amp;userid=<?=$LoggedUser['ID']?>"><?=$LoggedUser['FLTokens']?></a></span></li>
href="userhistory.php?action=token_history&amp;userid=<?=G::$LoggedUser['ID']?>"><?=G::$LoggedUser['FLTokens']?></a></span></li>
<? } ?>
</ul>
<?
$NewSubscriptions = $Cache->get_value('subscriptions_user_new_'.$LoggedUser['ID']);
if ($NewSubscriptions === false) {
if ($LoggedUser['CustomForums']) {
unset($LoggedUser['CustomForums']['']);
$RestrictedForums = implode("','", array_keys($LoggedUser['CustomForums'], 0));
$PermittedForums = implode("','", array_keys($LoggedUser['CustomForums'], 1));
}
$DB->query("
SELECT COUNT(s.TopicID)
FROM users_subscriptions AS s
JOIN forums_last_read_topics AS l ON s.UserID = l.UserID AND s.TopicID = l.TopicID
JOIN forums_topics AS t ON l.TopicID = t.ID
JOIN forums AS f ON t.ForumID = f.ID
WHERE (f.MinClassRead <= ".$LoggedUser['Class']." OR f.ID IN ('$PermittedForums'))
AND l.PostID < t.LastPostID
AND s.UserID = ".$LoggedUser['ID'].
(!empty($RestrictedForums) ? "
AND f.ID NOT IN ('$RestrictedForums')" : ''));
list($NewSubscriptions) = $DB->next_record();
$Cache->cache_value('subscriptions_user_new_'.$LoggedUser['ID'], $NewSubscriptions, 0);
} ?>
<ul id="userinfo_minor"
<?=($NewSubscriptions ? ' class="highlite"' : '')?>>
<ul id="userinfo_minor">
<li id="nav_inbox"
<?=Format::add_class($PageID, array('inbox'), 'active', true)?>><a
onmousedown="Stats('inbox');"
@ -256,7 +232,7 @@ class="stat"
<li id="nav_uploaded"
<?=Format::add_class($PageID, array('torrents',false,'uploaded'), 'active', true, 'userid')?>><a
onmousedown="Stats('uploads');"
href="torrents.php?type=uploaded&amp;userid=<?=$LoggedUser['ID']?>">Uploads</a></li>
href="torrents.php?type=uploaded&amp;userid=<?=G::$LoggedUser['ID']?>">Uploads</a></li>
<li id="nav_bookmarks"
<?=Format::add_class($PageID, array('bookmarks'), 'active', true)?>><a
onmousedown="Stats('bookmarks');"
@ -270,8 +246,7 @@ class="stat"
<li id="nav_subscriptions"
<?=Format::add_class($PageID, array('userhistory','subscriptions'), 'active', true)?>><a
onmousedown="Stats('subscriptions');"
href="userhistory.php?action=subscriptions"
<?=($NewSubscriptions ? ' class="new-subscriptions"' : '')?>>Subscriptions</a></li>
href="userhistory.php?action=subscriptions">Subscriptions</a></li>
<li id="nav_comments"
<?=Format::add_class($PageID, array('comments'), 'active', true, 'userid')?>><a
onmousedown="Stats('comments');" href="comments.php">Comments</a></li>
@ -320,220 +295,91 @@ class="stat"
$Alerts = array();
$ModBar = array();
//Quotes
if ($LoggedUser['NotifyOnQuote']) {
$QuoteNotificationsCount = $Cache->get_value('notify_quoted_'.$LoggedUser['ID']);
if ($QuoteNotificationsCount === false) {
if ($LoggedUser['CustomForums']) {
unset($LoggedUser['CustomForums']['']);
$RestrictedForums = implode("','", array_keys($LoggedUser['CustomForums'], 0));
$PermittedForums = implode("','", array_keys($LoggedUser['CustomForums'], 1));
}
$sql = "
SELECT COUNT(q.UnRead)
FROM users_notify_quoted AS q
LEFT JOIN forums_topics AS t ON t.ID = q.PageID
LEFT JOIN forums AS f ON f.ID = t.ForumID
WHERE q.UserID = $LoggedUser[ID]
AND q.UnRead = 1
AND q.Page = 'forums'
AND ((f.MinClassRead <= '$LoggedUser[Class]'";
if (!empty($RestrictedForums)) {
$sql .= " AND f.ID NOT IN ('$RestrictedForums')";
}
$sql .= ')';
if (!empty($PermittedForums)) {
$sql .= " OR f.ID IN ('$PermittedForums')";
}
$sql .= ')';
$DB->query($sql);
list($QuoteNotificationsCount) = $DB->next_record();
$Cache->cache_value('notify_quoted_'.$LoggedUser['ID'], $QuoteNotificationsCount, 0);
}
if ($QuoteNotificationsCount > 0) {
$Alerts[] = '<a href="userhistory.php?action=quote_notifications">'. 'New quote'. ($QuoteNotificationsCount > 1 ? 's' : '') . '</a>';
}
}
// News
$MyNews = $LoggedUser['LastReadNews'];
$CurrentNews = $Cache->get_value('news_latest_id');
if ($CurrentNews === false) {
$DB->query("
SELECT ID
FROM news
ORDER BY Time DESC
LIMIT 1");
if ($DB->record_count() === 1) {
list($CurrentNews) = $DB->next_record();
} else {
$CurrentNews = -1;
}
$Cache->cache_value('news_latest_id', $CurrentNews, 0);
}
if ($MyNews < $CurrentNews) {
$Alerts[] = '<a href="index.php">New announcement!</a>';
}
// Blog
$MyBlog = $LoggedUser['LastReadBlog'];
$CurrentBlog = $Cache->get_value('blog_latest_id');
if ($CurrentBlog === false) {
$DB->query("
SELECT ID
FROM blog
WHERE Important = 1
ORDER BY Time DESC
LIMIT 1");
if ($DB->record_count() === 1) {
list($CurrentBlog) = $DB->next_record();
} else {
$CurrentBlog = -1;
}
$Cache->cache_value('blog_latest_id', $CurrentBlog, 0);
}
if ($MyBlog < $CurrentBlog) {
$Alerts[] = '<a href="blog.php">New blog post!</a>';
}
$NotificationsManager = new NotificationsManager(G::$LoggedUser['ID'], false, false, false);
// Staff blog
if (check_perms('users_mod')) {
global $SBlogReadTime, $LatestSBlogTime;
if (!$SBlogReadTime && ($SBlogReadTime = $Cache->get_value('staff_blog_read_'.$LoggedUser['ID'])) === false) {
$DB->query("
if (!$SBlogReadTime && ($SBlogReadTime = G::$Cache->get_value('staff_blog_read_'.G::$LoggedUser['ID'])) === false) {
G::$DB->query("
SELECT Time
FROM staff_blog_visits
WHERE UserID = ".$LoggedUser['ID']);
if (list($SBlogReadTime) = $DB->next_record()) {
WHERE UserID = ".G::$LoggedUser['ID']);
if (list($SBlogReadTime) = G::$DB->next_record()) {
$SBlogReadTime = strtotime($SBlogReadTime);
} else {
$SBlogReadTime = 0;
}
$Cache->cache_value('staff_blog_read_'.$LoggedUser['ID'], $SBlogReadTime, 1209600);
G::$Cache->cache_value('staff_blog_read_'.G::$LoggedUser['ID'], $SBlogReadTime, 1209600);
}
if (!$LatestSBlogTime && ($LatestSBlogTime = $Cache->get_value('staff_blog_latest_time')) === false) {
$DB->query("
if (!$LatestSBlogTime && ($LatestSBlogTime = G::$Cache->get_value('staff_blog_latest_time')) === false) {
G::$DB->query("
SELECT MAX(Time)
FROM staff_blog");
if (list($LatestSBlogTime) = $DB->next_record()) {
list($LatestSBlogTime) = G::$DB->next_record();
if ($LatestSBlogTime) {
$LatestSBlogTime = strtotime($LatestSBlogTime);
} else {
$LatestSBlogTime = 0;
}
$Cache->cache_value('staff_blog_latest_time', $LatestSBlogTime, 1209600);
G::$Cache->cache_value('staff_blog_latest_time', $LatestSBlogTime, 1209600);
}
if ($SBlogReadTime < $LatestSBlogTime) {
$Alerts[] = '<a href="staffblog.php">New staff blog post!</a>';
}
}
//Staff PM
$NewStaffPMs = $Cache->get_value('staff_pm_new_'.$LoggedUser['ID']);
if ($NewStaffPMs === false) {
$DB->query("
SELECT COUNT(ID)
FROM staff_pm_conversations
WHERE UserID = '".$LoggedUser['ID']."'
AND Unread = '1'");
list($NewStaffPMs) = $DB->next_record();
$Cache->cache_value('staff_pm_new_'.$LoggedUser['ID'], $NewStaffPMs, 0);
// Inbox
if ($NotificationsManager->is_traditional(NotificationsManager::INBOX)) {
$NotificationsManager->load_inbox();
$NewMessages = $NotificationsManager->get_notifications()[NotificationsManager::INBOX];
if (isset($NewMessages)) {
$Alerts[] = NotificationsManagerView::format_traditional($NewMessages['contents']);
}
$NotificationsManager->clear_notifications_array();
}
if ($NewStaffPMs > 0) {
$Alerts[] = '<a href="staffpm.php">You have '.$NewStaffPMs.(($NewStaffPMs > 1) ? ' new staff messages' : ' new staff message').'</a>';
}
//Inbox
$NewMessages = $Cache->get_value('inbox_new_'.$LoggedUser['ID']);
if ($NewMessages === false) {
$DB->query("
SELECT COUNT(UnRead)
FROM pm_conversations_users
WHERE UserID = '".$LoggedUser['ID']."'
AND UnRead = '1'
AND InInbox = '1'");
list($NewMessages) = $DB->next_record();
$Cache->cache_value('inbox_new_'.$LoggedUser['ID'], $NewMessages, 0);
}
if ($NewMessages > 0) {
$Alerts[] = '<a href="' . Inbox::get_inbox_link() . "\">You have $NewMessages".(($NewMessages > 1) ? ' new messages' : ' new message').'</a>';
}
if ($LoggedUser['RatioWatch']) {
$Alerts[] = '<a href="rules.php?p=ratio">Ratio Watch</a>: You have '.time_diff($LoggedUser['RatioWatchEnds'], 3).' to get your ratio over your required ratio or your leeching abilities will be disabled.';
} elseif ($LoggedUser['CanLeech'] != 1) {
if (G::$LoggedUser['RatioWatch']) {
$Alerts[] = '<a href="rules.php?p=ratio">Ratio Watch</a>: You have '.time_diff(G::$LoggedUser['RatioWatchEnds'], 3).' to get your ratio over your required ratio or your leeching abilities will be disabled.';
} elseif (G::$LoggedUser['CanLeech'] != 1) {
$Alerts[] = '<a href="rules.php?p=ratio">Ratio Watch</a>: Your downloading privileges are disabled until you meet your required ratio.';
}
if (check_perms('site_torrents_notify')) {
$NewNotifications = $Cache->get_value('notifications_new_'.$LoggedUser['ID']);
if ($NewNotifications === false) {
$DB->query("
SELECT COUNT(UserID)
FROM users_notify_torrents
WHERE UserID = '$LoggedUser[ID]'
AND UnRead = '1'");
list($NewNotifications) = $DB->next_record();
/* if ($NewNotifications && !check_perms('site_torrents_notify')) {
$DB->query("
DELETE FROM users_notify_torrents
WHERE UserID = '$LoggedUser[ID]'");
$DB->query("
DELETE FROM users_notify_filters
WHERE UserID = '$LoggedUser[ID]'");
} */
$Cache->cache_value('notifications_new_'.$LoggedUser['ID'], $NewNotifications, 0);
}
if ($NewNotifications > 0) {
$Alerts[] = '<a href="torrents.php?action=notify">You have '.$NewNotifications.(($NewNotifications > 1) ? ' new torrent notifications' : ' new torrent notification').'</a>';
// Torrents
if ($NotificationsManager->is_traditional(NotificationsManager::TORRENTS)) {
$NotificationsManager->load_torrent_notifications();
$NewTorrents = $NotificationsManager->get_notifications()[NotificationsManager::TORRENTS];
if (isset($NewTorrents)) {
$Alerts[] = NotificationsManagerView::format_traditional($NewTorrents['contents']);
}
$NotificationsManager->clear_notifications_array();
}
// Collage subscriptions
if (check_perms('site_collages_subscribe')) {
$NewCollages = $Cache->get_value('collage_subs_user_new_'.$LoggedUser['ID']);
if ($NewCollages === false) {
$DB->query("
SELECT COUNT(DISTINCT s.CollageID)
FROM users_collage_subs as s
JOIN collages as c ON s.CollageID = c.ID
JOIN collages_torrents as ct on ct.CollageID = c.ID
WHERE s.UserID = $LoggedUser[ID]
AND ct.AddedOn > s.LastVisit
AND c.Deleted = '0'");
list($NewCollages) = $DB->next_record();
$Cache->cache_value('collage_subs_user_new_'.$LoggedUser['ID'], $NewCollages, 0);
}
if ($NewCollages > 0) {
$Alerts[] = '<a href="userhistory.php?action=subscribed_collages">You have '.$NewCollages.(($NewCollages > 1) ? ' new collage updates' : ' new collage update').'</a>';
}
}
if (check_perms('users_mod')) {
$ModBar[] = '<a href="tools.php">Toolbox</a>';
}
if (check_perms('users_mod') || $LoggedUser['PermissionID'] == FORUM_MOD) {
$NumStaffPMs = $Cache->get_value('num_staff_pms_'.$LoggedUser['ID']);
if (check_perms('users_mod') || G::$LoggedUser['PermissionID'] == FORUM_MOD) {
$NumStaffPMs = G::$Cache->get_value('num_staff_pms_'.G::$LoggedUser['ID']);
if ($NumStaffPMs === false) {
if (check_perms('users_mod')) {
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM staff_pm_conversations
WHERE Status = 'Unanswered'
AND (AssignedToUser = ".$LoggedUser['ID']."
AND (AssignedToUser = ".G::$LoggedUser['ID']."
OR (Level >= ".max(700, $Classes[MOD]['Level'])."
AND Level <= ".$LoggedUser['Class']."))");
AND Level <= ".G::$LoggedUser['Class']."))");
}
if ($LoggedUser['PermissionID'] == FORUM_MOD) {
$DB->query("
if (G::$LoggedUser['PermissionID'] == FORUM_MOD) {
G::$DB->query("
SELECT COUNT(ID)
FROM staff_pm_conversations
WHERE Status='Unanswered'
AND (AssignedToUser = ".$LoggedUser['ID']."
AND (AssignedToUser = ".G::$LoggedUser['ID']."
OR Level = '". $Classes[FORUM_MOD]['Level'] . "')");
}
list($NumStaffPMs) = $DB->next_record();
$Cache->cache_value('num_staff_pms_'.$LoggedUser['ID'], $NumStaffPMs , 1000);
list($NumStaffPMs) = G::$DB->next_record();
G::$Cache->cache_value('num_staff_pms_'.G::$LoggedUser['ID'], $NumStaffPMs , 1000);
}
if ($NumStaffPMs > 0) {
@ -542,57 +388,57 @@ class="stat"
}
if (check_perms('admin_reports')) {
// Torrent reports code
$NumTorrentReports = $Cache->get_value('num_torrent_reportsv2');
$NumTorrentReports = G::$Cache->get_value('num_torrent_reportsv2');
if ($NumTorrentReports === false) {
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM reportsv2
WHERE Status = 'New'");
list($NumTorrentReports) = $DB->next_record();
$Cache->cache_value('num_torrent_reportsv2', $NumTorrentReports, 0);
list($NumTorrentReports) = G::$DB->next_record();
G::$Cache->cache_value('num_torrent_reportsv2', $NumTorrentReports, 0);
}
$ModBar[] = '<a href="reportsv2.php">'.$NumTorrentReports.(($NumTorrentReports == 1) ? ' Report' : ' Reports').'</a>';
// Other reports code
$NumOtherReports = $Cache->get_value('num_other_reports');
$NumOtherReports = G::$Cache->get_value('num_other_reports');
if ($NumOtherReports === false) {
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM reports
WHERE Status = 'New'");
list($NumOtherReports) = $DB->next_record();
$Cache->cache_value('num_other_reports', $NumOtherReports, 0);
list($NumOtherReports) = G::$DB->next_record();
G::$Cache->cache_value('num_other_reports', $NumOtherReports, 0);
}
if ($NumOtherReports > 0) {
$ModBar[] = '<a href="reports.php">'.$NumOtherReports.(($NumTorrentReports == 1) ? ' Other report' : ' Other reports').'</a>';
}
} elseif (check_perms('project_team')) {
$NumUpdateReports = $Cache->get_value('num_update_reports');
$NumUpdateReports = G::$Cache->get_value('num_update_reports');
if ($NumUpdateReports === false) {
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM reports
WHERE Status = 'New'
AND Type = 'request_update'");
list($NumUpdateReports) = $DB->next_record();
$Cache->cache_value('num_update_reports', $NumUpdateReports, 0);
list($NumUpdateReports) = G::$DB->next_record();
G::$Cache->cache_value('num_update_reports', $NumUpdateReports, 0);
}
if ($NumUpdateReports > 0) {
$ModBar[] = '<a href="reports.php">Request update reports</a>';
}
} elseif (check_perms('site_moderate_forums')) {
$NumForumReports = $Cache->get_value('num_forum_reports');
$NumForumReports = G::$Cache->get_value('num_forum_reports');
if ($NumForumReports === false) {
$DB->query("
G::$DB->query("
SELECT COUNT(ID)
FROM reports
WHERE Status = 'New'
AND Type IN('artist_comment', 'collages_comment', 'post', 'requests_comment', 'thread', 'torrents_comment')");
list($NumForumReports) = $DB->next_record();
$Cache->cache_value('num_forum_reports', $NumForumReports, 0);
list($NumForumReports) = G::$DB->next_record();
G::$Cache->cache_value('num_forum_reports', $NumForumReports, 0);
}
if ($NumForumReports > 0) {
@ -601,19 +447,21 @@ class="stat"
}
if (!empty($Alerts) || !empty($ModBar)) {
?>
<?
if (!empty($Alerts) || !empty($ModBar)) { ?>
<div id="alerts">
<? foreach ($Alerts as $Alert) { ?>
<div class="alertbar"><?=$Alert?></div>
<? }
<?
}
if (!empty($ModBar)) { ?>
<div class="alertbar blend"><?=implode(' | ', $ModBar)?></div>
<? } ?>
</div>
<?
}
} ?>
</div>
<? } ?>
<?
//Done handling alertbars
@ -623,13 +471,13 @@ class="stat"
<li id="searchbar_torrents"><span class="hidden">Torrents: </span>
<form class="search_form" name="torrents" action="torrents.php"
method="get">
<? if (isset($LoggedUser['SearchType']) && $LoggedUser['SearchType']) { // Advanced search ?>
<? if (isset(G::$LoggedUser['SearchType']) && G::$LoggedUser['SearchType']) { // Advanced search ?>
<input type="hidden" name="action" value="advanced" />
<? } ?>
<input id="torrentssearch" accesskey="t" spellcheck="false"
onfocus="if (this.value == 'Torrents') this.value = '';"
onblur="if (this.value == '') this.value = 'Torrents';"
<? if (isset($LoggedUser['SearchType']) && $LoggedUser['SearchType']) { // Advanced search ?>
<? if (isset(G::$LoggedUser['SearchType']) && G::$LoggedUser['SearchType']) { // Advanced search ?>
value="Torrents" type="text" name="groupname" size="17"
<? } else { ?> value="Torrents" type="text" name="searchstr"
size="17" <? } ?> />

View File

@ -1,7 +1,6 @@
<?
global $LoggedUser, $Languages, $SSL;
global $LoggedUser, $SSL;
define('FOOTER_FILE',SERVER_ROOT.'/design/publicfooter.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
@ -26,7 +25,6 @@
<? if ($Mobile) { ?>
<script src="<?=STATIC_SERVER?>styles/mobile/style.js?v=<?=filemtime(SERVER_ROOT.'/static/mobile/style.js')?>" type="text/javascript"></script>
<? }
?>
</head>
<body>
@ -44,4 +42,4 @@
<? } ?>
</ul>
</div>
<?

View File

@ -22,10 +22,22 @@
*
* Globals are required as this template is included within a
* function scope.
*/
global $LoggedUser, $HeavyInfo, $UserSubscriptions, $ThreadInfo, $ForumsDoublePost;
*
* To add a "Subscribe" box for non-forum pages (like artist/collage/...
* comments), add a key 'SubscribeBox' to the array passed to View::parse.
* Example:
if ($LoggedUser['DisablePosting']) {
View::parse('generic/reply/quickreply.php', array(
'InputTitle' => 'Post comment',
'InputName' => 'groupid',
'InputID' => $GroupID,
'TextareaCols' => 65,
'SubscribeBox' => true
));
*/
global $HeavyInfo, $UserSubscriptions, $ThreadInfo, $ForumsDoublePost, $Document;
if (G::$LoggedUser['DisablePosting']) {
return;
}
if (!isset($TextareaCols)) {
@ -40,6 +52,9 @@
if (!isset($InputTitle)) {
$InputTitle = 'Post comment';
}
if (!isset($Action)) {
$Action = '';
}
// TODO: Remove inline styles
@ -69,7 +84,7 @@
<tr class="colhead_dark">
<td colspan="<?=(Users::has_avatars_enabled() ? 2 : 1)?>">
<div style="float: left;"><a href="#quickreplypreview">#XXXXXX</a>
by <strong><?=Users::format_username($LoggedUser['ID'], true, true, true, true)?></strong> Just now
by <strong><?=Users::format_username(G::$LoggedUser['ID'], true, true, true, true)?></strong> Just now
</div>
<div style="float: right;">
<a href="#quickreplypreview" class="brackets">Report</a>
@ -81,7 +96,7 @@
<tr>
<? if (Users::has_avatars_enabled()) { ?>
<td class="avatar" valign="top">
<?=Users::show_avatar($LoggedUser['Avatar'], $LoggedUser['Username'], $HeavyInfo['DisableAvatars'])?>
<?=Users::show_avatar(G::$LoggedUser['Avatar'], G::$LoggedUser['ID'], G::$LoggedUser['Username'], $HeavyInfo['DisableAvatars'])?>
</td>
<? } ?>
<td class="body" valign="top">
@ -91,9 +106,9 @@
</td>
</tr>
</table>
<form class="send_form center" name="reply" id="quickpostform" action="" method="post"<? if (!check_perms('users_mod')) { ?> onsubmit="quickpostform.submit_button.disabled=true;" <? } ?>>
<form class="send_form center" name="reply" id="quickpostform" action="<?=$Action?>" method="post"<? if (!check_perms('users_mod')) { ?> onsubmit="quickpostform.submit_button.disabled=true;" <? } ?>>
<input type="hidden" name="action" value="<?=$InputAction?>" />
<input type="hidden" name="auth" value="<?=$LoggedUser['AuthKey']?>" />
<input type="hidden" name="auth" value="<?=G::$LoggedUser['AuthKey']?>" />
<input type="hidden" name="<?=$InputName?>" value="<?=$InputID?>" />
<div id="quickreplytext">
<?
@ -103,15 +118,20 @@
</div>
<div class="preview_submit">
<?
if (isset($SubscribeBox) && !isset($ForumID) && Subscriptions::has_subscribed_comments($Document, $InputID) === false) { ?>
<input id="subscribebox" type="checkbox" name="subscribe"<?=!empty($HeavyInfo['AutoSubscribe']) ? ' checked="checked"' : ''?> tabindex="2" />
<label for="subscribebox">Subscribe</label>
<?
}
// Forum thread logic
// This might use some more abstraction
if ($ForumID) { ?>
<? if (!in_array($InputID, $UserSubscriptions)) { ?>
if (isset($ForumID)) {
if (!Subscriptions::has_subscribed($InputID)) { ?>
<input id="subscribebox" type="checkbox" name="subscribe"<?=!empty($HeavyInfo['AutoSubscribe']) ? ' checked="checked"' : ''?> tabindex="2" />
<label for="subscribebox">Subscribe</label>
<?
}
if ($ThreadInfo['LastPostAuthorID'] == $LoggedUser['ID']
if ($ThreadInfo['LastPostAuthorID'] == G::$LoggedUser['ID']
&& (check_perms('site_forums_double_post')
|| in_array($ForumID, $ForumsDoublePost))
) {
@ -119,7 +139,7 @@
<input id="mergebox" type="checkbox" name="merge" tabindex="2" />
<label for="mergebox">Merge</label>
<? }
if (!$LoggedUser['DisableAutoSave']) { ?>
if (!G::$LoggedUser['DisableAutoSave']) { ?>
<script type="application/javascript">var storedTempTextarea = new StoreText('quickpost', 'quickpostform', <?=$InputID?>);</script>
<? }
}

View File

@ -1,5 +1,26 @@
CHANGELOG
2013-08-28 by porkpie
Add an option for the styled tooltips
2013-08-25 by Y
Comment subscriptions, quote notifications and quote linking
2013-08-24 by Ajax
Notifications Manager class and noty.js library to provide popup notifications
2013-08-24 by Ajax
Redesigned user settings page
2013-08-24 by Ajax
Tooltipster library added for tooltips
2013-08-24 by Ajax
Calendar in Staff Toolbox
2013-08-24 by Ajax
Donor Rank system and rewrite of all donation code
2013-08-08 by Squiffy
Drag and Drop ordering on the Do Not Upload page in toolbox

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
<?
$Type = $_POST['type'];
switch($Type) {
case NotificationsManager::INBOX:
NotificationsManager::clear_inbox();
break;
case NotificationsManager::NEWS:
NotificationsManager::clear_news();
break;
case NotificationsManager::BLOG:
NotificationsManager::clear_blog();
break;
case NotificationsManager::STAFFPM:
NotificationsManager::clear_staff_pms();
break;
case NotificationsManager::TORRENTS:
NotificationsManager::clear_torrents();
break;
case NotificationsManager::QUOTES:
NotificationsManager::clear_quotes();
break;
case NotificationsManager::SUBSCRIPTIONS:
NotificationsManager::clear_subscriptions();
break;
case NotificationsManager::COLLAGES:
NotificationsManager::clear_collages();
break;
case NotificationsManager::GLOBALNOTICE:
NotificationsManager::clear_global_notification();
break;
default:
break;
}
if (strpos($Type, "oneread_") === 0) {
NotificationsManager::clear_one_read($Type);
}

View File

@ -133,15 +133,8 @@
}
}
// 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);
}
//Handle subscriptions
$UserSubscriptions = Subscriptions::get_subscriptions();
if (empty($UserSubscriptions)) {
$UserSubscriptions = array();

View File

@ -0,0 +1,9 @@
<?
$Skip = array();
$Skip[] = db_string($_GET['skip']);
$NotificationsManager = new NotificationsManager($LoggedUser['ID'], $Skip);
json_die("success", $NotificationsManager->get_notifications());
//echo '{"status":"success","response":[[{"message":"1st notification","url":"https:\/\/www.google.com\/","importance":"alert","AutoExpire":false},{"message":"2nd notification","url":"","importance":"alert","AutoExpire":true}]]}';

View File

@ -157,6 +157,12 @@
case 'raw_bbcode':
require(SERVER_ROOT . '/sections/ajax/raw_bbcode.php');
break;
case 'get_user_notifications':
require(SERVER_ROOT . '/sections/ajax/get_user_notifications.php');
break;
case 'clear_user_notification':
require(SERVER_ROOT . '/sections/ajax/clear_user_notification.php');
break;
default:
// If they're screwing around with the query string
json_die("failure");

View File

@ -91,27 +91,7 @@
}
// Subscriptions
$NewSubscriptions = $Cache->get_value('subscriptions_user_new_' . $LoggedUser['ID']);
if ($NewSubscriptions === false) {
if ($LoggedUser['CustomForums']) {
unset($LoggedUser['CustomForums']['']);
$RestrictedForums = implode("','", array_keys($LoggedUser['CustomForums'], 0));
$PermittedForums = implode("','", array_keys($LoggedUser['CustomForums'], 1));
}
$DB->query("
SELECT COUNT(s.TopicID)
FROM users_subscriptions AS s
JOIN forums_last_read_topics AS l ON s.UserID = l.UserID AND s.TopicID = l.TopicID
JOIN forums_topics AS t ON l.TopicID = t.ID
JOIN forums AS f ON t.ForumID = f.ID
WHERE (f.MinClassRead <= " . $LoggedUser['Class'] . " OR f.ID IN ('$PermittedForums'))
AND l.PostID < t.LastPostID
AND s.UserID = " . $LoggedUser['ID'] .
(!empty($RestrictedForums) ? "
AND f.ID NOT IN ('" . $RestrictedForums . "')" : ''));
list($NewSubscriptions) = $DB->next_record();
$Cache->cache_value('subscriptions_user_new_' . $LoggedUser['ID'], $NewSubscriptions, 0);
}
$NewSubscriptions = Subscriptions::has_new_subscriptions();
json_die("success", array(
'username' => $LoggedUser['Username'],

View File

@ -1,5 +1,4 @@
<?
$RequestTax = 0.1;
// Minimum and default amount of upload to remove from the user when they vote.
@ -17,7 +16,7 @@
json_die("failure");
}
$RequestID = $_GET['id'];
$RequestID = (int)$_GET['id'];
//First things first, lets get the data for the request.
@ -92,47 +91,7 @@
}
reset($RequestVotes['Voters']);
$Results = $Cache->get_value('request_comments_'.$RequestID);
if ($Results === false) {
$DB->query("
SELECT COUNT(c.ID)
FROM requests_comments as c
WHERE c.RequestID = '$RequestID'");
list($Results) = $DB->next_record();
$Cache->cache_value('request_comments_'.$RequestID, $Results, 0);
}
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $Results);
// Get the cache catalogue
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
//---------- Get some data to start processing
// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page
$Catalogue = $Cache->get_value('request_comments_'.$RequestID.'_catalogue_'.$CatalogueID);
if ($Catalogue === false) {
$DB->query("
SELECT
c.ID,
c.AuthorID,
c.AddedTime,
c.Body,
c.EditedUserID,
c.EditedTime,
u.Username
FROM requests_comments as c
LEFT JOIN users_main AS u ON u.ID=c.EditedUserID
WHERE c.RequestID = '$RequestID'
ORDER BY c.ID
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false,MYSQLI_ASSOC);
$Cache->cache_value('request_comments_'.$RequestID.'_catalogue_'.$CatalogueID, $Catalogue, 0);
}
//This is a hybrid to reduce the catalogue down to the page elements: We use the page limit % catalogue
$Thread = array_slice($Catalogue, ((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) % THREAD_CATALOGUE), TORRENT_COMMENTS_PER_PAGE, true);
list($NumComments, $Page, $Thread) = Comments::load('requests', $RequestID, false);
$JsonRequestComments = array();
foreach ($Thread as $Key => $Post) {
@ -197,7 +156,7 @@
'tags' => $JsonTags,
'comments' => $JsonRequestComments,
'commentPage' => (int) $Page,
'commentPages' => (int) ceil($Results / TORRENT_COMMENTS_PER_PAGE),
'commentPages' => (int) ceil($NumComments / TORRENT_COMMENTS_PER_PAGE),
'recordLabel' => $RecordLabel,
'oclc' => $OCLC
));

View File

@ -17,12 +17,6 @@
}
list($Page, $Limit) = Format::page_limit($PerPage);
if ($LoggedUser['CustomForums']) {
unset($LoggedUser['CustomForums']['']);
$RestrictedForums = implode("','", array_keys($LoggedUser['CustomForums'], 0));
$PermittedForums = implode("','", array_keys($LoggedUser['CustomForums'], 1));
}
$ShowUnread = (!isset($_GET['showunread']) && !isset($HeavyInfo['SubscriptionsUnread']) || isset($HeavyInfo['SubscriptionsUnread']) && !!$HeavyInfo['SubscriptionsUnread'] || isset($_GET['showunread']) && !!$_GET['showunread']);
$ShowCollapsed = (!isset($_GET['collapse']) && !isset($HeavyInfo['SubscriptionsCollapse']) || isset($HeavyInfo['SubscriptionsCollapse']) && !!$HeavyInfo['SubscriptionsCollapse'] || isset($_GET['collapse']) && !!$_GET['collapse']);
$sql = '
@ -36,15 +30,7 @@
LEFT JOIN forums_last_read_topics AS l ON p.TopicID = l.TopicID AND l.UserID = s.UserID
WHERE s.UserID = '.$LoggedUser['ID'].'
AND p.ID <= IFNULL(l.PostID,t.LastPostID)
AND ((f.MinClassRead <= '.$LoggedUser['Class'];
if (!empty($RestrictedForums)) {
$sql.=" AND f.ID NOT IN ('$RestrictedForums')";
}
$sql .= ')';
if (!empty($PermittedForums)) {
$sql.=" OR f.ID IN ('$PermittedForums')";
}
$sql .= ')';
AND ' . Forums::user_forums_sql();
if ($ShowUnread) {
$sql .= '
AND IF(l.PostID IS NULL OR (t.IsLocked = \'1\' && t.IsSticky = \'0\'), t.LastPostID, l.PostID) < t.LastPostID';

View File

@ -1,62 +1,12 @@
<?php
<?
include(SERVER_ROOT.'/classes/text.class.php');
$Text = new TEXT;
$GroupID=ceil($_GET['id']);
$Results = $Cache->get_value('torrent_comments_'.$GroupID);
if ($Results === false) {
$DB->query("
SELECT
COUNT(c.ID)
FROM torrents_comments as c
WHERE c.GroupID = '$GroupID'");
list($Results) = $DB->next_record();
$Cache->cache_value('torrent_comments_'.$GroupID, $Results, 0);
if (empty($_GET['id']) || !is_number($_GET['id'])) {
json_die("failure");
}
if (isset($_GET['postid']) && is_number($_GET['postid']) && $Results > TORRENT_COMMENTS_PER_PAGE) {
$DB->query("
SELECT COUNT(ID)
FROM torrents_comments
WHERE GroupID = $GroupID
AND ID <= $_GET[postid]");
list($PostNum) = $DB->next_record();
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $PostNum);
} else {
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $Results);
}
//Get the cache catalogue
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
//---------- Get some data to start processing
// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page
$Catalogue = $Cache->get_value('torrent_comments_'.$GroupID.'_catalogue_'.$CatalogueID);
if ($Catalogue === false) {
$DB->query("
SELECT
c.ID,
c.AuthorID,
c.AddedTime,
c.Body,
c.EditedUserID,
c.EditedTime,
u.Username
FROM torrents_comments as c
LEFT JOIN users_main AS u ON u.ID=c.EditedUserID
WHERE c.GroupID = '$GroupID'
ORDER BY c.ID
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false,MYSQLI_ASSOC);
$Cache->cache_value('torrent_comments_'.$GroupID.'_catalogue_'.$CatalogueID, $Catalogue, 0);
}
//This is a hybrid to reduce the catalogue down to the page elements: We use the page limit % catalogue
$Thread = array_slice($Catalogue, ((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) % THREAD_CATALOGUE), TORRENT_COMMENTS_PER_PAGE, true);
list($NumComments, $Page, $Thread) = Comments::load('torrents', (int)$_GET['id'], false);
//---------- Begin printing
$JsonComments = array();
@ -86,6 +36,6 @@
json_die("success", array(
'page' => (int) $Page,
'pages' => ceil($Results / TORRENT_COMMENTS_PER_PAGE),
'pages' => ceil($NumComments / TORRENT_COMMENTS_PER_PAGE),
'comments' => $JsonComments
));

View File

@ -35,7 +35,6 @@
i.JoinDate,
i.Info,
i.Avatar,
i.Country,
i.Donor,
i.Warned,
COUNT(posts.id) AS ForumPosts,
@ -54,7 +53,7 @@
json_die("failure", "no such user");
}
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));
list($Username, $Email, $LastAccess, $IP, $Class, $Uploaded, $Downloaded, $RequiredRatio, $Enabled, $Paranoia, $Invites, $CustomTitle, $torrent_pass, $DisableLeech, $JoinDate, $Info, $Avatar, $Donor, $Warned, $ForumPosts, $InviterID, $DisableInvites, $InviterName, $RatioWatchEnds, $RatioWatchDownload) = $DB->next_record(MYSQLI_NUM, array(9, 11));
$Paranoia = unserialize($Paranoia);
if (!is_array($Paranoia)) {
@ -188,8 +187,9 @@ function check_paranoia_here($Setting) {
if (check_paranoia_here(array('torrentcomments', 'torrentcomments+'))) {
$DB->query("
SELECT COUNT(ID)
FROM torrents_comments
WHERE AuthorID = '$UserID'");
FROM comments
WHERE Page = 'torrents'
AND AuthorID = '$UserID'");
list($NumComments) = $DB->next_record();
}
@ -275,6 +275,11 @@ function check_paranoia_here($Setting) {
if (!check_paranoia_here('lastseen')) {
$LastAccess = '';
}
if (check_paranoia_here('ratio')) {
$Ratio = Format::get_ratio($Uploaded, $Downloaded, 5);
} else {
$Ratio = null;
}
if (!check_paranoia_here('uploaded')) {
$Uploaded = null;
}

View File

@ -36,11 +36,6 @@ function error_out($reason = '') {
$UserInfo = Users::user_info($UserID);
extract(array_intersect_key($UserInfo, array_flip(array('Username', 'Enabled', 'Title', 'Avatar', 'Donor', 'Warned'))));
if ($LoggedUser['CustomForums']) {
unset($LoggedUser['CustomForums']['']);
$RestrictedForums = implode("','", array_keys($LoggedUser['CustomForums'], 0));
$PermittedForums = implode("','", array_keys($LoggedUser['CustomForums'], 1));
}
$ViewingOwn = ($UserID === $LoggedUser['ID']);
$ShowUnread = ($ViewingOwn && (!isset($_GET['showunread']) || !!$_GET['showunread']));
$ShowGrouped = ($ViewingOwn && (!isset($_GET['group']) || !!$_GET['group']));
@ -58,17 +53,7 @@ function error_out($reason = '') {
$SQL .= '
LEFT JOIN forums AS f ON f.ID = t.ForumID
WHERE p.AuthorID = '.$UserID.'
AND ((f.MinClassRead <= '.$LoggedUser['Class'];
if (!empty($RestrictedForums)) {
$SQL .= "
AND f.ID NOT IN ('$RestrictedForums')";
}
$SQL .= ')';
if (!empty($PermittedForums)) {
$SQL .= "
OR f.ID IN ('$PermittedForums')";
}
$SQL .= ')';
AND ' . Forums::user_forums_sql();
if ($ShowUnread) {
$SQL .= '
AND ((t.IsLocked = \'0\' OR t.IsSticky = \'1\')
@ -145,21 +130,7 @@ function error_out($reason = '') {
JOIN forums AS f ON f.ID = t.ForumID
LEFT JOIN forums_last_read_topics AS l ON l.UserID = $UserID AND l.TopicID = t.ID
WHERE p.AuthorID = $UserID
AND ((f.MinClassRead <= ".$LoggedUser['Class'];
if (!empty($RestrictedForums)) {
$SQL .= "
AND f.ID NOT IN ('$RestrictedForums')";
}
$SQL .= '
)';
if (!empty($PermittedForums)) {
$SQL .= "
OR f.ID IN ('$PermittedForums')";
}
$SQL .= '
)';
AND " . Forums::user_forums_sql();
if ($ShowUnread) {
$SQL .= '

View File

@ -8,13 +8,13 @@
);
if (
empty($_GET['req']) ||
empty($_GET['uid']) ||
empty($_GET['aid']) ||
empty($_GET['key']) ||
!is_number($_GET['uid']) ||
!is_number($_GET['aid']) ||
!in_array($_GET['req'], $Available, true)
empty($_GET['req'])
|| empty($_GET['uid'])
|| empty($_GET['aid'])
|| empty($_GET['key'])
|| !is_number($_GET['uid'])
|| !is_number($_GET['aid'])
|| !in_array($_GET['req'], $Available, true)
) {
error('invalid');
}

View File

@ -9,7 +9,7 @@ function compare($X, $Y) {
include(SERVER_ROOT.'/classes/text.class.php'); // Text formatting class
$Text = new TEXT;
// Similar artist map
// Similar Artist Map
include(SERVER_ROOT.'/classes/artists_similar.class.php');
$UserVotes = Votes::get_user_votes($LoggedUser['ID']);
@ -343,9 +343,9 @@ function compare($X, $Y) {
}
$DisplayName = "<a href=\"torrents.php?id=$GroupID\" title=\"View Torrent\">$GroupName</a>";
$DisplayName = "<a href=\"torrents.php?id=$GroupID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if (check_perms('users_mod') || check_perms('torrents_fix_ghosts')) {
$DisplayName .= ' <a href="torrents.php?action=fix_group&amp;groupid='.$GroupID.'&amp;artistid='.$ArtistID.'&amp;auth='.$LoggedUser['AuthKey'].'" class="brackets" title="Fix ghost DB entry">Fix</a>';
$DisplayName .= ' <a href="torrents.php?action=fix_group&amp;groupid='.$GroupID.'&amp;artistid='.$ArtistID.'&amp;auth='.$LoggedUser['AuthKey'].'" class="brackets tooltip" title="Fix ghost DB entry">Fix</a>';
}
@ -390,22 +390,22 @@ function compare($X, $Y) {
?>
<tr class="releases_<?=$ReleaseType?> group discog<?=$SnatchedGroupClass . $HideDiscog?>">
<td class="center">
<div title="View" id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event)" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collapse all groups in this release type."></a>
<div id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="tooltip show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event);" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collapse all groups in this release type."></a>
</div>
</td>
<td colspan="5" class="big_info">
<? if ($LoggedUser['CoverArt']) : ?>
<? if ($LoggedUser['CoverArt']) { ?>
<div class="group_image float_left clear">
<? ImageTools::cover_thumb($WikiImage, $GroupCategoryID) ?>
</div>
<? endif; ?>
<? } ?>
<div class="group_info clear">
<strong><?=$DisplayName?></strong>
<? if (Bookmarks::has_bookmarked('torrent', $GroupID)) {
echo "<a style=\"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"remove_bookmark brackets\" title=\"Unbookmark\" onclick=\"Unbookmark('torrent', $GroupID, 'Bookmark'); return false;\">Unbookmark</a>";
echo "<a style=\"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"remove_bookmark brackets\" onclick=\"Unbookmark('torrent', $GroupID, 'Bookmark'); return false;\">Remove bookmark</a>";
} else {
echo "<a style=\"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"add_bookmark brackets\" title=\"Bookmark\" onclick=\"Bookmark('torrent', $GroupID, 'Unbookmark'); return false;\">Bookmark</a>";
echo "<a style=\"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"add_bookmark brackets\" onclick=\"Bookmark('torrent', $GroupID, 'Remove bookmark'); return false;\">Bookmark</a>";
} ?>
<?Votes::vote_link($GroupID, $UserVotes[$GroupID]['Type']);?>
<div class="tags"><?=$TorrentTags->format('torrents.php?taglist=', $Name)?></div>
@ -428,16 +428,19 @@ function compare($X, $Y) {
}
$SnatchedTorrentClass = ($Torrent['IsSnatched'] ? ' snatched_torrent' : '');
if ($Torrent['RemasterTitle'] != $LastRemasterTitle || $Torrent['RemasterYear'] != $LastRemasterYear ||
$Torrent['RemasterRecordLabel'] != $LastRemasterRecordLabel || $Torrent['RemasterCatalogueNumber'] !=
$LastRemasterCatalogueNumber || $FirstUnknown || $Torrent['Media'] != $LastMedia
if ($Torrent['RemasterTitle'] != $LastRemasterTitle
|| $Torrent['RemasterYear'] != $LastRemasterYear
|| $Torrent['RemasterRecordLabel'] != $LastRemasterRecordLabel
|| $Torrent['RemasterCatalogueNumber'] != $LastRemasterCatalogueNumber
|| $FirstUnknown
|| $Torrent['Media'] != $LastMedia
) {
$EditionID++;
?>
<tr class="releases_<?=$ReleaseType?> groupid_<?=$GroupID?> edition group_torrent discog<?=$SnatchedGroupClass . $HideDiscog . $HideTorrents?>">
<td colspan="6" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event)" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $TorrentList[$Group['GroupID']])?></strong></td>
<td colspan="6" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event);" class="tooltip" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $TorrentList[$Group['GroupID']])?></strong></td>
</tr>
<?
}
@ -452,15 +455,15 @@ function compare($X, $Y) {
<span>
[ <a href="torrents.php?action=download&amp;id=<?=$TorrentID?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>" title="Download"><?=$Torrent['HasFile'] ? 'DL' : 'Missing'?></a>
<? if (Torrents::can_use_token($Torrent)) { ?>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');">FL</a>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');" class="tooltip">FL</a>
<? } ?> ]
</span>
&nbsp;&nbsp;&raquo;&nbsp; <a href="torrents.php?id=<?=$GroupID?>&amp;torrentid=<?=$TorrentID?>"><?=Torrents::torrent_info($Torrent)?></a>
</td>
<td class="nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td><?=number_format($Torrent['Snatched'])?></td>
<td<?=(($Torrent['Seeders'] == 0) ? ' class="r00"' : '')?>><?=number_format($Torrent['Seeders'])?></td>
<td><?=number_format($Torrent['Leechers'])?></td>
<td class="number_column nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td class="number_column"><?=number_format($Torrent['Snatched'])?></td>
<td class="number_column<?=(($Torrent['Seeders'] == 0) ? ' r00' : '')?>"><?=number_format($Torrent['Seeders'])?></td>
<td class="number_column"><?=number_format($Torrent['Leechers'])?></td>
</tr>
<?
}
@ -475,7 +478,7 @@ function compare($X, $Y) {
//----------------- End building list and getting stats
View::show_header($Name, 'browse,requests,bbcode,comments,voting,recommend');
View::show_header($Name, 'browse,requests,bbcode,comments,voting,recommend,subscriptions');
?>
<div class="thin">
<div class="header">
@ -497,7 +500,7 @@ function compare($X, $Y) {
$Notify = $DB->next_record(MYSQLI_ASSOC, false);
$Cache->cache_value('notify_artists_'.$LoggedUser['ID'], $Notify, 0);
}
if (stripos($Notify['Artists'], '|'.$Name.'|') === false) {
if (stripos($Notify['Artists'], "|$Name|") === false) {
?>
<a href="artist.php?action=notify&amp;artistid=<?=$ArtistID?>&amp;auth=<?=$LoggedUser['AuthKey']?>" class="brackets">Notify of new uploads</a>
<? } else { ?>
@ -512,6 +515,7 @@ function compare($X, $Y) {
<? } else { ?>
<a href="#" id="bookmarklink_artist_<?=$ArtistID?>" onclick="Bookmark('artist', <?=$ArtistID?>, 'Remove bookmark'); return false;" class="brackets">Bookmark</a>
<? } ?>
<a href="#" id="subscribelink_artist<?=$ArtistID?>" class="brackets" onclick="SubscribeComments('artist',<?=$ArtistID?>);return false;"><?=Subscriptions::has_subscribed_comments('artist', $ArtistID) !== false ? 'Unsubscribe' : 'Subscribe'?></a>
<!-- <a href="#" id="recommend" class="brackets">Recommend</a> -->
<?
if (check_perms('site_edit_wiki')) {
@ -544,7 +548,7 @@ function compare($X, $Y) {
<? } ?>
<div class="box box_search">
<div class="head"><strong>Search file lists</strong></div>
<div class="head"><strong>File Lists Search</strong></div>
<ul class="nobullet">
<li>
<form class="search_form" name="filelists" action="torrents.php">
@ -617,17 +621,15 @@ function compare($X, $Y) {
</form>
</div>
</div>
<? } ?>
<?
} //if (check_perms('zip_downloader')) ?>
<div class="box box_tags">
<div class="head"><strong>Tags</strong></div>
<ul class="stats nobullet">
<?
Tags::format_top(50, "torrents.php?taglist=", $Name);
?>
<? Tags::format_top(50, 'torrents.php?taglist=', $Name); ?>
</ul>
</div>
<?
// Stats
?>
<div class="box box_info box_statistics_artist">
@ -651,10 +653,10 @@ function compare($X, $Y) {
ass.Score,
ass.SimilarID
FROM artists_similar AS s1
JOIN artists_similar AS s2 ON s1.SimilarID=s2.SimilarID AND s1.ArtistID!=s2.ArtistID
JOIN artists_similar_scores AS ass ON ass.SimilarID=s1.SimilarID
JOIN artists_group AS a ON a.ArtistID=s2.ArtistID
WHERE s1.ArtistID='$ArtistID'
JOIN artists_similar AS s2 ON s1.SimilarID = s2.SimilarID AND s1.ArtistID != s2.ArtistID
JOIN artists_similar_scores AS ass ON ass.SimilarID = s1.SimilarID
JOIN artists_group AS a ON a.ArtistID = s2.ArtistID
WHERE s1.ArtistID = '$ArtistID'
ORDER BY ass.Score DESC
LIMIT 30
");
@ -663,12 +665,12 @@ function compare($X, $Y) {
}
?>
<div class="box box_artists">
<div class="head"><strong>Similar artists</strong></div>
<div class="head"><strong>Similar Artists</strong></div>
<ul class="stats nobullet">
<?
if ($NumSimilar == 0) { ?>
<? if ($NumSimilar == 0) { ?>
<li><span style="font-style: italic;">None found</span></li>
<? }
<?
}
$First = true;
foreach ($SimilarArray as $SimilarArtist) {
list($Artist2ID, $Artist2Name, $Score, $SimilarID) = $SimilarArtist;
@ -678,16 +680,16 @@ function compare($X, $Y) {
$First = false;
}
$FontSize = (ceil((((($Score - 2) / $Max - 2) * 4)))) + 8;
$FontSize = (ceil(((($Score - 2) / $Max - 2) * 4))) + 8;
?>
<li>
<span title="<?=$Score?>"><a href="artist.php?id=<?=$Artist2ID?>" style="float: left; display: block;"><?=$Artist2Name?></a></span>
<div style="float: right; display: block; letter-spacing: -1px;">
<a href="artist.php?action=vote_similar&amp;artistid=<?=$ArtistID?>&amp;similarid=<?=$SimilarID?>&amp;way=down" style="font-family: monospace;" title="Vote down this similar artist. Use this when you feel that the two artists are not all that similar." class="brackets">&minus;</a>
<a href="artist.php?action=vote_similar&amp;artistid=<?=$ArtistID?>&amp;similarid=<?=$SimilarID?>&amp;way=up" style="font-family: monospace;" title="Vote up this similar artist. Use this when you feel that the two artists are quite similar." class="brackets">+</a>
<a href="artist.php?action=vote_similar&amp;artistid=<?=$ArtistID?>&amp;similarid=<?=$SimilarID?>&amp;way=down" style="font-family: monospace;" class="tooltip" title="Vote down this similar artist. Use this when you feel that the two artists are not all that similar." class="brackets">&minus;</a>
<a href="artist.php?action=vote_similar&amp;artistid=<?=$ArtistID?>&amp;similarid=<?=$SimilarID?>&amp;way=up" style="font-family: monospace;" class="tooltip" title="Vote up this similar artist. Use this when you feel that the two artists are quite similar." class="brackets">+</a>
<? if (check_perms('site_delete_tag')) { ?>
<span class="remove remove_artist"><a href="artist.php?action=delete_similar&amp;similarid=<?=$SimilarID?>&amp;auth=<?=$LoggedUser['AuthKey']?>" title="Remove this similar artist" class="brackets">X</a></span>
<span class="remove remove_artist"><a href="artist.php?action=delete_similar&amp;similarid=<?=$SimilarID?>&amp;auth=<?=$LoggedUser['AuthKey']?>" class="tooltip" title="Remove this similar artist" class="brackets">X</a></span>
<? } ?>
</div>
<br style="clear: both;" />
@ -744,23 +746,25 @@ function compare($X, $Y) {
<td width="85%"><a href="#">&uarr;</a>&nbsp;This artist is in <?=number_format(count($Collages))?> collage<?=((count($Collages) > 1) ? 's' : '')?><?=$SeeAll?></td>
<td># artists</td>
</tr>
<? foreach ($Indices as $i) {
<?
foreach ($Indices as $i) {
list($CollageName, $CollageArtists, $CollageID) = $Collages[$i];
unset($Collages[$i]);
?>
?>
<tr>
<td><a href="collages.php?id=<?=$CollageID?>"><?=$CollageName?></a></td>
<td><?=number_format($CollageArtists)?></td>
</tr>
<? }
<?
}
foreach ($Collages as $Collage) {
list($CollageName, $CollageArtists, $CollageID) = $Collage;
?>
?>
<tr class="collage_rows hidden">
<td><a href="collages.php?id=<?=$CollageID?>"><?=$CollageName?></a></td>
<td><?=number_format($CollageArtists)?></td>
</tr>
<? } ?>
<? } ?>
</table>
<?
}
@ -797,10 +801,10 @@ function compare($X, $Y) {
} elseif ($CategoryName == 'Audiobooks' || $CategoryName == 'Comedy') {
$FullName = "<a href=\"requests.php?action=view&amp;id=$RequestID\">$Title [$Year]</a>";
} else {
$FullName ="<a href=\"requests.php?action=view&amp;id=$RequestID\">$Title</a>";
$FullName = "<a href=\"requests.php?action=view&amp;id=$RequestID\">$Title</a>";
}
$Row = ($Row == 'a') ? 'b' : 'a';
$Row = $Row === 'a' ? 'b' : 'a';
$Tags = Requests::get_tags($RequestID);
$ReqTagList = array();
@ -833,7 +837,7 @@ function compare($X, $Y) {
<?
}
// Similar artist map
// Similar Artist Map
if ($NumSimilar > 0) {
if ($SimilarData = $Cache->get_value("similar_positions_$ArtistID")) {
@ -862,7 +866,7 @@ function compare($X, $Y) {
<div id="similar_artist_map" class="box">
<div id="flipper_head" class="head">
<a href="#">&uarr;</a>&nbsp;
<strong id="flipper_title">Similar artist map</strong>
<strong id="flipper_title">Similar Artist Map</strong>
<a id="flip_to" class="brackets" href="#" onclick="flipView(); return false;">Switch to cloud</a>
</div>
<div id="flip_view_1" style="display: block; width: <?=(WIDTH)?>px; height: <?=(HEIGHT)?>px; position: relative; background-image: url(static/similar/<?=($ArtistID)?>.png?t=<?=(time())?>);">
@ -871,7 +875,7 @@ function compare($X, $Y) {
?>
</div>
<div id="flip_view_2" style="display: none; width: <?=WIDTH?>px; height: <?=HEIGHT?>px;">
<canvas width="<?=(WIDTH)?>px" height="<?=(HEIGHT - 20)?>px" id="similarArtistsCanvas"></canvas>
<canvas width="<?=WIDTH?>px" height="<?=(HEIGHT - 20)?>px" id="similarArtistsCanvas"></canvas>
<div id="artistTags" style="display: none;">
<ul><li></li></ul>
</div>
@ -888,7 +892,7 @@ function flipView() {
if (state) {
document.getElementById('flip_view_1').style.display = 'none';
document.getElementById('flip_view_2').style.display = 'block';
document.getElementById('flipper_title').innerHTML = 'Similar artist cloud';
document.getElementById('flipper_title').innerHTML = 'Similar Artist Cloud';
document.getElementById('flip_to').innerHTML = 'Switch to map';
if (!cloudLoaded) {
@ -902,7 +906,7 @@ function flipView() {
else {
document.getElementById('flip_view_1').style.display = 'block';
document.getElementById('flip_view_2').style.display = 'none';
document.getElementById('flipper_title').innerHTML = 'Similar artist map';
document.getElementById('flipper_title').innerHTML = 'Similar Artist Map';
document.getElementById('flip_to').innerHTML = 'Switch to cloud';
}
}
@ -939,154 +943,37 @@ function require(file, callback) {
</div>
<div id="body" class="body"><?=$Text->full_format($Body)?></div>
</div>
<? if (defined('LASTFM_API_KEY')) {
include(SERVER_ROOT.'/sections/artist/concerts.php');
} ?>
<?php
<?
if (defined('LASTFM_API_KEY')) {
include(SERVER_ROOT.'/sections/artist/concerts.php');
}
// --- Comments ---
// gets the amount of comments for this group
$Results = $Cache->get_value("artist_comments_$ArtistID");
if ($Results === false) {
$DB->query("
SELECT
COUNT(c.ID)
FROM artist_comments as c
WHERE c.ArtistID = '$ArtistID'");
list($Results) = $DB->next_record();
$Cache->cache_value("artist_comments_$ArtistID", $Results, 0);
}
list($NumComments, $Page, $Thread, $LastRead) = Comments::load('artist', $ArtistID);
$Pages = Format::get_pages($Page, $NumComments, TORRENT_COMMENTS_PER_PAGE, 9, '#comments');
if (isset($_GET['postid']) && is_number($_GET['postid']) && $Results > TORRENT_COMMENTS_PER_PAGE) {
$DB->query("
SELECT COUNT(ID)
FROM artist_comments
WHERE ArtistID = $ArtistID
AND ID <= $_GET[postid]");
list($PostNum) = $DB->next_record();
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $PostNum);
} else {
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $Results);
}
//Get the cache catalogue
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
//---------- Get some data to start processing
// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page
$Catalogue = $Cache->get_value("artist_comments_{$ArtistID}_catalogue_$CatalogueID");
if ($Catalogue === false) {
$DB->query("
SELECT
c.ID,
c.AuthorID,
c.AddedTime,
c.Body,
c.EditedUserID,
c.EditedTime,
u.Username
FROM artist_comments as c
LEFT JOIN users_main AS u ON u.ID = c.EditedUserID
WHERE c.ArtistID = '$ArtistID'
ORDER BY c.ID
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false, MYSQLI_ASSOC);
$Cache->cache_value("artist_comments_{$ArtistID}_catalogue_$CatalogueID", $Catalogue, 0);
}
//This is a hybrid to reduce the catalogue down to the page elements: We use the page limit % catalogue
$Thread = array_slice($Catalogue, ((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) % THREAD_CATALOGUE), TORRENT_COMMENTS_PER_PAGE, true);
?>
<div id="artistcomments" class="linkbox">
<a name="comments"></a>
<?
$Pages = Format::get_pages($Page, $Results, TORRENT_COMMENTS_PER_PAGE, 9, '#comments');
echo $Pages;
?>
<?=$Pages?>
</div>
<?
//---------- Begin printing
foreach ($Thread as $Key => $Post) {
list($PostID, $AuthorID, $AddedTime, $CommentBody, $EditedUserID, $EditedTime, $EditedUsername) = array_values($Post);
list($AuthorID, $Username, $PermissionID, $Paranoia, $Artist, $Donor, $Warned, $Avatar, $Enabled, $UserTitle) = array_values(Users::user_info($AuthorID));
CommentsView::render_comments($Thread, $LastRead, "artist.php?id=$ArtistID");
?>
<table class="forum_post box vertical_margin<?=(!Users::has_avatars_enabled() ? ' noavatar' : '')?>" id="post<?=$PostID?>">
<colgroup>
<? if (Users::has_avatars_enabled()) { ?>
<col class="col_avatar" />
<? } ?>
<col class="col_post_body" />
</colgroup>
<tr class="colhead_dark">
<td colspan="<?=(Users::has_avatars_enabled() ? 2 : 1)?>">
<div style="float: left;"><a class="post_id" href="artist.php?id=<?=$ArtistID?>&amp;postid=<?=$PostID?>#post<?=$PostID?>">#<?=$PostID?></a>
<strong><?=Users::format_username($AuthorID, true, true, true, true)?></strong> <?=time_diff($AddedTime)?>
- <a href="#quickpost" onclick="Quote('<?=$PostID?>','<?=$Username?>');" class="brackets">Quote</a>
<? if ($AuthorID == $LoggedUser['ID'] || check_perms('site_moderate_forums')) { ?>
- <a href="#post<?=$PostID?>" onclick="Edit_Form('<?=$PostID?>','<?=$Key?>');" class="brackets">Edit</a>
<?
}
if (check_perms('site_moderate_forums')) { ?>
- <a href="#post<?=$PostID?>" onclick="Delete('<?=$PostID?>');" class="brackets">Delete</a>
<? } ?>
</div>
<div id="bar<?=$PostID?>" style="float: right;">
<a href="reports.php?action=report&amp;type=artist_comment&amp;id=<?=$PostID?>" class="brackets">Report</a>
<?
if (check_perms('users_warn') && $AuthorID != $LoggedUser['ID']) {
$AuthorInfo = Users::user_info($AuthorID);
if ($LoggedUser['Class'] >= $AuthorInfo['Class']) {
?>
<form class="manage_form hidden" name="user" id="warn<?=$PostID?>" action="" method="post">
<input type="hidden" name="action" value="warn" />
<input type="hidden" name="artistid" value="<?=$ArtistID?>" />
<input type="hidden" name="postid" value="<?=$PostID?>" />
<input type="hidden" name="userid" value="<?=$AuthorID?>" />
<input type="hidden" name="key" value="<?=$Key?>" />
</form>
- <a href="#" onclick="$('#warn<?=$PostID?>').raw().submit(); return false;" class="brackets">Warn</a>
<?
}
}
?>
&nbsp;
<a href="#">&uarr;</a>
</div>
</td>
</tr>
<tr>
<? if (Users::has_avatars_enabled()) { ?>
<td class="avatar" valign="top">
<?=Users::show_avatar($Avatar, $Username, $HeavyInfo['DisableAvatars'])?>
</td>
<? } ?>
<td class="body" valign="top">
<div id="content<?=$PostID?>">
<?=$Text->full_format($CommentBody)?>
<? if ($EditedUserID) { ?>
<br />
<br />
<? if (check_perms('site_admin_forums')) { ?>
<a href="#content<?=$PostID?>" onclick="LoadEdit('artist', <?=$PostID?>, 1); return false;">&laquo;</a>
<? } ?>
Last edited by
<?=Users::format_username($EditedUserID, false, false, false) ?> <?=time_diff($EditedTime, 2, true, true)?>
<? } ?>
</div>
</td>
</tr>
</table>
<? } ?>
<div class="linkbox">
<?=($Pages)?>
<?=($Pages)?>
</div>
<?
View::parse('generic/reply/quickreply.php', array(
'InputName' => 'artistid',
'InputID' => $ArtistID));
'InputName' => 'pageid',
'InputID' => $ArtistID,
'Action' => 'comments.php?page=artist',
'InputAction' => 'take_post',
'SubscribeBox' => true
));
?>
</div>
</div>
@ -1099,7 +986,7 @@ function require(file, callback) {
if ($RevisionID) {
$Key = "artist_$ArtistID" . "_revision_$RevisionID";
} else {
$Key = 'artist_' . $ArtistID;
$Key = "artist_$ArtistID";
}
$Data = array(array($Name, $Image, $Body, $NumSimilar, $SimilarArray, array(), array(), $VanityHouseArtist));

View File

@ -35,7 +35,7 @@
if ($DB->has_results()) {
?>
<div class="thin">
There are still torrents that have <a href="artist.php?id=<?=$ArtistID?>" title="View Artist"><?=$Name?></a> as an artist.<br />
There are still torrents that have <a href="artist.php?id=<?=$ArtistID?>" class="tooltip" title="View artist"><?=$Name?></a> as an artist.<br />
Please remove the artist from these torrents manually before attempting to delete.<br />
<div class="box pad">
<ul>
@ -63,7 +63,7 @@
if ($DB->has_results()) {
?>
<div class="thin">
There are still requests that have <a href="artist.php?id=<?=$ArtistID?>" title="View Artist"><?=$Name?></a> as an artist.<br />
There are still requests that have <a href="artist.php?id=<?=$ArtistID?>" class="tooltip" title="View artist"><?=$Name?></a> as an artist.<br />
Please remove the artist from these requests manually before attempting to delete.<br />
<div class="box pad">
<ul>

View File

@ -112,14 +112,14 @@
}
?>
<li>
<span title="Alias ID"><?=$AliasID?></span>. <span title="Alias name"><?=$AliasName?></span>
<span class="tooltip" title="Alias ID"><?=$AliasID?></span>. <span class="tooltip" title="Alias name"><?=$AliasName?></span>
<? if ($User) { ?>
<a href="user.php?id=<?=$User?>" title="Alias creator" class="brackets">User</a>
<a href="user.php?id=<?=$User?>" title="Alias creator" class="brackets tooltip">User</a>
<? }
if ($Redirect) { ?>
(writes redirect to <span title="Target alias ID"><?=$Redirect?></span>)
(writes redirect to <span class="tooltip" title="Target alias ID"><?=$Redirect?></span>)
<? } ?>
<a href="artist.php?action=delete_alias&amp;aliasid=<?=$AliasID?>&amp;auth=<?=$LoggedUser['AuthKey']?>" title="Delete this alias" class="brackets">X</a>
<a href="artist.php?action=delete_alias&amp;aliasid=<?=$AliasID?>&amp;auth=<?=$LoggedUser['AuthKey']?>" title="Delete this alias" class="brackets tooltip">X</a>
</li>
<? }
?>

View File

@ -34,61 +34,6 @@
case 'change_artistid':
require(SERVER_ROOT . '/sections/artist/change_artistid.php');
break;
case 'reply':
authorize();
if (!isset($_POST['artistid']) || !isset($_POST['body']) || !is_number($_POST['artistid']) || trim($_POST['body']) === '') {
error(0);
}
if ($LoggedUser['DisablePosting']) {
error('Your posting privileges have been removed.');
}
$ArtistID = $_POST['artistid'];
if (!$ArtistID) {
error(404);
}
$DB->query("
SELECT
CEIL((
SELECT COUNT(ID) + 1
FROM artist_comments AS ac
WHERE ac.ArtistID = '" . db_string($ArtistID) . "'
) / " . TORRENT_COMMENTS_PER_PAGE . "
) AS Pages");
list($Pages) = $DB->next_record();
$DB->query("
INSERT INTO artist_comments
(ArtistID, AuthorID, AddedTime, Body)
VALUES
('" . db_string($ArtistID) . "', '" . db_string($LoggedUser['ID']) . "', '" . sqltime() . "', '" . db_string($_POST['body']) . "')");
$PostID = $DB->inserted_id();
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Pages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->begin_transaction("artist_comments_$ArtistID" . "_catalogue_$CatalogueID");
$Post = array(
'ID' => $PostID,
'AuthorID' => $LoggedUser['ID'],
'AddedTime' => sqltime(),
'Body' => $_POST['body'],
'EditedUserID' => 0,
'EditedTime' => '0000-00-00 00:00:00',
'Username' => ''
);
$Cache->insert('', $Post);
$Cache->commit_transaction(0);
$Cache->increment("artist_comments_$ArtistID");
header("Location: artist.php?id=$ArtistID&page=$Pages");
break;
case 'warn' :
include(SERVER_ROOT . '/sections/artist/warn.php');
break;
case 'take_warn' :
include(SERVER_ROOT . '/sections/artist/take_warn.php');
break;
case 'concert_thread':
include(SERVER_ROOT . '/sections/artist/concert_thread.php');
break;
@ -103,135 +48,6 @@
case 'autocomplete':
require('sections/artist/autocomplete.php');
break;
case 'get_post':
if (!$_GET['post'] || !is_number($_GET['post'])) {
error(0);
}
$DB->query("
SELECT Body
FROM artist_comments
WHERE ID = '" . db_string($_GET['post']) . "'");
list($Body) = $DB->next_record(MYSQLI_NUM);
echo trim($Body);
break;
case 'delete_comment':
authorize();
// Quick SQL injection check
if (!$_GET['postid'] || !is_number($_GET['postid'])) {
error(0);
}
// Make sure they are moderators
if (!check_perms('site_moderate_forums')) {
error(403);
}
// Get topicid, forumid, number of pages
$DB->query('
SELECT
ArtistID,
CEIL(COUNT(ac.ID) / ' . TORRENT_COMMENTS_PER_PAGE . ') AS Pages,
CEIL(SUM(IF(ac.ID <= ' . $_GET['postid'] . ', 1, 0)) / ' . TORRENT_COMMENTS_PER_PAGE . ') AS Page
FROM artist_comments AS ac
WHERE ac.ArtistID = (
SELECT ArtistID
FROM artist_comments
WHERE ID = ' . $_GET['postid'] . '
)
GROUP BY ac.ArtistID');
list($ArtistID, $Pages, $Page) = $DB->next_record();
// $Pages = number of pages in the thread
// $Page = which page the post is on
// These are set for cache clearing.
$DB->query("
DELETE FROM artist_comments
WHERE ID = '" . db_string($_GET['postid']) . "'");
//We need to clear all subsequential catalogues as they've all been bumped with the absence of this post
$ThisCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$LastCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $Pages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
for ($i = $ThisCatalogue; $i <= $LastCatalogue; $i++) {
$Cache->delete_value("artist_comments_$ArtistID" . "_catalogue_$i");
}
// Delete thread info cache (eg. number of pages)
$Cache->delete_value("artist_comments_$ArtistID");
break;
case 'takeedit_post':
authorize();
include(SERVER_ROOT . '/classes/text.class.php'); // Text formatting class
$Text = new TEXT;
// Quick SQL injection check
if (!$_POST['post'] || !is_number($_POST['post'])) {
error(0);
}
// Mainly
$DB->query("
SELECT
ac.Body,
ac.AuthorID,
ac.ArtistID,
ac.AddedTime
FROM artist_comments AS ac
WHERE ac.ID = '" . db_string($_POST['post']) . "'");
list($OldBody, $AuthorID, $ArtistID, $AddedTime) = $DB->next_record();
$DB->query("
SELECT ceil(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Page
FROM artist_comments
WHERE ArtistID = $ArtistID
AND ID <= $_POST[post]");
list($Page) = $DB->next_record();
if ($LoggedUser['ID'] != $AuthorID && !check_perms('site_moderate_forums')) {
error(404);
}
if (!$DB->has_results()) {
error(404);
}
// Perform the update
$DB->query("
UPDATE artist_comments
SET
Body = '" . db_string($_POST['body']) . "',
EditedUserID = '" . db_string($LoggedUser['ID']) . "',
EditedTime = '" . sqltime() . "'
WHERE ID = '" . db_string($_POST['post']) . "'");
// Update the cache
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->begin_transaction("artist_comments_$ArtistID" . "_catalogue_$CatalogueID");
$Cache->update_row($_POST['key'], array(
'ID' => $_POST['post'],
'AuthorID' => $AuthorID,
'AddedTime' => $AddedTime,
'Body' => $_POST['body'],
'EditedUserID' => db_string($LoggedUser['ID']),
'EditedTime' => sqltime(),
'Username' => $LoggedUser['Username']
));
$Cache->commit_transaction(0);
$DB->query("
INSERT INTO comments_edits
(Page, PostID, EditUser, EditTime, Body)
VALUES
('artist', " . db_string($_POST['post']) . ", " . db_string($LoggedUser['ID']) . ", '" . sqltime() . "', '" . db_string($OldBody) . "')");
// This gets sent to the browser, which echoes it in place of the old body
echo $Text->full_format($_POST['body']);
break;
case 'edit':
require(SERVER_ROOT . '/sections/artist/edit.php');

View File

@ -218,6 +218,8 @@
Requests::update_sphinx_requests($RequestID);
}
}
Comments::merge('artist', $ArtistID, $TargetArtistID);
}
}

View File

@ -1,79 +0,0 @@
<?php
if (!check_perms('users_warn')) {
error(404);
}
Misc::assert_isset_request($_POST, array('reason', 'privatemessage', 'body', 'length', 'artistid', 'postid', 'userid'));
$Reason = $_POST['reason'];
$PrivateMessage = $_POST['privatemessage'];
$Body = $_POST['body'];
$Length = $_POST['length'];
$ArtistID = (int)$_POST['artistid'];
$PostID = (int)$_POST['postid'];
$UserID = (int)$_POST['userid'];
$Key = (int)$_POST['key'];
$SQLTime = sqltime();
$UserInfo = Users::user_info($UserID);
if ($UserInfo['Class'] > $LoggedUser['Class']) {
error(403);
}
$URL = "https://". SSL_SITE_URL."/artist.php?id=$ArtistID&postid=$PostID#post$PostID";
if ($Length != 'verbal') {
$Time = ((int)$Length) * (7 * 24 * 60 * 60);
Tools::warn_user($UserID, $Time, "$URL - $Reason");
$Subject = 'You have received a warning';
$PrivateMessage = "You have received a $Length week warning for [url=$URL]this artist comment.[/url]\n\n$PrivateMessage";
$WarnTime = time_plus($Time);
$AdminComment = date('Y-m-d') . " - Warned until $WarnTime by " . $LoggedUser['Username'] . "\nReason: $URL - $Reason\n\n";
} else {
$Subject = 'You have received a verbal warning';
$PrivateMessage = "You have received a verbal warning for [url=$URL]this post.[/url]\n\n$PrivateMessage";
$AdminComment = date('Y-m-d') . ' - Verbally warned by ' . $LoggedUser['Username'] . " for $URL \nReason: $Reason\n\n";
Tools::update_user_notes($UserID, $AdminComment);
}
$DB->query("
INSERT INTO users_warnings_forums (UserID, Comment)
VALUES('$UserID', '" . db_string($AdminComment) . "')
ON DUPLICATE KEY UPDATE Comment = CONCAT('" . db_string($AdminComment) . "', Comment)");
Misc::send_pm($UserID, $LoggedUser['ID'], $Subject, $PrivateMessage);
// Mainly
$DB->query("
SELECT
ac.Body,
ac.AuthorID,
ac.ArtistID,
ac.AddedTime
FROM artist_comments AS ac
WHERE ac.ID = '$PostID'");
list($OldBody, $AuthorID, $ArtistID, $AddedTime) = $DB->next_record();
$DB->query("
SELECT ceil(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Page
FROM artist_comments
WHERE ArtistID = $ArtistID
AND ID <= $PostID");
list($Page) = $DB->next_record();
// Perform the update
$DB->query("
UPDATE artist_comments
SET
Body = '" . db_string($Body) . "',
EditedUserID = '" . db_string($LoggedUser['ID']) . "',
EditedTime = '" . sqltime() . "'
WHERE ID = '$PostID'");
// Update the cache
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->begin_transaction("artist_comments_$ArtistID" . "_catalogue_$CatalogueID");
$Cache->update_row($_POST['key'], array('ID' => $_POST['postid'], 'AuthorID' => $AuthorID, 'AddedTime' => $AddedTime, 'Body' => $Body, 'EditedUserID' => db_string($LoggedUser['ID']), 'EditedTime' => sqltime(), 'Username' => $LoggedUser['Username']));
$Cache->commit_transaction(0);
$DB->query("
INSERT INTO comments_edits (Page, PostID, EditUser, EditTime, Body)
VALUES ('artist', " . db_string($_POST['postid']) . ', ' . db_string($LoggedUser['ID']) . ", '" . sqltime() . "', '" . db_string($OldBody) . "')");
header("Location: artist.php?id=$ArtistID&postid=$PostID#post$PostID");
?>

View File

@ -1,70 +0,0 @@
<?php
if (!check_perms('users_warn')) {
error(404);
}
Misc::assert_isset_request($_POST, array('artistid', 'postid', 'userid', 'key'));
$ArtistID = (int) $_POST['artistid'];
$PostID = (int) $_POST['postid'];
$UserID = (int) $_POST['userid'];
$Key = (int) $_POST['key'];
$UserInfo = Users::user_info($UserID);
$DB->query("
SELECT ac.Body, ac.AddedTime
FROM artist_comments AS ac
WHERE ac.ID = '" . db_string($PostID) . "'");
list($PostBody) = $DB -> next_record();
View::show_header('Warn User');
?>
<div class="thin">
<div class="header">
<h2>Warning <a href="user.php?id=<?=$UserID?>"><?=$UserInfo['Username']?></a></h2>
</div>
<div class="thin box pad">
<form class="create_form" name="warning" action="" onsubmit="quickpostform.submit_button.disabled=true;" method="post">
<input type="hidden" name="artistid" value="<?=$ArtistID?>" />
<input type="hidden" name="postid" value="<?=$PostID?>" />
<input type="hidden" name="userid" value="<?=$UserID?>" />
<input type="hidden" name="key" value="<?=$Key?>" />
<input type="hidden" name="action" value="take_warn" />
<table class="layout" align="center">
<tr>
<td class="label">Reason:</td>
<td>
<input type="text" name="reason" size="30" />
</td>
</tr>
<tr>
<td class="label">Length:</td>
<td>
<select name="length">
<option value="verbal">Verbal</option>
<option value="1">1 week</option>
<option value="2">2 weeks</option>
<option value="4">4 weeks</option>
<? if (check_perms('users_mod')) { ?>
<option value="8">8 weeks</option>
<? } ?>
</select></td>
</tr>
<tr>
<td class="label">Private message:</td>
<td>
<textarea id="message" style="width: 95%;" tabindex="1" onkeyup="resize('message');" name="privatemessage" cols="90" rows="4"></textarea>
</td>
</tr>
<tr>
<td class="label">Edit post:</td>
<td>
<textarea id="body" style="width: 95%;" tabindex="1" onkeyup="resize('body');" name="body" cols="90" rows="8"><?=$PostBody?></textarea>
<br />
<input type="submit" id="submit_button" value="Warn user" tabindex="1" />
</td>
</tr>
</table>
</form>
</div>
</div>
<? View::show_footer(); ?>

View File

@ -66,7 +66,7 @@
} else {
$DisplayName = '';
}
$DisplayName .= "<a href=\"torrents.php?id=$GroupID\" title=\"View Torrent\">$GroupName</a>";
$DisplayName .= "<a href=\"torrents.php?id=$GroupID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -17,7 +17,7 @@
$Join = '';
$All = true;
} else {
$Join = "JOIN xbt_snatched as x ON x.fid=tbf.TorrentID AND x.uid = ".$LoggedUser['ID'];
$Join = "JOIN xbt_snatched as x ON x.fid = tbf.TorrentID AND x.uid = ".$LoggedUser['ID'];
$All = false;
}
@ -66,7 +66,7 @@
} else {
$DisplayName = '';
}
$DisplayName .= '<a href="torrents.php?id='.$GroupID.'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName .= "<a href=\"torrents.php?id=$GroupID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -43,7 +43,7 @@
}
$FlacID = $GroupIDs[$GroupID]['TorrentID'];
$DisplayName .= '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$FlacID.'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName .= "<a href=\"torrents.php?id=$GroupID&amp;torrentid=$FlacID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -191,7 +191,7 @@
if (!$Edition['FlacID'] || count($Edition['Formats']) === 3) {
continue;
}
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent" dir="ltr">'.$GroupName.'</a>';
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -17,7 +17,7 @@
$Join = '';
$All = true;
} else {
$Join = "JOIN xbt_snatched as x ON x.fid=tbt.TorrentID AND x.uid = ".$LoggedUser['ID'];
$Join = "JOIN xbt_snatched as x ON x.fid = tbt.TorrentID AND x.uid = ".$LoggedUser['ID'];
$All = false;
}
@ -67,7 +67,7 @@
} else {
$DisplayName = '';
}
$DisplayName .= '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$TorrentID.'#torrent'.$TorrentID.'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName .= "<a href=\"torrents.php?id=$GroupID&amp;torrentid=$TorrentID#torrent$TorrentID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -136,7 +136,7 @@
$Debug->log_var($Edition, 'Skipping '.$RemIdent);
continue;
}
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent" dir="ltr">'.$GroupName.'</a>';
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -304,7 +304,7 @@ function transcode_parse_groups($Groups) {
foreach ($Group['Editions'] as $RemIdent => $Edition) {
// TODO: point to the correct FLAC (?)
$FlacID = array_search(true, $Edition['FlacIDs']);
$DisplayName = $ArtistNames . "<a href=\"torrents.php?id=$GroupID&amp;torrentid=$FlacID#torrent$FlacID\" title=\"View Torrent\">$GroupName</a>";
$DisplayName = $ArtistNames . "<a href=\"torrents.php?id=$GroupID&amp;torrentid=$FlacID#torrent$FlacID\" title=\"View Torrent\" dir=\"ltr\">$GroupName</a>";
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -166,7 +166,7 @@
if (!$Edition['FlacID'] || count($Edition['Formats']) === 3) {
continue;
}
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent">'.$GroupName.'</a>';
$DisplayName = $ArtistNames . '<a href="torrents.php?id='.$GroupID.'&amp;torrentid='.$Edition['FlacID'].'#torrent'.$Edition['FlacID'].'" title="View Torrent" dir="ltr">'.$GroupName.'</a>';
if ($GroupYear > 0) {
$DisplayName .= " [$GroupYear]";
}

View File

@ -82,8 +82,8 @@ function compare($X, $Y) {
?>
<tr class="group discog<?=$SnatchedGroupClass?>" id="group_<?=$GroupID?>">
<td class="center">
<div title="View" id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event);" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collape all groups on this page."></a>
<div id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="tooltip show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event);" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collape all groups on this page."></a>
</div>
</td>
<td class="center">
@ -93,7 +93,7 @@ function compare($X, $Y) {
<strong><?=$DisplayName?></strong>
<span style="text-align: right;" class="float_right">
<? if (!$Sneaky) { ?>
<a href="#group_<?=$GroupID?>" class="brackets remove_bookmark" title="Remove bookmark" onclick="Unbookmark('torrent', <?=$GroupID?>, '');return false;">Unbookmark</a>
<a href="#group_<?=$GroupID?>" class="brackets remove_bookmark" onclick="Unbookmark('torrent', <?=$GroupID?>, ''); return false;">Remove bookmark</a>
<br />
<? } ?>
<?=time_diff($AddedTime);?>
@ -129,7 +129,7 @@ function compare($X, $Y) {
$EditionID++;
?>
<tr class="group_torrent groupid_<?=$GroupID?> edition<?=$SnatchedGroupClass . (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] === 1 ? ' hidden' : '')?>">
<td colspan="7" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event)" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $Group)?></strong></td>
<td colspan="7" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event)" class="tooltip" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $Group)?></strong></td>
</tr>
<?
}
@ -143,16 +143,16 @@ function compare($X, $Y) {
<td colspan="3">
<span>[ <a href="torrents.php?action=download&amp;id=<?=$TorrentID?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>" title="Download">DL</a>
<? if (Torrents::can_use_token($Torrent)) { ?>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');">FL</a>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');" class="tooltip">FL</a>
<? } ?>
| <a href="reportsv2.php?action=report&amp;id=<?=$TorrentID?>" title="Report">RP</a> ]
</span>
&nbsp;&nbsp;&raquo;&nbsp; <a href="torrents.php?id=<?=$GroupID?>&amp;torrentid=<?=$TorrentID?>"><?=Torrents::torrent_info($Torrent)?></a>
</td>
<td class="nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td><?=number_format($Torrent['Snatched'])?></td>
<td<?=(($Torrent['Seeders'] == 0) ? ' class="r00"' : '')?>><?=number_format($Torrent['Seeders'])?></td>
<td><?=number_format($Torrent['Leechers'])?></td>
<td class="number_column nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td class="number_column"><?=number_format($Torrent['Snatched'])?></td>
<td class="number_column<?=(($Torrent['Seeders'] == 0) ? ' r00' : '')?>"><?=number_format($Torrent['Seeders'])?></td>
<td class="number_column"><?=number_format($Torrent['Leechers'])?></td>
</tr>
<?
}
@ -185,22 +185,22 @@ function compare($X, $Y) {
<span>
[ <a href="torrents.php?action=download&amp;id=<?=$TorrentID?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>" title="Download">DL</a>
<? if (Torrents::can_use_token($Torrent)) { ?>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');">FL</a>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');" class="tooltip">FL</a>
<? } ?>
| <a href="reportsv2.php?action=report&amp;id=<?=$TorrentID?>" title="Report">RP</a> ]
</span>
<strong><?=$DisplayName?></strong>
<div class="tags"><?=$TorrentTags->format()?></div>
<? if (!$Sneaky) { ?>
<span class="float_right float_clear"><a href="#group_<?=$GroupID?>" class="brackets remove_bookmark" title="Remove bookmark" onclick="Unbookmark('torrent', <?=$GroupID?>, '');return false;">Unbookmark</a></span>
<span class="float_right float_clear"><a href="#group_<?=$GroupID?>" class="brackets remove_bookmark" onclick="Unbookmark('torrent', <?=$GroupID?>, ''); return false;">Remove bookmark</a></span>
<? } ?>
<span class="float_right float_clear"><?=time_diff($AddedTime);?></span>
</td>
<td class="nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td><?=number_format($Torrent['Snatched'])?></td>
<td<?=(($Torrent['Seeders'] == 0) ? ' class="r00"' : '')?>><?=number_format($Torrent['Seeders'])?></td>
<td><?=number_format($Torrent['Leechers'])?></td>
<td class="number_column nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td class="number_column"><?=number_format($Torrent['Snatched'])?></td>
<td class="number_column<?=(($Torrent['Seeders'] == 0) ? ' r00' : '')?>"><?=number_format($Torrent['Seeders'])?></td>
<td class="number_column"><?=number_format($Torrent['Leechers'])?></td>
</tr>
<?
}

View File

@ -1,37 +0,0 @@
<?
authorize();
if (empty($_POST['collageid']) || !is_number($_POST['collageid']) || $_POST['body'] === '' || !isset($_POST['body'])) {
error(0);
}
$CollageID = $_POST['collageid'];
if ($LoggedUser['DisablePosting']) {
error('Your posting privileges have been removed'); // Should this be logged?
}
$DB->query("
SELECT
CEIL(
(
SELECT COUNT(ID) + 1
FROM collages_comments
WHERE CollageID = '".db_string($CollageID)."'
) / ".TORRENT_COMMENTS_PER_PAGE."
) AS Pages");
list($Pages) = $DB->next_record();
$DB->query("
INSERT INTO collages_comments
(CollageID, Body, UserID, Time)
VALUES
('$CollageID', '".db_string($_POST['body'])."', '$LoggedUser[ID]', '".sqltime()."')");
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Pages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->delete_value("collage_$CollageID");
$Cache->delete_value("collage_comments_{$CollageID}_catalogue_$CatalogueID");
$Cache->increment("collage_comments_$CollageID");
header('Location: collages.php?id='.$CollageID);
?>

View File

@ -14,37 +14,12 @@
$Text = new TEXT;
// Check for lame SQL injection attempts
$CollageID = $_GET['collageid'];
if (!is_number($CollageID)) {
if (!is_number($_GET['collageid'])) {
error(0);
}
$CollageID = (int)$_GET['collageid'];
// gets the amount of comments for this collage
$NumComments = Collages::get_comment_count($CollageID);
if (isset($_GET['postid']) && is_number($_GET['postid']) && $NumComments > TORRENT_COMMENTS_PER_PAGE) {
$DB->query("
SELECT COUNT(ID)
FROM collages_comments
WHERE CollageID = $CollageID
AND ID <= $_GET[postid]");
list($PostNum) = $DB->next_record();
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $PostNum);
} else {
list($Page, $Limit) = Format::page_limit(TORRENT_COMMENTS_PER_PAGE, $NumComments);
}
//Get the cache catalogue
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
//---------- Get some data to start processing
// Cache catalogue from which the page is selected, allows block caches and future ability to specify posts per page
$Catalogue = Collages::get_comment_catalogue($CollageID, $CatalogueID);
//This is a hybrid to reduce the catalogue down to the page elements: We use the page limit % catalogue
$Thread = array_slice($Catalogue, ((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) % THREAD_CATALOGUE), TORRENT_COMMENTS_PER_PAGE, true);
list($NumComments, $Page, $Thread, $LastRead) = Comments::load('collages', $CollageID);
$DB->query("
SELECT Name
@ -53,7 +28,7 @@
list($Name) = $DB->next_record();
// Start printing
View::show_header("Comments for collage $Name", 'comments,bbcode');
View::show_header("Comments for collage $Name", 'comments,bbcode,subscriptions');
?>
<div class="thin">
<div class="header">
@ -62,63 +37,29 @@
<a href="collages.php?id=<?=$CollageID?>"><?=$Name?></a>
</h2>
<div class="linkbox">
<a href="#" id="subscribelink_collages<?=$CollageID?>" class="brackets" onclick="SubscribeComments('collages',<?=$CollageID?>);return false;"><?=Subscriptions::has_subscribed_comments('collages', $CollageID) !== false ? 'Unsubscribe' : 'Subscribe'?></a>
<?
$Pages = Format::get_pages($Page, $NumComments, TORRENT_COMMENTS_PER_PAGE, 9);
echo $Pages;
if ($Pages) {
echo '<br /><br />' . $Pages;
}
?>
</div>
</div>
<?
//---------- Begin printing
foreach ($Thread as $Post) {
list($PostID, $AuthorID, $AddedTime, $Body) = array_values($Post);
list($AuthorID, $Username, $PermissionID, $Paranoia, $Artist, $Donor, $Warned, $Avatar, $Enabled, $UserTitle) = array_values(Users::user_info($AuthorID));
?>
<table class="forum_post box vertical_margin<?=(!Users::has_avatars_enabled() ? ' noavatar' : '')?>" id="post<?=$PostID?>">
<colgroup>
<? if (Users::has_avatars_enabled()) { ?>
<col class="col_avatar" />
<? } ?>
<col class="col_post_body" />
</colgroup>
<tr class="colhead_dark">
<td colspan="<?=(Users::has_avatars_enabled() ? 2 : 1)?>">
<span style="float: left;"><a href="#post<?=$PostID?>">#<?=$PostID?></a>
<?=Users::format_username($AuthorID, true, true, true, true, true)?> <?=time_diff($AddedTime)?>
<? if (!$ThreadInfo['IsLocked']) { ?> - <a href="#quickpost" onclick="Quote('<?=$PostID?>','<?=$Username?>');" class="brackets">Quote</a><? }
if ($AuthorID === $LoggedUser['ID'] || check_perms('site_moderate_forums')) { ?> - <a href="#post<?=$PostID?>" onclick="Edit_Form('<?=$PostID?>');" class="brackets">Edit</a><? }
if (check_perms('site_moderate_forums')) { ?> - <a href="#post<?=$PostID?>" onclick="Delete('<?=$PostID?>');" class="brackets">Delete</a> <? } ?>
</span>
<span id="bar<?=$PostID?>" style="float: right;">
<a href="reports.php?action=report&amp;type=collages_comment&amp;id=<?=$PostID?>" class="brackets">Report</a>
<a href="#">&uarr;</a>
</span>
</td>
</tr>
<tr>
<? if (Users::has_avatars_enabled()) { ?>
<td class="avatar" valign="top">
<?=Users::show_avatar($Avatar, $Username, $HeavyInfo['DisableAvatars'])?>
</td>
<? } ?>
<td class="body" valign="top">
<div id="content<?=$PostID?>">
<?=$Text->full_format($Body)?>
</div>
</td>
</tr>
</table>
<?
}
CommentsView::render_comments($Thread, $LastRead, "collages.php?action=comments&collageid=$CollageID");
if (!$ThreadInfo['IsLocked'] || check_perms('site_moderate_forums')) {
if ($ThreadInfo['MinClassWrite'] <= $LoggedUser['Class'] && !$LoggedUser['DisablePosting']) {
View::parse('generic/reply/quickreply.php', array(
'InputName' => 'collageid',
View::parse('generic/reply/quickreply.php', array(
'InputName' => 'pageid',
'InputID' => $CollageID,
'InputAction' => 'add_comment',
'TextareaCols' => 90));
'Action' => 'comments.php?page=collages',
'InputAction' => 'take_post',
'TextareaCols' => 90,
'SubscribeBox' => true
));
}
}
?>

View File

@ -103,7 +103,7 @@
<? } ?>
<br /><br />
<? if (check_perms('site_collages_subscribe')) { ?>
<a href="#" id="subscribelink<?=$CollageID?>" class="brackets" onclick="CollageSubscribe(<?=$CollageID?>);return false;"><?=(in_array($CollageID, $CollageSubscriptions) ? 'Unsubscribe' : 'Subscribe')?></a>
<a href="#" id="subscribelink<?=$CollageID?>" class="brackets" onclick="CollageSubscribe(<?=$CollageID?>); return false;"><?=(in_array($CollageID, $CollageSubscriptions) ? 'Unsubscribe' : 'Subscribe')?></a>
<? }
if (check_perms('site_collages_delete') || (check_perms('site_edit_wiki') && !$Locked)) { ?>
<a href="collages.php?action=edit&amp;collageid=<?=$CollageID?>" class="brackets">Edit description</a>
@ -112,9 +112,9 @@
<? }
if (Bookmarks::has_bookmarked('collage', $CollageID)) {
?>
<a href="#" id="bookmarklink_collage_<?=$CollageID?>" class="brackets" onclick="Unbookmark('collage', <?=$CollageID?>,'Bookmark');return false;">Remove bookmark</a>
<a href="#" id="bookmarklink_collage_<?=$CollageID?>" class="brackets" onclick="Unbookmark('collage', <?=$CollageID?>, 'Bookmark'); return false;">Remove bookmark</a>
<? } else { ?>
<a href="#" id="bookmarklink_collage_<?=$CollageID?>" class="brackets" onclick="Bookmark('collage', <?=$CollageID?>,'Remove bookmark');return false;">Bookmark</a>
<a href="#" id="bookmarklink_collage_<?=$CollageID?>" class="brackets" onclick="Bookmark('collage', <?=$CollageID?>, 'Remove bookmark'); return false;">Bookmark</a>
<? }
?>
<!-- <a href="#" id="recommend" class="brackets">Recommend</a> -->
@ -205,15 +205,16 @@
if (empty($CommentList)) {
$DB->query("
SELECT
cc.ID,
cc.Body,
cc.UserID,
c.ID,
c.Body,
c.AuthorID,
um.Username,
cc.Time
FROM collages_comments AS cc
LEFT JOIN users_main AS um ON um.ID = cc.UserID
WHERE CollageID = '$CollageID'
ORDER BY ID DESC
c.AddedTime
FROM comments AS c
LEFT JOIN users_main AS um ON um.ID = c.AuthorID
WHERE c.Page = 'collages'
AND c.PageID = $CollageID
ORDER BY c.ID DESC
LIMIT 15");
$CommentList = $DB->to_array(false, MYSQLI_NUM);
}
@ -239,10 +240,11 @@
?>
<div class="box box_addcomment">
<div class="head"><strong>Add comment</strong></div>
<form class="send_form" name="comment" id="quickpostform" onsubmit="quickpostform.submit_button.disabled = true;" action="collages.php" method="post">
<input type="hidden" name="action" value="add_comment" />
<form class="send_form" name="comment" id="quickpostform" onsubmit="quickpostform.submit_button.disabled = true;" action="comments.php" method="post">
<input type="hidden" name="action" value="take_post" />
<input type="hidden" name="page" value="collages" />
<input type="hidden" name="auth" value="<?=$LoggedUser['AuthKey']?>" />
<input type="hidden" name="collageid" value="<?=$CollageID?>" />
<input type="hidden" name="pageid" value="<?=$CollageID?>" />
<div class="pad">
<div class="field_div">
<textarea name="body" cols="24" rows="5"></textarea>

View File

@ -307,7 +307,7 @@
$Row = 'a'; // For the pretty colours
foreach ($Collages as $Collage) {
list($ID, $Name, $NumTorrents, $TagList, $CategoryID, $UserID, $Subscribers, $Updated) = $Collage;
$Row = ($Row === 'a') ? 'b' : 'a';
$Row = $Row === 'a' ? 'b' : 'a';
$TorrentTags = new Tags($TagList);
//Print results
@ -325,8 +325,8 @@
<? } ?>
<div class="tags"><?=$TorrentTags->format('collages.php?action=search&amp;tags=')?></div>
</td>
<td><?=number_format((int)$NumTorrents)?></td>
<td><?=number_format((int)$Subscribers)?></td>
<td class="number_column"><?=number_format((int)$NumTorrents)?></td>
<td class="number_column"><?=number_format((int)$Subscribers)?></td>
<td><?=time_diff($Updated)?></td>
<td><?=Users::format_username($UserID, false, false, false)?></td>
</tr>

View File

@ -1,48 +0,0 @@
<?
include(SERVER_ROOT.'/classes/text.class.php'); // Text formatting class
$Text = new TEXT;
authorize();
// Quick SQL injection check
if (!$_GET['postid'] || !is_number($_GET['postid'])) {
error(0);
}
$PostID = $_GET['postid'];
// Make sure they are moderators
if (!check_perms('site_moderate_forums')) {
error(403);
}
// Get number of pages
// $Pages = number of pages in the thread
// $Page = which page the post is on
$DB->query("
SELECT
CollageID,
CEIL(COUNT(ID) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Pages,
CEIL(SUM(IF(ID <= '$PostID', 1, 0)) / " . TORRENT_COMMENTS_PER_PAGE . ") AS Page
FROM collages_comments
WHERE CollageID = (
SELECT CollageID
FROM collages_comments
WHERE ID = '$PostID'
)
GROUP BY CollageID");
list($CollageID, $Pages, $Page) = $DB->next_record();
$DB->query("
DELETE FROM collages_comments
WHERE ID = '$PostID'");
$Cache->delete_value("collage_$CollageID");
$Cache->increment_value("collage_comments_$CollageID", -1);
//We need to clear all subsequential catalogues as they've all been bumped with the absence of this post
$ThisCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $Page - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$LastCatalogue = floor((TORRENT_COMMENTS_PER_PAGE * $Pages - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
for ($i = $ThisCatalogue; $i <= $LastCatalogue; $i++) {
$Cache->delete_value("collage_comments_$CollageID"."_catalogue_$i");
}
?>

View File

@ -73,7 +73,7 @@
</tr>
<? if ($CategoryID == 0) { // CategoryID == 0 is for "personal" collages ?>
<tr>
<td class="label"><span title="A &quot;featured&quot; personal collage will be listed first on your profile, along with a preview of the included torrents.">Featured</span></td>
<td class="label"><span class="tooltip" title="A &quot;featured&quot; personal collage will be listed first on your profile, along with a preview of the included torrents.">Featured</span></td>
<td><input type="checkbox" name="featured"<?=($Featured ? ' checked="checked"' : '')?> /></td>
</tr>
<?

View File

@ -1,30 +0,0 @@
<?
/*********************************************************************\
//--------------Get Post--------------------------------------------//
This gets the raw BBCode of a post. It's used for editing and
quoting posts.
It gets called if $_GET['action'] == 'get_post'. It requires
$_GET['post'], which is the ID of the post.
\*********************************************************************/
// Quick SQL injection check
if (!$_GET['post'] || !is_number($_GET['post'])) {
error(0);
}
// Variables for database input
$PostID = $_GET['post'];
// Mainly
$DB->query("
SELECT Body
FROM collages_comments
WHERE ID = '$PostID'");
list($Body) = $DB->next_record(MYSQLI_NUM);
// This gets sent to the browser, which echoes it wherever
echo trim($Body);

View File

@ -76,21 +76,9 @@
case 'take_delete':
require(SERVER_ROOT.'/sections/collages/take_delete.php');
break;
case 'add_comment':
require(SERVER_ROOT.'/sections/collages/add_comment.php');
break;
case 'comments':
require(SERVER_ROOT.'/sections/collages/all_comments.php');
break;
case 'takeedit_comment':
require(SERVER_ROOT.'/sections/collages/takeedit_comment.php');
break;
case 'delete_comment':
require(SERVER_ROOT.'/sections/collages/delete_comment.php');
break;
case 'get_post':
require(SERVER_ROOT.'/sections/collages/get_post.php');
break;
case 'download':
require(SERVER_ROOT.'/sections/collages/download.php');
break;

View File

@ -57,13 +57,12 @@
<li>Press "Save All Changes" when you are finished sorting.</li>
<li>Press "Edit" or "Remove" to simply modify one entry.</li>
</ul>
<noscript><ul><li><strong class="important_text">Note: Enable JavaScript!</strong></li></ul></noscript>
</td>
</tr>
</table>
<div class="drag_drop_save hidden">
<input type="button" name="submit" value="Save All Changes" title="Save your changes." class="save_sortable_collage" />
<input type="button" name="submit" value="Save All Changes" class="save_sortable_collage" />
</div>
<table id="manage_collage_table">
<thead>
@ -129,7 +128,7 @@
</tbody>
</table>
<div class="drag_drop_save hidden">
<input type="button" name="submit" value="Save All Changes" title="Save your changes." class="save_sortable_collage" />
<input type="button" name="submit" value="Save All Changes" class="save_sortable_collage" />
</div>
<form class="dragdrop_form hidden" name="collage" action="collages.php" method="post" id="drag_drop_collage_form">
<div>

View File

@ -51,13 +51,12 @@
<li>Press "Save All Changes" when you are finished sorting.</li>
<li>Press "Edit" or "Remove" to simply modify one entry.</li>
</ul>
<noscript><ul><li><strong class="important_text">Note: Enable JavaScript!</strong></li></ul></noscript>
</td>
</tr>
</table>
<div class="drag_drop_save hidden">
<input type="button" name="submit" value="Save All Changes" title="Save your changes" class="save_sortable_collage" />
<input type="button" name="submit" value="Save All Changes" class="save_sortable_collage" />
</div>
<table id="manage_collage_table">
<thead>
@ -98,7 +97,7 @@
</tbody>
</table>
<div class="drag_drop_save hidden">
<input type="button" name="submit" value="Save All Changes" title="Save your changes." class="save_sortable_collage" />
<input type="button" name="submit" value="Save All Changes" class="save_sortable_collage" />
</div>
<form class="dragdrop_form hidden" name="collage" action="collages.php" method="post" id="drag_drop_collage_form">
<div>

View File

@ -33,21 +33,17 @@
}
//Personal collages have CategoryID 0
if ($CategoryID === '0') {
$DB->query("
DELETE FROM collages
WHERE ID = '$CollageID'");
$DB->query("
DELETE FROM collages_torrents
WHERE CollageID = '$CollageID'");
$DB->query("
DELETE FROM collages_comments
WHERE CollageID = '$CollageID'");
if ($CategoryID == 0) {
$DB->query("DELETE FROM collages WHERE ID = '$CollageID'");
$DB->query("DELETE FROM collages_torrents WHERE CollageID = '$CollageID'");
Comments::delete_page('collages', $CollageID);
} else {
$DB->query("
UPDATE collages
SET Deleted = '1'
WHERE ID = '$CollageID'");
Subscriptions::flush_subscriptions('collages', $CollageID);
Subscriptions::flush_quote_notifications('collages', $CollageID);
}
Misc::write_log("Collage $CollageID ($Name) was deleted by ".$LoggedUser['Username'].": $Reason");

View File

@ -1,64 +0,0 @@
<?
authorize();
include(SERVER_ROOT.'/classes/text.class.php'); // Text formatting class
$Text = new TEXT;
// Quick SQL injection check
if (!$_POST['post'] || !is_number($_POST['post'])) {
error(404);
}
// End injection check
// Variables for database input
$UserID = $LoggedUser['ID'];
$Body = db_string(urldecode($_POST['body']));
$PostID = $_POST['post'];
// Mainly
$DB->query("
SELECT
cc.Body,
cc.UserID,
cc.CollageID,
(
SELECT COUNT(ID)
FROM collages_comments
WHERE ID <= $PostID
AND collages_comments.CollageID = cc.CollageID
)
FROM collages_comments AS cc
WHERE cc.ID='$PostID'");
list($OldBody, $AuthorID, $CollageID, $PostNum) = $DB->next_record();
// Make sure they aren't trying to edit posts they shouldn't
// We use die() here instead of error() because whatever we spit out is displayed to the user in the box where his forum post is
if ($UserID != $AuthorID && !check_perms('site_moderate_forums')) {
die('Permission denied');
}
if (!$DB->has_results()) {
die('Post not found!');
}
// Perform the update
$DB->query("
UPDATE collages_comments
SET
Body = '$Body'
WHERE ID='$PostID'");
$Cache->delete_value('collage_'.$CollageID);
$PageNum = ceil($PostNum / TORRENT_COMMENTS_PER_PAGE);
$CatalogueID = floor((TORRENT_COMMENTS_PER_PAGE * $PageNum - TORRENT_COMMENTS_PER_PAGE) / THREAD_CATALOGUE);
$Cache->delete_value('collage_comments_'.$CollageID.'_catalogue_'.$CatalogueID);
$DB->query("
INSERT INTO comments_edits (Page, PostID, EditUser, EditTime, Body)
VALUES ('collages', $PostID, $UserID, '".sqltime()."', '".db_string($OldBody)."')");
// This gets sent to the browser, which echoes it in place of the old body
echo $Text->full_format($_POST['body']);
?>

View File

@ -98,8 +98,8 @@
?>
<tr class="group discog<?=$SnatchedGroupClass?>" id="group_<?=$GroupID?>">
<td class="center">
<div title="View" id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event)" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collapse all groups on this page."></a>
<div id="showimg_<?=$GroupID?>" class="<?=($ShowGroups ? 'hide' : 'show')?>_torrents">
<a href="#" class="tooltip show_torrents_link" onclick="toggle_group(<?=$GroupID?>, this, event)" title="Collapse this group. Hold &quot;Ctrl&quot; while clicking to collapse all groups on this page."></a>
</div>
</td>
<td class="center">
@ -109,9 +109,9 @@
<strong><?=$DisplayName?></strong>
<? // PHP start tag is indented for proper formatting of generated HTML
if (Bookmarks::has_bookmarked('torrent', $GroupID)) {
echo "<a style = \"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"remove_bookmark brackets\" title=\"Unbookmark\" onclick=\"Unbookmark('torrent', $GroupID, 'Bookmark'); return false;\">Unbookmark</a>";
echo "<a style = \"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"remove_bookmark brackets\" onclick=\"Unbookmark('torrent', $GroupID, 'Bookmark'); return false;\">Remove bookmark</a>";
} else {
echo "<a style = \"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"add_bookmark brackets\" title=\"Bookmark\" onclick=\"Bookmark('torrent', $GroupID, 'Unbookmark'); return false;\">Bookmark</a>";
echo "<a style = \"float: right;\" href=\"#\" id=\"bookmarklink_torrent_$GroupID\" class=\"add_bookmark brackets\" onclick=\"Bookmark('torrent', $GroupID, 'Remove bookmark'); return false;\">Bookmark</a>";
}
echo "\n";
echo Votes::vote_link($GroupID, $UserVotes[$GroupID]['Type']); ?>
@ -135,12 +135,17 @@
}
$SnatchedTorrentClass = ($Torrent['IsSnatched'] ? ' snatched_torrent' : '');
if ($Torrent['RemasterTitle'] != $LastRemasterTitle || $Torrent['RemasterYear'] != $LastRemasterYear ||
$Torrent['RemasterRecordLabel'] != $LastRemasterRecordLabel || $Torrent['RemasterCatalogueNumber'] != $LastRemasterCatalogueNumber || $FirstUnknown || $Torrent['Media'] != $LastMedia) {
if ($Torrent['RemasterTitle'] != $LastRemasterTitle
|| $Torrent['RemasterYear'] != $LastRemasterYear
|| $Torrent['RemasterRecordLabel'] != $LastRemasterRecordLabel
|| $Torrent['RemasterCatalogueNumber'] != $LastRemasterCatalogueNumber
|| $FirstUnknown
|| $Torrent['Media'] != $LastMedia
) {
$EditionID++;
?>
<tr class="group_torrent groupid_<?=$GroupID?> edition<?=$SnatchedGroupClass . (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] == 1 ? ' hidden' : '')?>">
<td colspan="7" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event)" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $Group)?></strong></td>
<td colspan="7" class="edition_info"><strong><a href="#" onclick="toggle_edition(<?=$GroupID?>, <?=$EditionID?>, this, event)" class="tooltip" title="Collapse this edition. Hold &quot;Ctrl&quot; while clicking to collapse all editions in this torrent group.">&minus;</a> <?=Torrents::edition_string($Torrent, $Group)?></strong></td>
</tr>
<?
}
@ -155,16 +160,16 @@
<span class="brackets">
<a href="torrents.php?action=download&amp;id=<?=$TorrentID?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>" title="Download">DL</a>
<? if (Torrents::can_use_token($Torrent)) { ?>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');">FL</a>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');" class="tooltip">FL</a>
<? } ?>
| <a href="reportsv2.php?action=report&amp;id=<?=$TorrentID?>" title="Report">RP</a>
</span>
&nbsp;&nbsp;&raquo;&nbsp; <a href="torrents.php?id=<?=$GroupID?>&amp;torrentid=<?=$TorrentID?>"><?=Torrents::torrent_info($Torrent)?></a>
</td>
<td class="nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td><?=number_format($Torrent['Snatched'])?></td>
<td<?=(($Torrent['Seeders'] == 0) ? ' class="r00"' : '')?>><?=number_format($Torrent['Seeders'])?></td>
<td><?=number_format($Torrent['Leechers'])?></td>
<td class="number_column nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td class="number_column"><?=number_format($Torrent['Snatched'])?></td>
<td class="number_column<?=(($Torrent['Seeders'] == 0) ? ' r00' : '')?>"><?=number_format($Torrent['Seeders'])?></td>
<td class="number_column"><?=number_format($Torrent['Leechers'])?></td>
</tr>
<?
}
@ -197,7 +202,7 @@
<span class="brackets">
<a href="torrents.php?action=download&amp;id=<?=$TorrentID?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>" title="Download">DL</a>
<? if (Torrents::can_use_token($Torrent)) { ?>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');">FL</a>
| <a href="torrents.php?action=download&amp;id=<?=$TorrentID ?>&amp;authkey=<?=$LoggedUser['AuthKey']?>&amp;torrent_pass=<?=$LoggedUser['torrent_pass']?>&amp;usetoken=1" title="Use a FL Token" onclick="return confirm('Are you sure you want to use a freeleech token here?');" class="tooltip">FL</a>
<? } ?>
| <a href="reportsv2.php?action=report&amp;id=<?=$TorrentID?>" title="Report">RP</a>
</span>
@ -205,14 +210,14 @@
<? Votes::vote_link($GroupID, $UserVotes[$GroupID]['Type']); ?>
<div class="tags"><?=$TorrentTags->format()?></div>
</td>
<td class="nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td><?=number_format($Torrent['Snatched'])?></td>
<td<?=(($Torrent['Seeders'] == 0) ? ' class="r00"' : '')?>><?=number_format($Torrent['Seeders'])?></td>
<td><?=number_format($Torrent['Leechers'])?></td>
<td class="number_column nobr"><?=Format::get_size($Torrent['Size'])?></td>
<td class="number_column"><?=number_format($Torrent['Snatched'])?></td>
<td class="number_column<?=(($Torrent['Seeders'] == 0) ? ' r00' : '')?>"><?=number_format($Torrent['Seeders'])?></td>
<td class="number_column"><?=number_format($Torrent['Leechers'])?></td>
</tr>
<?
}
$TorrentTable.= ob_get_clean();
$TorrentTable .= ob_get_clean();
// Album art
@ -481,15 +486,15 @@
if (empty($CommentList)) {
$DB->query("
SELECT
cc.ID,
cc.Body,
cc.UserID,
c.ID,
c.Body,
c.AuthorID,
um.Username,
cc.Time
FROM collages_comments AS cc
LEFT JOIN users_main AS um ON um.ID = cc.UserID
WHERE CollageID = '$CollageID'
ORDER BY ID DESC
c.AddedTime
FROM comments AS c
LEFT JOIN users_main AS um ON um.ID = c.AuthorID
WHERE c.Page = 'collages' AND c.PageID = $CollageID
ORDER BY c.ID DESC
LIMIT 15");
$CommentList = $DB->to_array(false, MYSQLI_NUM);
}
@ -515,10 +520,11 @@
?>
<div class="box box_addcomment">
<div class="head"><strong>Add comment</strong></div>
<form class="send_form" name="comment" id="quickpostform" onsubmit="quickpostform.submit_button.disabled = true;" action="collages.php" method="post">
<input type="hidden" name="action" value="add_comment" />
<form class="send_form" name="comment" id="quickpostform" onsubmit="quickpostform.submit_button.disabled = true;" action="comments.php" method="post">
<input type="hidden" name="action" value="take_post" />
<input type="hidden" name="page" value="collages" />
<input type="hidden" name="auth" value="<?=$LoggedUser['AuthKey']?>" />
<input type="hidden" name="collageid" value="<?=$CollageID?>" />
<input type="hidden" name="pageid" value="<?=$CollageID?>" />
<div class="pad">
<div class="field_div">
<textarea name="body" cols="24" rows="5"></textarea>

View File

@ -1,62 +0,0 @@
<?php
$OtherLink = '';
$Title = 'Artist comments made by '.($Self ? 'you' : $Username);
$Header = 'Artist comments left by '.($Self ? 'you' : Users::format_username($UserID, false, false, false)).'';
$Comments = $DB->query("
SELECT
SQL_CALC_FOUND_ROWS
ac.AuthorID,
a.ArtistID,
a.Name,
ac.ID,
ac.Body,
ac.AddedTime,
ac.EditedTime,
ac.EditedUserID as EditorID
FROM artists_group as a
JOIN artist_comments as ac ON ac.ArtistID = a.ArtistID
WHERE ac.AuthorId = $UserID
GROUP BY ac.ID
ORDER BY ac.AddedTime DESC
LIMIT $Limit;
");
$DB->query("SELECT FOUND_ROWS()");
list($Results) = $DB->next_record();
$Pages = Format::get_pages($Page, $Results, $PerPage, 11);
$DB->set_query_id($Comments);
$GroupIDs = $DB->collect('GroupID');
View::show_header($Title,'bbcode');
$DB->set_query_id($Comments);
?><div class="thin">
<div class="header">
<h2><?=$Header?></h2>
<? if ($OtherLink !== '') { ?>
<div class="linkbox">
<?=$OtherLink?>
</div>
<? } ?>
</div>
<div class="linkbox">
<?=$Pages?>
</div>
<?
while (list($UserID, $ArtistID, $ArtistName, $PostID, $Body, $AddedTime, $EditedTime, $EditorID) = $DB->next_record()) {
$permalink = "artist.php?id=$ArtistID&amp;postid=$PostID#post$PostID";
$postheader = ' on ' . "<a href=\"artist.php?id=$ArtistID\">$ArtistName</a>";
comment_body($UserID, $PostID, $postheader, $permalink, $Body, $EditorID, $AddedTime, $EditedTime);
} /* end while loop*/ ?>
<div class="linkbox"><?=($Pages)?></div>
</div>
<?
View::show_footer();

View File

@ -1,100 +0,0 @@
<?
/*
* $_REQUEST['type']:
* created = comments left on one's collages
* contributed = comments left on collages one contributed to
* * = one's request comments
*/
$Mode = 'normal';
$ExtraJoin = $Conditions = '';
$Conditions = "c.Deleted = '0' AND ";
if (!empty($_REQUEST['type'])) {
if ($_REQUEST['type'] == 'created') {
$Conditions .= "c.UserID = $UserID AND cc.UserID != $UserID";
$Title = 'Comments left on collages ' . ($Self ? 'you' : $Username) . ' created';
$Header = 'Comments left on collages ' . ($Self ? 'you' : Users::format_username($UserID, false, false, false)) . ' created';
$Mode = 'created';
} elseif ($_REQUEST['type'] == 'contributed') {
$Conditions .= "IF(c.CategoryID = " . array_search('Artists', $CollageCats) . ", ca.ArtistID, ct.GroupID) IS NOT NULL AND cc.UserID != $UserID";
$ExtraJoin .=
"LEFT JOIN collages_torrents as ct ON ct.CollageID = c.ID AND ct.UserID = $UserID
LEFT JOIN collages_artists as ca ON ca.CollageID = c.ID AND ca.UserID = $UserID";
$Title = 'Comments left on collages ' . ($Self ? 'you\'ve' : $Username . ' has') . ' contributed to';
$Header = 'Comments left on collages ' . ($Self ? 'you\'ve' : Users::format_username($UserID, false, false, false).' has') . ' contributed to';
$Mode = 'contributed';
}
}
if (!isset($Title)) {
$Conditions .= "cc.UserID = $UserID";
$Title = 'Collage comments made by ' . ($Self ? 'you' : $Username);
$Header = 'Collage comments made by ' . ($Self ? 'you' : Users::format_username($UserID, false, false, false));
}
$Comments = $DB->query("
SELECT
SQL_CALC_FOUND_ROWS
cc.UserID,
c.ID as CollageID,
c.Name,
cc.ID as PostID,
cc.Body,
cc.Time
FROM collages as c
JOIN collages_comments as cc ON cc.CollageID = c.ID
$ExtraJoin
WHERE $Conditions
GROUP BY cc.ID
ORDER BY cc.ID DESC
LIMIT $Limit;");
$Count = $DB->record_count();
$DB->query("SELECT FOUND_ROWS()");
list($Results) = $DB->next_record();
$Pages = Format::get_pages($Page, $Results, $PerPage, 11);
View::show_header($Title,'bbcode');
$DB->set_query_id($Comments);
$Links = array();
$BaseLink = 'comments.php?action=collages' . (!$Self ? '&amp;id='.$UserID : '');
if ($Mode != 'normal') {
$Links[] = '<a href="' . $BaseLink . '" class="brackets">Display collage comments ' . ($Self ? 'you\'ve' : $Username . ' has') . ' made</a>';
}
if ($Mode != 'created') {
$Links[] = '<a href="' . $BaseLink . '&amp;type=created" class="brackets">Display comments left on ' . ($Self ? 'your collages' : 'collages created by ' .$Username) . '</a>';
}
if ($Mode != 'contributed') {
$Links[] = '<a href="' . $BaseLink . '&amp;type=contributed" class="brackets">Display comments left on collages ' . ($Self ? 'you\'ve' : $Username . ' has') . ' contributed to</a>';
}
$Links = implode(' ', $Links);
?><div class="thin">
<div class="header">
<h2><?=$Header?></h2>
<? if ($Links !== '') { ?>
<div class="linkbox">
<?=$Links?>
</div>
<? } ?>
</div>
<div class="linkbox">
<?=$Pages?>
</div>
<?
if ($Count > 0) {
while (list($UserID, $CollageID, $Name, $PostID, $Body, $AddedTime) = $DB->next_record()) {
$permalink = "collages.php?action=comments&collageid=$CollageID&amp;postid=$PostID#post$PostID";
$postheader = " on <a href=\"collages.php?id=$CollageID\">$Name</a>";
comment_body($UserID, $PostID, $postheader, $permalink, $Body, 0, $AddedTime, 0);
}
} else { ?>
<div class="center">No results.</div>
<? } ?>
<div class="linkbox">
<?=$Pages?>
</div>
</div>
<?
View::show_footer();

Some files were not shown because too many files have changed in this diff Show More