Surge.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. /*
  3. * Developed based on
  4. * https://wiki.surge.community/modules
  5. * https://getsurfboard.com/docs/profile-format/overview/
  6. */
  7. namespace App\Utils\Clients;
  8. use App\Models\User;
  9. use App\Utils\Library\Templates\Client;
  10. use File;
  11. class Surge implements Client
  12. {
  13. public const AGENT = ['surge', 'surfboard'];
  14. public function getConfig(array $servers, User $user, string $target): string
  15. {
  16. if (str_contains($target, 'surge')) {
  17. $customConfig = base_path().'/resources/rules/custom.surge.conf';
  18. if (File::exists($customConfig)) {
  19. $config = file_get_contents($customConfig);
  20. } else {
  21. $config = file_get_contents(base_path().'/resources/rules/default.surge.conf');
  22. }
  23. } else {
  24. $customConfig = base_path().'/resources/rules/custom.surfboard.conf';
  25. if (File::exists($customConfig)) {
  26. $config = file_get_contents($customConfig);
  27. } else {
  28. $config = file_get_contents(base_path().'/resources/rules/default.surfboard.conf');
  29. }
  30. }
  31. $webName = sysConfig('website_name');
  32. header("content-disposition:attachment;filename*=UTF-8''".rawurlencode($webName).'.conf');
  33. $proxyProfiles = Protocols\Surge::build($servers);
  34. if (sysConfig('is_custom_subscribe')) {
  35. $upload = formatBytes($user->u);
  36. $download = formatBytes($user->d);
  37. $totalTraffic = formatBytes($user->transfer_enable);
  38. $style = 'info';
  39. $remainTraffic = $user->transfer_enable - $user->d - $user->u;
  40. $remainDates = now()->diffInDays($user->expired_at, false);
  41. if ($remainTraffic <= 0 || $remainDates <= 0) {
  42. $style = 'error';
  43. } elseif (($user->transfer_enable - $user->d - $user->u) / $user->transfer_enable <= 0.05 || $remainDates <= 7) {
  44. $style = 'alert';
  45. }
  46. $subscribeInfo = "title=$webName".trans('user.subscribe.info.title').', content='.trans('user.subscribe.info.upload').": $upload\n".trans('user.subscribe.info.download').": $download\n".trans('user.subscribe.info.total').": $totalTraffic\n".trans('model.user.expired_date').": $user->expired_at, style=$style";
  47. } else {
  48. $subscribeInfo = "title=$webName, content=";
  49. }
  50. return str_replace(['$subscribe_info', '$subs_link', '$subs_domain', '$proxies', '$proxy_group'], [$subscribeInfo, route('sub', $user->subscribe->code), $_SERVER['HTTP_HOST'], $proxyProfiles['proxies'], $proxyProfiles['names']],
  51. $config);
  52. }
  53. }