mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-03 14:10:57 +08:00
303 lines
10 KiB
PHP
303 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Models\Peer;
|
|
use App\Models\Setting;
|
|
use App\Models\Torrent;
|
|
use App\Models\User;
|
|
use Carbon\Carbon;
|
|
use Filament\Facades\Filament;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Nexus\Database\NexusDB;
|
|
|
|
class DashboardRepository extends BaseRepository
|
|
{
|
|
public function getSystemInfo(): array
|
|
{
|
|
$result = [];
|
|
$name = 'nexus_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => VERSION_NUMBER,
|
|
];
|
|
$name = 'nexus_release_date';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => RELEASE_DATE,
|
|
];
|
|
$name = 'laravel_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => \Illuminate\Foundation\Application::VERSION,
|
|
];
|
|
$name = 'filament_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => \Composer\InstalledVersions::getPrettyVersion('filament/filament'),
|
|
];
|
|
$name = 'php_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => PHP_VERSION,
|
|
];
|
|
$name = 'mysql_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => NexusDB::select('select version() as info')[0]['info'],
|
|
];
|
|
// $name = 'os';
|
|
// $result[$name] = [
|
|
// 'name' => $name,
|
|
// 'text' => nexus_trans("dashboard.system_info.$name"),
|
|
// 'value' => PHP_OS,
|
|
// ];
|
|
$name = 'redis_version';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => NexusDB::redis()->info()['redis_version'],
|
|
];
|
|
|
|
$name = 'server_software';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => $_SERVER['SERVER_SOFTWARE'] ?? '',
|
|
];
|
|
|
|
$name = 'load_average';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.system_info.$name"),
|
|
'value' => exec('uptime'),
|
|
];
|
|
return $result;
|
|
}
|
|
|
|
public function getStatData()
|
|
{
|
|
return [
|
|
'user_class' => [
|
|
'text' => nexus_trans('dashboard.user_class.page_title'),
|
|
'data' => $this->statUserClass()
|
|
],
|
|
'user' => [
|
|
'text' => nexus_trans('dashboard.user.page_title'),
|
|
'data' => $this->statUsers()
|
|
],
|
|
'torrent' => [
|
|
'text' => nexus_trans('dashboard.torrent.page_title'),
|
|
'data' => $this->statTorrents()
|
|
],
|
|
'system_info' => [
|
|
'text' => nexus_trans('dashboard.system_info.page_title'),
|
|
'data' => $this->getSystemInfo()
|
|
],
|
|
];
|
|
}
|
|
|
|
public function statUserClass()
|
|
{
|
|
$userClasses = User::query()
|
|
->groupBy('class')
|
|
->selectRaw('class, count(*) as counts')
|
|
->get()
|
|
->pluck('counts', 'class');
|
|
$result = [];
|
|
foreach (User::$classes as $class => $value) {
|
|
if ($class >= User::CLASS_VIP) {
|
|
break;
|
|
}
|
|
$result[$class] = [
|
|
'name' => $class,
|
|
'text' => $value['text'],
|
|
'value' => $userClasses->has($class) ? number_format($userClasses->get($class)) : 0,
|
|
];
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public function statUsers()
|
|
{
|
|
$result = [];
|
|
$now = Carbon::now();
|
|
|
|
$name = 'total';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => sprintf('%s / %s', number_format(User::query()->count()), number_format(intval(Setting::get('main.maxusers')))),
|
|
];
|
|
$name = 'unconfirmed';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('status', User::STATUS_PENDING)->count()),
|
|
];
|
|
$name = 'visit_last_one_day';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('last_access', '>', $now->subDays(1))->count()),
|
|
];
|
|
$name = 'visit_last_one_week';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('last_access', '>', $now->subDays(7))->count()),
|
|
];
|
|
$name = 'visit_last_30_days';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('last_access', '>', $now->subDays(30))->count()),
|
|
];
|
|
$name = 'vip';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('class', User::CLASS_VIP)->count()),
|
|
];
|
|
$name = 'donated';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('donor', 'yes')->count()),
|
|
];
|
|
$name = 'warned';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('warned', 'yes')->count()),
|
|
];
|
|
$name = 'disabled';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => number_format(User::query()->where('enabled', 'no')->count()),
|
|
];
|
|
|
|
$statGender = User::query()->groupBy('gender')->selectRaw('gender, count(*) as counts')->get()->pluck('counts','gender');
|
|
foreach ($statGender as $gender => $value) {
|
|
if (!isset(User::$genders[$gender])) {
|
|
$gender = User::GENDER_UNKNOWN;
|
|
}
|
|
$name = "gender_$gender";
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.user.$name"),
|
|
'value' => $statGender->has($gender) ? number_format($statGender->get($gender)) : 0,
|
|
];
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public function statTorrents()
|
|
{
|
|
$now = now();
|
|
$name = 'total';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format(Torrent::query()->count()),
|
|
];
|
|
$name = 'dead';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format(Torrent::query()->where('visible', '=', Torrent::VISIBLE_NO)->count()),
|
|
];
|
|
|
|
$seeders = Peer::query()->where('seeder', 'yes')->count();
|
|
$name = 'seeders';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format($seeders),
|
|
];
|
|
|
|
$leechers = Peer::query()->where('seeder', 'no')->count();
|
|
$name = 'leechers';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format($leechers),
|
|
];
|
|
$name = 'seeders_leechers';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format($seeders + $leechers),
|
|
];
|
|
$name = 'seeders_leechers_ratio';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => $leechers == 0 ? 0 : number_format(($seeders / $leechers) * 100) . '%',
|
|
];
|
|
$name = 'active_web_users';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format(User::query()->where('last_access', '>', $now->subSeconds(900))->count()),
|
|
];
|
|
$name = 'active_tracker_users';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => number_format(Peer::query()->selectRaw('count(distinct(userid)) as counts')->first()->counts),
|
|
];
|
|
|
|
$name = 'total_torrent_size';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => mksize(Torrent::query()->sum('size')),
|
|
];
|
|
|
|
$total_uploaded_byte = User::query()->sum('uploaded');
|
|
$total_downloaded_byte = User::query()->sum('downloaded');
|
|
$total_byte = $total_uploaded_byte + $total_downloaded_byte;
|
|
|
|
$name = 'total_uploaded';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => mksize($total_uploaded_byte),
|
|
];
|
|
$name = 'total_downloaded';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => mksize($total_downloaded_byte),
|
|
];
|
|
$name = 'total_uploaded_downloaded';
|
|
$result[$name] = [
|
|
'name' => $name,
|
|
'text' => nexus_trans("dashboard.torrent.$name"),
|
|
'value' => mksize($total_byte),
|
|
];
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function latestUser()
|
|
{
|
|
return User::query()->orderBy('id', 'desc')->limit(10)->get(User::$commonFields);
|
|
}
|
|
|
|
public function latestTorrent()
|
|
{
|
|
return Torrent::query()->with(['user'])->orderBy('id', 'desc')->limit(5)->get(Torrent::$commentFields);
|
|
}
|
|
|
|
|
|
}
|