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 0000000..6dfddbc Binary files /dev/null and b/assets/images/icon/status_1.ico differ diff --git a/assets/images/icon/status_1.png b/assets/images/icon/status_1.png new file mode 100644 index 0000000..0ca5aa7 Binary files /dev/null and b/assets/images/icon/status_1.png differ diff --git a/assets/images/icon/status_2.ico b/assets/images/icon/status_2.ico new file mode 100644 index 0000000..fd92791 Binary files /dev/null and b/assets/images/icon/status_2.ico differ diff --git a/assets/images/icon/status_2.png b/assets/images/icon/status_2.png new file mode 100644 index 0000000..4aa7e67 Binary files /dev/null and b/assets/images/icon/status_2.png differ diff --git a/assets/images/icon/status_3.ico b/assets/images/icon/status_3.ico new file mode 100644 index 0000000..4de1cee Binary files /dev/null and b/assets/images/icon/status_3.ico differ diff --git a/assets/images/icon/status_3.png b/assets/images/icon/status_3.png new file mode 100644 index 0000000..93db6d7 Binary files /dev/null and b/assets/images/icon/status_3.png differ diff --git a/assets/images/icon_black.ico b/assets/images/icon_black.ico deleted file mode 100644 index 76cb61c..0000000 Binary files a/assets/images/icon_black.ico and /dev/null differ diff --git a/assets/images/icon_black.png b/assets/images/icon_black.png deleted file mode 100644 index 910ad69..0000000 Binary files a/assets/images/icon_black.png and /dev/null differ diff --git a/assets/images/icon_white.ico b/assets/images/icon_white.ico deleted file mode 100644 index 9a0a5c0..0000000 Binary files a/assets/images/icon_white.ico and /dev/null differ diff --git a/assets/images/icon_white.png b/assets/images/icon_white.png deleted file mode 100644 index 9fe8eb1..0000000 Binary files a/assets/images/icon_white.png and /dev/null differ 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