sync: 2025-01-05 20:03:56 +0000

This commit is contained in:
mosasauroidea-bot
2025-01-05 20:03:56 +00:00
parent 77644987c1
commit 3849169f98
58 changed files with 717 additions and 606 deletions
+2 -1
View File
@@ -22,5 +22,6 @@
"formatFiles.excludedFolders": ["node_modules", ".vscode", ".git", "dist", ".chrome", "vendor"],
"editor.detectIndentation": false,
"intelephense.environment.phpVersion": "7.4",
"makefile.configureOnOpen": false
"makefile.configureOnOpen": false,
"editor.wordWrap": "off"
}
+9 -10
View File
@@ -5,18 +5,17 @@ namespace Gazelle\Action;
class BasicReward {
public static function getReward($action): RewardInfo {
$rewardInfo = new RewardInfo;
global $BaseRewardConfig;
$config = $BaseRewardConfig[$action];
$rewardInfo->tokenCount = !empty($config['token']) ? $config['token'] : 0;
if (!empty($config['token_valid_day']) && $config['token_valid_day'] > 0) {
$rewardInfo->tokenExpireTime = add_day(date('Y-m-d'), $config['token_valid_day']);
$config = CONFIG['BaseRewardConfig'][$action];
$rewardInfo->tokenCount = !empty($config['Token']) ? $config['Token'] : 0;
if (!empty($config['TokenValidDay']) && $config['TokenValidDay'] > 0) {
$rewardInfo->tokenExpireTime = add_day(date('Y-m-d'), $config['TokenValidDay']);
}
$rewardInfo->inviteCount = !empty($config['invite']) ? $config['invite'] : 0;
if (!empty($config['invite_valid_day']) && $config['invite_valid_day'] > 0) {
$rewardInfo->invteExpireTime = add_day(date('Y-m-d'), $config['invite_valid_day']);
$rewardInfo->inviteCount = !empty($config['Invite']) ? $config['Invite'] : 0;
if (!empty($config['InviteValidDay']) && $config['InviteValidDay'] > 1) {
$rewardInfo->invteExpireTime = add_day(date('Y-m-d'), $config['InviteValidDay']);
}
$rewardInfo->bonus = !empty($config['bonus']) ? $config['bonus'] : 0;
$rewardInfo->badgeID = !empty($config['badge_id']) ? $config['badge_id'] : 0;
$rewardInfo->bonus = !empty($config['Bonus']) ? $config['Bonus'] : 0;
$rewardInfo->badgeID = !empty($config['Badge_id']) ? $config['Badge_id'] : 0;
return $rewardInfo;
}
}
+12 -12
View File
@@ -3,16 +3,16 @@
namespace Gazelle\Action;
abstract class UserActionEnum {
const UploadTorrent = "upload_torrent";
const CheckTorrent = "check_torrent";
const Report = "report_torrent";
const CreateRequest = "create_request";
const FillRequest = "fill_request";
const CreateCollage = "create_collage";
const FillCollage = "fill_collage";
const EditMovie = "edit_movie";
const EditArtist = "edit_artist";
const PostComment = "post_comment";
const CreateTopic = "create_topic";
const InviteFriend = "invite_friend"; // need register success
const UploadTorrent = "UploadTorrent";
const CheckTorrent = "CheckTorrent";
const Report = "Report";
const CreateRequest = "CreateRequest";
const FillRequest = "FillRequest";
const CreateCollage = "CreateCollage";
const FillCollage = "FillCollage";
const EditMovie = "EditMovie";
const EditArtist = "EditArtist";
const PostComment = "PostComment";
const CreateTopic = "CreateTopic";
const InviteFriend = "InviteFriend"; // need register success
}
+4 -4
View File
@@ -61,13 +61,13 @@ class ActionTrigger extends \Gazelle\Base {
$this->rewardManager->sendReward($reward, [$this->user['ID']], "Basic reward for Create Topic($TopicID).", false, true);
}
public function triggerInviteeRegister(int $Inviter) {
public function triggerInviteeRegister(int $Inviter, int $Invitee) {
$reward = BasicReward::getReward(UserActionEnum::InviteFriend);
$this->rewardManager->sendReward($reward, [$Inviter], "Basic reward for invite user($this->user['ID']).", false, true);
$this->rewardManager->sendReward($reward, [$Inviter], "Basic reward for invite user($Invitee).", false, true);
}
public function triggerReport(int $Type, int $ID, $ReportID) {
public function triggerReport(string $Type, int $TorrentID, int $ReportID) {
$reward = BasicReward::getReward(UserActionEnum::Report);
$this->rewardManager->sendReward($reward, [$this->user['ID']], "Basic reward for report($ReportID) $Type($ID).", false, true);
$this->rewardManager->sendReward($reward, [$this->user['ID']], "Basic reward for report($ReportID) $Type for torrent($TorrentID).", false, true);
}
}
+3 -4
View File
@@ -175,7 +175,7 @@ class Donation extends \Gazelle\Base {
}
public function getPendingDonationCount() {
if (!$Count = $this->cache->get_value("donations_pending_count")) {
if ($Count = $this->cache->get_value("donations_pending_count") === false) {
$this->db->prepared_query('SELECT count(*) FROM donations_prepaid_card where status = ?', PrepaidCardStatus::Pending);
list($Count) = $this->db->next_record();
$this->cache->cache_value("donations_pending_count", $Count);
@@ -185,14 +185,13 @@ class Donation extends \Gazelle\Base {
public function getYearProgress() {
if (!$YearSum = $this->cache->get_value("donations_year_sum")) {
if (($YearSum = $this->cache->get_value("donations_year_sum")) === false) {
$this->db->query(
"SELECT sum(rank) from donations
where time >= '" . date("Y-01-01") . "'"
);
list($YearSum) = $this->db->next_record();
$this->cache->cache_value("donations_year_sum", $YearSum);
$this->cache->cache_value("donations_year_sum", $YearSum, 86400);
}
if (empty($YearSum)) {
return 0;
+2 -2
View File
@@ -15,7 +15,7 @@ class Reward extends \Gazelle\Base {
}
$send = false;
$BadgeName = '';
if ($rewardInfo->badgeID > 0) {
if (CONFIG['ENABLE_BADGE'] && $rewardInfo->badgeID > 0) {
$Badge = Badges::get_badges_by_id($rewardInfo->badgeID);
$BadgeName = $Badge['Label'];
if (empty($BadgeName)) {
@@ -34,7 +34,7 @@ class Reward extends \Gazelle\Base {
$this->addInvites($toUserIDs, $rewardInfo->inviteCount, $rewardInfo->invteExpireTime);
$send = true;
}
if (CONFIG['ENABLE_BADGE'] && $rewardInfo->bonus > 0) {
if ($rewardInfo->bonus > 0) {
$this->addBonus($toUserIDs, $rewardInfo->bonus);
$send = true;
}
-13
View File
@@ -623,19 +623,6 @@ class TorrentSlot {
return $Ret;
}
public static function resolution_name($resolution) {
switch ($resolution) {
case self::TorrentSlotResolutionSD:
case self::TorrentSlotResolutionHD720P:
return "group_standard_resolution";
case self::TorrentSlotResolutionHD1080P:
return "group_high_resolution";
case self::TorrentSlotResolutionUHD:
return "group_ultra_high_resolution";
}
return "";
}
public static function slot_filter_name($Slot) {
switch ($Slot) {
case self::TorrentSlotTypeNone:
+3 -4
View File
@@ -220,7 +220,7 @@ class Upload extends Base {
}
$properties['Subtitles'] = implode(',', $Params['subtitles']);
$properties['Makers'] = isset($POST['makers']) ? $Params['makers'] : "";
$properties['Makers'] = isset($Params['makers']) ? $Params['makers'] : "";
$properties['SpecialSub'] = isset($Params['special_effects_subtitles']) ? 1 : 0;
$properties['ChineseDubbed'] = isset($Params['chinese_dubbed']) ? 1 : 0;
@@ -276,7 +276,7 @@ class Upload extends Base {
}
$ReleaseGroup = Users::get_release_group_by_id($properties['Makers']);
if (count($ReleaseGroup) > 0) {
$properties['FreeEndTime'] = Time::timePlus(3600 * CONFIG['TORRENT_UPLOAD_FREE_HOUR']);
$properties['FreeEndTime'] = Time::timePlus(3600 * CONFIG['PG_TORRENT_UPLOAD_FREE_HOUR']);
} else {
$properties['FreeEndTime'] = Time::timePlus(3600 * CONFIG['TORRENT_UPLOAD_FREE_HOUR']);
}
@@ -370,10 +370,9 @@ class Upload extends Base {
$TotalSize = $this->properties['Size'];
$TorrentID = $this->properties['TorrentID'];
$UserID = $this->user['ID'];
$GroupID = $this->properties['GroupID'];
$FirstTorrent = $TotalSize > 2 * 1024 * 1024 * 1024 ? 1 : $TorrentID;
$this->db->query("update users_main set firsttorrent=IF(firsttorrent = 0, $FirstTorrent, firsttorrent) ,TotalUploads=TotalUploads+1 where id=" . $this->user['ID']);
$RecentUploads = $this->cache->delete_value("recent_uploads_$UserID");
$this->cache->delete_value("recent_uploads_$UserID");
}
private function fetchMovieData() {
+32 -1
View File
@@ -10,7 +10,12 @@ class Artists {
const Cinematographer = 5;
const Actor = 6;
const Importances = [
self::Director, self::Writter, self::Producer, self::Composer, self::Cinematographer, self::Actor
self::Director,
self::Writter,
self::Producer,
self::Composer,
self::Cinematographer,
self::Actor
];
public static function update_artist_alias($OldName, $Name, $ArtistID) {
@@ -154,6 +159,24 @@ class Artists {
return G::$DB->to_array('IMDBID', MYSQLI_ASSOC);
}
public static function update_artist_info($IMDBIDs) {
$FullArtistDetails = MOVIE::get_artists($IMDBIDs);
foreach ($IMDBIDs as $IMDBID) {
$ArtistDetail = MOVIE::get_default_artist($IMDBID);
$Detail = $FullArtistDetails[$IMDBID];
if ($Detail) {
$ArtistDetail = $Detail;
}
$Artist['IMDBID'] = $IMDBID;
$Artist['Image'] = $ArtistDetail['Image'];
$Artist['Description'] = $ArtistDetail['Description'];
$Artist['MainDescription'] = $ArtistDetail['MainDescription'];
$Artist['Birthday'] = $ArtistDetail['Birthday'];
$Artist['PlaceOfBirth'] = $ArtistDetail['PlaceOfBirth'];
Artists::add_artist($Artist);
}
}
public static function new_artist($ArtistForm, $MovieIMDNBID, $Limit = 10) {
foreach ($ArtistForm[Artists::Actor] as $Num => $Artist) {
if ($Artist['IMDBID']) {
@@ -226,11 +249,19 @@ class Artists {
G::$DB->prepared_query("INSERT INTO artists_alias (ArtistID, Name)
VALUES (?, ?)", $OldID, $Name);
$Updates[] = "Name = '" . db_string($Name) . "'";
} else if (!empty($OldArtist['Name'])) {
$Name = $OldArtist['Name'];
} else {
$Name = '';
}
if (!empty($SubName) && empty($OldSubName)) {
G::$DB->prepared_query("INSERT INTO artists_alias (ArtistID, Name)
VALUES (?, ?)", $OldID, $SubName);
$Updates[] = "SubName = '" . db_string($SubName) . "'";
} else if (!empty($OldArtist['SubName'])) {
$SubName = $OldArtist['SubName'];
} else {
$SubName = '';
}
if (empty($OldArtist['Image']) && !empty($Image)) {
$Updates[] = "Image = '" . db_string($Image) . "'";
+4 -6
View File
@@ -31,12 +31,10 @@ class Contest {
INNER JOIN contest_type t ON (t.ID = c.ContestTypeID)
WHERE c.DateEnd = (select max(DateEnd) from contest)
");
if (G::$DB->has_results()) {
$Contest = G::$DB->next_record(MYSQLI_ASSOC);
// Cache this for three days
G::$Cache->cache_value("contest_{$Contest['ID']}", $Contest, 86400 * 3);
G::$Cache->cache_value('contest_current', $Contest, 86400 * 3);
}
$Contest = G::$DB->next_record(MYSQLI_ASSOC);
// Cache this for three days
G::$Cache->cache_value("contest_{$Contest['ID']}", $Contest, 86400);
G::$Cache->cache_value('contest_current', $Contest, 86400);
}
return $Contest;
}
+3 -2
View File
@@ -10,7 +10,7 @@ class RecommendGroups {
$QueryID = G::$DB->get_query_id();
G::$DB->prepared_query("
SELECT
g.ID,
DISTINCT g.ID,
g.Name,
g.SubName,
g.IMDBRating,
@@ -19,10 +19,11 @@ class RecommendGroups {
rg.EndTime,
GROUP_CONCAT(DISTINCT tags.Name ORDER BY `TagID` SEPARATOR ' ') as TagList
FROM recommend_group AS rg
LEFT JOIN torrents_group AS g ON rg.GroupID = g.ID
RIGHT JOIN torrents_group AS g ON rg.GroupID = g.ID
LEFT JOIN torrents_tags AS tt ON tt.GroupID = g.ID
LEFT JOIN tags ON tags.ID = tt.TagID
WHERE rg.EndTime > ?
GROUP BY rg.GroupID
ORDER BY rg.EndTime DESC
LIMIT 10", sqltime());
+61
View File
@@ -307,4 +307,65 @@ class Requests {
}
return self::get_requests($Requests);
}
public static function delete_request($RequestID, $OperatorID = 0, $OperatorName, $Reason) {
//Do we need to get artists?
G::$DB->query(
"SELECT
UserID,
Title,
GroupID
FROM requests
WHERE ID = $RequestID"
);
list($UserID, $Title, $GroupID) = G::$DB->next_record();
if ($OperatorID != 0 && $OperatorID != $UserID && !check_perms('site_moderate_requests')) {
error(403);
}
$FullName = $Title;
// Delete request, votes and tags
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'");
Comments::delete_page('requests', $RequestID);
G::$DB->query(
"SELECT ArtistID
FROM requests_artists
WHERE RequestID = $RequestID"
);
$RequestArtists = G::$DB->to_array();
foreach ($RequestArtists as $RequestArtist) {
G::$Cache->delete_value("artists_requests_$RequestArtist");
}
G::$DB->query(
"DELETE FROM requests_artists
WHERE RequestID = '$RequestID'"
);
G::$Cache->delete_value("request_artists_$RequestID");
G::$DB->query(
"REPLACE INTO sphinx_requests_delta
(ID, TimeAdded)
VALUES
($RequestID, Unix_TIMESTAMP())"
);
if ($UserID != $OperatorID) {
Misc::send_pm_with_tpl($UserID, 'request_deleted', [
'FullName' => $FullName,
'LoggedUserID' => $OperatorID,
'LoggedUserUsername' => $OperatorName,
'Reason' => $Reason,
]);
}
Misc::write_log("Request $RequestID ($FullName) was deleted by user " . $OperatorID . ' (' . $OperatorName . ') for the reason: ' . $Reason);
G::$Cache->delete_value("request_$RequestID");
G::$Cache->delete_value("request_votes_$RequestID");
if ($GroupID) {
G::$Cache->delete_value("requests_group_$GroupID");
}
}
}
+2 -2
View File
@@ -1144,7 +1144,7 @@ class Text {
) {
$TableStyle = ' style="width: ' . intval($Block['Attr']) . '%;"';
}
$Str .= "<div class=\"TalbeContainer\"><table class=\"Table\"$TableStyle>";
$Str .= "<div class=\"TalbeContainer\"><table class=\"Table\" $TableStyle>";
foreach ($Block['Val'] as $tr) {
if (is_string($tr)) {
$tr = trim($tr);
@@ -1171,7 +1171,7 @@ class Text {
$Str .= '</tr>';
}
} else {
$Str .= '<tr class="Table-row"><td class="Table-cell">' . self::to_html([$tr]) . '</td></tr>';
$Str .= self::to_html([$tr]);
}
}
$Str .= '</table></div>';
+2 -2
View File
@@ -26,10 +26,10 @@ class Top10Movies {
$Key = "top10_movies_${Name}_${Limit}";
$Data = $Cache->get_value($Key);
if ($Data !== false) {
// return $Data;
return $Data;
}
if (!$Cache->get_query_lock($Key)) {
// return false;
return false;
}
$Query = strtr($this->BaseQuery, [
'{rest}' => $this->rest($Name),
+30 -32
View File
@@ -192,40 +192,38 @@ class TORRENT_FORM {
?>
<tr class="Form-row" id="freetorrent">
<td class="Form-label"><?= t('server.upload.freeleech') ?>:</td>
<td class="Form-items">
<div class="Form-inputs">
<select class="Input" name="freeleech">
<?
$FL = Torrents::freeleech_option();
foreach ($FL as $Key => $Name) {
?>
<option class="Select-option" value="<?= $Key ?>" <?= ($Key == $Torrent['FreeTorrent'] ? ' selected="selected"' : '') ?>>
<?= $Name ?></option>
<? } ?>
</select>
<script>
$(document).ready(() => {
$("#limit-time").click(() => {
if ($("#limit-time")[0].checked) {
$("#input-free-date,#input-free-time").show()
if (<?= $Torrent['FreeEndTime'] ? "false" : "true" ?>) {
const d = new Date()
$("#input-free-date")[0].value = d.getFullYear() + "-" + ("0" + (d.getMonth() +
1)).substr(-2) + "-" + ("0" + d.getDate()).substr(-2)
$("#input-free-time")[0].value = ("0" + d.getHours()).substr(-2) + ":" + ("0" + d
.getMinutes()).substr(-2)
}
} else {
$("#input-free-date,#input-free-time").hide()
<td class="Form-inputs">
<select class="Input" name="freeleech">
<?
$FL = Torrents::freeleech_option();
foreach ($FL as $Key => $Name) {
?>
<option class="Select-option" value="<?= $Key ?>" <?= ($Key == $Torrent['FreeTorrent'] ? ' selected="selected"' : '') ?>>
<?= $Name ?></option>
<? } ?>
</select>
<script>
$(document).ready(() => {
$("#limit-time").click(() => {
if ($("#limit-time")[0].checked) {
$("#input-free-date,#input-free-time").show()
if (<?= $Torrent['FreeEndTime'] ? "false" : "true" ?>) {
const d = new Date()
$("#input-free-date")[0].value = d.getFullYear() + "-" + ("0" + (d.getMonth() +
1)).substr(-2) + "-" + ("0" + d.getDate()).substr(-2)
$("#input-free-time")[0].value = ("0" + d.getHours()).substr(-2) + ":" + ("0" + d
.getMinutes()).substr(-2)
}
})
} else {
$("#input-free-date,#input-free-time").hide()
}
})
</script>
<div class="Checkbox">
<input class="Input" type="checkbox" id="limit-time" name="limit-time" <?= $Torrent['FreeEndTime'] ? " checked=\"checked\"" : "" ?> />
<label class="Checkbox-label" for="limit-time" style="display: inline;">定时</label>
</div>
})
</script>
<div class="Checkbox">
<input class="Input" type="checkbox" id="limit-time" name="limit-time" <?= $Torrent['FreeEndTime'] ? " checked=\"checked\"" : "" ?> />
<label class="Checkbox-label" for="limit-time" style="display: inline;">定时</label>
</div>
<input class="Input" type="date" id="input-free-date" name="free-date" <?= $Torrent['FreeEndTime'] ? "value=\"" . substr($Torrent['FreeEndTime'], 0, 10) . "\"" : "style=\"display:none;\"" ?> /><input class="Input" id="input-free-time" name="free-time" type="time" <?= $Torrent['FreeEndTime'] ? "value=\"" . substr($Torrent['FreeEndTime'], 11, 5) . "\"" : "style=\"display:none;\"" ?> />
<?= t('server.upload.because') ?>
+24 -3
View File
@@ -605,6 +605,7 @@ class Torrents {
* @param string $OcelotReason The deletion reason for ocelot to report to users.
*/
public static function delete_torrent($ID, $GroupID = 0, $OcelotReason = -1) {
// remove requests
$QueryID = G::$DB->get_query_id();
if (!$GroupID) {
G::$DB->query("
@@ -630,7 +631,6 @@ class Torrents {
}
}
G::$DB->query("
SELECT info_hash
FROM torrents
@@ -694,9 +694,29 @@ class Torrents {
REPLACE INTO sphinx_delta (ID, Time)
VALUES ($ID, UNIX_TIMESTAMP())");
// remove requests
G::$DB->query("SELECT ID, SourceTorrent FROM requests WHERE GroupID = $GroupID");
$Requests = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Requests as $Request) {
$Link = $Request['SourceTorrent'];
if (!preg_match('/' . TORRENT_REGEX . '/i', $Link, $Matches)) {
continue;
}
if ($Matches[2] != $ID) {
continue;
}
$RequestID = $Request['ID'];
break;
}
if (!empty($RequestID)) {
Requests::delete_request($RequestID, 0, 'System', 'Torrent deleted');
}
G::$Cache->delete_value("torrent_download_$ID");
G::$Cache->delete_value("torrent_group_$GroupID");
G::$Cache->delete_value("torrents_details_$GroupID");
G::$Cache->delete_value("recommend_group");
G::$DB->set_query_id($QueryID);
}
@@ -1759,7 +1779,8 @@ WHERE ud.TorrentID=? AND ui.NotifyOnDeleteDownloaded='1' AND ud.UserID NOT IN ({
$Body = $Artist['Body'];
$MainBody = $Artist['MainBody'];
$Image = $Artist['Image'];
$ArtistInfo = $ArtistInfos[$Artist['IMDBID']];
$ArtistIMDBID = $Artist['IMDBID'];
$ArtistInfo = $ArtistInfos[$ArtistIMDBID];
if (empty($ArtistInfo)) {
continue;
}
@@ -1789,7 +1810,7 @@ WHERE ud.TorrentID=? AND ui.NotifyOnDeleteDownloaded='1' AND ud.UserID NOT IN ({
"INSERT INTO wiki_artists
(PageID, Body, MainBody, Image, UserID, Summary, Time, IMDBID, SubName, Name)
VALUES
('$ArtistID', '$Body', '$MainBody', '$Image', '0', 'Auto load', '" . sqltime() . "', '$IMDBID', '$SubName', '$Name')"
('$ArtistID', '$Body', '$MainBody', '$Image', '0', 'Auto load', '" . sqltime() . "', '$ArtistIMDBID', '$SubName', '$Name')"
);
$RevisionID = G::$DB->inserted_id();
$UpdateSQL[] = "RevisionID = $RevisionID";
+4 -4
View File
@@ -152,7 +152,7 @@ class TorrentGroupCoverTableView extends GroupTorrentTableView {
</div>
<img class="TorrentCover-image" src="<?= ImageTools::process($RS['WikiImage'], false) ?>" />
</div>
<b><?= display_str($Name) ?></b>
<div class="TorrentCover-title"><?= display_str($Name) ?></div>
</a>
<? } ?>
</div>
@@ -185,7 +185,7 @@ class TorrentUnGroupCoverTableView extends UnGroupTorrentTableView {
</div>
<img class="TorrentCover-image" src="<?= ImageTools::process($RS['WikiImage'], false) ?>" />
</div>
<b><?= display_str($Name) ?></b>
<div class="TorrentCover-title"><?= display_str($Name) ?></div>
</a>
<? } ?>
</div>
@@ -1172,7 +1172,7 @@ class GroupTorrentTableView extends TorrentTableView {
if ($NewEdition) {
$EditionID++;
?>
<tr class="TableTorrent-rowCategory Table-row <?= $this->WithCheck && $GroupChecked ? "torrent_all_checked " : "torrent_all_unchecked" ?> <?= (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] === 1 ? ' hidden' : '') ?>" group-id="<?= $GroupID ?>">
<tr class="TableTorrent-rowCategory Table-row <?= $this->WithCheck && $GroupChecked ? "torrent_all_checked " : "torrent_all_unchecked" ?> <?= (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] === 1 ? ' u-hidden' : '') ?>" group-id="<?= $GroupID ?>">
<td class="TableTorrent-cellCategory Table-cell" colspan="<?= $Cols ?>">
<? if ($this->CollapseTorrent) { ?>
<a class="u-toggleEdition-button" href="#" onclick="globalapp.toggleEdition(event, <?= $GroupID ?>, <?= $EditionID ?>)" data-tooltip="<?= t('server.common.collapse_this_edition_title') ?>">&minus;</a>
@@ -1209,7 +1209,7 @@ class GroupTorrentTableView extends TorrentTableView {
}
?>
<? /* GroupTorrentTableView */ ?>
<tr class="TableTorrent-rowTitle Table-row <?= $this->WithCheck && $TorrentChecked ? "torrent_checked " : "torrent_unchecked" ?> <?= $SnatchedGroupClass . (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] == 1 ? ' hidden' : '') ?>" group-id="<?= $GroupID ?>" edition-id="<?= $EditionID ?>">
<tr class="TableTorrent-rowTitle Table-row <?= $this->WithCheck && $TorrentChecked ? "torrent_checked " : "torrent_unchecked" ?> <?= $SnatchedGroupClass . (!empty($LoggedUser['TorrentGrouping']) && $LoggedUser['TorrentGrouping'] == 1 ? ' u-hidden' : '') ?>" group-id="<?= $GroupID ?>" edition-id="<?= $EditionID ?>">
<td class="Table-cell is-name" colspan="<?= $Cols ?>">
<div class="TableTorrent-title">
<span class="TableTorrent-titleActions">
+62
View File
@@ -1112,4 +1112,66 @@ class Users {
}
return $list;
}
public static function add_secondary_class($UserID, $Classes) {
foreach ($Classes as $PermID) {
$ClassChanges[] = $Classes[$PermID]['Name'];
}
$ClassChangeStr = implode(', ', $ClassChanges);
$Values = [];
foreach ($Classes as $PermID) {
$Values[] = $UserID;
$Values[] = $PermID;
}
if (in_array('31', $Classes)) {
Misc::send_pm_with_tpl($UserID, 'official_recruiter', ['SiteName' => CONFIG['SITE_NAME']]);
}
$sqltime = sqltime();
G::$DB->begin_transaction();
try {
G::$DB->prepared_query(
"INSERT INTO users_levels (UserID, PermissionID)
VALUES " . implode(', ', array_fill(0, count($Values) / 2, '(?, ?)')),
...$Values
);
G::$DB->prepared_query("
UPDATE users_info AS ui
SET ui.AdminComment = CONCAT('$sqltime - Secondary classes added $ClassChangeStr.\n\n', ui.AdminComment)
WHERE ui.UserID = ?", $UserID);
} catch (Exception $e) {
G::$DB->rollback();
error_log($e);
}
G::$DB->commit();
G::$Cache->delete_value("user_info_$UserID");
G::$Cache->delete_value("user_info_heavy_$UserID");
}
public static function remove_secondary_class($UserID, $Classes) {
foreach ($Classes as $PermID) {
$ClassChanges[] = $Classes[$PermID]['Name'];
}
$ClassChangeStr = implode(', ', $ClassChanges);
$sqltime = sqltime();
G::$DB->begin_transaction();
try {
G::$DB->prepared_query(
"
DELETE FROM users_levels
WHERE UserID = '$UserID'
AND PermissionID IN (" . implode(', ', array_fill(0, count($Classes), '?')) . ")",
...$Classes
);
G::$DB->prepared_query("
UPDATE users_info AS ui
SET ui.AdminComment = CONCAT('$sqltime - Secondary classes added $ClassChangeStr.\n\n', ui.AdminComment)
WHERE ui.UserID = ?", $UserID);
} catch (Exception $e) {
G::$DB->rollback();
error_log($e);
}
G::$DB->commit();
G::$Cache->delete_value("user_info_$UserID");
G::$Cache->delete_value("user_info_heavy_$UserID");
}
}
+20 -39
View File
@@ -253,46 +253,27 @@ $CONFIG['UPLOAD_RANK_SHOW_END_TIME'] = '0000-00-00 00:00:00';
$CONFIG['RELEASE_GROUP'] = [];
$CONFIG['RELEASE_GROUP_MEMBER'] = [];
$CONFIG['BaseRewardConfig'] = [
'UploadTorrent' => [
'Token' => 0,
'TokenValidDay' => 0,
'Invite' => 0,
'InviteValidDay' => 0,
$PointRadios = [
'DownloadCount' => 0.75,
'UploadCount' => 1,
'CheckCount' => 7.5,
'RSReportCount' => 0.5,
'RPReportCount' => 12.5,
'EditCount' => 1,
'PostCount' => 0.5,
'SendJF' => 0.1,
'ApplyCount' => 1.5,
];
$Bases = [
"Sysop" => 8000,
"Administrator" => 8000,
"Developer" => 8000,
"Senior Moderator" => 7000, // cancel
"Moderator" => 7000,
"Torrent Moderator" => 6000,
"Forum Moderator" => 5000,
"Torrent Inspector" => 3000,
"First Line Support" => 3000,
"Translators" => 3000,
];
$BaseRewardConfig = [
'upload_torrent' => [
'token' => 0,
'token_valid_day' => 0,
'invite' => 0,
'invite_valid_day' => 0,
'bonus' => 0,
'badge_id' => 0,
'Bonus' => 0,
'BadgeID' => 0,
],
];
$CONFIG['SecondaryClassAwardConfig'] = [
'TI_CHECK_COUNT' => 0,
'TI_PERMISSION_ID' => 0,
'TI_SALARY' => 0,
'UP_UPLOAD_COUNT' => 0,
'UPLOADER_PERMISSION_ID' => 0,
'UPLOADER_SALARY' => 0,
'SD_SEED_SIZE' => 0, //GB
'SEEDER_PERMISSION_ID' => 0,
'SEEDER_SALARY' => 0,
];
@@ -0,0 +1,36 @@
<?php
use Phinx\Migration\AbstractMigration;
class EventsVarchar255 extends AbstractMigration {
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* addCustomColumn
* renameColumn
* addIndex
* addForeignKey
*
* Any other destructive changes will result in an error when trying to
* rollback the migration.
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change() {
$users = $this->table('events_reward_log');
$users->changeColumn('Remark', 'string', ['limit' => 255])
->save();
}
}
+13 -3
View File
@@ -179,9 +179,6 @@ if ($NotificationsManager->is_traditional(NotificationsManager::TORRENTS)) {
if (check_perms('users_mod')) {
$ModBar[] = '<a class="Button ButtonHeader" href="tools.php">' . t('server.pub.toolbox') . '</a>';
}
if (check_perms('staff_award')) {
$ModBar[] = '<a class="Button ButtonHeader" href="tools.php?action=award">' . t('server.pub.statistics') . '</a>';
}
if (check_perms('users_give_donor')) {
$Count = $donation->getPendingDonationCount();
if ($Count > 0) {
@@ -426,6 +423,19 @@ if ($_REQUEST['action']) {
</span>
</a>
</li>
<?
if (G::$LoggedUser['FLTokens'] > 0) { ?>
<li class="HeaderStat-item is-bp" data-tooltip="<?= t('server.common.fltoken') ?>">
<a class="HeaderStat-link LinkHeader Link" href="userhistory.php?action=token_history&amp;userid=<?= G::$LoggedUser['ID'] ?>">
<?= icon('token') ?>
<span class="HeaderStat-value is-bp" id="header-bp-value" data-value="<?= G::$LoggedUser['TimedTokens'] + G::$LoggedUser['FLTokens'] ?>">
<?
$Tokens = G::$LoggedUser['TimedTokens'] == 0 ? G::$LoggedUser['FLTokens'] : (G::$LoggedUser['FLTokens'] - G::$LoggedUser['TimedTokens']) . '+' . G::$LoggedUser['TimedTokens'];
echo $Tokens; ?>
</span>
</a>
</li>
<? } ?>
<? if (CONFIG['ENABLE_HNR']) { ?>
<li class="HeaderStat-item isHnr">
<a class="HeaderStat-link LinkHeader Link" href="rules.php?p=ratio">
-1
View File
@@ -78,7 +78,6 @@ switch ($Document) {
case 'activity':
case 'badges':
case 'subtitles':
case 'task':
$Valid = true;
break;
}
+8 -4
View File
@@ -74,7 +74,7 @@ if ($Data) {
error(404);
}
list($Name, $Image, $Body, $MainBody, $IMDBID, $SubName, $Birthday, $PlaceOfBirth) = $DB->next_record(MYSQLI_NUM);
list($Name, $Image, $Body, $MainBody, $IMDBID, $SubName, $Birthday, $PlaceOfBirth) = G::$DB->next_record(MYSQLI_NUM);
}
//----------------- Build list and get stats
@@ -355,12 +355,16 @@ View::show_header($ArtistHeaderName, 'browse,bbcode,comments,voting,recommend,su
</span>
</div>
<div class="MovieInfo-synopsis" data-tooltip="<?= t('server.torrents.fold_tooltip') ?>">
<p class="HtmlText">
<div class="HtmlText">
<?
$Content = Text::full_format(Lang::choose_content($MainBody, $Body));
echo $Content ? $Content : '<i>' . t('server.artist.empty_introduction_note') . '</i>'
if ($Content) {
View::long_text('movie_info_synopsis', display_str($Content), 5);
} else {
echo '<i>' . t('server.artist.empty_introduction_note') . '</i>';
}
?>
</p>
</div>
</div>
</div>
</div>
+8 -2
View File
@@ -27,8 +27,8 @@ if ($_GET['action'] === 'revert') { // if we're reverting to a previous revision
error(0);
}
} else { // with edit, the variables are passed with POST
$Body = db_string($_POST['body']);
$MainBody = db_string($_POST['mainbody']);
$Body = db_string(preg_replace("/\r|\n/", "", trim($_POST['body'])));
$MainBody = db_string(preg_replace("/\r|\n/", "", trim($_POST['mainbody'])));
$Summary = db_string($_POST['summary']);
$Image = db_string($_POST['image']);
$IMDBID = db_string($_POST['imdb_id']);
@@ -70,6 +70,10 @@ if (!$RevisionID) { // edit
$TotalSummary .= "修改名称";
}
$TotalSummary .= $Summary ? " 原因:$Summary" : "";
if (empty($TotalSummary)) {
header("Location: artist.php?id=$ArtistID");
die();
}
$DB->query("
INSERT INTO wiki_artists
(PageID, Body, MainBody, Image, UserID, Summary, Time, IMDBID, SubName, Name)
@@ -112,6 +116,8 @@ $DB->query(
WHERE ArtistID = '$ArtistID'"
);
Artists::update_artist_info([$IMDBID]);
// There we go, all done!
$Cache->delete_value("artist_$ArtistID"); // Delete artist cache
$trigger = new ActionTrigger;
+1 -1
View File
@@ -51,8 +51,8 @@ if (isset($_GET['action'])) {
case 'upload-4':
require_once(CONFIG['SERVER_ROOT'] . '/sections/bonus/upload.php');
break;
case 'recommend-movie-1':
case 'recommend-movie-7':
case 'recommend-movie-30':
require_once(CONFIG['SERVER_ROOT'] . '/sections/bonus/recommend_movie.php');
break;
default:
+9 -9
View File
@@ -8,19 +8,19 @@ $Label = $_REQUEST['label'];
if (isset($_POST['confirm']) && isset($_POST['torrent_group_id'])) {
authorize();
if (!preg_match('/^recommend-movie-([1|7])$/', $Label, $match)) {
error(t('server.bonus.you_cannot_afford_this_item'));
if (!preg_match('/^recommend-movie-([7|30])$/', $Label, $match)) {
error(t('server.bonus.you_cannot_afford_this_item'));
}
$flag = $Bonus->purchaseRecommendMovie($ID, $Label, G::$LoggedUser['EffectiveClass']);
if($flag) {
$LimitEndTime = date('Y-m-d H:i:s', strtotime("+{$match[1]} day"));
\Torrents::freeleech_groups($_POST['torrent_group_id'], 1, 0, $LimitEndTime);
\RecommendGroups::recommend_group_buy($ID, $_POST['torrent_group_id'], $LimitEndTime);
header('Location: bonus.php?complete=' . urlencode($Label));
}else {
error(t('server.bonus.you_cannot_afford_this_item'));
if ($flag) {
$LimitEndTime = date('Y-m-d H:i:s', strtotime("+{$match[1]} day"));
\Torrents::freeleech_groups($_POST['torrent_group_id'], 1, 0, $LimitEndTime);
\RecommendGroups::recommend_group_buy($ID, $_POST['torrent_group_id'], $LimitEndTime);
header('Location: bonus.php?complete=' . urlencode($Label));
} else {
error(t('server.bonus.you_cannot_afford_this_item'));
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ $Items = $Bonus->getList();
<tr class="Table-rowHeader">
<td class="Table-cell" width="30px">#</td>
<td class="Table-cell"><?= t('server.bonus.description') ?></td>
<td class="Table-cell" width="45px"><?= t('server.bonus.points_price') ?></td>
<td class="Table-cell" width="80px"><?= t('server.bonus.points_price') ?></td>
<td class="Table-cell" width="70px"><?= t('server.common.actions') ?></td>
</tr>
</thead>
+3 -2
View File
@@ -30,6 +30,7 @@ if (!empty($_REQUEST['confirm'])) {
WHERE ID = '$UserID'");
$Cache->increment('stats_user_count');
include('step2.php');
die();
}
// Confirm registration
@@ -277,9 +278,9 @@ if (!empty($_REQUEST['confirm'])) {
(UserID, InviterID, TreePosition, TreeID, TreeLevel)
VALUES
('$UserID', '$InviterID', '$TreePosition', '$TreeID', '$TreeLevel')");
$trigger = new ActionTrigger;
$trigger->triggerInviteeRegister($InviterID);
}
$trigger = new ActionTrigger;
$trigger->triggerInviteeRegister($InviterID, $UserID);
} else { // No inviter (open registration)
$DB->query("
SELECT MAX(TreeID)
-6
View File
@@ -1,7 +1,4 @@
<?
use Gazelle\Manager\ActionTrigger;
authorize();
if (empty($_POST['id']) || !is_number($_POST['id']) || empty($_POST['type']) || ($_POST['type'] !== 'request_update' && empty($_POST['reason']))) {
@@ -73,9 +70,6 @@ $DB->query('
(' . db_string($LoggedUser['ID']) . ", $ID, '$Short', '" . sqltime() . "', '" . db_string($Reason) . "')");
$ReportID = $DB->inserted_id();
$trigger = new ActionTrigger;
$trigger->triggerReport($Short, $ID, $ReportID);
$Channels = array();
if ($Short === 'request_update') {
+20 -2
View File
@@ -11,6 +11,8 @@
* Then it just inserts the report to the DB and increments the counter.
*/
use Gazelle\Manager\ActionTrigger;
authorize();
if (!is_number($_POST['torrentid'])) {
@@ -132,6 +134,10 @@ $DB->query("
$ReportID = $DB->inserted_id();
$trigger = new ActionTrigger;
$trigger->triggerReport($Type, $TorrentID, $ReportID);
if ($Type != "rescore" && $Type != "lossyapproval" && $Type != "upload_contest" && $Type != 'edited') {
$DB->query("
SELECT
@@ -157,8 +163,20 @@ if ($Type != "rescore" && $Type != "lossyapproval" && $Type != "upload_contest"
if ($DB->has_results()) {
$Data = G::$DB->next_record(MYSQLI_ASSOC);
list(
$UserID, $GroupID, $Size, $InfoHash, $Name, $SubName, $Year, $Time, $Source, $Codec, $Container, $Resolution,
$RemasterTitle, $RemasterYear
$UserID,
$GroupID,
$Size,
$InfoHash,
$Name,
$SubName,
$Year,
$Time,
$Source,
$Codec,
$Container,
$Resolution,
$RemasterTitle,
$RemasterYear
) = array_values($Data);
$Torrent = Torrents::get_torrent($TorrentID);
$RawName = Torrents::torrent_name($Torrent, false);
+1 -2
View File
@@ -27,8 +27,6 @@ if ($RequestType == 2) {
}
}
//Convenience variables
$IsFilled = !empty($Request['TorrentID']);
$CanVote = !$IsFilled && check_perms('site_vote');
@@ -42,6 +40,7 @@ if ($Request['CategoryID'] === '0') {
//Do we need to get artists?
$ArtistForm = Requests::get_artists($RequestID);
$Director = Artists::get_first_directors($ArtistForm);
$ArtistName = Artists::display_artists($ArtistForm, false, false);
$RequestGroupName = Torrents::group_name($Request, false);
+1 -63
View File
@@ -9,67 +9,5 @@ if (!is_number($RequestID)) {
error(0);
}
$DB->query("
SELECT
UserID,
Title,
CategoryID,
GroupID
FROM requests
WHERE ID = $RequestID");
list($UserID, $Title, $CategoryID, $GroupID) = $DB->next_record();
if ($LoggedUser['ID'] != $UserID && !check_perms('site_moderate_requests')) {
error(403);
}
$CategoryName = $Categories[$CategoryID - 1];
//Do we need to get artists?
$FullName = $Title;
// Delete request, votes and tags
$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'");
Comments::delete_page('requests', $RequestID);
$DB->query("
SELECT ArtistID
FROM requests_artists
WHERE RequestID = $RequestID");
$RequestArtists = $DB->to_array();
foreach ($RequestArtists as $RequestArtist) {
$Cache->delete_value("artists_requests_$RequestArtist");
}
$DB->query("
DELETE FROM requests_artists
WHERE RequestID = '$RequestID'");
$Cache->delete_value("request_artists_$RequestID");
G::$DB->query("
REPLACE INTO sphinx_requests_delta
(ID, TimeAdded)
VALUES
($RequestID, Unix_TIMESTAMP())");
if ($UserID != $LoggedUser['ID']) {
Misc::send_pm_with_tpl($UserID, 'request_deleted', [
'FullName' => $FullName,
'LoggedUserID' => $LoggedUser['ID'],
'LoggedUserUsername' => $LoggedUser['Username'],
'Reason' => $_POST['reason'],
]);
}
Misc::write_log("Request $RequestID ($FullName) was deleted by user " . $LoggedUser['ID'] . ' (' . $LoggedUser['Username'] . ') for the reason: ' . $_POST['reason']);
$Cache->delete_value("request_$RequestID");
$Cache->delete_value("request_votes_$RequestID");
if ($GroupID) {
$Cache->delete_value("requests_group_$GroupID");
}
Requests::delete_request($RequestID, G::$LoggedUser['ID'], G::$LoggedUser['Username'], $_POST['reason']);
header('Location: requests.php');
+2 -2
View File
@@ -81,7 +81,7 @@ if ($RequestType == 1) {
WHERE xu.fid = '$SourceTorrentID' and xu.uid = $FillerID and active = 1 and xu.remaining = 0 "
);
if (!$DB->has_results()) {
//$Err = t('server.requests.cant_fill');
$Err = t('server.requests.cant_fill');
}
$TorrentID = $SourceTorrentID;
}
@@ -172,7 +172,7 @@ foreach ($ArtistIDs as $ArtistID) {
$Cache->delete_value("artists_requests_$ArtistID");
}
$trigger = new ActionTrigger;
$trigger->triggerFillRequest($RequestID, $TorretnID);
$trigger->triggerFillRequest($RequestID, $TorrentID);
Requests::update_sphinx_requests($RequestID);
$SphQL = new SphinxqlQuery();
@@ -1,51 +0,0 @@
<?php
//------------- Delete dead torrents ------------------------------------//
//sleep(10);
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/award_functions.php');
$Year = date('Y');
$Month = date('n') - 1;
$Quarter = 0;
if (!$Month) {
$Month = 12;
$Year -= 1;
}
$Time = timeConvert($Year, $Quarter, $Month);
$AwardDatas = [
getAwardData("Sysop", $Time),
getAwardData("Administrator", $Time),
getAwardData("Moderator", $Time),
getAwardData("Torrent Moderator", $Time),
getAwardData("Forum Moderator", $Time),
getAwardData("Torrent Inspector", $Time),
getAwardData("First Line Support", $Time),
getAwardData("Interviewer", $Time),
getAwardData("Translators", $Time),
getAwardData("Developer", $Time),
];
$MaxValue = [
'DownloadCount' => 0,
'UploadCount' => 0,
'CheckCount' => 0,
'RSReportCount' => 0,
'RPReportCount' => 0,
'EditCount' => 0,
'PostCount' => 0,
'SendJF' => 0,
'Point' => 0,
'ApplyCount' => 0,
];
makePoint($AwardDatas, $Bases, $PointRadios, $MaxValue);
$PutoutUsersIDs = [];
$testMsg = "";
foreach ($AwardDatas as $data) {
foreach ($data['Users'] as $User) {
if (!in_array($User['UserID'], $PutoutUsersIDs)) {
$PutoutUsersIDs[] = $User['UserID'];
$DB->query("UPDATE users_main SET BonusPoints = BonusPoints + " . $User['Salary'] . " WHERE ID = " . $User['UserID']);
$Cache->delete_value('user_stats_' . $User['UserID']);
$testMsg .= $User['UserID'] . ", " . $User['Salary'] . "\n";
}
}
}
print_r($testMsg);
@@ -0,0 +1,187 @@
<?
use Gazelle\Action\RewardInfo;
use Gazelle\Manager\Reward;
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/award_functions.php');
$PromoteYear = date('Y');
$PromoteMonth = date('n') - 1;
if (!$PromoteMonth) {
$PromoteMonth = 12;
$PromoteYear -= 1;
}
$DemoteMonth = $PromoteMonth - 1;
$DemoteYear = $PromoteYear;
if (!$DemoteMonth) {
$DemoteMonth = 12;
$DemoteYear -= 1;
}
$Quarter = 0;
$PromoteTime = timeConvert($PromoteYear, $Quarter, $PromoteMonth);
list($promoteFromY, $promoteFromM, $promoteToY, $promoteToM) = $PromoteTime;
$DemoteTime = timeConvert($DemoteYear, $Quarter, $DemoteMonth);
list($demoteFromY, $demoteFromM,,) = $DemoteTime;
$demoteToY = $promoteToY;
$demoteToM = $promoteToM;
// TI
$PromoteCheckCount = CONFIG['SecondaryClassAwardConfig']['TI_CHECK_COUNT'];
$TIPermissionID = CONFIG['SecondaryClassAwardConfig']['TI_PERMISSION_ID'];
if ($PromoteCheckCount > 0 && !empty($TIPermissionID)) {
// promote
$sql =
"SELECT tc.UserID as UserID, COUNT(DISTINCT torrentid) AS Count, ul.PermissionID FROM torrents_check tc
LEFT JOIN users_levels ul ON ul.PermissionID = $TIPermissionID and ul.UserID = tc.UserID
WHERE tc.Time >= '$promoteFromY-$promoteFromM-1' AND tc.Time < '$promoteToY-$promoteToM-1' AND tc.Type = 1
GROUP By UserID
HAVING Count >= $PromoteCheckCount AND PermissionID is null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
$PromotedUserID = [];
foreach ($Ret as $Data) {
Users::add_secondary_class($Data['UserID'], [$TIPermissionID]);
echo "Add TI secondary class to $UserID";
$PromotedUserID[] = $Data['UserID'];
}
// demote
$DemoteCheckCount = 2 * CONFIG['SecondaryClassAwardConfig']['TI_CHECK_COUNT'];
$sql =
"SELECT tc.UserID as UserID, COUNT(DISTINCT torrentid) AS Count, ul.PermissionID FROM torrents_check tc
RIGHT JOIN users_levels ul ON ul.PermissionID = $TIPermissionID and ul.UserID = tc.UserID
WHERE `Time` >= '$demoteFromY-$demoteFromM-1' AND `Time` < '$demoteToY-$demoteToM-1' AND `Type` = 1
GROUP By UserID
HAVING Count < $DemoteCheckCount AND PermissionID is not null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
if (in_array($Data['UserID'], $PromotedUserID)) {
continue;
}
Users::remove_secondary_class($Data['UserID'], [$TIPermissionID]);
echo "Drop TI secondary class from $UserID";
}
}
// Uploader
$PromoteUploadCount = CONFIG['SecondaryClassAwardConfig']['UP_UPLOAD_COUNT'];
$UploaderPermissionID = CONFIG['SecondaryClassAwardConfig']['UPLOADER_PERMISSION_ID'];
if ($PromoteUploadCount > 0 && !empty($UploaderPermissionID)) {
// promote
$sql =
"SELECT t.UserID as UserID, COUNT(t.ID) AS Count, ul.PermissionID FROM torrents t
LEFT JOIN users_levels ul ON ul.PermissionID = $UploaderPermissionID and ul.UserID = t.UserID
WHERE t.Time >= '$promoteFromY-$promoteFromM-1' AND t.Time < '$promoteToY-$promoteToM-1'
GROUP By UserID
HAVING Count >= $PromoteUploadCount AND PermissionID is null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
$PromotedUserID = [];
foreach ($Ret as $Data) {
Users::add_secondary_class($Data['UserID'], [$UploaderPermissionID]);
echo "Add Uploader secondary class to $UserID";
$PromotedUserID[] = $Data['UserID'];
}
// demote
$DemoteUploadCount = 2 * CONFIG['SecondaryClassAwardConfig']['UP_UPLOAD_COUNT'];
$sql =
"SELECT t.UserID as UserID, COUNT(DISTINCT t.ID) AS Count, ul.PermissionID FROM torrents t
RIGHT JOIN users_levels ul ON ul.PermissionID = $UploaderPermissionID and ul.UserID = t.UserID
WHERE t.Time >= '$demoteFromY-$demoteFromM-1' AND t.Time < '$demoteToY-$demoteToM-1'
GROUP By UserID
HAVING Count < $DemoteUploadCount AND PermissionID is not null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
if (in_array($Data['UserID'], $PromotedUserID)) {
continue;
}
Users::remove_secondary_class($Data['UserID'], [$UploaderPermissionID]);
echo "Drop Uploader secondary class from $UserID";
}
}
// Seeder
$PromoteSeedCount = CONFIG['SecondaryClassAwardConfig']['SD_SEED_SIZE'];
$SeederPermissionID = CONFIG['SecondaryClassAwardConfig']['SEEDER_PERMISSION_ID'];
if ($PromoteSeedCount > 0 && !empty($SeederPermissionID)) {
// promote
$sql = "SELECT xfu.uid AS UserID, ul.PermissionID, floor(IFNULL(SUM(t.SIZE), 0) / 1024 / 1024 / 1024) AS Size FROM xbt_files_users xfu
LEFT JOIN users_levels ul ON ul.UserID = xfu.uid AND ul.PermissionID = $SeederPermissionID
RIGHT JOIN torrents t ON xfu.fid = t.ID
WHERE active = 1 AND remaining = 0 AND mtime > Unix_timestamp(Now() - interval 1 hour)
GROUP BY UserID
Having Size >= $PromoteSeedCount AND PermissionID is null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
Users::add_secondary_class($Data['UserID'], [$SeederPermissionID]);
echo "Add Seeder secondary class to $UserID";
}
// demote
$DemoteSeedCount = 2 * CONFIG['SecondaryClassAwardConfig']['SD_SEED_SIZE'];
$sql = "SELECT xfu.uid AS UserID, ul.PermissionID, floor(IFNULL(SUM(t.SIZE), 0) / 1024 / 1024 / 1024) AS Size FROM xbt_files_users xfu
RIGHT JOIN users_levels ul ON ul.UserID = xfu.uid AND ul.PermissionID = $SeederPermissionID
RIGHT JOIN torrents t ON xfu.fid = t.ID
WHERE active = 1 AND remaining = 0 AND mtime > Unix_timestamp(Now() - interval 1 hour)
GROUP BY UserID
Having Size < $DemoteSeedCount AND PermissionID is not null";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
Users::remove_secondary_class($Data['UserID'], [$SeederPermissionID]);
echo "Drop Seeder secondary class from $UserID";
}
}
// check rewards
$rewardManager = new Reward;
if (!empty($TIPermissionID) && CONFIG['SecondaryClassAwardConfig']['TI_SALARY'] > 0) {
$sql =
"SELECT tc.UserID as UserID, COUNT(DISTINCT torrentid) AS Count FROM torrents_check tc
RIGHT JOIN users_levels ul ON ul.PermissionID = $TIPermissionID and ul.UserID = tc.UserID
WHERE tc.Time >= '$promoteFromY-$promoteFromM-1' AND tc.Time < '$promoteToY-$promoteToM-1' AND tc.Type = 1
GROUP By UserID";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
$RewardInfo = new RewardInfo;
$RewardInfo->bonus = CONFIG['SecondaryClassAwardConfig']['TI_SALARY'] * $Data['Count'];
$rewardManager->sendReward($RewardInfo, [$Data['UserID']], "TI salary.", true, true);
}
}
// upload rewards
if (!empty($UploaderPermissionID) && CONFIG['SecondaryClassAwardConfig']['UPLOADER_SALARY'] > 0) {
$sql =
"SELECT t.UserID as UserID, COUNT(t.ID) AS Count FROM torrents t
RIGHT JOIN users_levels ul ON ul.PermissionID = $UploaderPermissionID and ul.UserID = t.UserID
WHERE t.Time >= '$promoteFromY-$promoteFromM-1' AND t.Time < '$promoteToY-$promoteToM-1'
GROUP By UserID";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
$RewardInfo = new RewardInfo;
$RewardInfo->bonus = CONFIG['SecondaryClassAwardConfig']['UPLOADER_SALARY'] * $Data['Count'];
$rewardManager->sendReward($RewardInfo, [$Data['UserID']], "Uploader salary.", true, true);
}
}
// seed reward
if (!empty($SeederPermissionID) && CONFIG['SecondaryClassAwardConfig']['SEEDER_SALARY'] > 0) {
$sql = "SELECT xfu.uid AS UserID, floor(IFNULL(SUM(t.SIZE), 0) / 1024 / 1024 / 1024) AS Size FROM xbt_files_users xfu
RIGHT JOIN users_levels ul ON ul.UserID = xfu.uid AND ul.PermissionID = $SeederPermissionID
RIGHT JOIN torrents t ON xfu.fid = t.ID
WHERE active = 1 AND remaining = 0 AND mtime > Unix_timestamp(Now() - interval 1 hour)
GROUP BY UserID";
G::$DB->query($sql);
$Ret = G::$DB->to_array(false, MYSQLI_ASSOC);
foreach ($Ret as $Data) {
$RewardInfo = new RewardInfo;
$RewardInfo->bonus = CONFIG['SecondaryClassAwardConfig']['SEEDER_SALARY'] * $Data['Size'];
$rewardManager->sendReward($RewardInfo, [$Data['UserID']], "Seeder salary.", true, true);
}
}
+28 -38
View File
@@ -9,6 +9,11 @@ $SupportStaff = get_support();
$action = $_GET['action'];
list($Secondary, $Staff) = $SupportStaff;
$SupportStaffList = [];
foreach ($Secondary as $StaffMember) {
list($ID, $ClassID, $Class, $ClassName, $StaffGroup, $Username, $Paranoia, $LastAccess, $Remark) = $StaffMember;
$SupportStaffList[$ClassName][] = $StaffMember;
}
?>
<div class="LayoutBody">
@@ -41,47 +46,32 @@ list($Secondary, $Staff) = $SupportStaff;
</div>
<div class="Group-body">
<?= t('server.staff.fl_support_note') ?>
<?
$CurClass = 0;
$CloseTable = false;
foreach ($Secondary as $StaffMember) {
list($ID, $ClassID, $Class, $ClassName, $StaffGroup, $Username, $Paranoia, $LastAccess, $Remark) = $StaffMember;
if ($Class != $CurClass) { // Start new class of staff members
$Row = 'a';
if ($CloseTable) {
$CloseTable = false;
// the "\t" and "\n" are used here to make the HTML look pretty
echo "</table></div></div>";
}
$CurClass = $Class;
$CloseTable = true;
<table class="TableUser Table">
<tr class="Table-rowHeader">
<td class="Table-cell" width="200px"><?= t('server.apply.role') ?></td>
<td class="Table-cell"><?= t('server.common.user') ?></td>
</tr>
<?
foreach ($SupportStaffList as $ClassName => $StaffMembers) {
$HTMLID = str_replace(' ', '_', strtolower($ClassName));
?>
<div class="Box">
<div class="Box-header">
<div class="Box-headerTitle">
<div id="<?= $HTMLID ?>"><i><?= $ClassName ?></i></div>
</div>
</div>
<div class="Box-body">
<table class="TableUser Table is-inner">
<tr class="Table-rowHeader">
<td class="Table-cell" style="width: 130px;"><?= t('server.staff.username') ?></td>
<td class="Table-cell" style="width: 200px;"><?= t('server.staff.lastseen') ?></td>
<td class="Table-cell"><?= t('server.staff.support') ?></td>
</tr>
<?
}
$Row = make_staff_row($Row, $ID, $Paranoia, $Class, $LastAccess, $Remark);
$UserNameList = implode(', ', array_map(function ($StaffMember) {
list($ID, $ClassID, $Class, $ClassName, $StaffGroup, $Username, $Paranoia, $LastAccess, $Remark) = $StaffMember;
return Users::format_username($ID, false, false, false);
}, $StaffMembers));
?>
<tr class="Table-row">
<td class="Table-cell" id="<?= $HTMLID ?>"><?= $ClassName ?></td>
<td class="Table-cell"><?= $UserNameList ?></td>
</tr>
<?
}
?>
</table>
</div>
</div>
<?
?>
?>
</table>
</div>
</div>
<?
?>
<? if (check_perms('show_admin_team')) {
foreach ($Staff as $SectionName => $StaffSection) {
@@ -89,7 +79,7 @@ list($Secondary, $Staff) = $SupportStaff;
continue;
}
?>
<div class="Group">
<div class=" Group">
<div class="Group-header">
<div class="Group-headerTitle"><?= $SectionName ?></div>
</div>
+1 -1
View File
@@ -25,7 +25,7 @@ if (empty($AllSubtitles)) {
foreach ($AllSubtitles as $Subtitle) {
$LanguageArray = explode(',', $Subtitle['languages']);
$IsNew = time_ago($Subtitle['upload_time']) < 600;
$CanRM = check_perms('users_mod') || $Subtitle['Uploader'] == $LoggedUser['ID'];
$CanRM = check_perms('users_mod') || $Subtitle['uploader'] == $LoggedUser['ID'];
$UserInfo = Users::user_info($Subtitle['uploader']);
$UploaderName = $UserInfo['Username'];
if ($UploaderName == '') {
-8
View File
@@ -77,14 +77,6 @@ switch ($_REQUEST['action']) {
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/forum_alter.php');
break;
case 'award':
if (check_perms('staff_award')) {
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/award.php');
} else {
error(403);
}
break;
case 'whitelist':
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/whitelist_list.php');
break;
-209
View File
@@ -1,209 +0,0 @@
<?
include(CONFIG['SERVER_ROOT'] . '/sections/tools/managers/award_functions.php');
View::show_header(t('server.pub.statistics'), '', 'PageToolAward');
$Year = isset($_GET['year']) ? intval($_GET['year']) : 0;
$Quarter = isset($_GET['quarter']) ? intval($_GET['quarter']) : 0;
$Month = isset($_GET['month']) ? intval($_GET['month']) : 0;
if (!$Year && !$Quarter && !$Month) {
$Month = date('n');
}
if (!$Year) {
$Year = date('Y');
}
if ($Quarter && $Month) {
$Month = 0;
}
$QUARTER = array("", t('server.tools.quarter_1'), t('server.tools.quarter_2'), t('server.tools.quarter_3'), t('server.tools.quarter_4'));
?>
<div class="LayoutBody">
<div class="BodyHeader">
<h2 class="BodyHeader-nav"><?= t('server.pub.statistics') ?></h2>
</div>
<h2 id="award-title" style="text-align: center;"><?= t('server.tools.year', ['Values' => [$Year]]) . ($Month ? t('server.tools.month', ['Values' => [$Month]]) : "") . ($Quarter ? "$QUARTER[$Quarter]" : "") ?></h2>
<div class="BoxBody">
<table id="table-select">
<?
printYearTR(2021, ($Month || $Quarter) ? 0 : $Year);
printQuarterTR($Year, $Quarter);
printMonthTR($Year, $Month);
?>
</table>
</div>
<?
$Time = timeConvert($Year, $Quarter, $Month);
$AwardDatas = [
getAwardData("Sysop", $Time),
getAwardData("Administrator", $Time),
getAwardData("Developer", $Time),
getAwardData("Senior Moderator", $Time),
getAwardData("Moderator", $Time),
getAwardData("Torrent Moderator", $Time),
getAwardData("Forum Moderator", $Time),
getAwardData("Torrent Inspector", $Time),
getAwardData("First Line Support", $Time),
getAwardData("Interviewer", $Time),
getAwardData("Translators", $Time),
];
$MaxValue = [
'DownloadCount' => 0,
'UploadCount' => 0,
'CheckCount' => 0,
'RSReportCount' => 0,
'RPReportCount' => 0,
'EditCount' => 0,
'PostCount' => 0,
'SendJF' => 0,
'Point' => 0,
'ApplyCount' => 0,
];
makePoint($AwardDatas, $Bases, $PointRadios, $MaxValue);
//print_r ($AwardDatas);
?>
<!--
<script>
$(document).ready(function() {
var top = $('#table-head-top').offset().top - parseFloat($('#table-head-top').css('marginTop').replace(/auto/, 0))
$(window).scroll(function (event) {
var y = $(this).scrollTop();
if (y >= top) {
$('#table-head-top').addClass('fixed');
} else {
$('#table-head-top').removeClass('fixed');
}
});
})
</script>
-->
<div id="salary-table">
<div id="table-head-left">
<div class="row1 th-span1 row-span-2"><?= t('server.tools.group') ?></div>
<div class="row1 th-span1 row-span-2"><?= t('server.tools.id') ?></div>
<?
$row = 2;
$PutoutUsersIDs = [];
foreach ($AwardDatas as $data) {
$first = true;
$headLeftUsers = "";
$rowspan = 0;
foreach ($data['Users'] as $User) {
if (!in_array($User['UserID'], $PutoutUsersIDs)) {
if ($first) {
$first = false;
}
$row++;
$DivClassName = "row" . ($row % 2 ? "even" : "odd");
$PutoutUsersIDs[] = $User['UserID'];
$rowspan++;
$headLeftUsers .= "<div class=\"$DivClassName div-username\">" . Users::format_username($User['UserID'], false, false, false) . "</div>";
}
}
if (!$first) {
$GroupNameMap = ['Moderator' => 'Mod', 'Torrent Moderator' => 'TM', 'Forum Moderator' => 'FM', 'Torrent Inspector' => 'TI', 'First Line Support' => 'FLS', 'Interviewer' => 'IN', 'Translators' => 'TL', 'Senior Moderator' => 'SM', 'Developer' => 'Dev', 'Administrator' => 'AD'];
if (isset($GroupNameMap[$data['GroupName']])) {
echo "<div class=\"group-name\" style=\"grid-row-start: span $rowspan;\" data-tooltip=\"" . $data['GroupName'] . "\">" . $GroupNameMap[$data['GroupName']] . "</div>";
} else {
echo "<div class=\"group-name\" style=\"grid-row-start: span $rowspan;\">" . $data['GroupName'] . "</div>";
}
echo $headLeftUsers;
}
}
?>
</div>
<div id="table-right-scroll">
<div id="table-head-top" style="grid-template-columns: repeat(15, 1fr);">
<div class="row1 th-span2"><?= t('server.tools.data') ?></div>
<div class="row1 th-span4"><?= t('server.tools.torrent_management') ?></div>
<div class="row1 th-span4"><?= t('server.tools.site_activities') ?></div>
<div class="row1 th-span1"><?= t('server.tools.others') ?></div>
<div class="row1 col-tail th-span4"><?= t('server.tools.wage_statistics') ?></div>
<div class="row2 th-span1"><?= t('server.tools.snatches') ?></div>
<div class="row2 th-span1"><?= t('server.tools.uploads') ?></div>
<div class="row2 th-span1"><?= t('server.tools.checks') ?></div>
<div class="row2 th-span1"><?= t('server.tools.reports_submitted') ?></div>
<div class="row2 th-span1"><?= t('server.tools.reports_handled') ?></div>
<div class="row2 th-span1"><?= t('server.tools.edit_requests_handled') ?></div>
<div class="row2 th-span1"><?= t('server.tools.posts') ?></div>
<div class="row2 th-span1"><?= t('server.tools.rewarded_times') ?></div>
<div class="row2 th-span1"><?= t('server.tools.qq_group') ?></div>
<div class="row2 th-span1"><?= t('server.tools.tg_group') ?></div>
<div class="row2 th-span1"><?= t('server.tools.examined') ?></div>
<div class="row2 th-span1"><?= t('server.tools.total_points') ?></div>
<div class="row2 th-span1"><?= t('server.tools.floating_wage') ?></div>
<div class="row2 th-span1"><?= t('server.tools.base_salary') ?></div>
<div class="row2 th-span1 col-tail"><?= t('server.tools.total_wages') ?></div>
</div>
<div id="table-content" style="grid-template-columns: repeat(15, 1fr);">
<?
$row = 2;
$PutoutUsersIDs = [];
$Gear = ["", t('server.tools.grade_1'), t('server.tools.grade_2'), t('server.tools.grade_3'), t('server.tools.grade_4'), t('server.tools.grade_5')];
foreach ($AwardDatas as $data) {
foreach ($data['Users'] as $User) {
if (!in_array($User['UserID'], $PutoutUsersIDs)) {
$row++;
$DivClassName = "row$row row" . ($row % 2 ? "even" : "odd");
$PutoutUsersIDs[] = $User['UserID'];
?>
<div class="<?= $DivClassName ?>" <?= $MaxValue['DownloadCount'] && $MaxValue['DownloadCount'] == $User['DownloadCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['DownloadCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['UploadCount'] && $MaxValue['UploadCount'] == $User['UploadCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['UploadCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['CheckCount'] && $MaxValue['CheckCount'] == $User['CheckCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['CheckCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['RPReportCount'] && $MaxValue['RPReportCount'] == $User['RPReportCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['RPReportCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['RSReportCount'] && $MaxValue['RSReportCount'] == $User['RSReportCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['RSReportCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['EditCount'] && $MaxValue['EditCount'] == $User['EditCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['EditCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['PostCount'] && $MaxValue['PostCount'] == $User['PostCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['PostCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['SendJF'] && $MaxValue['SendJF'] == $User['SendJF'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['SendJF'] ?></div>
<div class="<?= $DivClassName ?>"><?= $User['QQCount'] ?></div>
<div class="<?= $DivClassName ?>"><?= $User['TGCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['ApplyCount'] && $MaxValue['ApplyCount'] == $User['ApplyCount'] ? " style=\"color: #d39911;\"" : "" ?>><?= $User['ApplyCount'] ?></div>
<div class="<?= $DivClassName ?>" <?= $MaxValue['Point'] && $MaxValue['Point'] == $User['Point'] ? " style=\"color: #d39911;\"" : "" ?>><strong><?= $User['Point'] ?></strong></div>
<div class="<?= $DivClassName ?>"><?= $User['Brokerage'] ?></div>
<div class="<?= $DivClassName ?>"><?= $User['Base'] ?></div>
<div class="<?= $DivClassName ?> col-tail" data-tooltip="<?= $Gear[$User['Gear']] ?>"><strong><?= $User['Salary'] ?></strong></div>
<?
}
}
}
?>
</div>
</div>
</div>
<div class="floatright"><?= t('server.tools.explanation_thread') ?></div>
</div>
<script>
function setCookie(cname, cvalue, exdays = 0) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toUTCString();
document.cookie = cname + "=" + cvalue + (exdays ? (";" + expires) : "") + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
$(document).ready(() => {
var lastScroll = getCookie("lastScroll")
if (lastScroll) {
$(document).scrollTop(lastScroll)
}
$(document).scroll(() => {
setCookie("lastScroll", $(document).scrollTop())
})
})
</script>
<? View::show_footer(); ?>
@@ -81,7 +81,7 @@ View::show_header(t('server.tools.events_reward_history'));
foreach ($Histories as $Recode) {
?>
<tr class="Table-row">
<td class="Table-cell"><?= strlen($Recode['UserIDs']) > 1 ? '<a target="_blank" href="tools.php?action=events_reward_history&id=' . $Recode['ID'] . '">' . t('server.tools.show_all') . '</a>' : userIDs2Usernames($Recode['UserIDs'], ' ') ?></td>
<td class="Table-cell"><?= count(explode(',', $Recode['UserIDs'])) > 1 ? '<a target="_blank" href="tools.php?action=events_reward_history&id=' . $Recode['ID'] . '">' . t('server.tools.show_all') . '</a>' : userIDs2Usernames($Recode['UserIDs'], ' ') ?></td>
<td class="Table-cell"><?= Users::format_username($Recode['ByUserID']) ?></td>
<td class="Table-cell"><?
$Strs = [];
+1 -1
View File
@@ -205,7 +205,7 @@ View::show_header(t('server.top10.top_10_users'), '', 'PageTop10User');
$NameItem = $UserName;
}
} else if ($IsAnonymous) {
$NameItem = $IsAnonymous;
$NameItem = t('server.user.anonymous');
} else {
$NameItem = $UserName;
}
+2
View File
@@ -172,6 +172,7 @@ if ($CheckAllTorrents) {
list($AllUncheckedCnt) = G::$DB->next_record();
}
View::show_header(t('server.torrents.header'), 'browse', 'PageTorrentHome');
//$TimeNow = new DateTime();
//$TimeUntil = new DateTime('2016-12-16 03:50:00');
@@ -440,6 +441,7 @@ View::show_header(t('server.torrents.header'), 'browse', 'PageTorrentHome');
<span><?= t('server.torrents.unchecked_torrents_results_note', ['Values' => [$AllUncheckedCnt]]) ?></span>
<? }
?>
</div>
<div class="SearchPageFooter-actions">
<input class="Button" type="submit" value="<?= t('server.torrents.search_torrents') ?>" />
+1
View File
@@ -24,6 +24,7 @@ $View = isset($_GET['view']) ? $_GET['view'] : '';
// Group details
$WikiBody = Lang::choose_content($TorrentDetails['MainWikiBody'], $TorrentDetails['WikiBody']);
$WikiImage = $TorrentDetails['WikiImage'];
$GropuID = $TorrentDetails['ID'];
$IMDBID = $TorrentDetails['IMDBID'];
+1 -1
View File
@@ -148,7 +148,7 @@ if ($_REQUEST['usetoken'] && in_array($FreeTorrent, [Torrents::Normal, Torrents:
UPDATE users_main
SET FLTokens = FLTokens - $TokenUses
WHERE ID = $UserID");
G::$DB->prepared_query("DELETE FROM tokens_typed WHERE ID in (SELECT tmp.ID FROM (SELECT ID FROM tokens_typed order by EndTime limit $TokenUses) tmp)");
G::$DB->prepared_query("DELETE FROM tokens_typed WHERE ID in (SELECT tmp.ID FROM (SELECT ID FROM tokens_typed WHERE UserID = $UserID order by EndTime limit $TokenUses) tmp)");
} catch (Exception $e) {
error_log($e);
G::$DB->rollback();
+3 -2
View File
@@ -35,9 +35,10 @@ $Title = Torrents::group_name($Group);
list($TorrentID, $UserID, $Info, $Time) = $LogEntry;
if (strpos($Info, 'deleted') !== false) {
$Color = 'red';
}
if (strpos($Info, 'uploaded ') !== false) {
} else if (strpos($Info, 'uploaded ') !== false) {
$Color = 'green';
} else {
$Color = '';
}
?>
<tr class="Table-row">
+4 -3
View File
@@ -13,6 +13,7 @@ if ($NumReports < 0) {
$ReportIDs = array_column($Reports, 'ID');
$ReportsMessage = Reports::get_reports_messages($ReportIDs);
$Reported = true;
$ReportAdmin = check_perms('admin_reports');
$UploaderID = Torrents::get_torrent($TorrentID)['UserID'];
include(CONFIG['SERVER_ROOT'] . '/classes/reportsv2_type.php');
?>
@@ -50,19 +51,19 @@ include(CONFIG['SERVER_ROOT'] . '/classes/reportsv2_type.php');
<div class="Box-body BoxList">
<div class="BoxBody">
<strong>
<?= $ReportLinks; ?>
<? if ($ReportAdmin) {
?>
<a href="reportsv2.php?view=report&id=<?= $Report['ID'] ?>">
<?= $ReportLinks; ?>
<?= $ReportType['title'] ?>
</a>
<?
} else {
?>
<?= $ReportLinks; ?>
<?= $ReportType['title'] ?>
<?
}
?>
<?= $ReportType['title'] ?>
<?= t('server.torrents.at', ['Values' => [time_diff($Report['ReportedTime'], 2, true, true)]])
?>
</strong>
+62 -19
View File
@@ -130,6 +130,9 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<? } ?>
</ul>
</div>
<?
$hasTorrentItem = false;
?>
<div class="SidebarItemUserCoummunity SidebarItem Box Group-column">
<div class="Box-header">
@@ -142,18 +145,21 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
$ViewCount = check_paranoia_here('requestsfilled_count');
$ViewBounty = check_paranoia_here('requestsfilled_bounty');
if ($ViewCount && !$ViewBounty && !$ViewAll) { ?>
if ($ViewCount && !$ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item isRequestFill" id="requst-fill-value" data-value="<?= $RequestsFilled ?>">
<span><?= t('server.user.requestsfilled') ?>: </span>
<span data-tooltip="<?= empty($RequestRank) ? '' : t('server.user.all_site') . ' ' . number_format($RequestRank) . '%' ?>"><?= number_format($RequestsFilled) ?> </span>
</li>
<? } elseif (!$ViewCount && $ViewBounty && !$ViewAll) { ?>
<? } elseif (!$ViewCount && $ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item">
<span><?= t('server.user.requestsfilled') ?>: </span>
<?= Format::get_size($TotalBounty) ?>
<?= t('server.user.collected') ?>
</li>
<? } elseif ($ViewCount && $ViewBounty && !$ViewAll) { ?>
<? } elseif ($ViewCount && $ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item">
<span><?= t('server.user.requestsfilled') ?>: </span>
<span data-tooltip="<?= empty($RequestRank) ? '' : t('server.user.all_site') . ' ' . number_format($RequestRank) . '%' ?>"><?= number_format($RequestsFilled) ?></span>
@@ -162,7 +168,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<?= Format::get_size($TotalBounty) ?>)
</span>
</li>
<? } elseif ($ViewAll) { ?>
<? } elseif ($ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item">
<span class="<?= ($ViewCount === 2 ? 'paranoia_override' : '') ?>">
<span><?= t('server.user.requestsfilled') ?>: </span>
@@ -184,16 +191,20 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
$ViewCount = check_paranoia_here('requestsvoted_count');
$ViewBounty = check_paranoia_here('requestsvoted_bounty');
if ($ViewCount && !$ViewBounty && !$ViewAll) { ?>
if ($ViewCount && !$ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item"><?= t('server.user.requestscreated') ?>: <?= number_format($RequestsCreated) ?></li>
<li class="SidebarList-item"><?= t('server.user.requestsvoted') ?> <?= number_format($RequestsVoted) ?></li>
<? } elseif (!$ViewCount && $ViewBounty && !$ViewAll) { ?>
<? } elseif (!$ViewCount && $ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item"><?= t('server.user.requestscreated') ?>: <?= Format::get_size($RequestsCreatedSpent) ?> <?= t('server.user.spent') ?></li>
<li class="SidebarList-item"><?= t('server.user.requestsvoted') ?> <span data-tooltip="<?= empty($BountyRank) ? '' : t('server.user.all_site') . ' ' . number_format($BountyRank) . '%' ?>"><?= Format::get_size($TotalSpent) ?></span> <?= t('server.user.spent') ?></li>
<? } elseif ($ViewCount && $ViewBounty && !$ViewAll) { ?>
<? } elseif ($ViewCount && $ViewBounty && !$ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item"><?= t('server.user.requestscreated') ?>: <?= number_format($RequestsCreated) ?> <?= t('server.user.for') ?> <?= Format::get_size($RequestsCreatedSpent) ?></li>
<li class="SidebarList-item"><?= t('server.user.requestsvoted') ?> <?= number_format($RequestsVoted) ?> <?= t('server.user.for') ?><span data-tooltip="<?= empty($BountyRank) ? '' : t('server.user.all_site') . ' ' . number_format($BountyRank) . '%' ?>"> <?= Format::get_size($TotalSpent) ?></span></li>
<? } elseif ($ViewAll) { ?>
<? } elseif ($ViewAll) {
$hasTorrentItem = true ?>
<li class="SidebarList-item">
<span class="<?= ($ViewCount === 2 ? 'paranoia_override' : '') ?>"><?= t('server.user.requestscreated') ?>:
<a href="requests.php?type=created&amp;userid=<?= $UserID ?>" class="brackets<?= ($ViewAll === 2 ? ' paranoia_override' : '') ?>">
@@ -212,7 +223,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</li>
<? } ?>
<?
if ($CanViewUploads || $Override = check_paranoia_here('uploads+')) { ?>
if ($CanViewUploads || $Override = check_paranoia_here('uploads+')) {
$hasTorrentItem = true ?>
<li class="SidebarList-item isUploadCount <?= $OverrideClass ?>" id="upload-count-value" data-value="<?= $Uploads ?>">
<?= t('server.user.comm_upload') ?>:
<a data-tooltip="<?= empty($UploadsRank) ? '' : t('server.user.all_site') . ' ' . number_format($UploadsRank) . '%' ?>" class="brackets <?= $OverrideClass ?>" href="torrents.php?type=uploaded&amp;userid=<?= $UserID ?>">
@@ -234,7 +246,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</li>
<? } ?>
<?
if ($CanViewUploads || $Override = check_paranoia_here('originals+')) { ?>
if ($CanViewUploads || $Override = check_paranoia_here('originals+')) {
$hasTorrentItem = true ?>
<li class="SidebarList-item isOriginalUploadCount <?= $OverrideClass ?>" id="original-upload-count-value" data-value-buy="<?= $OriginalsBuy ?>" data-value-diy="<?= $OriginalsDiy ?>">
<?= t('server.user.comm_originals') ?>:
<span data-tooltip="<?= t('server.user.self_purchase_number') ?>">
@@ -248,6 +261,7 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<?
}
if ($Override = check_paranoia_here('seeding+')) {
$hasTorrentItem = true
?>
<li class="SidebarList-item <?= $OverrideClass ?>">
<?= t('server.user.comm_seeding') ?>:
@@ -280,7 +294,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</li>
<?
}
if ($Override = check_paranoia_here('leeching+')) { ?>
if ($Override = check_paranoia_here('leeching+')) {
$hasTorrentItem = true ?>
<li class="SidebarList-item <?= $OverrideClass ?>">
<?= t('server.user.comm_leeching') ?>:
<span class="user_commstats" id="user_commstats_leeching">
@@ -299,7 +314,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</li>
<?
}
if ($Override = check_paranoia_here('snatched+')) { ?>
if ($Override = check_paranoia_here('snatched+')) {
$hasTorrentItem = true ?>
<li class="SidebarList-item <?= $OverrideClass ?>">
<?= t('server.user.comm_snatched') ?>:
<span class="user_commstats" id="user_commstats_snatched"><a href="#" class="brackets" onclick="commStats(<?= $UserID ?>); return false;"><?= t('server.user.community_show') ?></a></a></span>
@@ -308,14 +324,16 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<?
}
}
if ($Override = check_paranoia_here('snatched')) { ?>
if ($Override = check_paranoia_here('snatched')) {
$hasTorrentItem = true ?>
[<a href="torrents.php?type=snatched&amp;userid=<?= $UserID ?>" class="brackets <?= $OverrideClass ?>"><?= t('server.user.view') ?></a>
<? if (check_perms('zip_downloader')) { ?>
|<a href="torrents.php?action=redownload&amp;type=snatches&amp;userid=<?= $UserID ?>" onclick="return confirm('<?= t('server.user.redownloading_confirm') ?>');" class="brackets"><?= t('server.user.community_dl') ?></a></a>
<? } ?>]
</li>
<? } ?>
<? if (check_perms('site_view_torrent_snatchlist', $Class)) { ?>
<? if (check_perms('site_view_torrent_snatchlist', $Class)) {
$hasTorrentItem = true ?>
<li class="SidebarList-item" id="comm_downloaded">
<?= t('server.user.comm_downloaded') ?>:
<span class="user_commstats" id="user_commstats_downloaded">
@@ -329,9 +347,16 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</a>]
</li>
<? } ?>
<?
if (!$hasTorrentItem) {
?>
<li class="SidebarList-item"><?= t('server.common.no_results') ?></li>
<?
} ?>
</ul>
<?
if ($OwnProfile || check_perms('users_override_paranoia')) { ?>
if ($OwnProfile || check_perms('users_override_paranoia')) {
$hasTorrentItem = true ?>
<?
$DB->query("SELECT xs.uid, xs.tstamp, xs.fid, t.Size FROM xbt_snatched AS xs left join torrents AS t ON t.ID = xs.fid WHERE xs.uid =" . $UserID . " and xs.tstamp >= unix_timestamp(date_format(now(),'%Y-%m-01')) order by 2");
$Requests = $DB->to_array();
@@ -413,13 +438,19 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
}
}
?>
<? } ?>
<?
}
?>
<? if ($LoggedUser['AutoloadCommStats']) { ?>
<script type="text/javascript">
commStats(<?= $UserID ?>);
</script>
<? } ?>
</div>
<?
$hasOther = false;
?>
<div class="SidebarItemUserCoummunity SidebarItem Box Group-column">
<div class="Box-header">
<?= t('server.common.others') ?>
@@ -427,7 +458,9 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<ul class="SidebarList SidebarItem-body Box-body">
<?
if (($Override = check_paranoia_here('collages+')) && CONFIG['ENABLE_COLLAGES']) { ?>
if (($Override = check_paranoia_here('collages+')) && CONFIG['ENABLE_COLLAGES']) {
$hasOther = true;
?>
<li class="SidebarList-item isCollageCreateCount <?= $OverrideClass ?>" id="collage-create-count-value" data-value="<?= $NumCollages ?>">
<span><?= t('server.user.community_collstart') ?>: </span>
<? if ($Override = check_paranoia_here('collages')) { ?>
@@ -440,7 +473,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
</li>
<?
}
if (($Override = check_paranoia_here('collagecontribs+')) && CONFIG['ENABLE_COLLAGES']) { ?>
if (($Override = check_paranoia_here('collagecontribs+')) && CONFIG['ENABLE_COLLAGES']) {
$hasOther = true; ?>
<li class="SidebarList-item isCollageContributeCount <?= $OverrideClass ?>" id="collage-countribute-count-value" data-value="<?= $NumCollageContribs ?>">
<span><?= t('server.user.community_collcontrib') ?>: </span>
<? if ($Override = check_paranoia_here('collagecontribs')) { ?>
@@ -454,7 +488,8 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<? }
?>
<?
if (($Override = check_paranoia_here('artistsadded'))) { ?>
if (($Override = check_paranoia_here('artistsadded'))) {
$hasOther = true; ?>
<li class="SidebarList-item" , id="artists_added">
<span><?= t('server.user.u_artist') ?>: </span>
<span data-tooltip="<?= !empty($ArtistsRank) ? t('server.user.all_site') . ' ' . $ArtistsRank . '%' : '' ?>">
@@ -464,6 +499,7 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<?
}
if ($Override = check_paranoia_here('invitedcount')) {
$hasOther = true;
$DB->query("SELECT COUNT(UserID) FROM users_info WHERE Inviter = '$UserID'");
list($Invited) = $DB->next_record();
?>
@@ -474,6 +510,13 @@ $OverrideClass = $Override === 2 ? 'paranoia_override' : '';
<?
}
?>
<?
if (!$hasOther) {
?>
<li class="SidebarList-item"><?= t('server.common.no_results') ?></li>
<?
}
?>
</ul>
</div>
</div>
+4 -4
View File
@@ -947,11 +947,11 @@ View::show_header($Username, "jquery.imagesloaded,jquery.wookmark,user,bbcode,co
AND t.UserID != '$UserID'
AND g.CategoryID = '1'
AND g.WikiImage != ''
GROUP BY g.ID
GROUP BY t.ID
ORDER BY s.tstamp DESC
LIMIT 5");
$RecentSnatches = $DB->to_array();
$Cache->cache_value("recent_snatches_$UserID", $RecentSnatches, 0); //inf cache
$Cache->cache_value("recent_snatches_$UserID", $RecentSnatches, 86400); //inf cache
}
if (!empty($RecentSnatches)) {
?>
@@ -991,11 +991,11 @@ View::show_header($Username, "jquery.imagesloaded,jquery.wookmark,user,bbcode,co
WHERE t.UserID = '$UserID'
AND g.CategoryID = '1'
AND g.WikiImage != ''
GROUP BY g.ID
GROUP BY t.ID
ORDER BY t.Time DESC
LIMIT 5");
$RecentUploads = $DB->to_array();
$Cache->cache_value("recent_uploads_$UserID", $RecentUploads, 0); //inf cache
$Cache->cache_value("recent_uploads_$UserID", $RecentUploads, 86400); //inf cache
}
if (!empty($RecentUploads)) {
?>
+4
View File
@@ -21,6 +21,10 @@
-webkit-line-clamp: 2;
}
.LongText-text.LongText-line-5 {
-webkit-line-clamp: 5;
}
.LongText .LongText-text::before {
content: '';
height: calc(100% - var(--global-lineHeight));
@@ -100,10 +100,6 @@ Where
background: var(--Box-header-background);
}
.Table:is(.is-inner) :is(.Table-cellHeader, .Table-rowHeader .Table-cell) {
font-weight: bold;
}
.Table :is(.Table-cellHeader, .Table-rowHeader .Table-cell):first-child {
border-top-left-radius: var(--global-borderRadius);
}
@@ -5,7 +5,7 @@
.TorrentView-btn {
font-size: var(--global-fontSize-sm);
margin-left: auto;
color: var(--Button-primary-background);
color: var(--Button-default-color);
background-color: transparent;
border-color: transparent;
cursor: pointer;
+15 -7
View File
@@ -48,6 +48,14 @@ TorrentCover variant="OneLine | FiveGrid"
word-break: break-all;
}
.TorrentCover-item .TorrentCover-title {
width: 160px;
color: var(--TableTorrent-movieInfoTitle-color);
padding-top: var(--global-space-sm);
justify-content: center;
display: flex;
}
.TorrentCover-imageContainer {
width: 160px;
height: 240px;
@@ -60,9 +68,11 @@ TorrentCover variant="OneLine | FiveGrid"
left: 0px;
top: 0px;
z-index: 1000;
width: 24px;
width: 26px;
display: flex;
justify-content: center;
border-bottom-right-radius: var(--global-borderRadius);
border-top-left-radius: var(--global-borderRadius);
}
.TorrentCover-imdbTag {
@@ -78,7 +88,10 @@ TorrentCover variant="OneLine | FiveGrid"
z-index: 1000;
color: var(--TableTorrent-coverTag-color);
background-color: var(--TableTorrent-coverTag-background);
padding: 0 2px;
border-top-left-radius: var(--global-borderRadius);
border-bottom-right-radius: var(--global-borderRadius);
padding-right: 4px;
padding-left: 2px;
font-size: 75%;
}
@media (max-width: 768px) {
@@ -92,8 +105,3 @@ TorrentCover variant="OneLine | FiveGrid"
height: 100%;
border-radius: var(--global-borderRadius);
}
.TorrentCover-item b {
color: var(--TableTorrent-movieInfoTitle-color);
padding-top: var(--global-space-sm);
}
@@ -158,7 +158,7 @@
--Button-default-onHover-color: var(--global-onHover-color-onPrimary);
--Button-default-onHover-boxShadow: var(--Button-default-boxShadow);
--Button-default-onHover-border: var(--Button-default-border);
--Button-primary-background: var(--Header-background);
--Button-primary-background: var(--HeaderAnnounceItem-link-background);
--Button-primary-color: var(--Button-default-color);
--Button-primary-border: var(--Button-default-border);
--Button-primary-boxShadow: var(--Button-default-boxShadow);
+5
View File
@@ -0,0 +1,5 @@
<svg class="icon" fill="currentColor" viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg">
<path
d="M20 3H4c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h16c1.103 0 2-.897 2-2V5c0-1.103-.897-2-2-2zm.001 6c-.001 0-.001 0 0 0h-.466l-2.667-4H20l.001 4zM9.535 9 6.868 5h2.597l2.667 4H9.535zm5 0-2.667-4h2.597l2.667 4h-2.597zM4 5h.465l2.667 4H4V5zm0 14v-8h16l.002 8H4z" />
</svg>

After

Width:  |  Height:  |  Size: 388 B

+4 -4
View File
@@ -664,10 +664,10 @@ server.bonus.upload-3: |-
250GB upload
server.bonus.upload-4: |-
500GB upload
server.bonus.recommend-movie-1: |-
Recommend a movie 1 day
server.bonus.recommend-movie-7: |-
Recommend a movie 7 days
Recommend a movie 7 day
server.bonus.recommend-movie-30: |-
Recommend a movie 30 days
server.bonus.torrent_group_id: |-
Torrent Group ID
server.bonus.you_cannot_afford_this_item: |-
@@ -5452,7 +5452,7 @@ server.torrents.reply: |-
server.torrents.reply_at: |-
reply the report
server.torrents.reply_it_patiently: |-
Please type your explanation to the report here, you can only submit once. Please be patient and objective, this reply can help staff to handle the report better.
Please type your explanation to the report here. Please be patient and objective, this reply can help staff to handle the report better.
server.torrents.report: |-
Report
server.torrents.reported: |-
+2 -2
View File
@@ -444,10 +444,10 @@ server.bonus.upload-3: |-
250GB de subida
server.bonus.upload-4: |-
500GB de subida
server.bonus.recommend-movie-1: |-
Recomendar una película (1)
server.bonus.recommend-movie-7: |-
Recomendar una película (7)
server.bonus.recommend-movie-30: |-
Recomendar una película (30)
server.bonus.torrent_group_id: |-
ID del grupo de torrents
server.bookmarks.dont_notify_new: |-
+4 -4
View File
@@ -663,10 +663,10 @@ server.bonus.upload-3: |-
Upload de 250GB
server.bonus.upload-4: |-
Upload de 500GB
server.bonus.recommend-movie-1: |-
Filmes recomendados 1 dia
server.bonus.recommend-movie-7: |-
Filmes recomendados 7 dias
Filmes recomendados 7 dia
server.bonus.recommend-movie-30: |-
Filmes recomendados 30 dias
server.bonus.torrent_group_id: |-
ID do grupo de sementes
server.bonus.you_cannot_afford_this_item: |-
@@ -5412,7 +5412,7 @@ server.torrents.reply: |-
server.torrents.reply_at: |-
responder a denúncia
server.torrents.reply_it_patiently: |-
Por favor, digite a sua explicação para o relatório aqui, você só pode enviar uma vez. Por favor, seja paciente e objetivo, esta resposta pode ajudar o pessoal a lidar melhor com o relatório.
Por favor, digite a sua explicação para o relatório aqui. Por favor, seja paciente e objetivo, esta resposta pode ajudar o pessoal a lidar melhor com o relatório.
server.torrents.report: |-
Reportar
server.torrents.reported: |-
+4 -6
View File
@@ -650,10 +650,10 @@ server.bonus.upload-3: |-
250GiB 上传量
server.bonus.upload-4: |-
500GiB 上传量
server.bonus.recommend-movie-1: |-
推荐电影 1天
server.bonus.recommend-movie-7: |-
推荐电影 7天
推荐电影 7
server.bonus.recommend-movie-30: |-
推荐电影 30 天
server.bonus.torrent_group_id: |-
种子组ID
server.bonus.you_cannot_afford_this_item: |-
@@ -5363,7 +5363,7 @@ server.torrents.reply: |-
server.torrents.reply_at: |-
回复报告于
server.torrents.reply_it_patiently: |-
请在此填写你针对已有报告想作出的解释和说明,你只能提交一次,请保持礼貌、客观。该说明有助于管理更好地处理该报告。
请在此填写你针对已有报告想作出的解释和说明,请保持礼貌、客观。该说明有助于管理更好地处理该报告。
server.torrents.report: |-
报告
server.torrents.reported: |-
@@ -8339,8 +8339,6 @@ client.stats.uv: |-
日活跃用户数
client.stats.seeding_user: |-
做种的用户数
server.forums.verbal: |-
口头的
server.wiki.created: |-
提交时间
server.wiki.edited: |-