v2borad-master/app/Http/Controllers/Client/ClientController.php

99 lines
3.3 KiB
PHP

<?php
namespace App\Http\Controllers\Client;
use App\Http\Controllers\Controller;
use App\Models\Server;
use App\Models\ServerShadowsocks;
use App\Models\ServerTrojan;
use Illuminate\Http\Request;
use App\Models\User;
use App\Utils\Client\Protocol;
use App\Services\ClientService;
use Illuminate\Support\Facades\Log;
use App\Services\UserService;
use Config;
class ClientController extends Controller
{
/**
* subscribe
*
* @param Request $request
*/
public function subscribe(Request $request)
{
$reqFlag = $request->input('flag') ?? ($_SERVER['HTTP_USER_AGENT'] ?? '');
$flag = strtolower($reqFlag);
$etagHeader = $request->header('If-None-Match');
$userService = new UserService();
$userIP=$userService->getUserIP();
$user = $request->user;
Log::info('fun(subscribe)=> flag:'.$flag.';If-None-Match:'.$etagHeader.';IP:'.$userIP.';token:'.$user->token);
if (empty($flag)) {
abort(500, "参数错误");
}
/**
* @var User $user
*/
// account not expired and is not banned.
if (!$user->isAvailable()) {
abort(500, "用户不可用");
}
$v2board = Config::get('v2board');
$eTag = '"'.$v2board['node_version_time'].$user->group_id.$user->expired_at.$user->transfer_enable. '"';
if ($etagHeader && str_contains($etagHeader, $eTag)) {
return response('', 304)->header('ETag', $etagHeader);
}
header("ETag: $eTag");
$servers1 = array_merge(
Server::configs($user)->toArray(),
ServerShadowsocks::configs($user)->toArray(),
ServerTrojan::configs($user)->toArray()
);
$inIpOnLink = $userService->goNodeOnLinkUser();
$servers = array();
if (count($inIpOnLink) > 0){
foreach ($servers1 as $item) {
$userSum = $inIpOnLink[config('app.name_en').$item['name']] ?? 0;
$item['xn'] = $userSum;
if(!is_null($item['tags'])){
foreach ($item['tags'] as $tag) {
if(strpos($tag, "dw:") === 0){
$dw = (int)substr($tag, 3);
if ($dw > 0) {
$item['xn'] = round($userSum / $dw, 2) + (mt_rand(1, 10) / 1000);
}
break;
}
}
}
array_push($servers, $item);
}
array_multisort(array_column($servers, 'xn'), SORT_ASC, $servers);
}else{
array_multisort(array_column($servers1, 'sort'), SORT_ASC, $servers1);
$servers = $servers1;
}
if ($flag) {
$protocolInstance = ClientService::getInstance($servers, $user, $flag,$etagHeader);
/**
* @var Protocol $protocolInstance
*/
if ($protocolInstance == null) {
$protocolInstance = ClientService::getInstance($servers, $user, 'v2rayn',$etagHeader);
}
$content = $protocolInstance->handle();
die($content);
}
die("目前只支持以下客户端, 请下载后使用软件订阅: ". join(",", ClientService::getProtoNames()));
}
}