mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-14 20:40:49 +08:00
admin add downloadpos manage
This commit is contained in:
@@ -586,8 +586,9 @@ class TrackerRepository extends BaseRepository
|
||||
return;
|
||||
}
|
||||
$duration = Carbon::now()->diffInSeconds($peer->last_action);
|
||||
$upSpeedMbps = ($dataTraffic['uploaded_increment'] / $duration) * 8;
|
||||
$upSpeedMbps = number_format(($dataTraffic['uploaded_increment'] / $duration / 1024 / 1024) * 8);
|
||||
$notSeedBoxMaxSpeedMbps = Setting::get('seed_box.not_seed_box_max_speed');
|
||||
do_log("upSpeedMbps: $upSpeedMbps, notSeedBoxMaxSpeedMbps: $notSeedBoxMaxSpeedMbps");
|
||||
if ($upSpeedMbps > $notSeedBoxMaxSpeedMbps) {
|
||||
$user->update(['downloadpos' => 'no']);
|
||||
do_log("user: {$user->id} downloading privileges have been disabled! (over speed)", 'error');
|
||||
@@ -708,84 +709,26 @@ class TrackerRepository extends BaseRepository
|
||||
|
||||
private function getDataTraffic(Torrent $torrent, $queries, User $user, Peer $peer, $snatch): array
|
||||
{
|
||||
$log = sprintf(
|
||||
"torrent: %s, user: %s, peer: %s, queriesUploaded: %s, queriesDownloaded: %s",
|
||||
$torrent->id, $user->id, json_encode($peer->only(['uploaded', 'downloaded'])), $queries['uploaded'], $queries['downloaded']
|
||||
);
|
||||
$torrentInfo = $torrent->toArray();
|
||||
$userInfo = $user->toArray();
|
||||
$userInfo['__is_donor'] = $user->isDonating();
|
||||
|
||||
$peerInfo = [];
|
||||
if ($peer->exists) {
|
||||
$realUploaded = max(bcsub($queries['uploaded'], $peer->uploaded), 0);
|
||||
$realDownloaded = max(bcsub($queries['downloaded'], $peer->downloaded), 0);
|
||||
$log .= ", [PEER_EXISTS], realUploaded: $realUploaded, realDownloaded: $realDownloaded";
|
||||
$spStateReal = $torrent->spStateReal;
|
||||
$log .= "[SP_STATE_REAL]: $spStateReal";
|
||||
$promotionInfo = apply_filter('torrent_promotion', $torrent->toArray());
|
||||
do_log("promotionInfo from filter torrent_promotion by torrent: " . $torrent->id . ", get : " . json_encode($promotionInfo));
|
||||
if (isset($promotionInfo['__ignore_global_sp_state']) && $promotionInfo['sp_state'] != $spStateReal) {
|
||||
$spStateReal = $promotionInfo['sp_state'];
|
||||
$log .= "[CHANGE_SP_STATE_REAL_BY_FILTER_TORRENT_PROMOTION]: $spStateReal";
|
||||
}
|
||||
$uploaderRatio = Setting::get('torrent.uploaderdouble');
|
||||
$log .= ", spStateReal: $spStateReal, uploaderRatio: $uploaderRatio";
|
||||
if ($torrent->owner == $user->id) {
|
||||
//uploader, use the bigger one
|
||||
$upRatio = max($uploaderRatio, Torrent::$promotionTypes[$spStateReal]['up_multiplier']);
|
||||
$log .= ", [IS_UPLOADER], upRatio: $upRatio";
|
||||
} else {
|
||||
$upRatio = Torrent::$promotionTypes[$spStateReal]['up_multiplier'];
|
||||
$log .= ", [IS_NOT_UPLOADER], upRatio: $upRatio";
|
||||
}
|
||||
/**
|
||||
* VIP do not calculate downloaded
|
||||
* @since 1.7.13
|
||||
*/
|
||||
if ($user->class == User::CLASS_VIP) {
|
||||
$downRatio = 0;
|
||||
$log .= ", [IS_VIP], downRatio: $downRatio";
|
||||
} else {
|
||||
$downRatio = Torrent::$promotionTypes[$spStateReal]['down_multiplier'];
|
||||
$log .= ", [IS_NOT_VIP], downRatio: $downRatio";
|
||||
}
|
||||
} else {
|
||||
$realUploaded = $queries['uploaded'];
|
||||
$realDownloaded = $queries['downloaded'];
|
||||
/**
|
||||
* If peer not exits, user increment = 0;
|
||||
*/
|
||||
$upRatio = 0;
|
||||
$downRatio = 0;
|
||||
$log .= ", [PEER_NOT_EXISTS], realUploaded: $realUploaded, realDownloaded: $realDownloaded, upRatio: $upRatio, downRatio: $downRatio";
|
||||
}
|
||||
$uploadedIncrementForUser = $realUploaded * $upRatio;
|
||||
$downloadedIncrementForUser = $realDownloaded * $downRatio;
|
||||
|
||||
/**
|
||||
* check seed box rule
|
||||
*/
|
||||
$isSeedBoxRuleEnabled = Setting::get('seed_box.enabled') == 'yes';
|
||||
if ($isSeedBoxRuleEnabled) {
|
||||
$isIPSeedBox = isIPSeedBox($queries['ip'], $user->id);
|
||||
if ($isIPSeedBox) {
|
||||
$uploadedIncrementForUser = $realUploaded;
|
||||
$downloadedIncrementForUser = $realDownloaded;
|
||||
$log .= ", isIPSeedBox, increment for user = real";
|
||||
$maxUploadedTimes = Setting::get('seed_box.max_uploaded');
|
||||
if ($snatch && $snatch->uploaded >= $torrent->size * $maxUploadedTimes) {
|
||||
$log .= ", uploaded >= torrentSize * times($maxUploadedTimes), uploadedIncrementForUser = 0";
|
||||
$uploadedIncrementForUser = 0;
|
||||
}
|
||||
}
|
||||
$peerInfo = $peer->toArray();
|
||||
}
|
||||
|
||||
$result = [
|
||||
'uploaded_increment' => $realUploaded,
|
||||
'uploaded_increment_for_user' => $uploadedIncrementForUser,
|
||||
'downloaded_increment' => $realDownloaded,
|
||||
'downloaded_increment_for_user' => $downloadedIncrementForUser,
|
||||
];
|
||||
do_log("$log, result: " . json_encode($result), 'info');
|
||||
return $result;
|
||||
$snatchInfo = [];
|
||||
if ($snatch instanceof Snatch) {
|
||||
$snatchInfo = $snatch->toArray();
|
||||
}
|
||||
|
||||
$promotionInfo = apply_filter('torrent_promotion', $torrentInfo);
|
||||
|
||||
return \getDataTraffic($torrentInfo, $queries, $userInfo, $peerInfo, $snatchInfo, $promotionInfo);
|
||||
}
|
||||
|
||||
|
||||
private function givePeers($originalPeers, $compact, $noPeerId, int $filterFlag = FILTER_FLAG_IPV4): string|array
|
||||
{
|
||||
$peers = [];
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Exceptions\InsufficientPermissionException;
|
||||
use App\Exceptions\NexusException;
|
||||
use App\Http\Resources\ExamUserResource;
|
||||
use App\Http\Resources\UserResource;
|
||||
@@ -134,9 +135,7 @@ class UserRepository extends BaseRepository
|
||||
throw new \InvalidArgumentException("password confirmation != password");
|
||||
}
|
||||
$user = User::query()->findOrFail($id, ['id', 'username', 'class']);
|
||||
if (Auth::user()->class <= $user->class) {
|
||||
throw new \LogicException("Sorry, you don't have enough permission to reset this user's password.");
|
||||
}
|
||||
$this->checkPermission(Auth::user(), $user);
|
||||
$secret = mksecret();
|
||||
$passhash = md5($secret . $password . $secret);
|
||||
$update = [
|
||||
@@ -162,9 +161,7 @@ class UserRepository extends BaseRepository
|
||||
if ($targetUser->enabled == User::ENABLED_NO) {
|
||||
throw new NexusException('Already disabled !');
|
||||
}
|
||||
if ($operator->class <= $targetUser->class) {
|
||||
throw new NexusException('No Permission !');
|
||||
}
|
||||
$this->checkPermission($operator, $targetUser);
|
||||
$banLog = [
|
||||
'uid' => $uid,
|
||||
'username' => $targetUser->username,
|
||||
@@ -186,9 +183,7 @@ class UserRepository extends BaseRepository
|
||||
if ($targetUser->enabled == User::ENABLED_YES) {
|
||||
throw new NexusException('Already enabled !');
|
||||
}
|
||||
if ($operator->class <= $targetUser->class) {
|
||||
throw new NexusException('No Permission !');
|
||||
}
|
||||
$this->checkPermission($operator, $targetUser);
|
||||
$update = [
|
||||
'enabled' => User::ENABLED_YES
|
||||
];
|
||||
@@ -233,9 +228,7 @@ class UserRepository extends BaseRepository
|
||||
}
|
||||
$sourceField = $fieldMap[$field];
|
||||
$targetUser = User::query()->findOrFail($uid, User::$commonFields);
|
||||
if (Auth::user()->class <= $targetUser->class) {
|
||||
throw new NexusException("No permission !");
|
||||
}
|
||||
$this->checkPermission($operator, $targetUser);
|
||||
$old = $targetUser->{$sourceField};
|
||||
$valueAtomic = $value;
|
||||
$formatSize = false;
|
||||
@@ -301,12 +294,10 @@ class UserRepository extends BaseRepository
|
||||
|
||||
public function removeLeechWarn($operator, $uid): bool
|
||||
{
|
||||
$operator = $this->getOperator($operator);
|
||||
$operator = $this->getUser($operator);
|
||||
$classRequire = Setting::get('authority.prfmanage');
|
||||
if ($operator->class <= $classRequire) {
|
||||
throw new \RuntimeException("No permission.");
|
||||
}
|
||||
$user = User::query()->findOrFail($uid, User::$commonFields);
|
||||
$this->checkPermission($operator, $user);
|
||||
NexusDB::cache_del('user_'.$uid.'_content');
|
||||
$user->leechwarn = 'no';
|
||||
$user->leechwarnuntil = null;
|
||||
@@ -315,24 +306,50 @@ class UserRepository extends BaseRepository
|
||||
|
||||
public function removeTwoStepAuthentication($operator, $uid): bool
|
||||
{
|
||||
$operator = $this->getOperator($operator);
|
||||
if (!$operator->canAccessAdmin()) {
|
||||
throw new \RuntimeException("No permission.");
|
||||
}
|
||||
$user = User::query()->findOrFail($uid, User::$commonFields);
|
||||
if ($operator->class <= $user->class) {
|
||||
throw new \RuntimeException("No permission!");
|
||||
}
|
||||
$this->checkPermission($operator, $user);
|
||||
$user->two_step_secret = '';
|
||||
return $user->save();
|
||||
}
|
||||
|
||||
private function getOperator($operator)
|
||||
|
||||
public function toggleDownloadPrivileges($operator, $id)
|
||||
{
|
||||
if (!$operator instanceof User) {
|
||||
$operator = User::query()->findOrFail(intval($operator), User::$commonFields);
|
||||
$targetUser = User::query()->findOrFail($id, User::$commonFields);
|
||||
$operator = $this->getUser($operator);
|
||||
$this->checkPermission($operator, $targetUser);
|
||||
$message = [
|
||||
'added' => now(),
|
||||
'receiver' => $targetUser->id,
|
||||
];
|
||||
if ($targetUser->downloadpos == 'yes') {
|
||||
$update = ['downloadpos' => 'no'];
|
||||
$modComment = date('Y-m-d') . " - Download disable by " . $operator->username;
|
||||
$message['subject'] = nexus_trans('message.download_disable.subject', [], $targetUser->locale);
|
||||
$message['msg'] = nexus_trans('message.download_disable.body', ['operator' => $operator->username], $targetUser->locale);
|
||||
} else {
|
||||
$update = ['downloadpos' => 'yes'];
|
||||
$modComment = date('Y-m-d') . " - Download enable by " . $operator->username;
|
||||
$message['subject'] = nexus_trans('message.download_enable.subject', [], $targetUser->locale);
|
||||
$message['msg'] = nexus_trans('message.download_enable.body', ['operator' => $operator->username], $targetUser->locale);
|
||||
}
|
||||
return NexusDB::transaction(function () use ($targetUser, $update, $modComment, $message) {
|
||||
Message::add($message);
|
||||
return $targetUser->updateWithModComment($update, $modComment);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private function checkPermission($operator, User $user, $minAuthClass = 'authority.prfmanage')
|
||||
{
|
||||
$operator = $this->getUser($operator);
|
||||
$classRequire = Setting::get($minAuthClass);
|
||||
if ($operator->class < $classRequire || $operator->class <= $user->class) {
|
||||
throw new InsufficientPermissionException();
|
||||
}
|
||||
return $operator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user