mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-05 04:30:52 +08:00
64 lines
1.9 KiB
PHP
64 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Server;
|
|
use App\Models\User;
|
|
use App\Services\NodeSyncService;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\Redis;
|
|
|
|
class CheckTrafficExceeded extends Command
|
|
{
|
|
protected $signature = 'check:traffic-exceeded';
|
|
protected $description = '检查流量超标用户并通知节点';
|
|
|
|
public function handle()
|
|
{
|
|
$count = Redis::scard('traffic:pending_check');
|
|
if ($count <= 0) {
|
|
return;
|
|
}
|
|
|
|
$pendingUserIds = array_map('intval', Redis::spop('traffic:pending_check', $count));
|
|
|
|
$exceededUsers = User::toBase()
|
|
->whereIn('id', $pendingUserIds)
|
|
->whereRaw('u + d >= transfer_enable')
|
|
->where('transfer_enable', '>', 0)
|
|
->where('banned', 0)
|
|
->select(['id', 'group_id'])
|
|
->get();
|
|
|
|
if ($exceededUsers->isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
$groupedUsers = $exceededUsers->groupBy('group_id');
|
|
$notifiedCount = 0;
|
|
|
|
foreach ($groupedUsers as $groupId => $users) {
|
|
if (!$groupId) {
|
|
continue;
|
|
}
|
|
|
|
$userIdsInGroup = $users->pluck('id')->toArray();
|
|
$servers = Server::whereJsonContains('group_ids', (string) $groupId)->get();
|
|
|
|
foreach ($servers as $server) {
|
|
if (!NodeSyncService::isNodeOnline($server->id)) {
|
|
continue;
|
|
}
|
|
|
|
NodeSyncService::push($server->id, 'sync.user.delta', [
|
|
'action' => 'remove',
|
|
'users' => array_map(fn($id) => ['id' => $id], $userIdsInGroup),
|
|
]);
|
|
$notifiedCount++;
|
|
}
|
|
}
|
|
|
|
$this->info("Checked " . count($pendingUserIds) . " users, notified {$notifiedCount} nodes for " . $exceededUsers->count() . " exceeded users.");
|
|
}
|
|
}
|