mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-14 11:20:53 +08:00
refactor: enhance plugin mechanism for better extensibility
This commit is contained in:
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\V1\Client;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Protocols\General;
|
||||
use App\Services\Plugin\HookManager;
|
||||
use App\Services\ServerService;
|
||||
use App\Services\UserService;
|
||||
use App\Utils\Helper;
|
||||
@@ -47,62 +48,10 @@ class ClientController extends Controller
|
||||
|
||||
private const ALLOWED_TYPES = ['vmess', 'vless', 'trojan', 'hysteria', 'shadowsocks', 'hysteria2'];
|
||||
|
||||
/**
|
||||
* 处理浏览器访问订阅的情况
|
||||
*/
|
||||
private function handleBrowserSubscribe($user, UserService $userService)
|
||||
{
|
||||
$useTraffic = $user['u'] + $user['d'];
|
||||
$totalTraffic = $user['transfer_enable'];
|
||||
$remainingTraffic = Helper::trafficConvert($totalTraffic - $useTraffic);
|
||||
$expiredDate = $user['expired_at'] ? date('Y-m-d', $user['expired_at']) : __('Unlimited');
|
||||
$resetDay = $userService->getResetDay($user);
|
||||
|
||||
// 获取通用订阅地址
|
||||
$subscriptionUrl = Helper::getSubscribeUrl($user->token);
|
||||
|
||||
// 生成二维码
|
||||
$writer = new \BaconQrCode\Writer(
|
||||
new \BaconQrCode\Renderer\ImageRenderer(
|
||||
new \BaconQrCode\Renderer\RendererStyle\RendererStyle(200),
|
||||
new \BaconQrCode\Renderer\Image\SvgImageBackEnd()
|
||||
)
|
||||
);
|
||||
$qrCode = base64_encode($writer->writeString($subscriptionUrl));
|
||||
|
||||
$data = [
|
||||
'username' => $user->email,
|
||||
'status' => $userService->isAvailable($user) ? 'active' : 'inactive',
|
||||
'data_limit' => $totalTraffic ? Helper::trafficConvert($totalTraffic) : '∞',
|
||||
'data_used' => Helper::trafficConvert($useTraffic),
|
||||
'expired_date' => $expiredDate,
|
||||
'reset_day' => $resetDay,
|
||||
'subscription_url' => $subscriptionUrl,
|
||||
'qr_code' => $qrCode
|
||||
];
|
||||
|
||||
// 只有当 device_limit 不为 null 时才添加到返回数据中
|
||||
if ($user->device_limit !== null) {
|
||||
$data['device_limit'] = $user->device_limit;
|
||||
}
|
||||
|
||||
return response()->view('client.subscribe', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否是浏览器访问
|
||||
*/
|
||||
private function isBrowserAccess(Request $request): bool
|
||||
{
|
||||
$userAgent = strtolower($request->input('flag', $request->header('User-Agent', '')));
|
||||
return str_contains($userAgent, 'mozilla')
|
||||
|| str_contains($userAgent, 'chrome')
|
||||
|| str_contains($userAgent, 'safari')
|
||||
|| str_contains($userAgent, 'edge');
|
||||
}
|
||||
|
||||
public function subscribe(Request $request)
|
||||
{
|
||||
HookManager::call('client.subscribe.before');
|
||||
$request->validate([
|
||||
'types' => ['nullable', 'string'],
|
||||
'filter' => ['nullable', 'string'],
|
||||
@@ -116,10 +65,6 @@ class ClientController extends Controller
|
||||
return response()->json(['message' => 'Account unavailable'], 403);
|
||||
}
|
||||
|
||||
// 检测是否是浏览器访问
|
||||
if ($this->isBrowserAccess($request)) {
|
||||
return $this->handleBrowserSubscribe($user, $userService);
|
||||
}
|
||||
$clientInfo = $this->getClientInfo($request);
|
||||
$types = $this->getFilteredTypes($request->input('types'), $clientInfo['supportHy2']);
|
||||
$filterArr = $this->getFilterArray($request->input('filter'));
|
||||
@@ -194,13 +139,17 @@ class ClientController extends Controller
|
||||
|
||||
private function checkHy2Support(string $flag, string $version): bool
|
||||
{
|
||||
$result = false;
|
||||
$clientFound = false;
|
||||
foreach (self::CLIENT_VERSIONS as $client => $minVersion) {
|
||||
if (stripos($flag, $client) !== false) {
|
||||
$result = $result || version_compare($version, $minVersion, '>=');
|
||||
$clientFound = true;
|
||||
if (version_compare($version, $minVersion, '>=')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result || !count(self::CLIENT_VERSIONS);
|
||||
// 如果客户端不在列表中,返回 true
|
||||
return !$clientFound;
|
||||
}
|
||||
|
||||
private function filterServers(array $servers, array $types, ?array $filters): array
|
||||
|
||||
Reference in New Issue
Block a user