diff --git a/app/Http/Controllers/V1/Client/ClientController.php b/app/Http/Controllers/V1/Client/ClientController.php index 4711c09..7a2c077 100644 --- a/app/Http/Controllers/V1/Client/ClientController.php +++ b/app/Http/Controllers/V1/Client/ClientController.php @@ -42,7 +42,8 @@ class ClientController extends Controller 'Nekoray' => '3.24', 'verge' => '1.3.8', 'ClashX Meta' => '1.3.5', - 'Hiddify' => '0.1.0' + 'Hiddify' => '0.1.0', + 'loon' => '637' ]; foreach($minSupportHy2ClinetVersionMap as $client => $minVersion){ if (stripos($flag, $client) !== false && $this->versionCompare($version, $minVersion)) { diff --git a/app/Protocols/Loon.php b/app/Protocols/Loon.php index 5aae24f..20cba66 100644 --- a/app/Protocols/Loon.php +++ b/app/Protocols/Loon.php @@ -38,6 +38,9 @@ class Loon if ($item['type'] === 'trojan') { $uri .= self::buildTrojan($user['uuid'], $item); } + if ($item['type'] === 'hysteria') { + $uri .= self::buildHysteria($user['uuid'], $item, $user); + } } return response($uri, 200) ->header('Subscription-Userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}"); @@ -132,4 +135,25 @@ class Loon $uri .= "\r\n"; return $uri; } + + public static function buildHysteria($password, $server, $user) + { + if ($server['version'] !== 2){ + return ; + } + $config = [ + "{$server['name']}=Hysteria2", + $server['host'], + $server['port'], + $password, + $server['server_name'] ? "tls={$server['server_name']}" : "(null)" + ]; + if ($server['insecure']) $config[] = "skip-cert-verify=true"; + $config[] = "download-bandwidth=" . ($user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps']); + $config[] = "udp=true"; + $config = array_filter($config); + $uri = implode(',', $config); + $uri .= "\r\n"; + return $uri; + } }