Browse Source

update: code

tokumeikoi 3 years ago
parent
commit
5b8591fde9

+ 5 - 1
app/Console/Commands/Test.php

@@ -38,6 +38,10 @@ class Test extends Command
      */
     public function handle()
     {
-        dd(Order::where('user_id', 4)->delete());
+        foreach (glob(app_path('Http//Controllers//Client//Protocols') . '/*.php') as $file) {
+            $file = 'App\\Http\\Controllers\\Client\\Protocols' . basename($file, '.php');
+            new $file();
+            var_dump($file);
+        }
     }
 }

+ 6 - 226
app/Http/Controllers/Client/ClientController.php

@@ -4,15 +4,7 @@ namespace App\Http\Controllers\Client;
 
 use App\Http\Controllers\Controller;
 use App\Services\ServerService;
-use App\Utils\Clash;
-use App\Utils\Origin;
-use App\Utils\QuantumultX;
-use App\Utils\Shadowrocket;
-use App\Utils\Shadowsocks;
-use App\Utils\Surge;
-use App\Utils\Surfboard;
 use Illuminate\Http\Request;
-use Symfony\Component\Yaml\Yaml;
 use App\Services\UserService;
 
 class ClientController extends Controller
@@ -31,227 +23,15 @@ class ClientController extends Controller
             $serverService = new ServerService();
             $servers = $serverService->getAvailableServers($user);
             if ($flag) {
-                if (strpos($flag, 'quantumult%20x') !== false) {
-                    die($this->quantumultX($user, $servers));
-                }
-                if (strpos($flag, 'clash') !== false) {
-                    die($this->clash($user, $servers));
-                }
-                if (strpos($flag, 'surfboard') !== false) {
-                    die($this->surfboard($user, $servers));
-                }
-                if (strpos($flag, 'surge') !== false) {
-                    die($this->surge($user, $servers));
-                }
-                if (strpos($flag, 'shadowrocket') !== false) {
-                    die($this->shadowrocket($user, $servers));
-                }
-                if (strpos($flag, 'shadowsocks') !== false) {
-                    die($this->shaodowsocksSIP008($user, $servers));
+                foreach (glob(app_path('Http//Controllers//Client//Protocols') . '/*.php') as $file) {
+                    $file = 'App\\Http\\Controllers\\Client\\Protocols\\' . basename($file, '.php');
+                    $class = new $file($user, $servers);
+                    if (strpos($flag, $class->flag) !== false) {
+                        die($class->handle());
+                    }
                 }
             }
             die('该客户端暂不支持进行订阅');
         }
     }
-
-    private function origin($user, $servers = [])
-    {
-        $uri = '';
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                $uri .= Origin::buildShadowsocks($item, $user);
-            }
-            if ($item['type'] === 'v2ray') {
-                $uri .= Origin::buildVmess($item, $user);
-            }
-            if ($item['type'] === 'trojan') {
-                $uri .= Origin::buildTrojan($item, $user);
-            }
-        }
-        return base64_encode($uri);
-    }
-
-    private function shadowrocket($user, $servers = [])
-    {
-        $uri = '';
-        //display remaining traffic and expire date
-        $upload = round($user['u'] / (1024*1024*1024), 2);
-        $download = round($user['d'] / (1024*1024*1024), 2);
-        $totalTraffic = round($user['transfer_enable'] / (1024*1024*1024), 2);
-        $expiredDate = date('Y-m-d', $user['expired_at']);
-        $uri .= "STATUS=🚀↑:{$upload}GB,↓:{$download}GB,TOT:{$totalTraffic}GB💡Expires:{$expiredDate}\r\n";
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                $uri .= Shadowrocket::buildShadowsocks($user['uuid'], $item);
-            }
-            if ($item['type'] === 'v2ray') {
-                $uri .= Shadowrocket::buildVmess($user['uuid'], $item);
-            }
-            if ($item['type'] === 'trojan') {
-                $uri .= Shadowrocket::buildTrojan($user['uuid'], $item);
-            }
-        }
-        return base64_encode($uri);
-    }
-
-    private function quantumultX($user, $servers = [])
-    {
-        $uri = '';
-        header("subscription-userinfo: upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                $uri .= QuantumultX::buildShadowsocks($user['uuid'], $item);
-            }
-            if ($item['type'] === 'v2ray') {
-                $uri .= QuantumultX::buildVmess($user['uuid'], $item);
-            }
-            if ($item['type'] === 'trojan') {
-                $uri .= QuantumultX::buildTrojan($user['uuid'], $item);
-            }
-        }
-        return base64_encode($uri);
-    }
-
-    private function shaodowsocksSIP008($user, $servers = [])
-    {
-        $configs = [];
-        $subs = [];
-        $subs['servers'] = [];
-        $subs['bytes_used'] = '';
-        $subs['bytes_remaining'] = '';
-
-        $bytesUsed = $user['u'] + $user['d'];
-        $bytesRemaining = $user['transfer_enable'] - $bytesUsed;
-
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                array_push($configs, Shadowsocks::SIP008($item, $user));
-            }
-        }
-
-        $subs['version'] = 1;
-        $subs['bytes_used'] = $bytesUsed;
-        $subs['bytes_remaining'] = $bytesRemaining;
-        $subs['servers'] = array_merge($subs['servers'] ? $subs['servers'] : [], $configs);
-
-        return json_encode($subs, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
-    }
-
-    private function surge($user, $servers = [])
-    {
-        $proxies = '';
-        $proxyGroup = '';
-
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                // [Proxy]
-                $proxies .= Surge::buildShadowsocks($user['uuid'], $item);
-                // [Proxy Group]
-                $proxyGroup .= $item['name'] . ', ';
-            }
-            if ($item['type'] === 'v2ray') {
-                // [Proxy]
-                $proxies .= Surge::buildVmess($user['uuid'], $item);
-                // [Proxy Group]
-                $proxyGroup .= $item['name'] . ', ';
-            }
-            if ($item['type'] === 'trojan') {
-                // [Proxy]
-                $proxies .= Surge::buildTrojan($user['uuid'], $item);
-                // [Proxy Group]
-                $proxyGroup .= $item['name'] . ', ';
-            }
-        }
-
-        $defaultConfig = base_path() . '/resources/rules/default.surge.conf';
-        $customConfig = base_path() . '/resources/rules/custom.surge.conf';
-        if (\File::exists($customConfig)) {
-            $config = file_get_contents("$customConfig");
-        } else {
-            $config = file_get_contents("$defaultConfig");
-        }
-
-        // Subscription link
-        $subsURL = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
-
-        $config = str_replace('$subs_link', $subsURL, $config);
-        $config = str_replace('$proxies', $proxies, $config);
-        $config = str_replace('$proxy_group', rtrim($proxyGroup, ', '), $config);
-        return $config;
-    }
-
-    private function surfboard($user, $servers = [])
-    {
-        $proxies = '';
-        $proxyGroup = '';
-
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                // [Proxy]
-                $proxies .= Surfboard::buildShadowsocks($user['uuid'], $item);
-                // [Proxy Group]
-                $proxyGroup .= $item['name'] . ', ';
-            }
-            if ($item['type'] === 'v2ray') {
-                // [Proxy]
-                $proxies .= Surfboard::buildVmess($user['uuid'], $item);
-                // [Proxy Group]
-                $proxyGroup .= $item['name'] . ', ';
-            }
-        }
-
-        $defaultConfig = base_path() . '/resources/rules/default.surfboard.conf';
-        $customConfig = base_path() . '/resources/rules/custom.surfboard.conf';
-        if (\File::exists($customConfig)) {
-            $config = file_get_contents("$customConfig");
-        } else {
-            $config = file_get_contents("$defaultConfig");
-        }
-
-        // Subscription link
-        $subsURL = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
-
-        $config = str_replace('$subs_link', $subsURL, $config);
-        $config = str_replace('$proxies', $proxies, $config);
-        $config = str_replace('$proxy_group', rtrim($proxyGroup, ', '), $config);
-        return $config;
-    }
-
-    private function clash($user, $servers = [])
-    {
-        header("subscription-userinfo: upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
-        $defaultConfig = base_path() . '/resources/rules/default.clash.yaml';
-        $customConfig = base_path() . '/resources/rules/custom.clash.yaml';
-        if (\File::exists($customConfig)) {
-            $config = Yaml::parseFile($customConfig);
-        } else {
-            $config = Yaml::parseFile($defaultConfig);
-        }
-        $proxy = [];
-        $proxies = [];
-
-        foreach ($servers as $item) {
-            if ($item['type'] === 'shadowsocks') {
-                array_push($proxy, Clash::buildShadowsocks($user['uuid'], $item));
-                array_push($proxies, $item['name']);
-            }
-            if ($item['type'] === 'v2ray') {
-                array_push($proxy, Clash::buildVmess($user['uuid'], $item));
-                array_push($proxies, $item['name']);
-            }
-            if ($item['type'] === 'trojan') {
-                array_push($proxy, Clash::buildTrojan($user['uuid'], $item));
-                array_push($proxies, $item['name']);
-            }
-        }
-
-        $config['proxies'] = array_merge($config['proxies'] ? $config['proxies'] : [], $proxy);
-        foreach ($config['proxy-groups'] as $k => $v) {
-            if (!is_array($config['proxy-groups'][$k]['proxies'])) continue;
-            $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies);
-        }
-        $yaml = Yaml::dump($config);
-        $yaml = str_replace('$app_name', config('v2board.app_name', 'V2Board'), $yaml);
-        return $yaml;
-    }
 }

+ 52 - 1
app/Utils/Clash.php → app/Http/Controllers/Client/Protocols/Clash.php

@@ -1,10 +1,61 @@
 <?php
 
-namespace App\Utils;
+namespace App\Http\Controllers\Client\Protocols;
 
+use Symfony\Component\Yaml\Yaml;
 
 class Clash
 {
+    public $flag = 'clash';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+        header("subscription-userinfo: upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
+        $defaultConfig = base_path() . '/resources/rules/default.clash.yaml';
+        $customConfig = base_path() . '/resources/rules/custom.clash.yaml';
+        if (\File::exists($customConfig)) {
+            $config = Yaml::parseFile($customConfig);
+        } else {
+            $config = Yaml::parseFile($defaultConfig);
+        }
+        $proxy = [];
+        $proxies = [];
+
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                array_push($proxy, self::buildShadowsocks($user['uuid'], $item));
+                array_push($proxies, $item['name']);
+            }
+            if ($item['type'] === 'v2ray') {
+                array_push($proxy, self::buildVmess($user['uuid'], $item));
+                array_push($proxies, $item['name']);
+            }
+            if ($item['type'] === 'trojan') {
+                array_push($proxy, self::buildTrojan($user['uuid'], $item));
+                array_push($proxies, $item['name']);
+            }
+        }
+
+        $config['proxies'] = array_merge($config['proxies'] ? $config['proxies'] : [], $proxy);
+        foreach ($config['proxy-groups'] as $k => $v) {
+            if (!is_array($config['proxy-groups'][$k]['proxies'])) continue;
+            $config['proxy-groups'][$k]['proxies'] = array_merge($config['proxy-groups'][$k]['proxies'], $proxies);
+        }
+        $yaml = Yaml::dump($config);
+        $yaml = str_replace('$app_name', config('v2board.app_name', 'V2Board'), $yaml);
+        return $yaml;
+    }
+
     public static function buildShadowsocks($uuid, $server)
     {
         $array = [];

+ 31 - 1
app/Utils/QuantumultX.php → app/Http/Controllers/Client/Protocols/QuantumultX.php

@@ -1,10 +1,40 @@
 <?php
 
-namespace App\Utils;
+namespace App\Http\Controllers\Client\Protocols;
 
 
 class QuantumultX
 {
+    public $flag = 'quantumult x';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+        $uri = '';
+        header("subscription-userinfo: upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                $uri .= self::buildShadowsocks($user['uuid'], $item);
+            }
+            if ($item['type'] === 'v2ray') {
+                $uri .= self::buildVmess($user['uuid'], $item);
+            }
+            if ($item['type'] === 'trojan') {
+                $uri .= self::buildTrojan($user['uuid'], $item);
+            }
+        }
+        return base64_encode($uri);
+    }
+
     public static function buildShadowsocks($password, $server)
     {
         $config = [

+ 38 - 2
app/Utils/Shadowrocket.php → app/Http/Controllers/Client/Protocols/Shadowrocket.php

@@ -1,10 +1,46 @@
 <?php
 
-namespace App\Utils;
-
+namespace App\Http\Controllers\Client\Protocols;
 
 class Shadowrocket
 {
+    public $flag = 'shadowrocket';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+
+        $uri = '';
+        //display remaining traffic and expire date
+        $upload = round($user['u'] / (1024*1024*1024), 2);
+        $download = round($user['d'] / (1024*1024*1024), 2);
+        $totalTraffic = round($user['transfer_enable'] / (1024*1024*1024), 2);
+        $expiredDate = date('Y-m-d', $user['expired_at']);
+        $uri .= "STATUS=🚀↑:{$upload}GB,↓:{$download}GB,TOT:{$totalTraffic}GB💡Expires:{$expiredDate}\r\n";
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                $uri .= self::buildShadowsocks($user['uuid'], $item);
+            }
+            if ($item['type'] === 'v2ray') {
+                $uri .= self::buildVmess($user['uuid'], $item);
+            }
+            if ($item['type'] === 'trojan') {
+                $uri .= self::buildTrojan($user['uuid'], $item);
+            }
+        }
+        return base64_encode($uri);
+    }
+
+
     public static function buildShadowsocks($password, $server)
     {
         $name = rawurlencode($server['name']);

+ 57 - 0
app/Http/Controllers/Client/Protocols/Shadowsocks.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Http\Controllers\Client\Protocols;
+
+class Shadowsocks
+{
+    public $flag = 'shadowsocks';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+
+        $configs = [];
+        $subs = [];
+        $subs['servers'] = [];
+        $subs['bytes_used'] = '';
+        $subs['bytes_remaining'] = '';
+
+        $bytesUsed = $user['u'] + $user['d'];
+        $bytesRemaining = $user['transfer_enable'] - $bytesUsed;
+
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                array_push($configs, self::SIP008($item, $user));
+            }
+        }
+
+        $subs['version'] = 1;
+        $subs['bytes_used'] = $bytesUsed;
+        $subs['bytes_remaining'] = $bytesRemaining;
+        $subs['servers'] = array_merge($subs['servers'] ? $subs['servers'] : [], $configs);
+
+        return json_encode($subs, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
+    }
+
+    public static function SIP008($server, $user)
+    {
+        $config = [
+            "id" => $server['id'],
+            "remarks" => $server['name'],
+            "server" => $server['host'],
+            "server_port" => $server['port'],
+            "password" => $user['uuid'],
+            "method" => $server['cipher']
+        ];
+        return $config;
+    }
+}

+ 52 - 1
app/Utils/Surfboard.php → app/Http/Controllers/Client/Protocols/Surfboard.php

@@ -1,10 +1,61 @@
 <?php
 
-namespace App\Utils;
+namespace App\Http\Controllers\Client\Protocols;
 
 
 class Surfboard
 {
+    public $flag = 'surfboard';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+
+        $proxies = '';
+        $proxyGroup = '';
+
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                // [Proxy]
+                $proxies .= Surfboard::buildShadowsocks($user['uuid'], $item);
+                // [Proxy Group]
+                $proxyGroup .= $item['name'] . ', ';
+            }
+            if ($item['type'] === 'v2ray') {
+                // [Proxy]
+                $proxies .= Surfboard::buildVmess($user['uuid'], $item);
+                // [Proxy Group]
+                $proxyGroup .= $item['name'] . ', ';
+            }
+        }
+
+        $defaultConfig = base_path() . '/resources/rules/default.surfboard.conf';
+        $customConfig = base_path() . '/resources/rules/custom.surfboard.conf';
+        if (\File::exists($customConfig)) {
+            $config = file_get_contents("$customConfig");
+        } else {
+            $config = file_get_contents("$defaultConfig");
+        }
+
+        // Subscription link
+        $subsURL = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
+
+        $config = str_replace('$subs_link', $subsURL, $config);
+        $config = str_replace('$proxies', $proxies, $config);
+        $config = str_replace('$proxy_group', rtrim($proxyGroup, ', '), $config);
+        return $config;
+    }
+
+
     public static function buildShadowsocks($password, $server)
     {
         $config = [

+ 58 - 2
app/Utils/Surge.php → app/Http/Controllers/Client/Protocols/Surge.php

@@ -1,10 +1,66 @@
 <?php
 
-namespace App\Utils;
-
+namespace App\Http\Controllers\Client\Protocols;
 
 class Surge
 {
+    public $flag = 'surge';
+    private $servers;
+    private $user;
+
+    public function __construct($user, $servers)
+    {
+        $this->user = $user;
+        $this->servers = $servers;
+    }
+
+    public function handle()
+    {
+        $servers = $this->servers;
+        $user = $this->user;
+
+        $proxies = '';
+        $proxyGroup = '';
+
+        foreach ($servers as $item) {
+            if ($item['type'] === 'shadowsocks') {
+                // [Proxy]
+                $proxies .= self::buildShadowsocks($user['uuid'], $item);
+                // [Proxy Group]
+                $proxyGroup .= $item['name'] . ', ';
+            }
+            if ($item['type'] === 'v2ray') {
+                // [Proxy]
+                $proxies .= self::buildVmess($user['uuid'], $item);
+                // [Proxy Group]
+                $proxyGroup .= $item['name'] . ', ';
+            }
+            if ($item['type'] === 'trojan') {
+                // [Proxy]
+                $proxies .= self::buildTrojan($user['uuid'], $item);
+                // [Proxy Group]
+                $proxyGroup .= $item['name'] . ', ';
+            }
+        }
+
+        $defaultConfig = base_path() . '/resources/rules/default.surge.conf';
+        $customConfig = base_path() . '/resources/rules/custom.surge.conf';
+        if (\File::exists($customConfig)) {
+            $config = file_get_contents("$customConfig");
+        } else {
+            $config = file_get_contents("$defaultConfig");
+        }
+
+        // Subscription link
+        $subsURL = config('v2board.subscribe_url', config('v2board.app_url', env('APP_URL'))) . '/api/v1/client/subscribe?token=' . $user['token'];
+
+        $config = str_replace('$subs_link', $subsURL, $config);
+        $config = str_replace('$proxies', $proxies, $config);
+        $config = str_replace('$proxy_group', rtrim($proxyGroup, ', '), $config);
+        return $config;
+    }
+
+
     public static function buildShadowsocks($password, $server)
     {
         $config = [

+ 0 - 59
app/Utils/Origin.php

@@ -1,59 +0,0 @@
-<?php
-namespace App\Utils;
-
-use App\Models\User;
-
-class Origin
-{
-    public static function buildShadowsocks($server, User $user)
-    {
-        $name = rawurlencode($server['name']);
-        $str = str_replace(
-            ['+', '/', '='],
-            ['-', '_', ''],
-            base64_encode("{$server['cipher']}:{$user['uuid']}")
-        );
-        return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n";
-    }
-
-    public static function buildVmess($server, User $user)
-    {
-        $config = [
-            "v" => "2",
-            "ps" => $server['name'],
-            "add" => $server['host'],
-            "port" => (string)$server['port'],
-            "id" => $user['uuid'],
-            "aid" => (string)$server['alter_id'],
-            "net" => $server['network'],
-            "type" => "none",
-            "host" => "",
-            "path" => "",
-            "tls" => $server['tls'] ? "tls" : "",
-            "sni" => $server['tls'] ? json_decode($server['tlsSettings'], true)['serverName'] : ""
-        ];
-        if ((string)$server['network'] === 'ws') {
-            $wsSettings = json_decode($server['networkSettings'], true);
-            if (isset($wsSettings['path'])) $config['path'] = $wsSettings['path'];
-            if (isset($wsSettings['headers']['Host'])) $config['host'] = $wsSettings['headers']['Host'];
-        }
-        if ((string)$server['network'] === 'grpc') {
-            $grpcSettings = json_decode($server['networkSettings'], true);
-            if (isset($grpcSettings['path'])) $config['path'] = $grpcSettings['serviceName'];
-        }
-        return "vmess://" . base64_encode(json_encode($config)) . "\r\n";
-    }
-
-    public static function buildTrojan($server, User $user)
-    {
-        $name = rawurlencode($server['name']);
-        $query = http_build_query([
-            'allowInsecure' => $server['allow_insecure'],
-            'peer' => $server['server_name'],
-            'sni' => $server['server_name']
-        ]);
-        $uri = "trojan://{$user['uuid']}@{$server['host']}:{$server['port']}?{$query}#{$name}";
-        $uri .= "\r\n";
-        return $uri;
-    }
-}

+ 0 - 20
app/Utils/Shadowsocks.php

@@ -1,20 +0,0 @@
-<?php
-namespace App\Utils;
-
-use App\Models\User;
-
-class Shadowsocks
-{
-    public static function SIP008($server, User $user)
-    {
-        $config = [
-            "id" => $server['id'],
-            "remarks" => $server['name'],
-            "server" => $server['host'],
-            "server_port" => $server['port'],
-            "password" => $user['uuid'],
-            "method" => $server['cipher']
-        ];
-        return $config;
-    }
-}