From 6e404ab19c74a9b8e2e7122b7d0210fe1582cdf2 Mon Sep 17 00:00:00 2001 From: chen08209 Date: Tue, 14 Oct 2025 15:13:52 +0800 Subject: [PATCH] Fix windows some issues Optimize overwrite handle Optimize access control page Optimize some details --- .github/workflows/build.yaml | 110 +-- .gitmodules | 4 + .../src/main/kotlin/com/follow/clash/State.kt | 24 +- .../res/drawable/ic_launcher_foreground.xml | 44 +- .../com/follow/clash/service/CommonService.kt | 6 +- .../com/follow/clash/service/VpnService.kt | 10 +- arb/intl_en.arb | 36 +- arb/intl_ja.arb | 36 +- arb/intl_ru.arb | 36 +- arb/intl_zh_CN.arb | 34 +- assets/images/{avatars => avatar}/arue.jpg | Bin assets/images/{avatars => avatar}/june2.jpg | Bin assets/images/empty/connection.svg | 23 + assets/images/empty/data.svg | 9 + assets/images/empty/log.svg | 25 + assets/images/empty/profile.svg | 37 + assets/images/empty/proxy.svg | 18 + assets/images/empty/rule.svg | 31 + assets/images/empty/script.svg | 19 + assets/images/icon/status_1.ico | Bin 0 -> 4286 bytes assets/images/icon/status_1.png | Bin 0 -> 4231 bytes assets/images/icon/status_2.ico | Bin 0 -> 4286 bytes assets/images/icon/status_2.png | Bin 0 -> 7151 bytes assets/images/icon/status_3.ico | Bin 0 -> 4286 bytes assets/images/icon/status_3.png | Bin 0 -> 4247 bytes assets/images/icon_black.ico | Bin 3939 -> 0 bytes assets/images/icon_black.png | Bin 13452 -> 0 bytes assets/images/icon_white.ico | Bin 4031 -> 0 bytes assets/images/icon_white.png | Bin 7153 -> 0 bytes core/Clash.Meta | 2 +- core/common.go | 3 +- core/go.mod | 25 +- core/go.sum | 49 +- lib/application.dart | 12 +- lib/common/app_localizations.dart | 2 +- lib/common/archive.dart | 3 + lib/common/common.dart | 1 + lib/common/compute.dart | 10 +- lib/common/constant.dart | 10 + lib/common/context.dart | 13 +- lib/common/datetime.dart | 14 +- lib/common/future.dart | 6 +- lib/common/iterable.dart | 40 +- lib/common/measure.dart | 70 +- lib/common/mixin.dart | 5 + lib/common/navigator.dart | 49 +- lib/common/num.dart | 16 +- lib/common/path.dart | 2 +- lib/common/preferences.dart | 3 +- lib/common/request.dart | 9 +- lib/common/string.dart | 10 + lib/common/system.dart | 2 +- lib/common/tray.dart | 99 +- lib/common/utils.dart | 11 +- lib/common/window.dart | 15 +- lib/common/yaml.dart | 18 + lib/controller.dart | 85 +- lib/core/controller.dart | 9 +- lib/core/interface.dart | 10 +- lib/core/service.dart | 1 + lib/enum/enum.dart | 28 +- lib/features/features.dart | 1 + lib/features/overwrite/overwrite.dart | 1 + lib/features/overwrite/rule.dart | 303 ++++++ lib/l10n/intl/messages_en.dart | 115 ++- lib/l10n/intl/messages_ja.dart | 98 +- lib/l10n/intl/messages_ru.dart | 121 ++- lib/l10n/intl/messages_zh_CN.dart | 92 +- lib/l10n/l10n.dart | 289 +++++- lib/main.dart | 8 +- lib/manager/core_manager.dart | 4 +- lib/manager/manager.dart | 2 +- lib/manager/message_manager.dart | 151 --- lib/manager/status_manager.dart | 262 +++++ lib/manager/tray_manager.dart | 24 +- lib/manager/vpn_manager.dart | 21 +- lib/models/app.dart | 2 + lib/models/clash_config.dart | 17 +- lib/models/common.dart | 51 +- lib/models/config.dart | 44 +- lib/models/generated/app.freezed.dart | 58 +- .../generated/clash_config.freezed.dart | 22 +- lib/models/generated/config.freezed.dart | 177 ++-- lib/models/generated/config.g.dart | 30 +- lib/models/generated/profile.freezed.dart | 919 +++++++++++++++++- lib/models/generated/profile.g.dart | 58 ++ lib/models/generated/selector.freezed.dart | 624 +++++++++++- lib/models/generated/widget.freezed.dart | 374 ++++++- lib/models/profile.dart | 61 +- lib/models/selector.dart | 63 +- lib/models/widget.dart | 14 +- lib/pages/editor.dart | 268 ++--- lib/providers/app.dart | 93 +- lib/providers/config.dart | 42 +- lib/providers/generated/app.g.dart | 278 +++++- lib/providers/generated/config.g.dart | 85 +- lib/providers/generated/state.g.dart | 366 ++++++- lib/providers/state.dart | 121 ++- lib/state.dart | 485 +++++---- lib/views/about.dart | 21 +- lib/views/access.dart | 847 +++++++--------- lib/views/application_setting.dart | 21 +- lib/views/backup_and_recovery.dart | 266 ++--- lib/views/config/added_rules.dart | 172 ++++ lib/views/config/advanced.dart | 90 ++ lib/views/config/config.dart | 108 +- lib/views/config/dns.dart | 375 +++---- lib/views/config/general.dart | 35 +- lib/views/config/network.dart | 112 +-- lib/views/{profiles => config}/scripts.dart | 180 ++-- lib/views/connection/connections.dart | 10 +- lib/views/connection/item.dart | 50 +- lib/views/connection/requests.dart | 60 +- lib/views/dashboard/dashboard.dart | 4 +- .../dashboard/widgets/network_detection.dart | 4 +- .../dashboard/widgets/quick_options.dart | 4 +- lib/views/developer.dart | 102 +- lib/views/hotkey.dart | 149 +-- lib/views/logs.dart | 118 +-- .../profiles/{add_profile.dart => add.dart} | 0 .../profiles/{edit_profile.dart => edit.dart} | 0 .../{override_profile.dart => override.dart} | 18 +- lib/views/profiles/overwrite.dart | 581 +++++++++++ lib/views/profiles/profiles.dart | 362 +++---- lib/views/proxies/common.dart | 2 +- lib/views/proxies/list.dart | 31 +- lib/views/proxies/proxies.dart | 63 +- lib/views/proxies/setting.dart | 3 +- lib/views/proxies/tab.dart | 88 +- lib/views/theme.dart | 490 +++++----- lib/views/tools.dart | 126 ++- lib/widgets/animated_cross_slide.dart | 279 ++++++ lib/widgets/card.dart | 35 +- lib/widgets/donut_chart.dart | 95 +- lib/widgets/effect.dart | 21 +- lib/widgets/fade_box.dart | 11 +- lib/widgets/icon.dart | 40 +- lib/widgets/input.dart | 564 +++++++---- lib/widgets/line_chart.dart | 227 +++-- lib/widgets/list.dart | 278 ++++-- lib/widgets/loading.dart | 95 ++ lib/widgets/null_status.dart | 223 ++++- lib/widgets/popup.dart | 156 ++- lib/widgets/scaffold.dart | 58 +- lib/widgets/setting.dart | 38 +- lib/widgets/sheet.dart | 51 +- lib/widgets/subscription_info_view.dart | 22 +- lib/widgets/super_grid.dart | 30 +- lib/widgets/theme.dart | 43 + lib/widgets/wave.dart | 32 +- lib/widgets/widgets.dart | 2 + macos/Podfile | 3 + macos/Podfile.lock | 10 +- plugins/tray_manager | 1 + pubspec.lock | 171 ++-- pubspec.yaml | 30 +- 156 files changed, 9931 insertions(+), 3954 deletions(-) rename assets/images/{avatars => avatar}/arue.jpg (100%) rename assets/images/{avatars => avatar}/june2.jpg (100%) create mode 100644 assets/images/empty/connection.svg create mode 100644 assets/images/empty/data.svg create mode 100644 assets/images/empty/log.svg create mode 100644 assets/images/empty/profile.svg create mode 100644 assets/images/empty/proxy.svg create mode 100644 assets/images/empty/rule.svg create mode 100644 assets/images/empty/script.svg create mode 100644 assets/images/icon/status_1.ico create mode 100644 assets/images/icon/status_1.png create mode 100644 assets/images/icon/status_2.ico create mode 100644 assets/images/icon/status_2.png create mode 100644 assets/images/icon/status_3.ico create mode 100644 assets/images/icon/status_3.png delete mode 100644 assets/images/icon_black.ico delete mode 100644 assets/images/icon_black.png delete mode 100644 assets/images/icon_white.ico delete mode 100644 assets/images/icon_white.png create mode 100644 lib/common/yaml.dart create mode 100644 lib/features/features.dart create mode 100644 lib/features/overwrite/overwrite.dart create mode 100644 lib/features/overwrite/rule.dart delete mode 100644 lib/manager/message_manager.dart create mode 100644 lib/manager/status_manager.dart create mode 100644 lib/views/config/added_rules.dart create mode 100644 lib/views/config/advanced.dart rename lib/views/{profiles => config}/scripts.dart (51%) rename lib/views/profiles/{add_profile.dart => add.dart} (100%) rename lib/views/profiles/{edit_profile.dart => edit.dart} (100%) rename lib/views/profiles/{override_profile.dart => override.dart} (98%) create mode 100644 lib/views/profiles/overwrite.dart create mode 100644 lib/widgets/animated_cross_slide.dart create mode 100644 lib/widgets/loading.dart create mode 100644 lib/widgets/theme.dart create mode 160000 plugins/tray_manager diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8723a5c..587f198 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -22,7 +22,7 @@ jobs: os: ubuntu-22.04 arch: amd64 - platform: macos - os: macos-13 + os: macos-15-intel arch: amd64 - platform: macos os: macos-latest @@ -64,22 +64,25 @@ jobs: cache-dependency-path: | core/go.sum - - name: Setup Flutter Master - if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm') - uses: subosito/flutter-action@v2 - with: - channel: 'master' - cache: true - name: Setup Flutter if: ${{ !(startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')) }} uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: stable + flutter-version: 3.35.7 + cache: true + - name: Setup Flutter With Other + if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm') + uses: subosito/flutter-action@v2 + with: + channel: master + flutter-version: 3.35.7 cache: true - # flutter-version: 3.29.3 - name: Get Flutter Dependency - run: flutter pub get + run: | + flutter --version + flutter pub get - name: Setup run: dart setup.dart ${{ matrix.platform }} ${{ matrix.arch && format('--arch {0}', matrix.arch) }} ${{ env.IS_STABLE == 'true' && '--env stable' || '' }} @@ -104,34 +107,26 @@ jobs: - name: Generate if: ${{ env.IS_STABLE == 'true' }} run: | - tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate)) - preTag=$(grep -oP '^## \K.*' CHANGELOG.md | head -n 1) - currentTag="" - for ((i = 0; i <= ${#tags[@]}; i++)); do - if (( i < ${#tags[@]} )); then - tag=${tags[$i]} - else - tag="" - fi - if [ -n "$currentTag" ]; then - if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then - break - fi - fi - if [ -n "$currentTag" ]; then - echo "## $currentTag" >> NEW_CHANGELOG.md - echo "" >> NEW_CHANGELOG.md - if [ -n "$tag" ]; then - git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md - else - git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md - fi - echo "" >> NEW_CHANGELOG.md - fi - currentTag=$tag + last_ver=$(grep -m1 '^## ' CHANGELOG.md 2>/dev/null | sed 's/^## //') + + tags=($(git tag --merged HEAD --sort=-creatordate)) + + temp="NEW_CHANGELOG.md" > "$temp" + + for i in "${!tags[@]}"; do + curr="${tags[i]}" + [[ "$curr" == "$last_ver" ]] && break + + prev="${tags[i+1]}" + range="${prev:+$prev..}$curr" + + echo -e "## $curr\n" >> "$temp" + git log --no-merges --pretty=format:"%B" "$range" | \ + awk '!/Update changelog/ && NF {print "- " $0 "\n"}' >> "$temp" done - cat CHANGELOG.md >> NEW_CHANGELOG.md - cat NEW_CHANGELOG.md > CHANGELOG.md + [ -f CHANGELOG.md ] && cat CHANGELOG.md >> "$temp" + + mv "$temp" CHANGELOG.md - name: Commit if: ${{ env.IS_STABLE == 'true' }} @@ -181,31 +176,24 @@ jobs: - name: Generate release.md run: | - tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate)) - preTag=$(curl --silent "https://api.github.com/repos/chen08209/FlClash/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")' || echo "") - currentTag="" - for ((i = 0; i <= ${#tags[@]}; i++)); do - if (( i < ${#tags[@]} )); then - tag=${tags[$i]} - else - tag="" - fi - if [ -n "$currentTag" ]; then - if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then - break - fi - fi - if [ -n "$currentTag" ]; then - if [ -n "$tag" ]; then - git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md - else - git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md - fi - echo "" >> release.md - fi - currentTag=$tag + tags=($(git tag --merged HEAD --sort=-creatordate)) + preTag=$(curl -s "https://api.github.com/repos/chen08209/FlClash/releases/latest" | \ + sed -nE 's/.*"tag_name": "([^"]+)".*/\1/p') + + [ -z "$preTag" ] && preTag="" + + out="release.md" > "$out" + + for i in "${!tags[@]}"; do + curr="${tags[i]}" + [[ "$curr" == "$preTag" ]] && break + + prev="${tags[i+1]}" + range="${prev:+$prev..}$curr" + + git log --no-merges --pretty=format:"%B" "$range" | \ + awk '!/Update changelog/ && NF {print "- " $0 "\n"}' >> "$out" done - - name: Push to telegram env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} diff --git a/.gitmodules b/.gitmodules index cfcef0a..70bf7cd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,5 +6,9 @@ path = plugins/flutter_distributor url = git@github.com:chen08209/flutter_distributor.git branch = FlClash +[submodule "plugins/tray_manager"] + path = plugins/tray_manager + url = git@github.com:chen08209/tray_manager.git + branch = main diff --git a/android/app/src/main/kotlin/com/follow/clash/State.kt b/android/app/src/main/kotlin/com/follow/clash/State.kt index 7eef285..cb5be3e 100644 --- a/android/app/src/main/kotlin/com/follow/clash/State.kt +++ b/android/app/src/main/kotlin/com/follow/clash/State.kt @@ -54,13 +54,17 @@ object State { suspend fun handleSyncState() { runLock.withLock { - Service.bind() - runTime = Service.getRunTime() - val runState = when (runTime == 0L) { - true -> RunState.STOP - false -> RunState.START + try { + Service.bind() + runTime = Service.getRunTime() + val runState = when (runTime == 0L) { + true -> RunState.STOP + false -> RunState.START + } + runStateFlow.tryEmit(runState) + } catch (_: Exception) { + runStateFlow.tryEmit(RunState.STOP) } - runStateFlow.tryEmit(runState) } } @@ -92,8 +96,9 @@ object State { } fun handleStartService() { + val appPlugin = flutterEngine?.plugin() if (appPlugin != null) { - appPlugin?.requestNotificationsPermission { + appPlugin.requestNotificationsPermission { startService() } return @@ -159,10 +164,7 @@ object State { if (servicePlugin == null) { return@launch } - val options = servicePlugin?.handleGetVpnOptions() - if (options == null) { - return@launch - } + val options = servicePlugin?.handleGetVpnOptions() ?: return@launch appPlugin?.prepare(options.enable) { runTime = Service.startService(options, runTime) runStateFlow.tryEmit(RunState.START) diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml index 1ee1f3a..cc39282 100644 --- a/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,25 +1,25 @@ - - - - - + android:width="108dp" + android:height="108dp" + android:viewportWidth="240" + android:viewportHeight="240"> + + + + + + - diff --git a/android/service/src/main/java/com/follow/clash/service/CommonService.kt b/android/service/src/main/java/com/follow/clash/service/CommonService.kt index de4d920..4f680d0 100644 --- a/android/service/src/main/java/com/follow/clash/service/CommonService.kt +++ b/android/service/src/main/java/com/follow/clash/service/CommonService.kt @@ -50,7 +50,11 @@ class CommonService : Service(), IBaseService, } override fun start() { - loader.load() + try { + loader.load() + } catch (_: Exception) { + stop() + } } override fun stop() { diff --git a/android/service/src/main/java/com/follow/clash/service/VpnService.kt b/android/service/src/main/java/com/follow/clash/service/VpnService.kt index 2194d32..883064a 100644 --- a/android/service/src/main/java/com/follow/clash/service/VpnService.kt +++ b/android/service/src/main/java/com/follow/clash/service/VpnService.kt @@ -234,9 +234,13 @@ class VpnService : SystemVpnService(), IBaseService, } override fun start() { - loader.load() - State.options?.let { - handleStart(it) + try { + loader.load() + State.options?.let { + handleStart(it) + } + } catch (_: Exception) { + stop() } } diff --git a/arb/intl_en.arb b/arb/intl_en.arb index 0a77a23..8c93cdf 100644 --- a/arb/intl_en.arb +++ b/arb/intl_en.arb @@ -340,6 +340,8 @@ "none": "none", "basicConfig": "Basic configuration", "basicConfigDesc": "Modify the basic configuration globally", + "advancedConfig": "Advanced configuration", + "advancedConfigDesc": "Provide diverse configuration options", "selectedCountTitle": "{count} items have been selected", "addRule": "Add rule", "ruleName": "Rule name", @@ -390,7 +392,7 @@ "existsTip": "Current {label} already exists", "deleteTip": "Are you sure you want to delete the current {label}?", "deleteMultipTip": "Are you sure you want to delete the selected {label}?", - "nullTip": "No {label} at the moment", + "nullTip": "No {label} yet", "script": "Script", "color": "Color", "rename": "Rename", @@ -434,5 +436,35 @@ "crashlytics": "Crash Analysis", "crashlyticsTip": "When enabled, automatically uploads crash logs without sensitive information when the app crashes", "appendSystemDns": "Append System DNS", - "appendSystemDnsTip": "Forcefully append system DNS to the configuration" + "appendSystemDnsTip": "Forcefully append system DNS to the configuration", + "editRule": "Edit rule", + "overrideMode": "Override mode", + "standardModeDesc": "Standard mode, override basic configuration, provide simple rule addition capability", + "scriptModeDesc": "Script mode, use external extension scripts, provide one-click override configuration capability", + "addedRules": "Added rules", + "controlGlobalAddedRules": "Control global added rules", + "overrideScript": "Override script", + "goToConfigureScript": "Go to configure script", + "editGlobalRules": "Edit global rules", + "externalFetch": "External fetch", + "confirmForceCrashCore": "Are you sure you want to force crash the core?", + "confirmClearAllData": "Are you sure you want to clear all data?", + "loading": "Loading...", + "loadTest": "Load test", + "yearsAgo": "{count, plural, =1{1 year ago} other{{count} years ago}}", + "monthsAgo": "{count, plural, =1{1 month ago} other{{count} months ago}}", + "daysAgo": "{count, plural, =1{1 day ago} other{{count} days ago}}", + "hoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "minutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "justNow": "Just now", + "noLongerRemind": "Don't remind again", + "accessControlSettings": "Access Control Settings", + "turnOn": "Turn On", + "turnOff": "Turn Off", + "coreConfigChangeDetected": "Core configuration change detected", + "reload": "Reload", + "vpnConfigChangeDetected": "VPN configuration change detected", + "restart": "Restart", + "speedStatistics": "Speed statistics", + "resetPageChangesTip": "The current page has changes. Are you sure you want to reset?" } \ No newline at end of file diff --git a/arb/intl_ja.arb b/arb/intl_ja.arb index 17eb030..f9b7ff4 100644 --- a/arb/intl_ja.arb +++ b/arb/intl_ja.arb @@ -340,6 +340,8 @@ "none": "なし", "basicConfig": "基本設定", "basicConfigDesc": "基本設定をグローバルに変更", + "advancedConfig": "高度な設定", + "advancedConfigDesc": "多様な設定を提供", "selectedCountTitle": "{count} 項目が選択されています", "addRule": "ルールを追加", "ruleName": "ルール名", @@ -391,7 +393,7 @@ "existsTip": "現在の{label}は既に存在しています", "deleteTip": "現在の{label}を削除してもよろしいですか?", "deleteMultipTip": "選択された{label}を削除してもよろしいですか?", - "nullTip": "現在{label}はありません", + "nullTip": "まだ{label}はありません", "script": "スクリプト", "color": "カラー", "rename": "リネーム", @@ -435,5 +437,35 @@ "crashlytics": "クラッシュ分析", "crashlyticsTip": "有効にすると、アプリがクラッシュした際に機密情報を含まないクラッシュログを自動的にアップロードします", "appendSystemDns": "システムDNSを追加", - "appendSystemDnsTip": "設定にシステムDNSを強制的に追加します" + "appendSystemDnsTip": "設定にシステムDNSを強制的に追加します", + "editRule": "ルールを編集", + "overrideMode": "上書きモード", + "standardModeDesc": "標準モード、基本設定を上書きし、シンプルなルール追加機能を提供", + "scriptModeDesc": "スクリプトモード、外部拡張スクリプトを使用し、ワンクリックで設定を上書きする機能を提供", + "addedRules": "追加ルール", + "controlGlobalAddedRules": "グローバル追加ルールを制御", + "overrideScript": "上書きスクリプト", + "goToConfigureScript": "スクリプト設定に移動", + "editGlobalRules": "グローバルルールを編集", + "externalFetch": "外部取得", + "confirmForceCrashCore": "コアを強制的にクラッシュさせてもよろしいですか?", + "confirmClearAllData": "すべてのデータをクリアしてもよろしいですか?", + "loading": "読み込み中...", + "loadTest": "読み込みテスト", + "yearsAgo": "{count}年前", + "monthsAgo": "{count}ヶ月前", + "daysAgo": "{count}日前", + "hoursAgo": "{count}時間前", + "minutesAgo": "{count}分前", + "justNow": "たった今", + "noLongerRemind": "今後表示しない", + "accessControlSettings": "アクセス制御設定", + "turnOn": "オン", + "turnOff": "オフ", + "coreConfigChangeDetected": "コア設定の変更が検出されました", + "reload": "リロード", + "vpnConfigChangeDetected": "VPN設定の変更が検出されました", + "restart": "再起動", + "speedStatistics": "速度統計", + "resetPageChangesTip": "現在のページに変更があります。リセットしてもよろしいですか?" } \ No newline at end of file diff --git a/arb/intl_ru.arb b/arb/intl_ru.arb index 1920370..433ed57 100644 --- a/arb/intl_ru.arb +++ b/arb/intl_ru.arb @@ -340,6 +340,8 @@ "none": "Нет", "basicConfig": "Базовая конфигурация", "basicConfigDesc": "Глобальное изменение базовых настроек", + "advancedConfig": "Расширенная конфигурация", + "advancedConfigDesc": "Предоставляет разнообразные варианты конфигурации", "selectedCountTitle": "Выбрано {count} элементов", "addRule": "Добавить правило", "ruleName": "Название правила", @@ -391,7 +393,7 @@ "existsTip": "Текущий {label} уже существует", "deleteTip": "Вы уверены, что хотите удалить текущий {label}?", "deleteMultipTip": "Вы уверены, что хотите удалить выбранные {label}?", - "nullTip": "Сейчас {label} нет", + "nullTip": "{label} пока отсутствуют", "script": "Скрипт", "color": "Цвет", "rename": "Переименовать", @@ -435,5 +437,35 @@ "crashlytics": "Анализ сбоев", "crashlyticsTip": "При включении автоматически загружает журналы сбоев без конфиденциальной информации, когда приложение выходит из строя", "appendSystemDns": "Добавить системный DNS", - "appendSystemDnsTip": "Принудительно добавить системный DNS к конфигурации" + "appendSystemDnsTip": "Принудительно добавить системный DNS к конфигурации", + "editRule": "Редактировать правило", + "overrideMode": "Режим переопределения", + "standardModeDesc": "Стандартный режим, переопределение базовой конфигурации, предоставление возможности простого добавления правил", + "scriptModeDesc": "Режим скрипта, использование внешних расширяющих скриптов, предоставление возможности переопределения конфигурации одним кликом", + "addedRules": "Добавленные правила", + "controlGlobalAddedRules": "Управление глобальными добавленными правилами", + "overrideScript": "Скрипт переопределения", + "goToConfigureScript": "Перейти к настройке скрипта", + "editGlobalRules": "Редактировать глобальные правила", + "externalFetch": "Внешнее получение", + "confirmForceCrashCore": "Вы уверены, что хотите принудительно аварийно завершить работу ядра?", + "confirmClearAllData": "Вы уверены, что хотите очистить все данные?", + "loading": "Загрузка...", + "loadTest": "Тест загрузки", + "yearsAgo": "{count, plural, one{{count} год назад} few{{count} года назад} many{{count} лет назад} other{{count} года назад}}", + "monthsAgo": "{count, plural, one{{count} месяц назад} few{{count} месяца назад} many{{count} месяцев назад} other{{count} месяца назад}}", + "daysAgo": "{count, plural, one{{count} день назад} few{{count} дня назад} many{{count} дней назад} other{{count} дня назад}}", + "hoursAgo": "{count, plural, one{{count} час назад} few{{count} часа назад} many{{count} часов назад} other{{count} часа назад}}", + "minutesAgo": "{count, plural, one{{count} минута назад} few{{count} минуты назад} many{{count} минут назад} other{{count} минуты назад}}", + "justNow": "Только что", + "noLongerRemind": "Больше не напоминать", + "accessControlSettings": "Настройки контроля доступа", + "turnOn": "Включить", + "turnOff": "Выключить", + "coreConfigChangeDetected": "Обнаружено изменение конфигурации ядра", + "reload": "Перезагрузить", + "vpnConfigChangeDetected": "Обнаружено изменение конфигурации VPN", + "restart": "Перезапустить", + "speedStatistics": "Статистика скорости", + "resetPageChangesTip": "На текущей странице есть изменения. Вы уверены, что хотите сбросить?" } \ No newline at end of file diff --git a/arb/intl_zh_CN.arb b/arb/intl_zh_CN.arb index 71ccab0..abba2bc 100644 --- a/arb/intl_zh_CN.arb +++ b/arb/intl_zh_CN.arb @@ -340,6 +340,8 @@ "none": "无", "basicConfig": "基本配置", "basicConfigDesc": "全局修改基本配置", + "advancedConfig": "进阶配置", + "advancedConfigDesc": "提供多样化配置", "selectedCountTitle": "已选择 {count} 项", "addRule": "添加规则", "ruleName": "规则名称", @@ -435,5 +437,35 @@ "crashlytics": "崩溃分析", "crashlyticsTip": "开启后,应用崩溃时自动上传不包含敏感信息的崩溃日志", "appendSystemDns": "追加系统DNS", - "appendSystemDnsTip": "强制为配置附加系统DNS" + "appendSystemDnsTip": "强制为配置附加系统DNS", + "editRule": "编辑规则", + "overrideMode": "覆写模式", + "standardModeDesc": "标准模式,覆写基本配置,提供简单追加规则能力", + "scriptModeDesc": "脚本模式,使用外部扩展脚本,提供一键覆写配置的能力", + "addedRules": "附加规则", + "controlGlobalAddedRules": "控制全局附加规则", + "overrideScript": "覆写脚本", + "goToConfigureScript": "前往配置脚本", + "editGlobalRules": "编辑全局规则", + "externalFetch": "外部获取", + "confirmForceCrashCore": "确定要强制崩溃核心?", + "confirmClearAllData": "确定要清除所有数据?", + "loading": "加载中...", + "loadTest": "加载测试", + "yearsAgo": "{count} 年前", + "monthsAgo": "{count} 个月前", + "daysAgo": "{count} 天前", + "hoursAgo": "{count} 小时前", + "minutesAgo": "{count} 分钟前", + "justNow": "刚刚", + "noLongerRemind": "不再提示", + "accessControlSettings": "访问控制设置", + "turnOn": "开启", + "turnOff": "关闭", + "coreConfigChangeDetected": "检测到核心配置更改", + "reload": "重载", + "vpnConfigChangeDetected": "检测到VPN相关配置改动", + "restart": "重启", + "speedStatistics": "网速统计", + "resetPageChangesTip": "当前页面存在更改,确定重置吗?" } diff --git a/assets/images/avatars/arue.jpg b/assets/images/avatar/arue.jpg similarity index 100% rename from assets/images/avatars/arue.jpg rename to assets/images/avatar/arue.jpg diff --git a/assets/images/avatars/june2.jpg b/assets/images/avatar/june2.jpg similarity index 100% rename from assets/images/avatars/june2.jpg rename to assets/images/avatar/june2.jpg diff --git a/assets/images/empty/connection.svg b/assets/images/empty/connection.svg new file mode 100644 index 0000000..820ba33 --- /dev/null +++ b/assets/images/empty/connection.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/data.svg b/assets/images/empty/data.svg new file mode 100644 index 0000000..6f46e0c --- /dev/null +++ b/assets/images/empty/data.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/log.svg b/assets/images/empty/log.svg new file mode 100644 index 0000000..92aa3a0 --- /dev/null +++ b/assets/images/empty/log.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/profile.svg b/assets/images/empty/profile.svg new file mode 100644 index 0000000..487f4db --- /dev/null +++ b/assets/images/empty/profile.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/proxy.svg b/assets/images/empty/proxy.svg new file mode 100644 index 0000000..bcb9019 --- /dev/null +++ b/assets/images/empty/proxy.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/rule.svg b/assets/images/empty/rule.svg new file mode 100644 index 0000000..e9f25a1 --- /dev/null +++ b/assets/images/empty/rule.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/empty/script.svg b/assets/images/empty/script.svg new file mode 100644 index 0000000..d366c98 --- /dev/null +++ b/assets/images/empty/script.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/icon/status_1.ico b/assets/images/icon/status_1.ico new file mode 100644 index 0000000000000000000000000000000000000000..6dfddbca10a87bedb9e43d811713bcc893223c59 GIT binary patch literal 4286 zcmbuCe{9@k9mk(*yR~b}+F4Lya4jZw8wA;pW@ro+W$X{4Bq|7*)eK6n*WO@`KXfs1 zKP=JUjB(;3@CO-DmZAu>-4$bGX%R_)gp80G=1 z+$Pt&`hD(sp6}=Vc|OnQ`EkaC_-kk|`fs{xjrpuGW+hN%?gG{OAKL1wW|*nCw*PKA zX)@_#iJMAX2lZ|`ehb{{msOWelw{M1YcqO<-ma4{t`jeT26S5B8Tc2x4{yR7@D98M z&q7Pkw>E7&-9Z9U})Gy8HD0d#`s- zo>)TLui5EA>Gbm(t46w8_JIo%a0p+% zls$R+M*6%6>TBPV4b7Qs8fg^!s6FWSXP$N(Qh0GTz+*HWsq^EOX0T%*{*9&4uHR#vTF1OFrwp2xDFZzRMR5ZnpYs(02-a zn55hae!Du$2PpGxq!Jp3Y|3`@;%M3w<^y%oz6F%y>Zct3x!#wZ!jJpvBW9vM5<=@< z=z&A9^-On56%=+Q28x64gW_PXuHDS;b zcfm(+87{&raA$A(>e9Z*n%TY!6=VxGf^17e`@_v(^|i0r`1BH!C3f#ZL)wesFW}8% zl<&WT75$Gjh5DmS3&~rJN;LXF`g!;Pn9-RyDCbqL9Mzt~T1fh~ur2*c_y^3_*Y{}{ zf*->TvB+BU`j)wVDA!~&uq_Q~Ju^0=y_E7`P^b9Z0kh+XMX}e>BpT>WV zd?&VL-Qrku-K-52WE0lII7nZbONsMxo=1W@ax=;InXy{~ec0-YuC2zl#u$fUKB)d2 zMEV|CJtq#DPxt~lntSP^iB>wklCl%j9cJIC(>XiU-fpJC;o4j{d_O#v54V3c8`)CU z+qt?C`%l9d6!YV4+LnSHf*pSyI)?)-2c4A*>7S4FNq-5t`(O$@7=yi+!ySz;Jbr80 z!OpeK*zbV}nD56s)YZZj_2&9#4*vH7RmSbu5%^U}W)&V$u1eCDWsi#hqO z*Y?x$*P^%Ih-MUi3*SSxV*XmhuI50wZTEmd_9f+h2d- z(0X|TzJ(7J7h=5{V>Q^Z%l;mnd72k}qyst=ZEh+)JN&aVIQw&vh{-+tu>ANu{0tl@ z=7Z|b!T$WCZH?pS&MNjVgS4fgv)-!7!}noZcbbmu@geRXbN5*4rC$ZQciJ3P{~eqk{#_uG9Gdmn z-yhrC7o)uq{tllM@nbx{dGngg*r`TrbwTy~JB>9;n|#n6QFq0{`)5C~*uZ_hLO!_M z)%5X})tRX$wwZj(50|3d3Lk*-urMC!TwB|UGoH5yo8&?9-vaaQ-`W%GTxi}D3$0Df zkLH%h4o{h zXOi}!TRy<1UR<9wyM+}Xaod| z?yiBIgI&Ao2g`TWIOPMSK8sDrDf21iDe9eHn3};ZQ#!bN!0aAysoZYLov)j6w`Nxj Pwwuw|Ic-YO1hoGPHHWgY literal 0 HcmV?d00001 diff --git a/assets/images/icon/status_1.png b/assets/images/icon/status_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca5aa7f0d0dd7fecbcaad3138e20c7dec2f9e79 GIT binary patch literal 4231 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 d9N++K{1*~eYVKe{$002ovPDHLkV1jG$#Z~|S literal 0 HcmV?d00001 diff --git a/assets/images/icon/status_2.ico b/assets/images/icon/status_2.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd92791f60da0892983cf7e1cc4dcc9c36250b75 GIT binary patch literal 4286 zcmb`Jdu&tJ9mkK8KtdiQEX`I`ZAd3A5UQ=b1goZwPNmgUwUfGs#AwtNXc7}cS@*|= zCbht*HZi0off5{`3`PJ43gm$Uj8~la700hQcKk>xdFwVt%dma@xYzf_KKq`V*fJV7LS^ii5;eA#KYJ>WGE9qGUO#c(mz_GUvf2n+Co4ce`>f!`15dm z^2D$@dE7h%7kl!kX%P80MYYK+wi}1w&>iDxG`-Ib$3E`AQ5>5`&tnwwCap*i`&E>m;ukNegF3sBjvbvfN0X9I5{7{BuQjyEd%7 ztNHnhch0}|nAC1x0Ea)K1}QjD@qnI+ZTd;EMXwZFhDyNPH#>7Cs&x>)+fEWajw=3= zy@S7K6Ho^V2g+-#Avp93r>(31sd=U3uBQGF2m>D6`d8P6Z%K!pkHeu8eG$%a5Tq8p zT51`rlHee<+?vxPaoIr`N_Yr~ekX-PIMHWU^4+$1e2-neJa+l5O#TYw2Xh<*>~8_`d3G`K3HqV{ z4obWe5$1q82vX~i>hFgT7Xc+>&;+SqLu2^(CB_$}A|_)Qmu z1BHV&an-p99`ZHX=G8>oyh_pEylM&92wv)Gc(z2k)jaRs`8SJ^uejUwV0K1irY|Z` z2lhN<-iv)wn@u6L8A)6>#;A!6jQQiYk$=+_ieGoFkKb@*njpwyya0S41>)c$c)qu3 zd48XAMfTd+cI3WjH@*y)(6oa*K0J+ag2aa0V5~kiI3~e?q8`0)SP;88osSHbJs+F{ z^dY{$|E*w2|Mu02e%0#P;_)1q7{z!V`ownBfc3>e!yACaM%;>+!L5$z-4qUKIH+Pe z7m45Y$Zer*mR}710v^t1|EEC!{1Q}Yl`F}WZ4Y`RJM<)}hJ)JJ42LxOf;p%YhldrM z$+IwO^620|QHv02u@+?SL#sl2TURrOcYz3Ib703LFbH1PZd)~9t6G(9gY6`bm>6r4 z9me}`py(4F`lBpr8Ly5Gk9*)iV@A(J+~BE>8>jC*(?B2E>Qk*OMceEiC&63}>^KLM zeVdm*PzTJF1Uvv3;`&$UI)`0tfWoJlZe**l9HojA-QPmY= zT&PFR2$%xQgT0$OdK$h%uH?KA!U^P`Fjr&!FaZY&2akBnR2_5r%A!u6j zYxwq~EdO~B1)1#Jt%T!x^vRED!*2?^RnI<-OcnSL`~xU2=C>(U+ z$L56z&!mDI^{F|hkD?CgsLk6P@4d$I7lF%jy1Mr}zLkRgV1C~$F zW&yVAKsQK$+49*j_H1}SGk)_mK%^NDzROAy=dA0ojtU89*gDGM7dkC9fN-7w2~B>g zfWtmGP}G4rXgPS$LlU3ZO0kaWW$P%^ zf?^%DKXuBeNS?LG?MFO*0_r%Ae`3Y~ec^kbbNUN_e2t`35^2*W=J5phEeL|S9N2LV zoS158s7+j*D8f4GJl0WEIA;x@FP4F9A8}qkN$TM+?pMJ<1W= z7z(ugZEysHz<=}5re6PHDb|xefAXa@ zy%gj|KCmD1OcG9Zn5e>5ozoZcdx7zxmyHh?r`BM;sE(Q4l`*6Hv6$KS4eqaz0^H}5 z$leP+1MC@P<;?S%-IXKR4zJ$YYd4cEDJT z@!G=XEP39f^7=vV{uFD79Z{pVJUZykw)Ma4MBF|ScKh>CgBs4|ub0PahgUZ}XJOu! z=Wg8p^cv;}@;71~Rq_AI&vlQD`bl)upNILXENb^v<5|GmJ-#$Hy@pvBHM{eomIv1^ zxxb%npN7jR-L0T$LUv6NvQ8jmak!|WJow$x!r;#8!U17%{+@w#d-e|O((T>7SXa2a zJXko8FEgJgf(0`9*fJIee@Du7dr7`-&j8so5XQlsq%in>QW!4ZU5>WbA!ApXw literal 0 HcmV?d00001 diff --git a/assets/images/icon/status_2.png b/assets/images/icon/status_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa7e67d3cba83bbfe1f3808383d519d7009fc98 GIT binary patch literal 7151 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 literal 0 HcmV?d00001 diff --git a/assets/images/icon/status_3.ico b/assets/images/icon/status_3.ico new file mode 100644 index 0000000000000000000000000000000000000000..4de1cee886658c8f301daf9932ce7bab44df7d72 GIT binary patch literal 4286 zcmbW4X>3$g7>3W#LQ4y66;Wf9Rucz$g+k(I_Ga#jU0HPRHlHy=Ry z-&w9P0sgA0jDAgfg)t`@W2OOF<}y&e_fR&ebeQ3cWBVOyjT@)6XN((*Pjq5EmAub_ zvt80Dfl*;AHIZM*b1M(c6bg{r^<=N$Kd0CSkGVVM0?EP zmaPG7O@}u44jf3s2W~8J%TV*DRq3WLPEAF7FDGvU90t|d1y8_qH@Yn#TgURa)TeDJ zL|``zfpo=tZmf684_huS-uud}=kM*f?TS6G&pjd4^3iz89)px$Pj%HcjJ?vM@nNvF zM`LZ=*7#)FX)Fi8>h_V|>_&TQe%^R(>E8Cbwa^Fsu#gT)`!Ptm3$DVql6@~PGU#0oe?vNp)xW*C*rZ~KV(MPuw^3X9AzSPH ze&v+c_<+V-zS{9VM0zE<70kDBp4upF5zNxHKD_i($GpIv4fEv##E+xx3b11#o6l)3 zG{4yo>&LjOx2x}A(0IvbwF{#?R&%1~&nT@FRYEnaezVZ!9qV-QfUQ*T5#&21|c!uPcR2JteTAc#;nq z2fKEpp*7{z_4*$3*4g9aNn2>XHGW>5uErYE)i^uQ-8g$H%!8{o1=FhWf?YE^LjR#aF4XA=|LFEVGO0Xsjdg3zp22$`BY=lcT*Uu>E z4A0Ee&6SWXw66ATOGEp^>B{%fo@K{}HP$oU#t0hH9tW>LdKCNk|7n=oeRoZuJ5rNN z-i|>D8l5107j6gBAA47OoMK-2ic#%3S__^nY)iic-ht8j`hN&^!96g!D?H1*wRof- z!*lHQRko!et!D>f?@7B15`Lb>{(Q*vqbq{Fh8p>BFAPF1AC%`nFWk_zc=oui$n1;_ zC1exkzyXlHG|M<6rtseB=MkIw|H#@<+fHnCMrKXGw)(gm^7)|r-yz(&V8)1X@b{O~ z(9zsWf2XuLr>2ok`guEulSzup!TNeL7z$N5q0r56w;QUz@KAVh;pWB})!2Uq_Cr2D zKBTM+ zXg@w7uL7*RjlmrHBgTIh<8+#H?`nhA95?{dwhWQ}4(>~bmP~4oOfO+ys6*#7a6x`( zZ7$suJlDLHwH|aA@aJ0lPiFi{PXrr(ij6tW{ZC8(68HnGcJ|vLe>-z>V>EHvI@y<>t_RtU`)?a^{r>%VL1=QqYM<_HA>fkeQA)g;wFI(X{d?)cSV zI@R{M?uM^{w56f5-m|M8-34?fAW!jO?;nTQ8@N04;KPyqkhoNA2C#h&JP!xq-~8xu z?zoQrC+1>XcbbO7+>f$t4*S4d4BvTm@3d!x>aU=#cNef{lInZ=V}1QNw6BJ@;cy;5 z4miODGu>4mRbwj(6Ldez^-yN-zUxV6-#@$g|4KI+FScvR^Wo;{#Mlz!EV{D{?S=3a zC=Rp7;|C`coSJ&(;8~ z{{Bp$qdq5nzUHmG=V2b-85O+$huXh4(YLktjqROT-npr}182CGE>oGl(U0Xx_m!v9 zO@Z`~F)LkTY6py|>?^J)PhK#gD7kD(QGB4XpgCUK9F4C`M4KuTMNQ?&qIiMFI1@+~ tdKB;$mB|)Uo`{-)M04CU$NR`!W{Q%Rnxek)rgCi8qOo$w6rc%c{{tem>D>ST literal 0 HcmV?d00001 diff --git a/assets/images/icon/status_3.png b/assets/images/icon/status_3.png new file mode 100644 index 0000000000000000000000000000000000000000..93db6d759e2bc1c6ddf8771173c6aa19280e1d48 GIT binary patch literal 4247 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 literal 0 HcmV?d00001 diff --git a/assets/images/icon_black.ico b/assets/images/icon_black.ico deleted file mode 100644 index 76cb61ce0360149e1b40489132f3249bafe08014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 zcmV-p51jA-00962000000096X08I}702TlM0EtjeM-2)Z3IG5A4M|8uQUCw}00001 z00;yC008!TVC?_^00D1uPE-NUqIa4A01pRAL_t(|+U=crn9k)I$3HXE%rM3}DTELu zyO1TNv^hc{tx_pkEGJwjN+KMjjgmG=B1aoX2ua!yEmTsLlBKZ^hB3^X=RI?st5c`) zd*9#oJkNW7?#tEHU*-8e@9$ae=lbrWIFm1((o(s$`HL17kmBmD~^V zCac)aK@M|7MK=4`#79h~rv))IGHkX`he?jb|24i*UxE@cc&2k2gV-3g_yuuP?G+lx5SmL-I-ofGYS*jiEph})66f{3ng}EFo7r`SaD3JXPfJmqZ#fjVuktkHin0E)w}k6-My0rs7B9d&-MQeo>0M zSfjD{vIO`@Dy>-%SZX)+SV1un%WD#-&-3inUi?VBO(7A?TPiSw%|?hHiO1z4$V-ZG zGb=+$?Zy_z<%zg=By$O~Ic$vhk=RW$5zZTGGJ#!2i64oNBM~$jQurJ1kYkDbKhs7ejfQ$WYe;I>No=8mNa~#O4362FQO8(MI}z0>#kh$T zhFx48q@qsVajA6wN9^p(8*4ZU*Gp74!%@}+fWG2l?5^0@KmCPvG-XVl@DkgXZL zjU49FTAcr#QI7lAVAXN&OS)51gmpqXH}a`fsokxNpo$3Vgd|$~1u(W=z$XWS}2{>})m>z-fnqngeYMOY^!tB>Ry ztLk_5sfFwuN$onLR_I;#yp5y0tG2O{+I2)(ExPV`8Ed$cQX;Gq(z(u9YsNp0ZTy2X zL|7;2)^*Q|)b6V^mDH{?&NAGZ@%M3zrF4?MeaDS|oh&AJTR;6|` zd7QIFSZ6e3ss+}JzeYB1a-pPlosq!+t1fwuvz*Qp6=9uGkAGQZ*RX+m#iz%4ey=TS zElcgz5m}wff4xP94M&*E7af$-jxglG^o>iUu`f-ovxh_2h3|lqzcJyIE}^hcSwWxt}{|M;%JX z-(j+WAv=H^=5e_PRl6BnszhJFX0m?cR(_0ZGS%Yp0$r#UPrHjNjIeM0f^HsIGghNN z%T8!vlgmc+rMV8W+GR~9dGuIu`p zQryW`Fhrwo zP3}(m*z6E`lZKspyy?1Efgx(I?@dX`NPD-0tu=G{IK&JOy6zQMXZ)2OE^axDvbC7B zo<`kzkMpqyUH6h{$!yQ3^%3r~^OEQ^ZJvVuz(5bW?$z|I0reiPv2g;VsPk_4;ztf# zwOs#Q$})iOeJw1vvc{;N2G)%3yY3ZHi^oU4S2Vt2<7Tj_`nZKxzq3MZ*W6k&Mht9b z24Y~7O=tTiKv5QimfH2A>)x5_&={P7%`!^cHwEqr;WB71&wJ2yuQa^^e$alD+wGeG zl>+YKouj@v?z`?4;wqMekjh$YqnmL505bw#d0@?$KqFob$-rix+Ok?l1wIR8@U}A2 zgRXm(c$h6Ao?FJ*SbBQB@4bGqm_`%VnYEH?4gNgjgX^a@n#&gASzqgSme9fVZF-8@ zIn2}G1=CJ7ku9XMI^y^_%8Ht>yzCQ;wFIHI=AMGZRXviqmI(Su|$(u_2 z4A=j~s*Ewhs&-a9^%kv2Cnl+FPbRs)OBo&KkXk5aGk|kFcsYMEJ&m!celp&=4JA^V z`dm#P#;VEiB9nQ7q1;9b^_%tLKvamfEHbD!NiPJ?NKgySWcC|mQjx`_BAZv7&ahBZ zyRp3vmL9{NP=c;THlUs&JqX;BLMz@e!kps&Uj=p%`P@>QiJGK#qmMPR0J!5c1{rKk zo6m5OFm}?pflrNYK)peIy@Z&Eq;_97ya9C{4~menaW+qoX|(tSX<%9ZW8f6}sIzmv z@v)byM9gSOqZ1!k(SZ6GBjx-bEp?fyeQMWfyy}5fWn58&o<6)X4lCwKAHwJ;$3!FV z`TjWOdQi|7SDdAOF}8@GtClg@`$t6$mRKYIE_L!RA(BQzB^FyEejdwcEsbfSqa@QT zk$*EoJg9AmGZJ|~>*w6gO&}(7jx?Z-o{IytYw|DOzmT@B4Q%3)3^jD7%O5eY$q*@H zqq~OA!rALkQppr{Dv73BkV8+I2P86*v;y`>3z z4H17g6YcE#5iVC5kpak2CzZ?PU7sKH(7wbok5$|znSH+)thxMK7$&cJ{Ny2x#ox~q z8cAx`UxsV@o^KIX+U)A73j?*3e=WUSH=q_A(M`Ke;5NokO@s-GHdFym@n+-} zF7>r}3U-WTbduC=(3Apfg3>W;Th`6!0STsK%a%?FppO8#P2yB$cqaZKX3|`$c1@!!FL>}m;20lqT|D&Yw2@*A zby+O3p8jIeWHQOLXJyQ(-3io`AvB-LjE=e~+yQ3MQtEeXA(4hW#YTtcg1x*&J6ZK@ zBZ=y2J%5+&e{n;Q#cIaVf^-=!TS=!rT^Y{;R5ClOG1VK0n5UhaCxzlF4$$(OO(VY@`G?Fo#`^>>)m)w|IitL?Jq|fWuLF z0e{Y&l#-#dfwOrori!DZ%%i#N3Ct#u_N;Yf5ZPNQ3CyK1eO0#IWP92nWUTZ8HHj

A8929Wtz@P?gm_l$ZWU zV;Nc#NM)i=1?F#1Oomr~TKU$0=m=e9cy*^JZ~N#l@-e5%5bI5AUyY`6=`KU8Gbv2* z*;rVhf5X|mw3K1im+rp!3;i}m$}sCnGSdU_8C)uhfUcAYqyzCb>d8>+Ni#=J zzTC!9I?7P%$+ZFO03tC!hFVYh1Y|Y+l$g!x$>@M4z;r1j(UAn63}^zpBYg&RB$1~B zngH`<0_gb#cp{()Fh@-2^yDGg1H?DI0-6Bhq+CQ#+IjX4_^+dn47HxrXImg$M%&6z z>q!PH0+;}ssV+mU>p^fr025$=coFN%wdD9d0S3x2>q`aS6T+EN9iaDR&={X5z$_^j z*PBLc_4NeMNrqT&PGY=|6JQ=CWQg^@4cO#c<5{@@FoM41`Z56~QAh^Y1WGZ-2l-c1 zRfg6S>bbIp`s4Pq^7%K4c1kiY?IG@#44`Q@0$p4?g#Froc(546m^cM)@#HIz#XynY z)G5%GZ(Pd1g>Lc!&}15@6G7~U!evqmY(5$46TUeH@wYRQ@-lpOECqELAJuE2T}+`l zNiuZya1xEwFM7=hUk&E+9TT`fwtaR|fet*y$806%H-)5m>fd*;l1bc16{-BQeL*Nm xZCb0{{Se0R7~|AGd(cKL6Q$*{M-YT~ diff --git a/assets/images/icon_black.png b/assets/images/icon_black.png deleted file mode 100644 index 910ad69fc0beb40af1ada606f615510f65cd56bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13452 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 J>h0vi{|k(zSPlRH diff --git a/assets/images/icon_white.ico b/assets/images/icon_white.ico deleted file mode 100644 index 9a0a5c0d50188fc6807ab9054c788269fa1919b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4031 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 PDHk6zBYJman(==DswQZv diff --git a/core/Clash.Meta b/core/Clash.Meta index 168fc42..e0cf7fb 160000 --- a/core/Clash.Meta +++ b/core/Clash.Meta @@ -1 +1 @@ -Subproject commit 168fc4232c86f80facbeef3e022db172b2f4da68 +Subproject commit e0cf7fb4e641741592e87890be8427594932535e diff --git a/core/common.go b/core/common.go index 33d60de..ca73f6f 100644 --- a/core/common.go +++ b/core/common.go @@ -17,6 +17,7 @@ import ( "github.com/metacubex/mihomo/constant/features" cp "github.com/metacubex/mihomo/constant/provider" "github.com/metacubex/mihomo/hub" + "github.com/metacubex/mihomo/hub/executor" "github.com/metacubex/mihomo/hub/route" "github.com/metacubex/mihomo/listener" "github.com/metacubex/mihomo/log" @@ -263,7 +264,7 @@ func setupConfig(params *SetupParams) error { defer runLock.Unlock() var err error constant.DefaultTestURL = params.TestURL - currentConfig, err = parseWithPath(filepath.Join(constant.Path.HomeDir(), "config.json")) + currentConfig, err = executor.ParseWithPath(filepath.Join(constant.Path.HomeDir(), "config.yaml")) if err != nil { currentConfig, _ = config.ParseRawConfig(config.DefaultRawConfig()) } diff --git a/core/go.mod b/core/go.mod index 8c69df3..76079a4 100644 --- a/core/go.mod +++ b/core/go.mod @@ -18,8 +18,8 @@ require ( github.com/buger/jsonparser v1.1.1 // indirect github.com/coreos/go-iptables v0.8.0 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect - github.com/ebitengine/purego v0.9.0 // indirect - github.com/enfein/mieru/v3 v3.20.0 // indirect + github.com/ebitengine/purego v0.9.1 // indirect + github.com/enfein/mieru/v3 v3.22.1 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -33,7 +33,7 @@ require ( github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.4.0 // indirect - github.com/gofrs/uuid/v5 v5.3.2 // indirect + github.com/gofrs/uuid/v5 v5.4.0 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -46,32 +46,32 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.4.1 // indirect - github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 // indirect + github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d // indirect github.com/metacubex/ascon v0.1.0 // indirect - github.com/metacubex/bart v0.24.0 // indirect + github.com/metacubex/bart v0.26.0 // indirect github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b // indirect github.com/metacubex/blake3 v0.1.0 // indirect github.com/metacubex/chacha v0.1.5 // indirect github.com/metacubex/fswatch v0.1.1 // indirect github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect github.com/metacubex/gvisor v0.0.0-20250919004547-6122b699a301 // indirect - github.com/metacubex/kcp-go v0.0.0-20250923001605-1ba6f691c45b // indirect + github.com/metacubex/kcp-go v0.0.0-20251105084629-8c93f4bf37be // indirect github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793 // indirect - github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295 // indirect + github.com/metacubex/quic-go v0.55.1-0.20251024060151-bd465f127128 // indirect github.com/metacubex/randv2 v0.2.0 // indirect github.com/metacubex/restls-client-go v0.1.7 // indirect github.com/metacubex/sing v0.5.6 // indirect github.com/metacubex/sing-mux v0.3.4 // indirect - github.com/metacubex/sing-quic v0.0.0-20250909002258-06122df8f231 // indirect + github.com/metacubex/sing-quic v0.0.0-20251004051927-c45ee18473bb // indirect github.com/metacubex/sing-shadowsocks v0.2.12 // indirect github.com/metacubex/sing-shadowsocks2 v0.2.7 // indirect github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 // indirect - github.com/metacubex/sing-tun v0.4.8 // indirect + github.com/metacubex/sing-tun v0.4.9 // indirect github.com/metacubex/sing-vmess v0.2.4 // indirect github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f // indirect github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 // indirect - github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 // indirect - github.com/metacubex/utls v1.8.1 // indirect + github.com/metacubex/tfo-go v0.0.0-20251024101424-368b42b59148 // indirect + github.com/metacubex/utls v1.8.3 // indirect github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f // indirect github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 // indirect github.com/miekg/dns v1.1.63 // indirect @@ -84,7 +84,7 @@ require ( github.com/quic-go/qpack v0.4.0 // indirect github.com/sagernet/cors v1.2.1 // indirect github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect - github.com/samber/lo v1.51.0 // indirect + github.com/samber/lo v1.52.0 // indirect github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect @@ -96,7 +96,6 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect - go.uber.org/mock v0.4.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect diff --git a/core/go.sum b/core/go.sum index b799f9e..deb1b71 100644 --- a/core/go.sum +++ b/core/go.sum @@ -22,10 +22,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= -github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= -github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= +github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= +github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/enfein/mieru/v3 v3.22.1 h1:/XGYYXpEhEJlxosmtbpEJkhtRLHB8IToG7LB8kU2ZDY= +github.com/enfein/mieru/v3 v3.22.1/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I= github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g= @@ -54,8 +54,8 @@ github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= -github.com/gofrs/uuid/v5 v5.3.2 h1:2jfO8j3XgSwlz/wHqemAEugfnTlikAYHhnqQ8Xh4fE0= -github.com/gofrs/uuid/v5 v5.3.2/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= +github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0= +github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= @@ -86,12 +86,12 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/ github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= -github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI= -github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY= +github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d h1:vAJ0ZT4aO803F1uw2roIA9yH7Sxzox34tVVyye1bz6c= +github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY= github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM= github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc= -github.com/metacubex/bart v0.24.0 h1:EyNiPeVOlg0joSHTzi5oentI0j5M89utUq/5dd76pWM= -github.com/metacubex/bart v0.24.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= +github.com/metacubex/bart v0.26.0 h1:d/bBTvVatfVWGfQbiDpYKI1bXUJgjaabB2KpK1Tnk6w= +github.com/metacubex/bart v0.26.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b h1:j7dadXD8I2KTmMt8jg1JcaP1ANL3JEObJPdANKcSYPY= github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b/go.mod h1:+WmP0VJZDkDszvpa83HzfUp6QzARl/IKkMorH4+nODw= github.com/metacubex/blake3 v0.1.0 h1:KGnjh/56REO7U+cgZA8dnBhxdP7jByrG7hTP+bu6cqY= @@ -104,12 +104,12 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20250919004547-6122b699a301 h1:N5GExQJqYAH3gOCshpp2u/J3CtNYzMctmlb0xK9wtbQ= github.com/metacubex/gvisor v0.0.0-20250919004547-6122b699a301/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU= -github.com/metacubex/kcp-go v0.0.0-20250923001605-1ba6f691c45b h1:z7JLKjugnQ1qvDOAD8yMA5C8AlJY3bG+VrrgRntRlUY= -github.com/metacubex/kcp-go v0.0.0-20250923001605-1ba6f691c45b/go.mod h1:HIJZW4QMhbBqXuqC1ly6Hn0TEYT2SzRw58ns1yGhXTs= +github.com/metacubex/kcp-go v0.0.0-20251105084629-8c93f4bf37be h1:Y7SigZIqfv/+RIA/D7R6EbB9p+brPRoGOM6zobSmRIM= +github.com/metacubex/kcp-go v0.0.0-20251105084629-8c93f4bf37be/go.mod h1:HIJZW4QMhbBqXuqC1ly6Hn0TEYT2SzRw58ns1yGhXTs= github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793 h1:1Qpuy+sU3DmyX9HwI+CrBT/oLNJngvBorR2RbajJcqo= github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793/go.mod h1:RjRNb4G52yAgfR+Oe/kp9G4PJJ97Fnj89eY1BFO3YyA= -github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295 h1:8JVlYuE8uSJAvmyCd4TjvDxs57xjb0WxEoaWafK5+qs= -github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295/go.mod h1:1lktQFtCD17FZliVypbrDHwbsFSsmz2xz2TRXydvB5c= +github.com/metacubex/quic-go v0.55.1-0.20251024060151-bd465f127128 h1:I1uvJl206/HbkzEAZpLgGkZgUveOZb+P+6oTUj7dN+o= +github.com/metacubex/quic-go v0.55.1-0.20251024060151-bd465f127128/go.mod h1:1lktQFtCD17FZliVypbrDHwbsFSsmz2xz2TRXydvB5c= github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/restls-client-go v0.1.7 h1:eCwiXCTQb5WJu9IlgYvDBA1OgrINv58dEe7hcN5H15k= @@ -119,26 +119,26 @@ github.com/metacubex/sing v0.5.6 h1:mEPDCadsCj3DB8gn+t/EtposlYuALEkExa/LUguw6/c= github.com/metacubex/sing v0.5.6/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= github.com/metacubex/sing-mux v0.3.4 h1:tf4r27CIkzaxq9kBlAXQkgMXq2HPp5Mta60Kb4RCZF0= github.com/metacubex/sing-mux v0.3.4/go.mod h1:SEJfAuykNj/ozbPqngEYqyggwSr81+L7Nu09NRD5mh4= -github.com/metacubex/sing-quic v0.0.0-20250909002258-06122df8f231 h1:dGvo7UahC/gYBQNBoictr14baJzBjAKUAorP63QFFtg= -github.com/metacubex/sing-quic v0.0.0-20250909002258-06122df8f231/go.mod h1:B60FxaPHjR1SeQB0IiLrgwgvKsaoASfOWdiqhLjmMGA= +github.com/metacubex/sing-quic v0.0.0-20251004051927-c45ee18473bb h1:gxrJmnxuEAel+kh3V7ntqkHjURif0xKDu76nzr/BF5Y= +github.com/metacubex/sing-quic v0.0.0-20251004051927-c45ee18473bb/go.mod h1:JK4+PYUKps6pnlicKjsSUAjAcvIUjhorIjdNZGg930M= github.com/metacubex/sing-shadowsocks v0.2.12 h1:Wqzo8bYXrK5aWqxu/TjlTnYZzAKtKsaFQBdr6IHFaBE= github.com/metacubex/sing-shadowsocks v0.2.12/go.mod h1:2e5EIaw0rxKrm1YTRmiMnDulwbGxH9hAFlrwQLQMQkU= github.com/metacubex/sing-shadowsocks2 v0.2.7 h1:hSuuc0YpsfiqYqt1o+fP4m34BQz4e6wVj3PPBVhor3A= github.com/metacubex/sing-shadowsocks2 v0.2.7/go.mod h1:vOEbfKC60txi0ca+yUlqEwOGc3Obl6cnSgx9Gf45KjE= github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI= github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E= -github.com/metacubex/sing-tun v0.4.8 h1:3PyiUKWXYi37yHptXskzL1723O3OUdyt0Aej4XHVikM= -github.com/metacubex/sing-tun v0.4.8/go.mod h1:L/TjQY5JEGy8nvsuYmy/XgMFMCPiF0+AWSFCYfS6r9w= +github.com/metacubex/sing-tun v0.4.9 h1:jY0Yyt8nnN3yQRN/jTxgqNCmGi1dsFdxdIi7pQUlVVU= +github.com/metacubex/sing-tun v0.4.9/go.mod h1:L/TjQY5JEGy8nvsuYmy/XgMFMCPiF0+AWSFCYfS6r9w= github.com/metacubex/sing-vmess v0.2.4 h1:Tx6AGgCiEf400E/xyDuYyafsel6sGbR8oF7RkAaus6I= github.com/metacubex/sing-vmess v0.2.4/go.mod h1:21R5R1u90uUvBQF0owoooEu96/SAYYD56nDrwm6nFaM= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f h1:Sr/DYKYofKHKc4GF3qkRGNuj6XA6c0eqPgEDN+VAsYU= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f/go.mod h1:jpAkVLPnCpGSfNyVmj6Cq4YbuZsFepm/Dc+9BAOcR80= github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKeaPW/mXwNLjnlo65AYN7WS2jrBNaM= github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= -github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= -github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= -github.com/metacubex/utls v1.8.1/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/tfo-go v0.0.0-20251024101424-368b42b59148 h1:Zd0QqciLIhv9MKbGKTPEgN8WUFsgQGA1WJBy6spEnVU= +github.com/metacubex/tfo-go v0.0.0-20251024101424-368b42b59148/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= +github.com/metacubex/utls v1.8.3 h1:0m/yCxm3SK6kWve2lKiFb1pue1wHitJ8sQQD4Ikqde4= +github.com/metacubex/utls v1.8.3/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f h1:FGBPRb1zUabhPhDrlKEjQ9lgIwQ6cHL4x8M9lrERhbk= github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f/go.mod h1:oPGcV994OGJedmmxrcK9+ni7jUEMGhR+uVQAdaduIP4= github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 h1:lhlqpYHopuTLx9xQt22kSA9HtnyTDmk5XjjQVCGHe2E= @@ -170,8 +170,8 @@ github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ= github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI= github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis= github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= -github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= -github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8= github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM= github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -211,7 +211,6 @@ gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+r gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/lib/application.dart b/lib/application.dart index edce76c..e1a1bbc 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -24,15 +24,14 @@ class Application extends ConsumerStatefulWidget { } class ApplicationState extends ConsumerState { - Timer? _autoUpdateGroupTaskTimer; Timer? _autoUpdateProfilesTaskTimer; final _pageTransitionsTheme = const PageTransitionsTheme( builders: { - TargetPlatform.android: CommonPageTransitionsBuilder(), - TargetPlatform.windows: CommonPageTransitionsBuilder(), - TargetPlatform.linux: CommonPageTransitionsBuilder(), - TargetPlatform.macOS: CommonPageTransitionsBuilder(), + TargetPlatform.android: commonSharedXPageTransitions, + TargetPlatform.windows: commonSharedXPageTransitions, + TargetPlatform.linux: commonSharedXPageTransitions, + TargetPlatform.macOS: commonSharedXPageTransitions, }, ); @@ -102,7 +101,7 @@ class ApplicationState extends ConsumerState { } Widget _buildApp({required Widget child}) { - return MessageManager(child: ThemeManager(child: child)); + return StatusManager(child: ThemeManager(child: child)); } @override @@ -162,7 +161,6 @@ class ApplicationState extends ConsumerState { @override Future dispose() async { linkManager.destroy(); - _autoUpdateGroupTaskTimer?.cancel(); _autoUpdateProfilesTaskTimer?.cancel(); await coreController.destroy(); await globalState.appController.savePreferences(); diff --git a/lib/common/app_localizations.dart b/lib/common/app_localizations.dart index 497e093..a4e86d3 100644 --- a/lib/common/app_localizations.dart +++ b/lib/common/app_localizations.dart @@ -1,3 +1,3 @@ import 'package:fl_clash/l10n/l10n.dart'; -final appLocalizations = AppLocalizations.current; \ No newline at end of file +final appLocalizations = AppLocalizations.current; diff --git a/lib/common/archive.dart b/lib/common/archive.dart index ea94206..37889f2 100644 --- a/lib/common/archive.dart +++ b/lib/common/archive.dart @@ -7,6 +7,9 @@ import 'package:path/path.dart'; extension ArchiveExt on Archive { void addDirectoryToArchive(String dirPath, String parentPath) { final dir = Directory(dirPath); + if (!dir.existsSync()) { + return; + } final entities = dir.listSync(recursive: false); for (final entity in entities) { final relativePath = relative(entity.path, from: parentPath); diff --git a/lib/common/common.dart b/lib/common/common.dart index cf4e7db..b1e05b2 100644 --- a/lib/common/common.dart +++ b/lib/common/common.dart @@ -38,3 +38,4 @@ export 'text.dart'; export 'tray.dart'; export 'utils.dart'; export 'window.dart'; +export 'yaml.dart'; diff --git a/lib/common/compute.dart b/lib/common/compute.dart index f3351ca..fa91462 100644 --- a/lib/common/compute.dart +++ b/lib/common/compute.dart @@ -7,7 +7,7 @@ List computeSort({ required List groups, required ProxiesSortType sortType, required DelayMap delayMap, - required SelectedMap selectedMap, + required Map selectedMap, required String defaultTestUrl, }) { return groups.map((group) { @@ -31,7 +31,7 @@ DelayState computeProxyDelayState({ required String proxyName, required String testUrl, required List groups, - required SelectedMap selectedMap, + required Map selectedMap, required DelayMap delayMap, }) { final state = computeRealSelectedProxyState( @@ -47,7 +47,7 @@ DelayState computeProxyDelayState({ SelectedProxyState computeRealSelectedProxyState( String proxyName, { required List groups, - required SelectedMap selectedMap, + required Map selectedMap, }) { return _getRealSelectedProxyState( SelectedProxyState(proxyName: proxyName), @@ -59,7 +59,7 @@ SelectedProxyState computeRealSelectedProxyState( SelectedProxyState _getRealSelectedProxyState( SelectedProxyState state, { required List groups, - required SelectedMap selectedMap, + required Map selectedMap, }) { if (state.proxyName.isEmpty) return state; final index = groups.indexWhere((element) => element.name == state.proxyName); @@ -83,7 +83,7 @@ List _sortOfDelay({ required List groups, required List proxies, required DelayMap delayMap, - required SelectedMap selectedMap, + required Map selectedMap, required String testUrl, }) { return List.from(proxies)..sort((a, b) { diff --git a/lib/common/constant.dart b/lib/common/constant.dart index b7320b0..c924a73 100644 --- a/lib/common/constant.dart +++ b/lib/common/constant.dart @@ -23,6 +23,12 @@ final baseInfoEdgeInsets = EdgeInsets.symmetric( vertical: 16.ap, horizontal: 16.ap, ); +final listHeaderPadding = EdgeInsets.only( + left: 16.ap, + right: 8.ap, + top: 24.ap, + bottom: 8.ap, +); final defaultTextScaleFactor = WidgetsBinding.instance.platformDispatcher.textScaleFactor; @@ -63,10 +69,14 @@ const stringListEquality = ListEquality(); const intListEquality = ListEquality(); const logListEquality = ListEquality(); const groupListEquality = ListEquality(); +const ruleListEquality = ListEquality(); +const scriptEquality = ListEquality