peer add ipv6

This commit is contained in:
xiaomlove
2022-04-21 16:14:08 +08:00
parent 541f0eb46f
commit 06cb452fdd
11 changed files with 182 additions and 90 deletions
+1
View File
@@ -11,6 +11,7 @@ class Peer extends NexusModel
protected $fillable = [ protected $fillable = [
'torrent', 'peer_id', 'ip', 'port', 'uploaded', 'downloaded', 'to_go', 'seeder', 'started', 'last_action', 'torrent', 'peer_id', 'ip', 'port', 'uploaded', 'downloaded', 'to_go', 'seeder', 'started', 'last_action',
'prev_action', 'connectable', 'userid', 'agent', 'finishedat', 'downloadoffset', 'uploadedoffset', 'passkey', 'prev_action', 'connectable', 'userid', 'agent', 'finishedat', 'downloadoffset', 'uploadedoffset', 'passkey',
'ipv4', 'ipv6',
]; ];
const CONNECTABLE_YES = 'yes'; const CONNECTABLE_YES = 'yes';
+93 -55
View File
@@ -68,6 +68,7 @@ class TrackerRepository extends BaseRepository
$clientAllow = $this->checkClient($request); $clientAllow = $this->checkClient($request);
$torrent = $this->checkTorrent($queries, $user); $torrent = $this->checkTorrent($queries, $user);
$isReAnnounce = $this->isReAnnounce($request); $isReAnnounce = $this->isReAnnounce($request);
do_log("[IS_RE_ANNOUNCE] $isReAnnounce");
if ($isReAnnounce < self::ANNOUNCE_DUPLICATE) { if ($isReAnnounce < self::ANNOUNCE_DUPLICATE) {
/** @var Peer $peerSelf */ /** @var Peer $peerSelf */
$peerSelf = $this->checkMinInterval($torrent, $queries, $user); $peerSelf = $this->checkMinInterval($torrent, $queries, $user);
@@ -99,7 +100,9 @@ class TrackerRepository extends BaseRepository
* Note: Must update peer first, otherwise updateTorrent() count peer not correct * Note: Must update peer first, otherwise updateTorrent() count peer not correct
* Update: Will not change $peerSelf any more * Update: Will not change $peerSelf any more
*/ */
if ($isReAnnounce == self::ANNOUNCE_FIRST || ($isReAnnounce == self::ANNOUNCE_DUPLICATE && $queries['event'] !== 'stopped')) {
$this->updatePeer($peerSelf, $queries); $this->updatePeer($peerSelf, $queries);
}
if ($isReAnnounce === self::ANNOUNCE_FIRST) { if ($isReAnnounce === self::ANNOUNCE_FIRST) {
$withPeers = true; $withPeers = true;
@@ -293,7 +296,25 @@ class TrackerRepository extends BaseRepository
} }
// Part.4 Get User Ip Address // Part.4 Get User Ip Address
$queries['ip'] = nexus()->getRequestIp(); $ip = nexus()->getRequestIp();
$ipv4 = $ipv6 = '';
$ipv4Temp = $request->query->get('ipv4', '');
$ipv6Temp = $request->query->get('ipv6', '');
//use the real ip first, ip from parameter second
if (isIPV4($ip)) {
$ipv4 = $ip;
} elseif (isIPV4($ipv4Temp)) {
$ipv4 = $ipv4Temp;
}
if (isIPV6($ip)) {
$ipv6 = $ip;
} elseif (isIPV6($ipv6Temp)) {
$ipv6 = $ipv6Temp;
}
$queries['ip'] = $ip;
$queries['ipv4'] = $ipv4;
$queries['ipv6'] = $ipv6;
// Part.5 Get Users Agent // Part.5 Get Users Agent
$queries['user_agent'] = $request->headers->get('user-agent'); $queries['user_agent'] = $request->headers->get('user-agent');
@@ -445,8 +466,6 @@ class TrackerRepository extends BaseRepository
$peer = Peer::query() $peer = Peer::query()
->where('torrent', $torrent->id) ->where('torrent', $torrent->id)
->where('peer_id', $queries['peer_id']) ->where('peer_id', $queries['peer_id'])
->groupBy('peer_id')
->selectRaw("*, group_concat(id order by id) as ids, group_concat(ip order by id) as ips")
->first(); ->first();
if ($peer) { if ($peer) {
@@ -596,7 +615,7 @@ class TrackerRepository extends BaseRepository
if (\strtolower($queries['event']) !== 'stopped' && $withPeers) { if (\strtolower($queries['event']) !== 'stopped' && $withPeers) {
$limit = ($queries['numwant'] <= self::MAX_PEER_NUM_WANT ? $queries['numwant'] : self::MAX_PEER_NUM_WANT); $limit = ($queries['numwant'] <= self::MAX_PEER_NUM_WANT ? $queries['numwant'] : self::MAX_PEER_NUM_WANT);
$baseQuery = Peer::query() $baseQuery = Peer::query()
->select(['peer_id', 'ip', 'port']) ->select(['peer_id', 'ip', 'port', 'ipv4', 'ipv6'])
->where('torrent', $torrent->id) ->where('torrent', $torrent->id)
->where('userid', '!=', $user->id) ->where('userid', '!=', $user->id)
->limit($limit) ->limit($limit)
@@ -689,17 +708,26 @@ class TrackerRepository extends BaseRepository
return $result; return $result;
} }
private function givePeers($peers, $compact, $noPeerId, int $filterFlag = FILTER_FLAG_IPV4): string|array private function givePeers($originalPeers, $compact, $noPeerId, int $filterFlag = FILTER_FLAG_IPV4): string|array
{ {
if ($compact) { $peers = [];
$pcomp = ''; foreach ($originalPeers as $value) {
foreach ($peers as $p) { $ipKey = $filterFlag == FILTER_FLAG_IPV4 ? 'ipv4' : 'ipv6';
if (isset($p['ip'], $p['port']) && \filter_var($p['ip'], FILTER_VALIDATE_IP, $filterFlag)) { if (!empty($value[$ipKey]) && filter_var($value[$ipKey], FILTER_VALIDATE_IP, $filterFlag)) {
$pcomp .= \inet_pton($p['ip']); $peers[] = [
$pcomp .= \pack('n', (int) $p['port']); 'peer_id' => $value['peer_id'],
'ip' => $value[$ipKey],
'port' => $value['port']
];
} }
} }
if ($compact) {
$pcomp = '';
foreach ($peers as $p) {
$pcomp .= \inet_pton($p['ip']);
$pcomp .= \pack('n', (int) $p['port']);
}
return $pcomp; return $pcomp;
} }
@@ -745,27 +773,15 @@ class TrackerRepository extends BaseRepository
do_log("no event, return", 'debug'); do_log("no event, return", 'debug');
return; return;
} }
$seederResult = Peer::query() $torrentId = $torrent->id;
->where('torrent', $torrent->id) $torrent->seeders = count_peer("torrent = $torrentId and to_go = 0");
->where('to_go', '=',0) $torrent->leechers = count_peer("torrent = $torrentId and to_go > 0");
->selectRaw("count(distinct(peer_id)) as counts")
->first();
$torrent->seeders = $seederResult ? $seederResult->counts : 0;
$leecherResult = Peer::query()
->where('torrent', $torrent->id)
->where('to_go', '>', 0)
->selectRaw("count(distinct(peer_id)) as counts")
->first();
$torrent->leechers = $leecherResult ? $leecherResult->counts : 0;
$torrent->visible = Torrent::VISIBLE_YES; $torrent->visible = Torrent::VISIBLE_YES;
$torrent->last_action = Carbon::now(); $torrent->last_action = Carbon::now();
if ($isPeerExists && $queries['event'] == 'completed') { if ($isPeerExists && $queries['event'] == 'completed') {
$torrent->times_completed = DB::raw("times_completed + 1"); $torrent->times_completed = DB::raw("times_completed + 1");
} }
$torrent->save(); $torrent->save();
do_log(last_query()); do_log(last_query());
} }
@@ -790,6 +806,12 @@ class TrackerRepository extends BaseRepository
'agent' => $queries['user_agent'], 'agent' => $queries['user_agent'],
'connectable' => $this->getConnectable($queries['ip'], $queries['port'], $queries['user_agent']) 'connectable' => $this->getConnectable($queries['ip'], $queries['port'], $queries['user_agent'])
]; ];
if (!empty($queries['ipv4'])) {
$update['ipv4'] = $queries['ipv4'];
}
if (!empty($queries['ipv6'])) {
$update['ipv6'] = $queries['ipv6'];
}
if ($peer->exists) { if ($peer->exists) {
$update['prev_action'] = $peer->last_action; $update['prev_action'] = $peer->last_action;
@@ -809,36 +831,47 @@ class TrackerRepository extends BaseRepository
$update['uploaded'] = $queries['uploaded']; $update['uploaded'] = $queries['uploaded'];
$update['downloaded'] = $queries['downloaded']; $update['downloaded'] = $queries['downloaded'];
$idArr = explode(',', $peer->ids); $logData = json_encode(Arr::except($update, ['peer_id']));
$ipArr = explode(',', $peer->ips);
$logPrefix = "update: " . json_encode($update);
$doUpdate = false;
if ($peer->exists) { if ($peer->exists) {
$logPrefix .= ", [EXISTS]";
foreach ($idArr as $key => $id) {
$ip = $ipArr[$key];
if (isIPV4($ip) && isIPV4($queries['ip'])) {
$update['ip'] = DB::raw("if(id = $id,'$ip', ip)");
$doUpdate = true;
$logPrefix .= ", v4, id = $id";
} elseif (isIPV6($ip) && isIPV6($queries['ip'])) {
$update['ip'] = DB::raw("if(id = $id,'$ip', ip)");
$doUpdate = true;
$logPrefix .= ", v6, id = $id";
}
}
if ($doUpdate) {
$affected = Peer::query()->where('torrent', $peer->torrent)->where('peer_id', $queries['peer_id'])->update($update); $affected = Peer::query()->where('torrent', $peer->torrent)->where('peer_id', $queries['peer_id'])->update($update);
do_log("$logPrefix, [UPDATE], affected: $affected"); do_log("[UPDATE], affected: $affected, data: $logData");
} else { } else {
Peer::query()->insert($update); Peer::query()->insert($update);
do_log("$logPrefix, [INSERT]"); do_log("[INSERT], data: $logData");
}
} else {
$logPrefix .= ", [NOT_EXISTS]";
Peer::query()->insert($update);
do_log("$logPrefix, [INSERT]");
} }
// $idArr = explode(',', $peer->ids);
// $ipArr = explode(',', $peer->ips);
// $logPrefix = "update: " . json_encode($update);
// $doUpdate = false;
// if ($peer->exists) {
// $logPrefix .= ", [EXISTS]";
// foreach ($idArr as $key => $id) {
// $ip = $ipArr[$key];
// if (isIPV4($ip) && isIPV4($queries['ip'])) {
// $update['ip'] = DB::raw("if(id = $id,'$ip', ip)");
// $doUpdate = true;
// $logPrefix .= ", v4, id = $id";
// } elseif (isIPV6($ip) && isIPV6($queries['ip'])) {
// $update['ip'] = DB::raw("if(id = $id,'$ip', ip)");
// $doUpdate = true;
// $logPrefix .= ", v6, id = $id";
// }
// }
// if ($doUpdate) {
// $affected = Peer::query()->where('torrent', $peer->torrent)->where('peer_id', $queries['peer_id'])->update($update);
// do_log("$logPrefix, [UPDATE], affected: $affected");
// } else {
// Peer::query()->insert($update);
// do_log("$logPrefix, [INSERT]");
// }
// } else {
// $logPrefix .= ", [NOT_EXISTS]";
// Peer::query()->insert($update);
// do_log("$logPrefix, [INSERT]");
// }
} }
private function getConnectable($ip, $port, $agent) private function getConnectable($ip, $port, $agent)
@@ -913,7 +946,7 @@ class TrackerRepository extends BaseRepository
$snatch->last_action = $nowStr; $snatch->last_action = $nowStr;
$snatch->save(); $snatch->save();
do_log(last_query()); do_log(last_query(), 'alert');
return $snatch; return $snatch;
} }
@@ -1035,11 +1068,16 @@ class TrackerRepository extends BaseRepository
private function updateUser(User $user) private function updateUser(User $user)
{ {
$log = "update: " . json_encode($this->userUpdates);
if (count($this->userUpdates) === 0) { if (count($this->userUpdates) === 0) {
return; $log .= ", no update...";
} else {
$user->fill($this->userUpdates);
$log .= ", dirty: " . json_encode($user->getDirty());
$user->save();
$log .= ", query: " . last_query();
} }
$user->save($this->userUpdates); do_log($log, 'alert');
do_log(last_query());
} }
} }
+4 -17
View File
@@ -19,21 +19,12 @@ class class_cache_redis {
public $redis; public $redis;
function __construct() { function __construct() {
$success = $this->connect(); // Connect to Redis $this->connect(); // Connect to Redis
if ($success) {
$this->isEnabled = 1;
} else {
do_log("Redis is disabled!");
$this->isEnabled = 0;
}
} }
private function connect() private function connect()
{ {
$config = nexus_config('nexus.redis'); $config = nexus_config('nexus.redis');
if (empty($config['host'])) {
return false;
}
$redis = new Redis(); $redis = new Redis();
$params = [ $params = [
$config['host'], $config['host'],
@@ -45,21 +36,17 @@ class class_cache_redis {
$params[] = $config['timeout']; $params[] = $config['timeout'];
} }
$connectResult = $redis->connect(...$params); $connectResult = $redis->connect(...$params);
$auth = [];
if (!empty($config['password'])) { if (!empty($config['password'])) {
$auth['pass'] = $config['password']; $connectResult = $connectResult && $redis->auth($config['password']);
if (!empty($config['username'])) {
$auth['user'] = $config['username'];
}
$connectResult = $connectResult && $redis->auth($auth);
} }
if ($connectResult) { if ($connectResult) {
$this->redis = $redis; $this->redis = $redis;
if (is_numeric($config['database'])) { if (is_numeric($config['database'])) {
$redis->select($config['database']); $redis->select($config['database']);
} }
} else {
throw new \RuntimeException("Redis connect fail.");
} }
return $connectResult;
} }
function getIsEnabled() { function getIsEnabled() {
+1
View File
@@ -20,6 +20,7 @@ return [
'host' => nexus_env('REDIS_HOST', '127.0.0.1'), 'host' => nexus_env('REDIS_HOST', '127.0.0.1'),
'port' => nexus_env('REDIS_PORT', 6379), 'port' => nexus_env('REDIS_PORT', 6379),
'database' => nexus_env('REDIS_DB', 0), 'database' => nexus_env('REDIS_DB', 0),
'password' => nexus_env('REDIS_PASSWORD'),
], ],
'elasticsearch' => [ 'elasticsearch' => [
@@ -36,7 +36,7 @@ class CreatePeersTable extends Migration
$table->unsignedBigInteger('downloadoffset')->default(0); $table->unsignedBigInteger('downloadoffset')->default(0);
$table->unsignedBigInteger('uploadoffset')->default(0); $table->unsignedBigInteger('uploadoffset')->default(0);
$table->char('passkey', 32)->default(''); $table->char('passkey', 32)->default('');
$table->unique(['torrent', 'peer_id', 'ip']); $table->unique(['torrent', 'peer_id']);
}); });
} }
@@ -28,7 +28,7 @@ return new class extends Migration
} }
Schema::table($tableName, function (Blueprint $table) { Schema::table($tableName, function (Blueprint $table) {
$table->unique(['torrent', 'peer_id', 'ip']); $table->unique(['torrent', 'peer_id']);
$table->index('peer_id'); $table->index('peer_id');
}); });
} }
@@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('peers', function (Blueprint $table) {
if (!Schema::hasColumn('peers', 'ipv4')) {
$table->string('ipv4', 64)->default('');
}
if (!Schema::hasColumn('peers', 'ipv6')) {
$table->string('ipv6', 64)->default('');
}
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('peers', function (Blueprint $table) {
$table->dropColumn(['ipv4', 'ipv6']);
});
}
};
+13
View File
@@ -470,10 +470,14 @@ function get_user_class_name($class, $compact = false, $b_colored = false, $I18N
global $SITENAME; global $SITENAME;
static $en_lang_functions; static $en_lang_functions;
static $current_user_lang_functions; static $current_user_lang_functions;
static $settingAccount;
if (!$en_lang_functions) { if (!$en_lang_functions) {
require(get_langfile_path("functions.php",false,"en")); require(get_langfile_path("functions.php",false,"en"));
$en_lang_functions = $lang_functions; $en_lang_functions = $lang_functions;
} }
if (!$settingAccount) {
$settingAccount = get_setting('account');
}
if(!$I18N) { if(!$I18N) {
$this_lang_functions = $en_lang_functions; $this_lang_functions = $en_lang_functions;
@@ -506,6 +510,12 @@ function get_user_class_name($class, $compact = false, $b_colored = false, $I18N
case UC_SYSOP: {$class_name = $this_lang_functions['text_sysops']; break;} case UC_SYSOP: {$class_name = $this_lang_functions['text_sysops']; break;}
case UC_STAFFLEADER: {$class_name = $this_lang_functions['text_staff_leader']; break;} case UC_STAFFLEADER: {$class_name = $this_lang_functions['text_staff_leader']; break;}
} }
if ($class < UC_VIP) {
$alias = trim($settingAccount["{$class}_alias"]);
if (!empty($alias)) {
$class_name = sprintf('%s(%s)', $class_name, $alias);
}
}
switch ($class) switch ($class)
{ {
@@ -5393,6 +5403,9 @@ function get_ip_location_from_geoip($ip)
$locale = $langMap[$lang] ?? $lang; $locale = $langMap[$lang] ?? $lang;
$result = []; $result = [];
foreach (explode(',', $ip) as $__ip) { foreach (explode(',', $ip) as $__ip) {
if (empty($__ip)) {
continue;
}
$locationInfo = \Nexus\Database\NexusDB::remember("locations_{$__ip}", 3600, function () use ($locale, $__ip, $reader) { $locationInfo = \Nexus\Database\NexusDB::remember("locations_{$__ip}", 3600, function () use ($locale, $__ip, $reader) {
$info = [ $info = [
'ip' => $__ip, 'ip' => $__ip,
+3
View File
@@ -739,6 +739,9 @@ $lang_settings = array
'row_site_language_enabled' => '站点启用语言', 'row_site_language_enabled' => '站点启用语言',
'text_site_language_enabled_note' => '选择站点启用的语言', 'text_site_language_enabled_note' => '选择站点启用的语言',
'keep_at_least_one' => '至少保留一个', 'keep_at_least_one' => '至少保留一个',
'text_alias' => '等级别名:',
'row_default_user_one' => '默认为',
'row_default_user_two' => '',
); );
?> ?>
+24 -12
View File
@@ -119,15 +119,16 @@ elseif ($action == 'savesettings_account') // save account
$validConfig = array( $validConfig = array(
'neverdelete', 'neverdeletepacked', 'deletepacked', 'deleteunpacked', 'deletenotransfer', 'deletenotransfertwo', 'deletepeasant', 'neverdelete', 'neverdeletepacked', 'deletepacked', 'deleteunpacked', 'deletenotransfer', 'deletenotransfertwo', 'deletepeasant',
'psdlone', 'psratioone', 'psdltwo', 'psratiotwo', 'psdlthree', 'psratiothree', 'psdlfour', 'psratiofour', 'psdlfive', 'psratiofive', 'psdlone', 'psratioone', 'psdltwo', 'psratiotwo', 'psdlthree', 'psratiothree', 'psdlfour', 'psratiofour', 'psdlfive', 'psratiofive', \App\Models\User::CLASS_PEASANT . '_alias',
'putime', 'pudl', \App\Models\User::CLASS_POWER_USER . '_min_seed_points', 'puprratio', 'puderatio', \App\Models\User::CLASS_USER . '_alias',
'eutime', 'eudl', \App\Models\User::CLASS_ELITE_USER . '_min_seed_points', 'euprratio', 'euderatio', 'putime', 'pudl', \App\Models\User::CLASS_POWER_USER . '_min_seed_points', 'puprratio', 'puderatio', \App\Models\User::CLASS_POWER_USER . '_alias',
'cutime', 'cudl', \App\Models\User::CLASS_CRAZY_USER . '_min_seed_points', 'cuprratio', 'cuderatio', 'eutime', 'eudl', \App\Models\User::CLASS_ELITE_USER . '_min_seed_points', 'euprratio', 'euderatio', \App\Models\User::CLASS_ELITE_USER . '_alias',
'iutime', 'iudl', \App\Models\User::CLASS_INSANE_USER . '_min_seed_points', 'iuprratio', 'iuderatio', 'cutime', 'cudl', \App\Models\User::CLASS_CRAZY_USER . '_min_seed_points', 'cuprratio', 'cuderatio', \App\Models\User::CLASS_CRAZY_USER . '_alias',
'vutime', 'vudl', \App\Models\User::CLASS_VETERAN_USER . '_min_seed_points', 'vuprratio', 'vuderatio', 'iutime', 'iudl', \App\Models\User::CLASS_INSANE_USER . '_min_seed_points', 'iuprratio', 'iuderatio', \App\Models\User::CLASS_INSANE_USER . '_alias',
'exutime', 'exudl', \App\Models\User::CLASS_EXTREME_USER . '_min_seed_points', 'exuprratio', 'exuderatio', 'vutime', 'vudl', \App\Models\User::CLASS_VETERAN_USER . '_min_seed_points', 'vuprratio', 'vuderatio', \App\Models\User::CLASS_VETERAN_USER . '_alias',
'uutime', 'uudl', \App\Models\User::CLASS_ULTIMATE_USER . '_min_seed_points', 'uuprratio', 'uuderatio', 'exutime', 'exudl', \App\Models\User::CLASS_EXTREME_USER . '_min_seed_points', 'exuprratio', 'exuderatio', \App\Models\User::CLASS_EXTREME_USER . '_alias',
'nmtime', 'nmdl', \App\Models\User::CLASS_NEXUS_MASTER . '_min_seed_points', 'nmprratio', 'nmderatio', 'uutime', 'uudl', \App\Models\User::CLASS_ULTIMATE_USER . '_min_seed_points', 'uuprratio', 'uuderatio', \App\Models\User::CLASS_ULTIMATE_USER . '_alias',
'nmtime', 'nmdl', \App\Models\User::CLASS_NEXUS_MASTER . '_min_seed_points', 'nmprratio', 'nmderatio', \App\Models\User::CLASS_NEXUS_MASTER . '_alias',
'getInvitesByPromotion' 'getInvitesByPromotion'
); );
GetVar($validConfig); GetVar($validConfig);
@@ -138,6 +139,7 @@ elseif ($action == 'savesettings_account') // save account
saveSetting('account', $ACCOUNT); saveSetting('account', $ACCOUNT);
$actiontime = date("F j, Y, g:i a"); $actiontime = date("F j, Y, g:i a");
write_log("Tracker account settings updated by {$CURUSER['username']}. $actiontime",'mod'); write_log("Tracker account settings updated by {$CURUSER['username']}. $actiontime",'mod');
\Nexus\Database\NexusDB::cache_del('stats_classes');
go_back(); go_back();
} }
elseif($action == 'savesettings_torrent') // save account elseif($action == 'savesettings_torrent') // save account
@@ -583,14 +585,22 @@ elseif ($action == 'accountsettings'){
tr($lang_settings['row_delete_no_transfer'],$lang_settings['text_delete_transfer_note_one']."<input type='text' style=\"width: 50px\" name=deletenotransfer value='".(isset($ACCOUNT["deletenotransfer"]) ? $ACCOUNT["deletenotransfer"] : 60 )."'>".$lang_settings['text_delete_transfer_note_two']."<input type='text' style=\"width: 50px\" name=deletenotransfertwo value='".(isset($ACCOUNT["deletenotransfertwo"]) ? $ACCOUNT["deletenotransfertwo"] : 0 )."'>".$lang_settings['text_delete_transfer_note_three'], 1); tr($lang_settings['row_delete_no_transfer'],$lang_settings['text_delete_transfer_note_one']."<input type='text' style=\"width: 50px\" name=deletenotransfer value='".(isset($ACCOUNT["deletenotransfer"]) ? $ACCOUNT["deletenotransfer"] : 60 )."'>".$lang_settings['text_delete_transfer_note_two']."<input type='text' style=\"width: 50px\" name=deletenotransfertwo value='".(isset($ACCOUNT["deletenotransfertwo"]) ? $ACCOUNT["deletenotransfertwo"] : 0 )."'>".$lang_settings['text_delete_transfer_note_three'], 1);
print("<tr><td colspan=2 align=center><b>".$lang_settings['text_user_promotion_demotion']."</b></td></tr>"); print("<tr><td colspan=2 align=center><b>".$lang_settings['text_user_promotion_demotion']."</b></td></tr>");
tr($lang_settings['row_ban_peasant_one'].get_user_class_name(UC_PEASANT,false,false,true).$lang_settings['row_ban_peasant_two'],get_user_class_name(UC_PEASANT,false,true,true).$lang_settings['text_ban_peasant_note_one']."<input type='text' style=\"width: 50px\" name=deletepeasant value='".(isset($ACCOUNT["deletepeasant"]) ? $ACCOUNT["deletepeasant"] : 30 )."'>".$lang_settings['text_ban_peasant_note_two'], 1); tr($lang_settings['row_ban_peasant_one'].get_user_class_name(UC_PEASANT,false,false,true).$lang_settings['row_ban_peasant_two'],get_user_class_name(UC_PEASANT,false,true,true).$lang_settings['text_ban_peasant_note_one']."<input type='text' style=\"width: 50px\" name=deletepeasant value='".(isset($ACCOUNT["deletepeasant"]) ? $ACCOUNT["deletepeasant"] : 30 )."'>".$lang_settings['text_ban_peasant_note_two'], 1);
tr($lang_settings['row_demoted_to_peasant_one'].get_user_class_name(UC_PEASANT,false,false,true).$lang_settings['row_demoted_to_peasant_two'],$lang_settings['text_demoted_peasant_note_one'].get_user_class_name(UC_PEASANT,false,true,true).$lang_settings['text_demoted_peasant_note_two']."<br /><ul> $inputAlias = "0_alias";
tr($lang_settings['row_demoted_to_peasant_one'].get_user_class_name(UC_PEASANT,false,false,true).$lang_settings['row_demoted_to_peasant_two'],
$lang_settings['text_alias'] . "<input type='text' style=\"width: 60px\" name='".$inputAlias."' value='".(isset($ACCOUNT[$inputAlias]) ? $ACCOUNT[$inputAlias] : '' )."'><br/>"
.$lang_settings['text_demoted_peasant_note_one'].get_user_class_name(UC_PEASANT,false,true,true).$lang_settings['text_demoted_peasant_note_two']."<br /><ul>
<li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlone value='".(isset($ACCOUNT["psdlone"]) ? $ACCOUNT["psdlone"] : 50 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratioone value='".(isset($ACCOUNT["psratioone"]) ? $ACCOUNT["psratioone"] : 0.4 )."'>".$lang_settings['text_demote_peasant_default_one']."</li> <li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlone value='".(isset($ACCOUNT["psdlone"]) ? $ACCOUNT["psdlone"] : 50 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratioone value='".(isset($ACCOUNT["psratioone"]) ? $ACCOUNT["psratioone"] : 0.4 )."'>".$lang_settings['text_demote_peasant_default_one']."</li>
<li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdltwo value='".(isset($ACCOUNT["psdltwo"]) ? $ACCOUNT["psdltwo"] : 100 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiotwo value='".(isset($ACCOUNT["psratiotwo"]) ? $ACCOUNT["psratiotwo"] : 0.5 )."'>".$lang_settings['text_demote_peasant_default_two']."</li> <li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdltwo value='".(isset($ACCOUNT["psdltwo"]) ? $ACCOUNT["psdltwo"] : 100 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiotwo value='".(isset($ACCOUNT["psratiotwo"]) ? $ACCOUNT["psratiotwo"] : 0.5 )."'>".$lang_settings['text_demote_peasant_default_two']."</li>
<li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlthree value='".(isset($ACCOUNT["psdlthree"]) ? $ACCOUNT["psdlthree"] : 200 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiothree value='".(isset($ACCOUNT["psratiothree"]) ? $ACCOUNT["psratiothree"] : 0.6 )."'>".$lang_settings['text_demote_peasant_default_three']."</li> <li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlthree value='".(isset($ACCOUNT["psdlthree"]) ? $ACCOUNT["psdlthree"] : 200 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiothree value='".(isset($ACCOUNT["psratiothree"]) ? $ACCOUNT["psratiothree"] : 0.6 )."'>".$lang_settings['text_demote_peasant_default_three']."</li>
<li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlfour value='".(isset($ACCOUNT["psdlfour"]) ? $ACCOUNT["psdlfour"] : 400 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiofour value='".(isset($ACCOUNT["psratiofour"]) ? $ACCOUNT["psratiofour"] : 0.7 )."'>".$lang_settings['text_demote_peasant_default_four']."</li> <li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlfour value='".(isset($ACCOUNT["psdlfour"]) ? $ACCOUNT["psdlfour"] : 400 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiofour value='".(isset($ACCOUNT["psratiofour"]) ? $ACCOUNT["psratiofour"] : 0.7 )."'>".$lang_settings['text_demote_peasant_default_four']."</li>
<li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlfive value='".(isset($ACCOUNT["psdlfive"]) ? $ACCOUNT["psdlfive"] : 800 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiofive value='".(isset($ACCOUNT["psratiofive"]) ? $ACCOUNT["psratiofive"] : 0.8 )."'>".$lang_settings['text_demote_peasant_default_five']."</li> <li>".$lang_settings['text_downloaded_amount_larger_than']."<input type='text' style=\"width: 50px\" name=psdlfive value='".(isset($ACCOUNT["psdlfive"]) ? $ACCOUNT["psdlfive"] : 800 )."'>".$lang_settings['text_and_ratio_below']."<input type='text' style=\"width: 50px\" name=psratiofive value='".(isset($ACCOUNT["psratiofive"]) ? $ACCOUNT["psratiofive"] : 0.8 )."'>".$lang_settings['text_demote_peasant_default_five']."</li>
</ul><br />".$lang_settings['text_demote_peasant_note'], 1); </ul><br />".$lang_settings['text_demote_peasant_note'], 1);
function promotion_criteria($class, $input, $time, $dl, $prratio, $deratio, $defaultInvites=0, $defaultSeedPoints = 0){
$inputAlias = "1_alias";
tr($lang_settings['row_default_user_one'].get_user_class_name(UC_USER,false,false,true).$lang_settings['row_default_user_two'],
$lang_settings['text_alias'] . "<input type='text' style=\"width: 60px\" name='".$inputAlias."' value='".(isset($ACCOUNT[$inputAlias]) ? $ACCOUNT[$inputAlias] : '' )."'>", 1);
function promotion_criteria($class, $input, $time, $dl, $prratio, $deratio, $defaultInvites=0, $defaultSeedPoints = 0, $defaultAlias = ''){
global $lang_settings; global $lang_settings;
global $ACCOUNT; global $ACCOUNT;
$inputtime = $input."time"; $inputtime = $input."time";
@@ -598,10 +608,12 @@ elseif ($action == 'accountsettings'){
$inputprratio = $input."prratio"; $inputprratio = $input."prratio";
$inputderatio = $input."deratio"; $inputderatio = $input."deratio";
$inputSeedPoints = $class . "_min_seed_points"; $inputSeedPoints = $class . "_min_seed_points";
$inputAlias = $class . "_alias";
if (!isset($class)) if (!isset($class))
return; return;
$x = $lang_settings['row_promote_to_one'].get_user_class_name($class,false,false,true).$lang_settings['row_promote_to_two']; $x = $lang_settings['row_promote_to_one'].get_user_class_name($class,false,false,true).$lang_settings['row_promote_to_two'];
$y = $lang_settings['text_member_longer_than']."<input type='text' style=\"width: 50px\" name='".$inputtime."' value='".(isset($ACCOUNT[$inputtime]) ? $ACCOUNT[$inputtime] : $time )."'>" $y = $lang_settings['text_alias'] . "<input type='text' style=\"width: 60px\" name='".$inputAlias."' value='".(isset($ACCOUNT[$inputAlias]) ? $ACCOUNT[$inputAlias] : $defaultAlias )."'><br/>"
.$lang_settings['text_member_longer_than']."<input type='text' style=\"width: 50px\" name='".$inputtime."' value='".(isset($ACCOUNT[$inputtime]) ? $ACCOUNT[$inputtime] : $time )."'>"
.$lang_settings['text_downloaded_more_than']."<input type='text' style=\"width: 50px\" name='".$inputdl."' value='".(isset($ACCOUNT[$inputdl]) ? $ACCOUNT[$inputdl] : $dl )."'>" .$lang_settings['text_downloaded_more_than']."<input type='text' style=\"width: 50px\" name='".$inputdl."' value='".(isset($ACCOUNT[$inputdl]) ? $ACCOUNT[$inputdl] : $dl )."'>"
.$lang_settings['text_seed_points_more_than']."<input type='text' style=\"width: 60px\" name='".$inputSeedPoints."' value='".(isset($ACCOUNT[$inputSeedPoints]) ? $ACCOUNT[$inputSeedPoints] : $defaultSeedPoints )."'>" .$lang_settings['text_seed_points_more_than']."<input type='text' style=\"width: 60px\" name='".$inputSeedPoints."' value='".(isset($ACCOUNT[$inputSeedPoints]) ? $ACCOUNT[$inputSeedPoints] : $defaultSeedPoints )."'>"
.$lang_settings['text_with_ratio_above']."<input type='text' style=\"width: 50px\" name='".$inputprratio."' value='".(isset($ACCOUNT[$inputprratio]) ? $ACCOUNT[$inputprratio] : $prratio )."'>" .$lang_settings['text_with_ratio_above']."<input type='text' style=\"width: 50px\" name='".$inputprratio."' value='".(isset($ACCOUNT[$inputprratio]) ? $ACCOUNT[$inputprratio] : $prratio )."'>"
+3 -3
View File
@@ -54,12 +54,12 @@ function dltable($name, $arr, $torrent)
$secs = max(1, ($e["la"] - $e["st"])); $secs = max(1, ($e["la"] - $e["st"]));
if ($enablelocation_tweak == 'yes'){ if ($enablelocation_tweak == 'yes'){
list($loc_pub, $loc_mod) = get_ip_location($e["ips"]); list($loc_pub, $loc_mod) = get_ip_location(sprintf('%s,%s', $e['ipv4'], $e['ipv6']));
$location = get_user_class() >= $userprofile_class ? "<div title='" . $loc_mod . "'>" . $loc_pub . "</div>" : $loc_pub; $location = get_user_class() >= $userprofile_class ? "<div title='" . $loc_mod . "'>" . $loc_pub . "</div>" : $loc_pub;
$s .= "<td class=rowfollow align=center width=1%><nobr>" . $location . "</nobr></td>\n"; $s .= "<td class=rowfollow align=center width=1%><nobr>" . $location . "</nobr></td>\n";
} }
elseif (get_user_class() >= $userprofile_class){ elseif (get_user_class() >= $userprofile_class){
$location = $e["ips"]; $location = implode(', ', array_filter([$e['ipv4'], $e['ipv6']]));
$s .= "<td class=rowfollow align=center width=1%><nobr>" . $location . "</nobr></td>\n"; $s .= "<td class=rowfollow align=center width=1%><nobr>" . $location . "</nobr></td>\n";
} }
@@ -93,7 +93,7 @@ function dltable($name, $arr, $torrent)
} }
$downloaders = array(); $downloaders = array();
$seeders = array(); $seeders = array();
$subres = sql_query("SELECT seeder, finishedat, downloadoffset, uploadoffset, group_concat(ip) as ips, port, uploaded, downloaded, to_go, UNIX_TIMESTAMP(started) AS st, connectable, agent, peer_id, UNIX_TIMESTAMP(last_action) AS la, userid FROM peers WHERE torrent = $id group by peer_id ") or sqlerr(); $subres = sql_query("SELECT seeder, finishedat, downloadoffset, uploadoffset, ip, ipv4, ipv6, port, uploaded, downloaded, to_go, UNIX_TIMESTAMP(started) AS st, connectable, agent, peer_id, UNIX_TIMESTAMP(last_action) AS la, userid FROM peers WHERE torrent = $id group by peer_id ") or sqlerr();
while ($subrow = mysql_fetch_array($subres)) { while ($subrow = mysql_fetch_array($subres)) {
if ($subrow["seeder"] == "yes") if ($subrow["seeder"] == "yes")
$seeders[] = $subrow; $seeders[] = $subrow;