99 lines
3.3 KiB
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()));
|
|
}
|
|
}
|