Compare commits
1 Commits
main
...
v0.8.85-pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7f53cfaae |
12
.github/workflows/build.yaml
vendored
12
.github/workflows/build.yaml
vendored
@@ -63,11 +63,19 @@ jobs:
|
|||||||
cache-dependency-path: |
|
cache-dependency-path: |
|
||||||
core/go.sum
|
core/go.sum
|
||||||
|
|
||||||
- name: Setup Flutter
|
- name: Setup Flutter Master
|
||||||
|
if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: ${{ (startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')) && 'master' || 'stable' }}
|
channel: 'master'
|
||||||
cache: true
|
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'
|
||||||
|
cache: true
|
||||||
|
flutter-version: 3.29.3
|
||||||
|
|
||||||
- name: Get Flutter Dependency
|
- name: Get Flutter Dependency
|
||||||
run: flutter pub get
|
run: flutter pub get
|
||||||
|
|||||||
@@ -1,97 +0,0 @@
|
|||||||
plugins {
|
|
||||||
id "com.android.application"
|
|
||||||
id "kotlin-android"
|
|
||||||
id "dev.flutter.flutter-gradle-plugin"
|
|
||||||
}
|
|
||||||
|
|
||||||
def localProperties = new Properties()
|
|
||||||
def localPropertiesFile = rootProject.file('local.properties')
|
|
||||||
if (localPropertiesFile.exists()) {
|
|
||||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
|
||||||
localProperties.load(reader)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
|
||||||
if (flutterVersionCode == null) {
|
|
||||||
flutterVersionCode = '1'
|
|
||||||
}
|
|
||||||
|
|
||||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
|
||||||
if (flutterVersionName == null) {
|
|
||||||
flutterVersionName = '1.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
def defStoreFile = file("keystore.jks")
|
|
||||||
def defStorePassword = localProperties.getProperty('storePassword')
|
|
||||||
def defKeyAlias = localProperties.getProperty('keyAlias')
|
|
||||||
def defKeyPassword = localProperties.getProperty('keyPassword')
|
|
||||||
def isRelease = defStoreFile.exists() && defStorePassword != null && defKeyAlias != null && defKeyPassword != null
|
|
||||||
|
|
||||||
android {
|
|
||||||
namespace "com.follow.clash"
|
|
||||||
compileSdk 35
|
|
||||||
ndkVersion = "28.0.13004108"
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_17
|
|
||||||
targetCompatibility JavaVersion.VERSION_17
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = '17'
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main.java.srcDirs += 'src/main/kotlin'
|
|
||||||
}
|
|
||||||
|
|
||||||
signingConfigs {
|
|
||||||
if (isRelease) {
|
|
||||||
release {
|
|
||||||
storeFile defStoreFile
|
|
||||||
storePassword defStorePassword
|
|
||||||
keyAlias defKeyAlias
|
|
||||||
keyPassword defKeyPassword
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
applicationId "com.follow.clash"
|
|
||||||
minSdkVersion 21
|
|
||||||
targetSdkVersion 35
|
|
||||||
versionCode flutterVersionCode.toInteger()
|
|
||||||
versionName flutterVersionName
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
debug {
|
|
||||||
minifyEnabled false
|
|
||||||
applicationIdSuffix '.debug'
|
|
||||||
}
|
|
||||||
release {
|
|
||||||
if (isRelease) {
|
|
||||||
signingConfig signingConfigs.release
|
|
||||||
} else {
|
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
}
|
|
||||||
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
flutter {
|
|
||||||
source '../..'
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation project(":core")
|
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
|
||||||
implementation 'com.google.code.gson:gson:2.10.1'
|
|
||||||
implementation("com.android.tools.smali:smali-dexlib2:3.0.9") {
|
|
||||||
exclude group: "com.google.guava", module: "guava"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
93
android/app/build.gradle.kts
Normal file
93
android/app/build.gradle.kts
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import java.util.Properties
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("com.android.application")
|
||||||
|
id("kotlin-android")
|
||||||
|
id("dev.flutter.flutter-gradle-plugin")
|
||||||
|
}
|
||||||
|
|
||||||
|
val localPropertiesFile = rootProject.file("local.properties")
|
||||||
|
val localProperties = Properties().apply {
|
||||||
|
if (localPropertiesFile.exists()) {
|
||||||
|
localPropertiesFile.inputStream().use { load(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val mStoreFile: File = file("keystore.jks")
|
||||||
|
val mStorePassword: String? = localProperties.getProperty("storePassword")
|
||||||
|
val mKeyAlias: String? = localProperties.getProperty("keyAlias")
|
||||||
|
val mKeyPassword: String? = localProperties.getProperty("keyPassword")
|
||||||
|
val isRelease = mStoreFile.exists()
|
||||||
|
&& mStorePassword != null
|
||||||
|
&& mKeyAlias != null
|
||||||
|
&& mKeyPassword != null
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.follow.clash"
|
||||||
|
compileSdk = 35
|
||||||
|
ndkVersion = "28.0.13004108"
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = JavaVersion.VERSION_17.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId = "com.follow.clash"
|
||||||
|
minSdk = flutter.minSdkVersion
|
||||||
|
targetSdk = flutter.targetSdkVersion
|
||||||
|
versionCode = flutter.versionCode
|
||||||
|
versionName = flutter.versionName
|
||||||
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
if (isRelease) {
|
||||||
|
create("release") {
|
||||||
|
storeFile = mStoreFile
|
||||||
|
storePassword = mStorePassword
|
||||||
|
keyAlias = mKeyAlias
|
||||||
|
keyPassword = mKeyPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
debug {
|
||||||
|
isMinifyEnabled = false
|
||||||
|
applicationIdSuffix = ".debug"
|
||||||
|
}
|
||||||
|
|
||||||
|
release {
|
||||||
|
isMinifyEnabled = true
|
||||||
|
isDebuggable = false
|
||||||
|
|
||||||
|
signingConfig = if (isRelease) {
|
||||||
|
signingConfigs.getByName("release")
|
||||||
|
} else {
|
||||||
|
signingConfigs.getByName("debug")
|
||||||
|
}
|
||||||
|
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flutter {
|
||||||
|
source = "../.."
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":core"))
|
||||||
|
implementation("androidx.core:core-splashscreen:1.0.1")
|
||||||
|
implementation("com.google.code.gson:gson:2.10.1")
|
||||||
|
implementation("com.android.tools.smali:smali-dexlib2:3.0.9") {
|
||||||
|
exclude(group = "com.google.guava", module = "guava")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,9 @@
|
|||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.camera"
|
android:name="android.hardware.camera"
|
||||||
android:required="false" />
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.software.leanback"
|
||||||
|
android:required="false" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
@@ -22,6 +25,7 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".FlClashApplication"
|
android:name=".FlClashApplication"
|
||||||
|
android:banner="@mipmap/ic_banner"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="FlClash">
|
android:label="FlClash">
|
||||||
@@ -88,7 +92,7 @@
|
|||||||
<service
|
<service
|
||||||
android:name=".services.FlClashTileService"
|
android:name=".services.FlClashTileService"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@drawable/ic_stat_name"
|
android:icon="@drawable/ic"
|
||||||
android:label="FlClash"
|
android:label="FlClash"
|
||||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
|
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
|
||||||
tools:targetApi="n">
|
tools:targetApi="n">
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ import com.follow.clash.plugins.VpnPlugin
|
|||||||
import io.flutter.FlutterInjector
|
import io.flutter.FlutterInjector
|
||||||
import io.flutter.embedding.engine.FlutterEngine
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
import io.flutter.embedding.engine.dart.DartExecutor
|
import io.flutter.embedding.engine.dart.DartExecutor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
import kotlin.concurrent.withLock
|
import kotlin.concurrent.withLock
|
||||||
|
|
||||||
@@ -33,6 +37,15 @@ object GlobalState {
|
|||||||
return currentEngine?.plugins?.get(AppPlugin::class.java) as AppPlugin?
|
return currentEngine?.plugins?.get(AppPlugin::class.java) as AppPlugin?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun syncStatus() {
|
||||||
|
CoroutineScope(Dispatchers.Default).launch {
|
||||||
|
val status = getCurrentVPNPlugin()?.getStatus() ?: false
|
||||||
|
withContext(Dispatchers.Main){
|
||||||
|
runState.value = if (status) RunState.START else RunState.STOP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun getText(text: String): String {
|
suspend fun getText(text: String): String {
|
||||||
return getCurrentAppPlugin()?.getText(text) ?: ""
|
return getCurrentAppPlugin()?.getText(text) ?: ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class MainActivity : FlutterActivity() {
|
|||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
GlobalState.flutterEngine = null
|
GlobalState.flutterEngine = null
|
||||||
|
GlobalState.runState.value = RunState.STOP
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,6 +51,7 @@ data object ServicePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun handleDestroy() {
|
private fun handleDestroy() {
|
||||||
GlobalState.destroyServiceEngine()
|
GlobalState.destroyServiceEngine()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,6 +200,13 @@ data object VpnPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
|
|||||||
timerJob = null
|
timerJob = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
suspend fun getStatus(): Boolean? {
|
||||||
|
return withContext(Dispatchers.Default) {
|
||||||
|
flutterMethodChannel.awaitResult<Boolean>("status", null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleStartService() {
|
private fun handleStartService() {
|
||||||
if (flClashService == null) {
|
if (flClashService == null) {
|
||||||
bindService()
|
bindService()
|
||||||
@@ -248,9 +255,9 @@ data object VpnPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
|
|||||||
GlobalState.runLock.withLock {
|
GlobalState.runLock.withLock {
|
||||||
if (GlobalState.runState.value == RunState.STOP) return
|
if (GlobalState.runState.value == RunState.STOP) return
|
||||||
GlobalState.runState.value = RunState.STOP
|
GlobalState.runState.value = RunState.STOP
|
||||||
|
flClashService?.stop()
|
||||||
stopForegroundJob()
|
stopForegroundJob()
|
||||||
Core.stopTun()
|
Core.stopTun()
|
||||||
flClashService?.stop()
|
|
||||||
GlobalState.handleTryDestroy()
|
GlobalState.handleTryDestroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import com.follow.clash.MainActivity
|
|||||||
import com.follow.clash.R
|
import com.follow.clash.R
|
||||||
import com.follow.clash.extensions.getActionPendingIntent
|
import com.follow.clash.extensions.getActionPendingIntent
|
||||||
import com.follow.clash.models.VpnOptions
|
import com.follow.clash.models.VpnOptions
|
||||||
import io.flutter.Log
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Deferred
|
import kotlinx.coroutines.Deferred
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -54,7 +53,7 @@ fun Service.createFlClashNotificationBuilder(): Deferred<NotificationCompat.Buil
|
|||||||
this@createFlClashNotificationBuilder, GlobalState.NOTIFICATION_CHANNEL
|
this@createFlClashNotificationBuilder, GlobalState.NOTIFICATION_CHANNEL
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
setSmallIcon(R.drawable.ic_stat_name)
|
setSmallIcon(R.drawable.ic)
|
||||||
setContentTitle("FlClash")
|
setContentTitle("FlClash")
|
||||||
setContentIntent(pendingIntent)
|
setContentIntent(pendingIntent)
|
||||||
setCategory(NotificationCompat.CATEGORY_SERVICE)
|
setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||||
@@ -76,9 +75,8 @@ fun Service.startForeground(notification: Notification) {
|
|||||||
val manager = getSystemService(NotificationManager::class.java)
|
val manager = getSystemService(NotificationManager::class.java)
|
||||||
var channel = manager?.getNotificationChannel(GlobalState.NOTIFICATION_CHANNEL)
|
var channel = manager?.getNotificationChannel(GlobalState.NOTIFICATION_CHANNEL)
|
||||||
if (channel == null) {
|
if (channel == null) {
|
||||||
Log.d("[FlClash]","createNotificationChannel===>")
|
|
||||||
channel = NotificationChannel(
|
channel = NotificationChannel(
|
||||||
GlobalState.NOTIFICATION_CHANNEL, "FlClash", NotificationManager.IMPORTANCE_LOW
|
GlobalState.NOTIFICATION_CHANNEL, "SERVICE_CHANNEL", NotificationManager.IMPORTANCE_LOW
|
||||||
)
|
)
|
||||||
manager?.createNotificationChannel(channel)
|
manager?.createNotificationChannel(channel)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class FlClashTileService : TileService() {
|
|||||||
|
|
||||||
override fun onStartListening() {
|
override fun onStartListening() {
|
||||||
super.onStartListening()
|
super.onStartListening()
|
||||||
|
GlobalState.syncStatus()
|
||||||
GlobalState.runState.value?.let { updateTile(it) }
|
GlobalState.runState.value?.let { updateTile(it) }
|
||||||
GlobalState.runState.observeForever(observer)
|
GlobalState.runState.observeForever(observer)
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 618 B |
Binary file not shown.
|
Before Width: | Height: | Size: 423 B |
Binary file not shown.
|
Before Width: | Height: | Size: 803 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
17
android/app/src/main/res/drawable/ic.xml
Normal file
17
android/app/src/main/res/drawable/ic.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:width="240dp"
|
||||||
|
android:height="240dp"
|
||||||
|
android:viewportWidth="240"
|
||||||
|
android:viewportHeight="240"
|
||||||
|
tools:ignore="VectorRaster">
|
||||||
|
<path
|
||||||
|
android:pathData="M48.1,80.89L168.44,11.41c11.08,-6.4 25.24,-2.6 31.64,8.48 0,0 0,0 0,0h0c6.4,11.08 2.6,25.24 -8.48,31.64 0,0 0,0 0,0l-120.34,69.48c-11.08,6.4 -25.24,2.6 -31.64,-8.48 0,0 0,0 0,0h0c-6.4,-11.08 -2.6,-25.24 8.48,-31.64 0,0 0,0 0,0Z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M78.98,134.37l60.18,-34.74c11.07,-6.39 25.23,-2.59 31.63,8.48h0c6.4,11.07 2.61,25.24 -8.47,31.64l-60.18,34.74c-11.08,6.4 -25.24,2.6 -31.64,-8.48 0,0 0,0 0,0h0c-6.4,-11.08 -2.6,-25.24 8.48,-31.64h0Z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M109.86,187.86h0c11.08,-6.4 25.24,-2.6 31.64,8.48 0,0 0,0 0,0h0c6.4,11.08 2.6,25.24 -8.48,31.64 0,0 0,0 0,0h0c-11.08,6.4 -25.24,2.6 -31.64,-8.48 0,0 0,0 0,0h0c-6.4,-11.08 -2.6,-25.24 8.48,-31.64 0,0 0,0 0,0Z"
|
||||||
|
android:fillColor="#FFFFFF"/>
|
||||||
|
</vector>
|
||||||
BIN
android/app/src/main/res/mipmap-xhdpi/ic_banner.png
Normal file
BIN
android/app/src/main/res/mipmap-xhdpi/ic_banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@@ -1,33 +0,0 @@
|
|||||||
buildscript {
|
|
||||||
ext.kotlin_version = "${kotlin_version}"
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
classpath "com.android.tools.build:gradle:$agp_version"
|
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rootProject.buildDir = '../build'
|
|
||||||
subprojects {
|
|
||||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
|
||||||
}
|
|
||||||
subprojects {
|
|
||||||
project.evaluationDependsOn(':app')
|
|
||||||
project.evaluationDependsOn(':core')
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register("clean", Delete) {
|
|
||||||
delete rootProject.buildDir
|
|
||||||
}
|
|
||||||
|
|
||||||
22
android/build.gradle.kts
Normal file
22
android/build.gradle.kts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
|
||||||
|
rootProject.layout.buildDirectory.value(newBuildDir)
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
|
||||||
|
project.layout.buildDirectory.value(newSubprojectBuildDir)
|
||||||
|
}
|
||||||
|
subprojects {
|
||||||
|
project.evaluationDependsOn(":app")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Delete>("clean") {
|
||||||
|
delete(rootProject.layout.buildDirectory)
|
||||||
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.argumentsWithVarargAsSingleArray
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.library")
|
id("com.android.library")
|
||||||
id("org.jetbrains.kotlin.android")
|
id("org.jetbrains.kotlin.android")
|
||||||
@@ -10,11 +12,11 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
isJniDebuggable = false
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
"proguard-rules.pro"
|
"proguard-rules.pro"
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ project("core")
|
|||||||
|
|
||||||
message("CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}")
|
message("CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}")
|
||||||
|
|
||||||
|
message("CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
||||||
if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
||||||
add_compile_options(-O3)
|
add_compile_options(-O3)
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
#include <jni.h>
|
|
||||||
|
|
||||||
#ifdef LIBCLASH
|
#ifdef LIBCLASH
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <string>
|
|
||||||
#include "jni_helper.h"
|
#include "jni_helper.h"
|
||||||
#include "libclash.h"
|
#include "libclash.h"
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_follow_clash_core_Core_startTun(JNIEnv *env, jobject thiz, jint fd, jobject cb) {
|
Java_com_follow_clash_core_Core_startTun(JNIEnv *env, jobject, const jint fd, jobject cb) {
|
||||||
auto interface = new_global(cb);
|
const auto interface = new_global(cb);
|
||||||
startTUN(fd, interface);
|
startTUN(fd, interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_follow_clash_core_Core_stopTun(JNIEnv *env, jobject thiz) {
|
Java_com_follow_clash_core_Core_stopTun(JNIEnv *) {
|
||||||
stopTun();
|
stopTun();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,50 +23,50 @@ static jmethodID m_tun_interface_resolve_process;
|
|||||||
|
|
||||||
static void release_jni_object_impl(void *obj) {
|
static void release_jni_object_impl(void *obj) {
|
||||||
ATTACH_JNI();
|
ATTACH_JNI();
|
||||||
del_global((jobject) obj);
|
del_global(static_cast<jobject>(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void call_tun_interface_protect_impl(void *tun_interface, int fd) {
|
static void call_tun_interface_protect_impl(void *tun_interface, const int fd) {
|
||||||
ATTACH_JNI();
|
ATTACH_JNI();
|
||||||
env->CallVoidMethod((jobject) tun_interface,
|
env->CallVoidMethod(static_cast<jobject>(tun_interface),
|
||||||
(jmethodID) m_tun_interface_protect,
|
m_tun_interface_protect,
|
||||||
(jint) fd);
|
fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char*
|
static const char *
|
||||||
call_tun_interface_resolve_process_impl(void *tun_interface, int protocol,
|
call_tun_interface_resolve_process_impl(void *tun_interface, int protocol,
|
||||||
const char *source,
|
const char *source,
|
||||||
const char *target,
|
const char *target,
|
||||||
int uid) {
|
const int uid) {
|
||||||
ATTACH_JNI();
|
ATTACH_JNI();
|
||||||
jstring packageName = (jstring)env->CallObjectMethod((jobject) tun_interface,
|
const auto packageName = reinterpret_cast<jstring>(env->CallObjectMethod(static_cast<jobject>(tun_interface),
|
||||||
(jmethodID) m_tun_interface_resolve_process,
|
m_tun_interface_resolve_process,
|
||||||
(jint) protocol,
|
protocol,
|
||||||
(jstring) new_string(source),
|
new_string(source),
|
||||||
(jstring) new_string(target),
|
new_string(target),
|
||||||
(jint) uid);
|
uid));
|
||||||
return get_string(packageName);
|
return get_string(packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
JNI_OnLoad(JavaVM *vm, void *reserved) {
|
JNI_OnLoad(JavaVM *vm, void *) {
|
||||||
JNIEnv *env = nullptr;
|
JNIEnv *env = nullptr;
|
||||||
if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
|
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||||
return JNI_ERR;
|
return JNI_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
initialize_jni(vm, env);
|
initialize_jni(vm, env);
|
||||||
|
|
||||||
jclass c_tun_interface = find_class("com/follow/clash/core/TunInterface");
|
const auto c_tun_interface = find_class("com/follow/clash/core/TunInterface");
|
||||||
|
|
||||||
m_tun_interface_protect = find_method(c_tun_interface, "protect", "(I)V");
|
m_tun_interface_protect = find_method(c_tun_interface, "protect", "(I)V");
|
||||||
m_tun_interface_resolve_process = find_method(c_tun_interface, "resolverProcess",
|
m_tun_interface_resolve_process = find_method(c_tun_interface, "resolverProcess",
|
||||||
"(ILjava/lang/String;Ljava/lang/String;I)Ljava/lang/String;");
|
"(ILjava/lang/String;Ljava/lang/String;I)Ljava/lang/String;");
|
||||||
|
|
||||||
registerCallbacks(&call_tun_interface_protect_impl,
|
registerCallbacks(&call_tun_interface_protect_impl,
|
||||||
&call_tun_interface_resolve_process_impl,
|
&call_tun_interface_resolve_process_impl,
|
||||||
&release_jni_object_impl);
|
&release_jni_object_impl);
|
||||||
return JNI_VERSION_1_6;
|
return JNI_VERSION_1_6;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "jni_helper.h"
|
#include "jni_helper.h"
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@@ -12,7 +13,7 @@ static jmethodID m_get_bytes;
|
|||||||
void initialize_jni(JavaVM *vm, JNIEnv *env) {
|
void initialize_jni(JavaVM *vm, JNIEnv *env) {
|
||||||
global_vm = vm;
|
global_vm = vm;
|
||||||
|
|
||||||
c_string = (jclass) new_global(find_class("java/lang/String"));
|
c_string = reinterpret_cast<jclass>(new_global(find_class("java/lang/String")));
|
||||||
m_new_string = find_method(c_string, "<init>", "([B)V");
|
m_new_string = find_method(c_string, "<init>", "([B)V");
|
||||||
m_get_bytes = find_method(c_string, "getBytes", "()[B");
|
m_get_bytes = find_method(c_string, "getBytes", "()[B");
|
||||||
}
|
}
|
||||||
@@ -22,23 +23,23 @@ JavaVM *global_java_vm() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *jni_get_string(JNIEnv *env, jstring str) {
|
char *jni_get_string(JNIEnv *env, jstring str) {
|
||||||
auto array = (jbyteArray) env->CallObjectMethod(str, m_get_bytes);
|
const auto array = reinterpret_cast<jbyteArray>(env->CallObjectMethod(str, m_get_bytes));
|
||||||
int length = env->GetArrayLength(array);
|
const int length = env->GetArrayLength(array);
|
||||||
char *content = (char *) malloc(length + 1);
|
const auto content = static_cast<char *>(malloc(length + 1));
|
||||||
env->GetByteArrayRegion(array, 0, length, (jbyte *) content);
|
env->GetByteArrayRegion(array, 0, length, reinterpret_cast<jbyte *>(content));
|
||||||
content[length] = 0;
|
content[length] = 0;
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
jstring jni_new_string(JNIEnv *env, const char *str) {
|
jstring jni_new_string(JNIEnv *env, const char *str) {
|
||||||
auto length = (int) strlen(str);
|
const auto length = static_cast<int>(strlen(str));
|
||||||
jbyteArray array = env->NewByteArray(length);
|
const auto array = env->NewByteArray(length);
|
||||||
env->SetByteArrayRegion(array, 0, length, (const jbyte *) str);
|
env->SetByteArrayRegion(array, 0, length, reinterpret_cast<const jbyte *>(str));
|
||||||
return (jstring) env->NewObject(c_string, m_new_string, array);
|
return reinterpret_cast<jstring>(env->NewObject(c_string, m_new_string, array));
|
||||||
}
|
}
|
||||||
|
|
||||||
int jni_catch_exception(JNIEnv *env) {
|
int jni_catch_exception(JNIEnv *env) {
|
||||||
int result = env->ExceptionCheck();
|
const int result = env->ExceptionCheck();
|
||||||
if (result) {
|
if (result) {
|
||||||
env->ExceptionDescribe();
|
env->ExceptionDescribe();
|
||||||
env->ExceptionClear();
|
env->ExceptionClear();
|
||||||
@@ -46,9 +47,9 @@ int jni_catch_exception(JNIEnv *env) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void jni_attach_thread(struct scoped_jni *jni) {
|
void jni_attach_thread(scoped_jni *jni) {
|
||||||
JavaVM *vm = global_java_vm();
|
JavaVM *vm = global_java_vm();
|
||||||
if (vm->GetEnv((void **) &jni->env, JNI_VERSION_1_6) == JNI_OK) {
|
if (vm->GetEnv(reinterpret_cast<void **>(&jni->env), JNI_VERSION_1_6) == JNI_OK) {
|
||||||
jni->require_release = 0;
|
jni->require_release = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -58,9 +59,9 @@ void jni_attach_thread(struct scoped_jni *jni) {
|
|||||||
jni->require_release = 1;
|
jni->require_release = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void jni_detach_thread(struct scoped_jni *jni) {
|
void jni_detach_thread(const scoped_jni *env) {
|
||||||
JavaVM *vm = global_java_vm();
|
JavaVM *vm = global_java_vm();
|
||||||
if (jni->require_release) {
|
if (env->require_release) {
|
||||||
vm->DetachCurrentThread();
|
vm->DetachCurrentThread();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <cstdint>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
struct scoped_jni {
|
struct scoped_jni {
|
||||||
JNIEnv *env;
|
JNIEnv *env;
|
||||||
@@ -18,14 +15,14 @@ extern char *jni_get_string(JNIEnv *env, jstring str);
|
|||||||
|
|
||||||
extern int jni_catch_exception(JNIEnv *env);
|
extern int jni_catch_exception(JNIEnv *env);
|
||||||
|
|
||||||
extern void jni_attach_thread(struct scoped_jni *jni);
|
extern void jni_attach_thread(scoped_jni *jni);
|
||||||
|
|
||||||
extern void jni_detach_thread(struct scoped_jni *env);
|
extern void jni_detach_thread(const scoped_jni *env);
|
||||||
|
|
||||||
extern void release_string(char **str);
|
extern void release_string(char **str);
|
||||||
|
|
||||||
#define ATTACH_JNI() __attribute__((unused, cleanup(jni_detach_thread))) \
|
#define ATTACH_JNI() __attribute__((unused, cleanup(jni_detach_thread))) \
|
||||||
struct scoped_jni _jni; \
|
scoped_jni _jni{}; \
|
||||||
jni_attach_thread(&_jni); \
|
jni_attach_thread(&_jni); \
|
||||||
JNIEnv *env = _jni.env
|
JNIEnv *env = _jni.env
|
||||||
|
|
||||||
@@ -36,4 +33,4 @@ extern void release_string(char **str);
|
|||||||
#define new_global(obj) env->NewGlobalRef(obj)
|
#define new_global(obj) env->NewGlobalRef(obj)
|
||||||
#define del_global(obj) env->DeleteGlobalRef(obj)
|
#define del_global(obj) env->DeleteGlobalRef(obj)
|
||||||
#define get_string(jstr) jni_get_string(env, jstr)
|
#define get_string(jstr) jni_get_string(env, jstr)
|
||||||
#define new_string(cstr) jni_new_string(env, cstr)
|
#define new_string(cstr) jni_new_string(env, cstr)
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ org.gradle.jvmargs=-Xmx4G
|
|||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
kotlin_version=1.9.22
|
kotlin_version=1.9.22
|
||||||
agp_version=8.9.1
|
agp_version=8.9.2
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
pluginManagement {
|
|
||||||
def flutterSdkPath = {
|
|
||||||
def properties = new Properties()
|
|
||||||
file("local.properties").withInputStream { properties.load(it) }
|
|
||||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
|
||||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
|
||||||
return flutterSdkPath
|
|
||||||
}
|
|
||||||
settings.ext.flutterSdkPath = flutterSdkPath()
|
|
||||||
|
|
||||||
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
gradlePluginPortal()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
plugins {
|
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
|
||||||
id "com.android.application" version "$agp_version" apply false
|
|
||||||
id "org.jetbrains.kotlin.android" version "$kotlin_version" apply false
|
|
||||||
}
|
|
||||||
|
|
||||||
include ":app"
|
|
||||||
include ':core'
|
|
||||||
29
android/settings.gradle.kts
Normal file
29
android/settings.gradle.kts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
pluginManagement {
|
||||||
|
val flutterSdkPath = run {
|
||||||
|
val properties = java.util.Properties()
|
||||||
|
file("local.properties").inputStream().use { properties.load(it) }
|
||||||
|
val flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||||
|
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
|
||||||
|
flutterSdkPath
|
||||||
|
}
|
||||||
|
|
||||||
|
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||||
|
id("com.android.application") version "8.9.2" apply false
|
||||||
|
id("org.jetbrains.kotlin.android") version "1.9.22" apply false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
include(":app")
|
||||||
|
include(":core")
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
"resourcesDesc": "External resource related info",
|
"resourcesDesc": "External resource related info",
|
||||||
"trafficUsage": "Traffic usage",
|
"trafficUsage": "Traffic usage",
|
||||||
"coreInfo": "Core info",
|
"coreInfo": "Core info",
|
||||||
"nullCoreInfoDesc": "Unable to obtain core info",
|
|
||||||
"networkSpeed": "Network speed",
|
"networkSpeed": "Network speed",
|
||||||
"outboundMode": "Outbound mode",
|
"outboundMode": "Outbound mode",
|
||||||
"networkDetection": "Network detection",
|
"networkDetection": "Network detection",
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
"noProxy": "No proxy",
|
"noProxy": "No proxy",
|
||||||
"noProxyDesc": "Please create a profile or add a valid profile",
|
"noProxyDesc": "Please create a profile or add a valid profile",
|
||||||
"nullProfileDesc": "No profile, Please add a profile",
|
"nullProfileDesc": "No profile, Please add a profile",
|
||||||
"nullLogsDesc": "No logs",
|
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"defaultText": "Default",
|
"defaultText": "Default",
|
||||||
@@ -149,8 +147,6 @@
|
|||||||
"addressHelp": "WebDAV server address",
|
"addressHelp": "WebDAV server address",
|
||||||
"addressTip": "Please enter a valid WebDAV address",
|
"addressTip": "Please enter a valid WebDAV address",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"passwordTip": "Password cannot be empty",
|
|
||||||
"accountTip": "Account cannot be empty",
|
|
||||||
"checkUpdate": "Check for updates",
|
"checkUpdate": "Check for updates",
|
||||||
"discoverNewVersion": "Discover the new version",
|
"discoverNewVersion": "Discover the new version",
|
||||||
"checkUpdateError": "The current application is already the latest version",
|
"checkUpdateError": "The current application is already the latest version",
|
||||||
@@ -185,8 +181,6 @@
|
|||||||
"expirationTime": "Expiration time",
|
"expirationTime": "Expiration time",
|
||||||
"connections": "Connections",
|
"connections": "Connections",
|
||||||
"connectionsDesc": "View current connections data",
|
"connectionsDesc": "View current connections data",
|
||||||
"nullRequestsDesc": "No requests",
|
|
||||||
"nullConnectionsDesc": "No connections",
|
|
||||||
"intranetIP": "Intranet IP",
|
"intranetIP": "Intranet IP",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"cut": "Cut",
|
"cut": "Cut",
|
||||||
@@ -219,7 +213,6 @@
|
|||||||
"autoCloseConnectionsDesc": "Auto close connections after change node",
|
"autoCloseConnectionsDesc": "Auto close connections after change node",
|
||||||
"onlyStatisticsProxy": "Only statistics proxy",
|
"onlyStatisticsProxy": "Only statistics proxy",
|
||||||
"onlyStatisticsProxyDesc": "When turned on, only statistics proxy traffic",
|
"onlyStatisticsProxyDesc": "When turned on, only statistics proxy traffic",
|
||||||
"deleteProfileTip": "Sure you want to delete the current profile?",
|
|
||||||
"pureBlackMode": "Pure black mode",
|
"pureBlackMode": "Pure black mode",
|
||||||
"keepAliveIntervalDesc": "Tcp keep alive interval",
|
"keepAliveIntervalDesc": "Tcp keep alive interval",
|
||||||
"entries": " entries",
|
"entries": " entries",
|
||||||
@@ -250,7 +243,6 @@
|
|||||||
"dnsDesc": "Update DNS related settings",
|
"dnsDesc": "Update DNS related settings",
|
||||||
"key": "Key",
|
"key": "Key",
|
||||||
"value": "Value",
|
"value": "Value",
|
||||||
"notEmpty": "Cannot be empty",
|
|
||||||
"hostsDesc": "Add Hosts",
|
"hostsDesc": "Add Hosts",
|
||||||
"vpnTip": "Changes take effect after restarting the VPN",
|
"vpnTip": "Changes take effect after restarting the VPN",
|
||||||
"vpnEnableDesc": "Auto routes all system traffic through VpnService",
|
"vpnEnableDesc": "Auto routes all system traffic through VpnService",
|
||||||
@@ -337,15 +329,12 @@
|
|||||||
"fileIsUpdate": "The file has been modified. Do you want to save the changes?",
|
"fileIsUpdate": "The file has been modified. Do you want to save the changes?",
|
||||||
"profileHasUpdate": "The profile has been modified. Do you want to disable auto update?",
|
"profileHasUpdate": "The profile has been modified. Do you want to disable auto update?",
|
||||||
"hasCacheChange": "Do you want to cache the changes?",
|
"hasCacheChange": "Do you want to cache the changes?",
|
||||||
"nullProxies": "No proxies",
|
|
||||||
"copySuccess": "Copy success",
|
"copySuccess": "Copy success",
|
||||||
"copyLink": "Copy link",
|
"copyLink": "Copy link",
|
||||||
"exportFile": "Export file",
|
"exportFile": "Export file",
|
||||||
"cacheCorrupt": "The cache is corrupt. Do you want to clear it?",
|
"cacheCorrupt": "The cache is corrupt. Do you want to clear it?",
|
||||||
"detectionTip": "Relying on third-party api is for reference only",
|
"detectionTip": "Relying on third-party api is for reference only",
|
||||||
"listen": "Listen",
|
"listen": "Listen",
|
||||||
"keyExists": "The current key already exists",
|
|
||||||
"valueExists": "The current value already exists",
|
|
||||||
"undo": "undo",
|
"undo": "undo",
|
||||||
"redo": "redo",
|
"redo": "redo",
|
||||||
"none": "none",
|
"none": "none",
|
||||||
@@ -353,28 +342,21 @@
|
|||||||
"basicConfigDesc": "Modify the basic configuration globally",
|
"basicConfigDesc": "Modify the basic configuration globally",
|
||||||
"selectedCountTitle": "{count} items have been selected",
|
"selectedCountTitle": "{count} items have been selected",
|
||||||
"addRule": "Add rule",
|
"addRule": "Add rule",
|
||||||
"ruleProviderEmptyTip": "Rule provider cannot be empty",
|
|
||||||
"ruleName": "Rule name",
|
"ruleName": "Rule name",
|
||||||
"content": "Content",
|
"content": "Content",
|
||||||
"contentEmptyTip": "Content cannot be empty",
|
|
||||||
"subRule": "Sub rule",
|
"subRule": "Sub rule",
|
||||||
"subRuleEmptyTip": "Sub rule content cannot be empty",
|
|
||||||
"ruleTarget": "Rule target",
|
"ruleTarget": "Rule target",
|
||||||
"ruleTargetEmptyTip": "Rule target cannot be empty",
|
|
||||||
"sourceIp": "Source IP",
|
"sourceIp": "Source IP",
|
||||||
"noResolve": "No resolve IP",
|
"noResolve": "No resolve IP",
|
||||||
"getOriginRules": "Get original rules",
|
"getOriginRules": "Get original rules",
|
||||||
"overrideOriginRules": "Override the original rule",
|
"overrideOriginRules": "Override the original rule",
|
||||||
"addedOriginRules": "Attach on the original rules",
|
"addedOriginRules": "Attach on the original rules",
|
||||||
"enableOverride": "Enable override",
|
"enableOverride": "Enable override",
|
||||||
"deleteRuleTip": "Are you sure you want to delete the selected rule?",
|
|
||||||
"saveChanges": "Do you want to save the changes?",
|
"saveChanges": "Do you want to save the changes?",
|
||||||
"generalDesc": "Modify general settings",
|
"generalDesc": "Modify general settings",
|
||||||
"findProcessModeDesc": "There is a certain performance loss after opening",
|
"findProcessModeDesc": "There is a certain performance loss after opening",
|
||||||
"tabAnimationDesc": "Effective only in mobile view",
|
"tabAnimationDesc": "Effective only in mobile view",
|
||||||
"saveTip": "Are you sure you want to save?",
|
"saveTip": "Are you sure you want to save?",
|
||||||
"deleteColorTip": "Are you sure you want to delete the current color?",
|
|
||||||
"colorExists": "Current color already exists",
|
|
||||||
"colorSchemes": "Color schemes",
|
"colorSchemes": "Color schemes",
|
||||||
"palette": "Palette",
|
"palette": "Palette",
|
||||||
"tonalSpotScheme": "TonalSpot",
|
"tonalSpotScheme": "TonalSpot",
|
||||||
@@ -400,5 +382,28 @@
|
|||||||
"recoveryStrategy": "Recovery strategy",
|
"recoveryStrategy": "Recovery strategy",
|
||||||
"recoveryStrategy_override": "Override",
|
"recoveryStrategy_override": "Override",
|
||||||
"recoveryStrategy_compatible": "Compatible",
|
"recoveryStrategy_compatible": "Compatible",
|
||||||
"logsTest": "Logs test"
|
"logsTest": "Logs test",
|
||||||
|
"emptyTip": "{label} cannot be empty",
|
||||||
|
"urlTip": "{label} must be a url",
|
||||||
|
"numberTip": "{label} must be a number",
|
||||||
|
"interval": "Interval",
|
||||||
|
"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",
|
||||||
|
"script": "Script",
|
||||||
|
"color": "Color",
|
||||||
|
"rename": "Rename",
|
||||||
|
"unnamed": "Unnamed",
|
||||||
|
"pleaseEnterScriptName": "Please enter a script name",
|
||||||
|
"overrideInvalidTip": "Does not take effect in script mode",
|
||||||
|
"mixedPort": "Mixed Port",
|
||||||
|
"socksPort": "Socks Port",
|
||||||
|
"redirPort": "Redir Port",
|
||||||
|
"tproxyPort": "Tproxy Port",
|
||||||
|
"portTip": "{label} must be between 1024 and 49151",
|
||||||
|
"portConflictTip": "Please enter a different port",
|
||||||
|
"import": "Import",
|
||||||
|
"importFile": "Import from file",
|
||||||
|
"importUrl": "Import from URL"
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
"resourcesDesc": "外部リソース関連情報",
|
"resourcesDesc": "外部リソース関連情報",
|
||||||
"trafficUsage": "トラフィック使用量",
|
"trafficUsage": "トラフィック使用量",
|
||||||
"coreInfo": "コア情報",
|
"coreInfo": "コア情報",
|
||||||
"nullCoreInfoDesc": "コア情報を取得できません",
|
|
||||||
"networkSpeed": "ネットワーク速度",
|
"networkSpeed": "ネットワーク速度",
|
||||||
"outboundMode": "アウトバウンドモード",
|
"outboundMode": "アウトバウンドモード",
|
||||||
"networkDetection": "ネットワーク検出",
|
"networkDetection": "ネットワーク検出",
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
"noProxy": "プロキシなし",
|
"noProxy": "プロキシなし",
|
||||||
"noProxyDesc": "プロファイルを作成するか、有効なプロファイルを追加してください",
|
"noProxyDesc": "プロファイルを作成するか、有効なプロファイルを追加してください",
|
||||||
"nullProfileDesc": "プロファイルがありません。追加してください",
|
"nullProfileDesc": "プロファイルがありません。追加してください",
|
||||||
"nullLogsDesc": "ログがありません",
|
|
||||||
"settings": "設定",
|
"settings": "設定",
|
||||||
"language": "言語",
|
"language": "言語",
|
||||||
"defaultText": "デフォルト",
|
"defaultText": "デフォルト",
|
||||||
@@ -149,8 +147,6 @@
|
|||||||
"addressHelp": "WebDAVサーバーアドレス",
|
"addressHelp": "WebDAVサーバーアドレス",
|
||||||
"addressTip": "有効なWebDAVアドレスを入力",
|
"addressTip": "有効なWebDAVアドレスを入力",
|
||||||
"password": "パスワード",
|
"password": "パスワード",
|
||||||
"passwordTip": "パスワードは必須です",
|
|
||||||
"accountTip": "アカウントは必須です",
|
|
||||||
"checkUpdate": "更新を確認",
|
"checkUpdate": "更新を確認",
|
||||||
"discoverNewVersion": "新バージョンを発見",
|
"discoverNewVersion": "新バージョンを発見",
|
||||||
"checkUpdateError": "アプリは最新版です",
|
"checkUpdateError": "アプリは最新版です",
|
||||||
@@ -185,8 +181,6 @@
|
|||||||
"expirationTime": "有効期限",
|
"expirationTime": "有効期限",
|
||||||
"connections": "接続",
|
"connections": "接続",
|
||||||
"connectionsDesc": "現在の接続データを表示",
|
"connectionsDesc": "現在の接続データを表示",
|
||||||
"nullRequestsDesc": "リクエストなし",
|
|
||||||
"nullConnectionsDesc": "接続なし",
|
|
||||||
"intranetIP": "イントラネットIP",
|
"intranetIP": "イントラネットIP",
|
||||||
"view": "表示",
|
"view": "表示",
|
||||||
"cut": "切り取り",
|
"cut": "切り取り",
|
||||||
@@ -219,7 +213,6 @@
|
|||||||
"autoCloseConnectionsDesc": "ノード変更後に接続を自動閉じる",
|
"autoCloseConnectionsDesc": "ノード変更後に接続を自動閉じる",
|
||||||
"onlyStatisticsProxy": "プロキシのみ統計",
|
"onlyStatisticsProxy": "プロキシのみ統計",
|
||||||
"onlyStatisticsProxyDesc": "有効化するとプロキシトラフィックのみ統計",
|
"onlyStatisticsProxyDesc": "有効化するとプロキシトラフィックのみ統計",
|
||||||
"deleteProfileTip": "現在のプロファイルを削除しますか?",
|
|
||||||
"pureBlackMode": "純黒モード",
|
"pureBlackMode": "純黒モード",
|
||||||
"keepAliveIntervalDesc": "TCPキープアライブ間隔",
|
"keepAliveIntervalDesc": "TCPキープアライブ間隔",
|
||||||
"entries": " エントリ",
|
"entries": " エントリ",
|
||||||
@@ -250,7 +243,6 @@
|
|||||||
"dnsDesc": "DNS関連設定の更新",
|
"dnsDesc": "DNS関連設定の更新",
|
||||||
"key": "キー",
|
"key": "キー",
|
||||||
"value": "値",
|
"value": "値",
|
||||||
"notEmpty": "空欄不可",
|
|
||||||
"hostsDesc": "ホストを追加",
|
"hostsDesc": "ホストを追加",
|
||||||
"vpnTip": "変更はVPN再起動後に有効",
|
"vpnTip": "変更はVPN再起動後に有効",
|
||||||
"vpnEnableDesc": "VpnService経由で全システムトラフィックをルーティング",
|
"vpnEnableDesc": "VpnService経由で全システムトラフィックをルーティング",
|
||||||
@@ -337,15 +329,12 @@
|
|||||||
"fileIsUpdate": "ファイルが変更されました。保存しますか?",
|
"fileIsUpdate": "ファイルが変更されました。保存しますか?",
|
||||||
"profileHasUpdate": "プロファイルが変更されました。自動更新を無効化しますか?",
|
"profileHasUpdate": "プロファイルが変更されました。自動更新を無効化しますか?",
|
||||||
"hasCacheChange": "変更をキャッシュしますか?",
|
"hasCacheChange": "変更をキャッシュしますか?",
|
||||||
"nullProxies": "プロキシなし",
|
|
||||||
"copySuccess": "コピー成功",
|
"copySuccess": "コピー成功",
|
||||||
"copyLink": "リンクをコピー",
|
"copyLink": "リンクをコピー",
|
||||||
"exportFile": "ファイルをエクスポート",
|
"exportFile": "ファイルをエクスポート",
|
||||||
"cacheCorrupt": "キャッシュが破損しています。クリアしますか?",
|
"cacheCorrupt": "キャッシュが破損しています。クリアしますか?",
|
||||||
"detectionTip": "サードパーティAPIに依存(参考値)",
|
"detectionTip": "サードパーティAPIに依存(参考値)",
|
||||||
"listen": "リスン",
|
"listen": "リスン",
|
||||||
"keyExists": "現在のキーは既に存在します",
|
|
||||||
"valueExists": "現在の値は既に存在します",
|
|
||||||
"undo": "元に戻す",
|
"undo": "元に戻す",
|
||||||
"redo": "やり直す",
|
"redo": "やり直す",
|
||||||
"none": "なし",
|
"none": "なし",
|
||||||
@@ -353,28 +342,21 @@
|
|||||||
"basicConfigDesc": "基本設定をグローバルに変更",
|
"basicConfigDesc": "基本設定をグローバルに変更",
|
||||||
"selectedCountTitle": "{count} 項目が選択されています",
|
"selectedCountTitle": "{count} 項目が選択されています",
|
||||||
"addRule": "ルールを追加",
|
"addRule": "ルールを追加",
|
||||||
"ruleProviderEmptyTip": "ルールプロバイダーは必須です",
|
|
||||||
"ruleName": "ルール名",
|
"ruleName": "ルール名",
|
||||||
"content": "内容",
|
"content": "内容",
|
||||||
"contentEmptyTip": "内容は必須です",
|
|
||||||
"subRule": "サブルール",
|
"subRule": "サブルール",
|
||||||
"subRuleEmptyTip": "サブルールの内容は必須です",
|
|
||||||
"ruleTarget": "ルール対象",
|
"ruleTarget": "ルール対象",
|
||||||
"ruleTargetEmptyTip": "ルール対象は必須です",
|
|
||||||
"sourceIp": "送信元IP",
|
"sourceIp": "送信元IP",
|
||||||
"noResolve": "IPを解決しない",
|
"noResolve": "IPを解決しない",
|
||||||
"getOriginRules": "元のルールを取得",
|
"getOriginRules": "元のルールを取得",
|
||||||
"overrideOriginRules": "元のルールを上書き",
|
"overrideOriginRules": "元のルールを上書き",
|
||||||
"addedOriginRules": "元のルールに追加",
|
"addedOriginRules": "元のルールに追加",
|
||||||
"enableOverride": "上書きを有効化",
|
"enableOverride": "上書きを有効化",
|
||||||
"deleteRuleTip": "選択したルールを削除しますか?",
|
|
||||||
"saveChanges": "変更を保存しますか?",
|
"saveChanges": "変更を保存しますか?",
|
||||||
"generalDesc": "一般設定を変更",
|
"generalDesc": "一般設定を変更",
|
||||||
"findProcessModeDesc": "有効化するとパフォーマンスが若干低下します",
|
"findProcessModeDesc": "有効化するとパフォーマンスが若干低下します",
|
||||||
"tabAnimationDesc": "モバイル表示でのみ有効",
|
"tabAnimationDesc": "モバイル表示でのみ有効",
|
||||||
"saveTip": "保存してもよろしいですか?",
|
"saveTip": "保存してもよろしいですか?",
|
||||||
"deleteColorTip": "現在の色を削除しますか?",
|
|
||||||
"colorExists": "この色は既に存在します",
|
|
||||||
"colorSchemes": "カラースキーム",
|
"colorSchemes": "カラースキーム",
|
||||||
"palette": "パレット",
|
"palette": "パレット",
|
||||||
"tonalSpotScheme": "トーンスポット",
|
"tonalSpotScheme": "トーンスポット",
|
||||||
@@ -401,5 +383,28 @@
|
|||||||
"recoveryStrategy": "リカバリー戦略",
|
"recoveryStrategy": "リカバリー戦略",
|
||||||
"recoveryStrategy_override": "オーバーライド",
|
"recoveryStrategy_override": "オーバーライド",
|
||||||
"recoveryStrategy_compatible": "互換性",
|
"recoveryStrategy_compatible": "互換性",
|
||||||
"logsTest": "ログテスト"
|
"logsTest": "ログテスト",
|
||||||
|
"emptyTip": "{label}は空欄にできません",
|
||||||
|
"urlTip": "{label}はURLである必要があります",
|
||||||
|
"numberTip": "{label}は数字でなければなりません",
|
||||||
|
"interval": "インターバル",
|
||||||
|
"existsTip": "現在の{label}は既に存在しています",
|
||||||
|
"deleteTip": "現在の{label}を削除してもよろしいですか?",
|
||||||
|
"deleteMultipTip": "選択された{label}を削除してもよろしいですか?",
|
||||||
|
"nullTip": "現在{label}はありません",
|
||||||
|
"script": "スクリプト",
|
||||||
|
"color": "カラー",
|
||||||
|
"rename": "リネーム",
|
||||||
|
"unnamed": "無題",
|
||||||
|
"pleaseEnterScriptName": "スクリプト名を入力してください",
|
||||||
|
"overrideInvalidTip": "スクリプトモードでは有効になりません",
|
||||||
|
"mixedPort": "混合ポート",
|
||||||
|
"socksPort": "Socksポート",
|
||||||
|
"redirPort": "Redirポート",
|
||||||
|
"tproxyPort": "Tproxyポート",
|
||||||
|
"portTip": "{label} は 1024 から 49151 の間でなければなりません",
|
||||||
|
"portConflictTip": "別のポートを入力してください",
|
||||||
|
"import": "インポート",
|
||||||
|
"importFile": "ファイルからインポート",
|
||||||
|
"importUrl": "URLからインポート"
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
"resourcesDesc": "Информация, связанная с внешними ресурсами",
|
"resourcesDesc": "Информация, связанная с внешними ресурсами",
|
||||||
"trafficUsage": "Использование трафика",
|
"trafficUsage": "Использование трафика",
|
||||||
"coreInfo": "Информация о ядре",
|
"coreInfo": "Информация о ядре",
|
||||||
"nullCoreInfoDesc": "Не удалось получить информацию о ядре",
|
|
||||||
"networkSpeed": "Скорость сети",
|
"networkSpeed": "Скорость сети",
|
||||||
"outboundMode": "Режим исходящего трафика",
|
"outboundMode": "Режим исходящего трафика",
|
||||||
"networkDetection": "Обнаружение сети",
|
"networkDetection": "Обнаружение сети",
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
"noProxy": "Нет прокси",
|
"noProxy": "Нет прокси",
|
||||||
"noProxyDesc": "Пожалуйста, создайте профиль или добавьте действительный профиль",
|
"noProxyDesc": "Пожалуйста, создайте профиль или добавьте действительный профиль",
|
||||||
"nullProfileDesc": "Нет профиля, пожалуйста, добавьте профиль",
|
"nullProfileDesc": "Нет профиля, пожалуйста, добавьте профиль",
|
||||||
"nullLogsDesc": "Нет логов",
|
|
||||||
"settings": "Настройки",
|
"settings": "Настройки",
|
||||||
"language": "Язык",
|
"language": "Язык",
|
||||||
"defaultText": "По умолчанию",
|
"defaultText": "По умолчанию",
|
||||||
@@ -149,8 +147,6 @@
|
|||||||
"addressHelp": "Адрес сервера WebDAV",
|
"addressHelp": "Адрес сервера WebDAV",
|
||||||
"addressTip": "Пожалуйста, введите действительный адрес WebDAV",
|
"addressTip": "Пожалуйста, введите действительный адрес WebDAV",
|
||||||
"password": "Пароль",
|
"password": "Пароль",
|
||||||
"passwordTip": "Пароль не может быть пустым",
|
|
||||||
"accountTip": "Аккаунт не может быть пустым",
|
|
||||||
"checkUpdate": "Проверить обновления",
|
"checkUpdate": "Проверить обновления",
|
||||||
"discoverNewVersion": "Обнаружена новая версия",
|
"discoverNewVersion": "Обнаружена новая версия",
|
||||||
"checkUpdateError": "Текущее приложение уже является последней версией",
|
"checkUpdateError": "Текущее приложение уже является последней версией",
|
||||||
@@ -185,8 +181,6 @@
|
|||||||
"expirationTime": "Время истечения",
|
"expirationTime": "Время истечения",
|
||||||
"connections": "Соединения",
|
"connections": "Соединения",
|
||||||
"connectionsDesc": "Просмотр текущих данных о соединениях",
|
"connectionsDesc": "Просмотр текущих данных о соединениях",
|
||||||
"nullRequestsDesc": "Нет запросов",
|
|
||||||
"nullConnectionsDesc": "Нет соединений",
|
|
||||||
"intranetIP": "Внутренний IP",
|
"intranetIP": "Внутренний IP",
|
||||||
"view": "Просмотр",
|
"view": "Просмотр",
|
||||||
"cut": "Вырезать",
|
"cut": "Вырезать",
|
||||||
@@ -219,7 +213,6 @@
|
|||||||
"autoCloseConnectionsDesc": "Автоматически закрывать соединения после смены узла",
|
"autoCloseConnectionsDesc": "Автоматически закрывать соединения после смены узла",
|
||||||
"onlyStatisticsProxy": "Только статистика прокси",
|
"onlyStatisticsProxy": "Только статистика прокси",
|
||||||
"onlyStatisticsProxyDesc": "При включении будет учитываться только трафик прокси",
|
"onlyStatisticsProxyDesc": "При включении будет учитываться только трафик прокси",
|
||||||
"deleteProfileTip": "Вы уверены, что хотите удалить текущий профиль?",
|
|
||||||
"pureBlackMode": "Чисто черный режим",
|
"pureBlackMode": "Чисто черный режим",
|
||||||
"keepAliveIntervalDesc": "Интервал поддержания TCP-соединения",
|
"keepAliveIntervalDesc": "Интервал поддержания TCP-соединения",
|
||||||
"entries": " записей",
|
"entries": " записей",
|
||||||
@@ -250,7 +243,6 @@
|
|||||||
"dnsDesc": "Обновление настроек, связанных с DNS",
|
"dnsDesc": "Обновление настроек, связанных с DNS",
|
||||||
"key": "Ключ",
|
"key": "Ключ",
|
||||||
"value": "Значение",
|
"value": "Значение",
|
||||||
"notEmpty": "Не может быть пустым",
|
|
||||||
"hostsDesc": "Добавить Hosts",
|
"hostsDesc": "Добавить Hosts",
|
||||||
"vpnTip": "Изменения вступят в силу после перезапуска VPN",
|
"vpnTip": "Изменения вступят в силу после перезапуска VPN",
|
||||||
"vpnEnableDesc": "Автоматически направляет весь системный трафик через VpnService",
|
"vpnEnableDesc": "Автоматически направляет весь системный трафик через VpnService",
|
||||||
@@ -337,15 +329,12 @@
|
|||||||
"fileIsUpdate": "Файл был изменен. Хотите сохранить изменения?",
|
"fileIsUpdate": "Файл был изменен. Хотите сохранить изменения?",
|
||||||
"profileHasUpdate": "Профиль был изменен. Хотите отключить автообновление?",
|
"profileHasUpdate": "Профиль был изменен. Хотите отключить автообновление?",
|
||||||
"hasCacheChange": "Хотите сохранить изменения в кэше?",
|
"hasCacheChange": "Хотите сохранить изменения в кэше?",
|
||||||
"nullProxies": "Нет прокси",
|
|
||||||
"copySuccess": "Копирование успешно",
|
"copySuccess": "Копирование успешно",
|
||||||
"copyLink": "Копировать ссылку",
|
"copyLink": "Копировать ссылку",
|
||||||
"exportFile": "Экспорт файла",
|
"exportFile": "Экспорт файла",
|
||||||
"cacheCorrupt": "Кэш поврежден. Хотите очистить его?",
|
"cacheCorrupt": "Кэш поврежден. Хотите очистить его?",
|
||||||
"detectionTip": "Опирается на сторонний API, только для справки",
|
"detectionTip": "Опирается на сторонний API, только для справки",
|
||||||
"listen": "Слушать",
|
"listen": "Слушать",
|
||||||
"keyExists": "Текущий ключ уже существует",
|
|
||||||
"valueExists": "Текущее значение уже существует",
|
|
||||||
"undo": "Отменить",
|
"undo": "Отменить",
|
||||||
"redo": "Повторить",
|
"redo": "Повторить",
|
||||||
"none": "Нет",
|
"none": "Нет",
|
||||||
@@ -353,28 +342,21 @@
|
|||||||
"basicConfigDesc": "Глобальное изменение базовых настроек",
|
"basicConfigDesc": "Глобальное изменение базовых настроек",
|
||||||
"selectedCountTitle": "Выбрано {count} элементов",
|
"selectedCountTitle": "Выбрано {count} элементов",
|
||||||
"addRule": "Добавить правило",
|
"addRule": "Добавить правило",
|
||||||
"ruleProviderEmptyTip": "Поставщик правил не может быть пустым",
|
|
||||||
"ruleName": "Название правила",
|
"ruleName": "Название правила",
|
||||||
"content": "Содержание",
|
"content": "Содержание",
|
||||||
"contentEmptyTip": "Содержание не может быть пустым",
|
|
||||||
"subRule": "Подправило",
|
"subRule": "Подправило",
|
||||||
"subRuleEmptyTip": "Содержание подправила не может быть пустым",
|
|
||||||
"ruleTarget": "Цель правила",
|
"ruleTarget": "Цель правила",
|
||||||
"ruleTargetEmptyTip": "Цель правила не может быть пустой",
|
|
||||||
"sourceIp": "Исходный IP",
|
"sourceIp": "Исходный IP",
|
||||||
"noResolve": "Не разрешать IP",
|
"noResolve": "Не разрешать IP",
|
||||||
"getOriginRules": "Получить оригинальные правила",
|
"getOriginRules": "Получить оригинальные правила",
|
||||||
"overrideOriginRules": "Переопределить оригинальное правило",
|
"overrideOriginRules": "Переопределить оригинальное правило",
|
||||||
"addedOriginRules": "Добавить к оригинальным правилам",
|
"addedOriginRules": "Добавить к оригинальным правилам",
|
||||||
"enableOverride": "Включить переопределение",
|
"enableOverride": "Включить переопределение",
|
||||||
"deleteRuleTip": "Вы уверены, что хотите удалить выбранное правило?",
|
|
||||||
"saveChanges": "Сохранить изменения?",
|
"saveChanges": "Сохранить изменения?",
|
||||||
"generalDesc": "Изменение общих настроек",
|
"generalDesc": "Изменение общих настроек",
|
||||||
"findProcessModeDesc": "При включении возможны небольшие потери производительности",
|
"findProcessModeDesc": "При включении возможны небольшие потери производительности",
|
||||||
"tabAnimationDesc": "Действительно только в мобильном виде",
|
"tabAnimationDesc": "Действительно только в мобильном виде",
|
||||||
"saveTip": "Вы уверены, что хотите сохранить?",
|
"saveTip": "Вы уверены, что хотите сохранить?",
|
||||||
"deleteColorTip": "Удалить текущий цвет?",
|
|
||||||
"colorExists": "Этот цвет уже существует",
|
|
||||||
"colorSchemes": "Цветовые схемы",
|
"colorSchemes": "Цветовые схемы",
|
||||||
"palette": "Палитра",
|
"palette": "Палитра",
|
||||||
"tonalSpotScheme": "Тональный акцент",
|
"tonalSpotScheme": "Тональный акцент",
|
||||||
@@ -401,5 +383,28 @@
|
|||||||
"recoveryStrategy": "Стратегия восстановления",
|
"recoveryStrategy": "Стратегия восстановления",
|
||||||
"recoveryStrategy_override": "Переопределение",
|
"recoveryStrategy_override": "Переопределение",
|
||||||
"recoveryStrategy_compatible": "Совместимый",
|
"recoveryStrategy_compatible": "Совместимый",
|
||||||
"logsTest": "Тест журналов"
|
"logsTest": "Тест журналов",
|
||||||
|
"emptyTip": "{label} не может быть пустым",
|
||||||
|
"urlTip": "{label} должен быть URL",
|
||||||
|
"numberTip": "{label} должно быть числом",
|
||||||
|
"interval": "Интервал",
|
||||||
|
"existsTip": "Текущий {label} уже существует",
|
||||||
|
"deleteTip": "Вы уверены, что хотите удалить текущий {label}?",
|
||||||
|
"deleteMultipTip": "Вы уверены, что хотите удалить выбранные {label}?",
|
||||||
|
"nullTip": "Сейчас {label} нет",
|
||||||
|
"script": "Скрипт",
|
||||||
|
"color": "Цвет",
|
||||||
|
"rename": "Переименовать",
|
||||||
|
"unnamed": "Без имени",
|
||||||
|
"pleaseEnterScriptName": "Пожалуйста, введите название скрипта",
|
||||||
|
"overrideInvalidTip": "В скриптовом режиме не действует",
|
||||||
|
"mixedPort": "Смешанный порт",
|
||||||
|
"socksPort": "Socks-порт",
|
||||||
|
"redirPort": "Redir-порт",
|
||||||
|
"tproxyPort": "Tproxy-порт",
|
||||||
|
"portTip": "{label} должен быть числом от 1024 до 49151",
|
||||||
|
"portConflictTip": "Введите другой порт",
|
||||||
|
"import": "Импорт",
|
||||||
|
"importFile": "Импорт из файла",
|
||||||
|
"importUrl": "Импорт по URL"
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
"resourcesDesc": "外部资源相关信息",
|
"resourcesDesc": "外部资源相关信息",
|
||||||
"trafficUsage": "流量统计",
|
"trafficUsage": "流量统计",
|
||||||
"coreInfo": "内核信息",
|
"coreInfo": "内核信息",
|
||||||
"nullCoreInfoDesc": "无法获取内核信息",
|
|
||||||
"networkSpeed": "网络速度",
|
"networkSpeed": "网络速度",
|
||||||
"outboundMode": "出站模式",
|
"outboundMode": "出站模式",
|
||||||
"networkDetection": "网络检测",
|
"networkDetection": "网络检测",
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
"noProxy": "暂无代理",
|
"noProxy": "暂无代理",
|
||||||
"noProxyDesc": "请创建配置文件或者添加有效配置文件",
|
"noProxyDesc": "请创建配置文件或者添加有效配置文件",
|
||||||
"nullProfileDesc": "没有配置文件,请先添加配置文件",
|
"nullProfileDesc": "没有配置文件,请先添加配置文件",
|
||||||
"nullLogsDesc": "暂无日志",
|
|
||||||
"settings": "设置",
|
"settings": "设置",
|
||||||
"language": "语言",
|
"language": "语言",
|
||||||
"defaultText": "默认",
|
"defaultText": "默认",
|
||||||
@@ -149,8 +147,6 @@
|
|||||||
"addressHelp": "WebDAV服务器地址",
|
"addressHelp": "WebDAV服务器地址",
|
||||||
"addressTip": "请输入有效的WebDAV地址",
|
"addressTip": "请输入有效的WebDAV地址",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
"passwordTip": "密码不能为空",
|
|
||||||
"accountTip": "账号不能为空",
|
|
||||||
"checkUpdate": "检查更新",
|
"checkUpdate": "检查更新",
|
||||||
"discoverNewVersion": "发现新版本",
|
"discoverNewVersion": "发现新版本",
|
||||||
"checkUpdateError": "当前应用已经是最新版了",
|
"checkUpdateError": "当前应用已经是最新版了",
|
||||||
@@ -185,8 +181,6 @@
|
|||||||
"expirationTime": "到期时间",
|
"expirationTime": "到期时间",
|
||||||
"connections": "连接",
|
"connections": "连接",
|
||||||
"connectionsDesc": "查看当前连接数据",
|
"connectionsDesc": "查看当前连接数据",
|
||||||
"nullRequestsDesc": "暂无请求",
|
|
||||||
"nullConnectionsDesc": "暂无连接",
|
|
||||||
"intranetIP": "内网 IP",
|
"intranetIP": "内网 IP",
|
||||||
"view": "查看",
|
"view": "查看",
|
||||||
"cut": "剪切",
|
"cut": "剪切",
|
||||||
@@ -219,7 +213,6 @@
|
|||||||
"autoCloseConnectionsDesc": "切换节点后自动关闭连接",
|
"autoCloseConnectionsDesc": "切换节点后自动关闭连接",
|
||||||
"onlyStatisticsProxy": "仅统计代理",
|
"onlyStatisticsProxy": "仅统计代理",
|
||||||
"onlyStatisticsProxyDesc": "开启后,将只统计代理流量",
|
"onlyStatisticsProxyDesc": "开启后,将只统计代理流量",
|
||||||
"deleteProfileTip": "确定要删除当前配置吗?",
|
|
||||||
"pureBlackMode": "纯黑模式",
|
"pureBlackMode": "纯黑模式",
|
||||||
"keepAliveIntervalDesc": "TCP保持活动间隔",
|
"keepAliveIntervalDesc": "TCP保持活动间隔",
|
||||||
"entries": "个条目",
|
"entries": "个条目",
|
||||||
@@ -250,7 +243,6 @@
|
|||||||
"dnsDesc": "更新DNS相关设置",
|
"dnsDesc": "更新DNS相关设置",
|
||||||
"key": "键",
|
"key": "键",
|
||||||
"value": "值",
|
"value": "值",
|
||||||
"notEmpty": "不能为空",
|
|
||||||
"hostsDesc": "追加Hosts",
|
"hostsDesc": "追加Hosts",
|
||||||
"vpnTip": "重启VPN后改变生效",
|
"vpnTip": "重启VPN后改变生效",
|
||||||
"vpnEnableDesc": "通过VpnService自动路由系统所有流量",
|
"vpnEnableDesc": "通过VpnService自动路由系统所有流量",
|
||||||
@@ -337,15 +329,12 @@
|
|||||||
"fileIsUpdate": "文件有修改,是否保存修改",
|
"fileIsUpdate": "文件有修改,是否保存修改",
|
||||||
"profileHasUpdate": "配置文件已经修改,是否关闭自动更新 ",
|
"profileHasUpdate": "配置文件已经修改,是否关闭自动更新 ",
|
||||||
"hasCacheChange": "是否缓存修改",
|
"hasCacheChange": "是否缓存修改",
|
||||||
"nullProxies": "暂无代理",
|
|
||||||
"copySuccess": "复制成功",
|
"copySuccess": "复制成功",
|
||||||
"copyLink": "复制链接",
|
"copyLink": "复制链接",
|
||||||
"exportFile": "导出文件",
|
"exportFile": "导出文件",
|
||||||
"cacheCorrupt": "缓存已损坏,是否清空?",
|
"cacheCorrupt": "缓存已损坏,是否清空?",
|
||||||
"detectionTip": "依赖第三方api,仅供参考",
|
"detectionTip": "依赖第三方api,仅供参考",
|
||||||
"listen": "监听",
|
"listen": "监听",
|
||||||
"keyExists": "当前键已存在",
|
|
||||||
"valueExists": "当前值已存在",
|
|
||||||
"undo": "撤销",
|
"undo": "撤销",
|
||||||
"redo": "重做",
|
"redo": "重做",
|
||||||
"none": "无",
|
"none": "无",
|
||||||
@@ -353,28 +342,21 @@
|
|||||||
"basicConfigDesc": "全局修改基本配置",
|
"basicConfigDesc": "全局修改基本配置",
|
||||||
"selectedCountTitle": "已选择 {count} 项",
|
"selectedCountTitle": "已选择 {count} 项",
|
||||||
"addRule": "添加规则",
|
"addRule": "添加规则",
|
||||||
"ruleProviderEmptyTip": "规则提供者不能为空",
|
|
||||||
"ruleName": "规则名称",
|
"ruleName": "规则名称",
|
||||||
"content": "内容",
|
"content": "内容",
|
||||||
"contentEmptyTip": "内容不能为空",
|
|
||||||
"subRule": "子规则",
|
"subRule": "子规则",
|
||||||
"subRuleEmptyTip": "子规则内容不能为空",
|
|
||||||
"ruleTarget": "规则目标",
|
"ruleTarget": "规则目标",
|
||||||
"ruleTargetEmptyTip": "规则目标不能为空",
|
|
||||||
"sourceIp": "源IP",
|
"sourceIp": "源IP",
|
||||||
"noResolve": "不解析IP",
|
"noResolve": "不解析IP",
|
||||||
"getOriginRules": "获取原始规则",
|
"getOriginRules": "获取原始规则",
|
||||||
"overrideOriginRules": "覆盖原始规则",
|
"overrideOriginRules": "覆盖原始规则",
|
||||||
"addedOriginRules": "附加到原始规则",
|
"addedOriginRules": "附加到原始规则",
|
||||||
"enableOverride": "启用覆写",
|
"enableOverride": "启用覆写",
|
||||||
"deleteRuleTip": "确定要删除选中的规则吗?",
|
|
||||||
"saveChanges": "是否保存更改?",
|
"saveChanges": "是否保存更改?",
|
||||||
"generalDesc": "修改通用设置",
|
"generalDesc": "修改通用设置",
|
||||||
"findProcessModeDesc": "开启后会有一定性能损耗",
|
"findProcessModeDesc": "开启后会有一定性能损耗",
|
||||||
"tabAnimationDesc": "仅在移动视图中有效",
|
"tabAnimationDesc": "仅在移动视图中有效",
|
||||||
"saveTip": "确定要保存吗?",
|
"saveTip": "确定要保存吗?",
|
||||||
"deleteColorTip": "确定删除当前颜色吗?",
|
|
||||||
"colorExists": "该颜色已存在",
|
|
||||||
"colorSchemes": "配色方案",
|
"colorSchemes": "配色方案",
|
||||||
"palette": "调色板",
|
"palette": "调色板",
|
||||||
"tonalSpotScheme": "调性点缀",
|
"tonalSpotScheme": "调性点缀",
|
||||||
@@ -401,5 +383,28 @@
|
|||||||
"recoveryStrategy": "恢复策略",
|
"recoveryStrategy": "恢复策略",
|
||||||
"recoveryStrategy_override": "覆盖",
|
"recoveryStrategy_override": "覆盖",
|
||||||
"recoveryStrategy_compatible": "兼容",
|
"recoveryStrategy_compatible": "兼容",
|
||||||
"logsTest": "日志测试"
|
"logsTest": "日志测试",
|
||||||
|
"emptyTip": "{label}不能为空",
|
||||||
|
"urlTip": "{label}必须为URL",
|
||||||
|
"numberTip": "{label}必须为数字",
|
||||||
|
"interval": "间隔",
|
||||||
|
"existsTip": "{label}当前已存在",
|
||||||
|
"deleteTip": "确定删除当前{label}吗?",
|
||||||
|
"deleteMultipTip": "确定删除选中的{label}吗?",
|
||||||
|
"nullTip": "暂无{label}",
|
||||||
|
"script": "脚本",
|
||||||
|
"color": "颜色",
|
||||||
|
"rename": "重命名",
|
||||||
|
"unnamed": "未命名",
|
||||||
|
"pleaseEnterScriptName": "请输入脚本名称",
|
||||||
|
"overrideInvalidTip": "在脚本模式下不生效",
|
||||||
|
"mixedPort": "混合端口",
|
||||||
|
"socksPort": "Socks端口",
|
||||||
|
"redirPort": "Redir端口",
|
||||||
|
"tproxyPort": "Tproxy端口",
|
||||||
|
"portTip": "{label} 必须在 1024 到 49151 之间",
|
||||||
|
"portConflictTip": "请输入不同的端口",
|
||||||
|
"import": "导入",
|
||||||
|
"importFile": "通过文件导入",
|
||||||
|
"importUrl": "通过URL导入"
|
||||||
}
|
}
|
||||||
|
|||||||
Submodule core/Clash.Meta updated: 6eac0e5d3d...413467ae6b
118
core/action.go
118
core/action.go
@@ -5,16 +5,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Action struct {
|
type Action struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Method Method `json:"method"`
|
Method Method `json:"method"`
|
||||||
Data interface{} `json:"data"`
|
Data interface{} `json:"data"`
|
||||||
DefaultValue interface{} `json:"default-value"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ActionResult struct {
|
type ActionResult struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Method Method `json:"method"`
|
Method Method `json:"method"`
|
||||||
Data interface{} `json:"data"`
|
Data interface{} `json:"data"`
|
||||||
|
Code int `json:"code"`
|
||||||
|
Port int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (result ActionResult) Json() ([]byte, error) {
|
func (result ActionResult) Json() ([]byte, error) {
|
||||||
@@ -22,99 +23,117 @@ func (result ActionResult) Json() ([]byte, error) {
|
|||||||
return data, err
|
return data, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (action Action) getResult(data interface{}) []byte {
|
func (result ActionResult) success(data interface{}) {
|
||||||
resultAction := ActionResult{
|
result.Code = 0
|
||||||
Id: action.Id,
|
result.Data = data
|
||||||
Method: action.Method,
|
result.send()
|
||||||
Data: data,
|
|
||||||
}
|
|
||||||
res, _ := resultAction.Json()
|
|
||||||
return res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleAction(action *Action, result func(data interface{})) {
|
func (result ActionResult) error(data interface{}) {
|
||||||
|
result.Code = -1
|
||||||
|
result.Data = data
|
||||||
|
result.send()
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleAction(action *Action, result ActionResult) {
|
||||||
switch action.Method {
|
switch action.Method {
|
||||||
case initClashMethod:
|
case initClashMethod:
|
||||||
paramsString := action.Data.(string)
|
paramsString := action.Data.(string)
|
||||||
result(handleInitClash(paramsString))
|
result.success(handleInitClash(paramsString))
|
||||||
return
|
return
|
||||||
case getIsInitMethod:
|
case getIsInitMethod:
|
||||||
result(handleGetIsInit())
|
result.success(handleGetIsInit())
|
||||||
return
|
return
|
||||||
case forceGcMethod:
|
case forceGcMethod:
|
||||||
handleForceGc()
|
handleForceGc()
|
||||||
result(true)
|
result.success(true)
|
||||||
return
|
return
|
||||||
case shutdownMethod:
|
case shutdownMethod:
|
||||||
result(handleShutdown())
|
result.success(handleShutdown())
|
||||||
return
|
return
|
||||||
case validateConfigMethod:
|
case validateConfigMethod:
|
||||||
data := []byte(action.Data.(string))
|
data := []byte(action.Data.(string))
|
||||||
result(handleValidateConfig(data))
|
result.success(handleValidateConfig(data))
|
||||||
return
|
return
|
||||||
case updateConfigMethod:
|
case updateConfigMethod:
|
||||||
data := []byte(action.Data.(string))
|
data := []byte(action.Data.(string))
|
||||||
result(handleUpdateConfig(data))
|
result.success(handleUpdateConfig(data))
|
||||||
|
return
|
||||||
|
case setupConfigMethod:
|
||||||
|
data := []byte(action.Data.(string))
|
||||||
|
result.success(handleSetupConfig(data))
|
||||||
return
|
return
|
||||||
case getProxiesMethod:
|
case getProxiesMethod:
|
||||||
result(handleGetProxies())
|
result.success(handleGetProxies())
|
||||||
return
|
return
|
||||||
case changeProxyMethod:
|
case changeProxyMethod:
|
||||||
data := action.Data.(string)
|
data := action.Data.(string)
|
||||||
handleChangeProxy(data, func(value string) {
|
handleChangeProxy(data, func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case getTrafficMethod:
|
case getTrafficMethod:
|
||||||
result(handleGetTraffic())
|
result.success(handleGetTraffic())
|
||||||
return
|
return
|
||||||
case getTotalTrafficMethod:
|
case getTotalTrafficMethod:
|
||||||
result(handleGetTotalTraffic())
|
result.success(handleGetTotalTraffic())
|
||||||
return
|
return
|
||||||
case resetTrafficMethod:
|
case resetTrafficMethod:
|
||||||
handleResetTraffic()
|
handleResetTraffic()
|
||||||
result(true)
|
result.success(true)
|
||||||
return
|
return
|
||||||
case asyncTestDelayMethod:
|
case asyncTestDelayMethod:
|
||||||
data := action.Data.(string)
|
data := action.Data.(string)
|
||||||
handleAsyncTestDelay(data, func(value string) {
|
handleAsyncTestDelay(data, func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case getConnectionsMethod:
|
case getConnectionsMethod:
|
||||||
result(handleGetConnections())
|
result.success(handleGetConnections())
|
||||||
return
|
return
|
||||||
case closeConnectionsMethod:
|
case closeConnectionsMethod:
|
||||||
result(handleCloseConnections())
|
result.success(handleCloseConnections())
|
||||||
|
return
|
||||||
|
case resetConnectionsMethod:
|
||||||
|
result.success(handleResetConnections())
|
||||||
|
return
|
||||||
|
case getConfigMethod:
|
||||||
|
path := action.Data.(string)
|
||||||
|
config, err := handleGetConfig(path)
|
||||||
|
if err != nil {
|
||||||
|
result.error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result.success(config)
|
||||||
return
|
return
|
||||||
case closeConnectionMethod:
|
case closeConnectionMethod:
|
||||||
id := action.Data.(string)
|
id := action.Data.(string)
|
||||||
result(handleCloseConnection(id))
|
result.success(handleCloseConnection(id))
|
||||||
return
|
return
|
||||||
case getExternalProvidersMethod:
|
case getExternalProvidersMethod:
|
||||||
result(handleGetExternalProviders())
|
result.success(handleGetExternalProviders())
|
||||||
return
|
return
|
||||||
case getExternalProviderMethod:
|
case getExternalProviderMethod:
|
||||||
externalProviderName := action.Data.(string)
|
externalProviderName := action.Data.(string)
|
||||||
result(handleGetExternalProvider(externalProviderName))
|
result.success(handleGetExternalProvider(externalProviderName))
|
||||||
case updateGeoDataMethod:
|
case updateGeoDataMethod:
|
||||||
paramsString := action.Data.(string)
|
paramsString := action.Data.(string)
|
||||||
var params = map[string]string{}
|
var params = map[string]string{}
|
||||||
err := json.Unmarshal([]byte(paramsString), ¶ms)
|
err := json.Unmarshal([]byte(paramsString), ¶ms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
result(err.Error())
|
result.success(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
geoType := params["geo-type"]
|
geoType := params["geo-type"]
|
||||||
geoName := params["geo-name"]
|
geoName := params["geo-name"]
|
||||||
handleUpdateGeoData(geoType, geoName, func(value string) {
|
handleUpdateGeoData(geoType, geoName, func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case updateExternalProviderMethod:
|
case updateExternalProviderMethod:
|
||||||
providerName := action.Data.(string)
|
providerName := action.Data.(string)
|
||||||
handleUpdateExternalProvider(providerName, func(value string) {
|
handleUpdateExternalProvider(providerName, func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case sideLoadExternalProviderMethod:
|
case sideLoadExternalProviderMethod:
|
||||||
@@ -122,59 +141,48 @@ func handleAction(action *Action, result func(data interface{})) {
|
|||||||
var params = map[string]string{}
|
var params = map[string]string{}
|
||||||
err := json.Unmarshal([]byte(paramsString), ¶ms)
|
err := json.Unmarshal([]byte(paramsString), ¶ms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
result(err.Error())
|
result.success(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
providerName := params["providerName"]
|
providerName := params["providerName"]
|
||||||
data := params["data"]
|
data := params["data"]
|
||||||
handleSideLoadExternalProvider(providerName, []byte(data), func(value string) {
|
handleSideLoadExternalProvider(providerName, []byte(data), func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case startLogMethod:
|
case startLogMethod:
|
||||||
handleStartLog()
|
handleStartLog()
|
||||||
result(true)
|
result.success(true)
|
||||||
return
|
return
|
||||||
case stopLogMethod:
|
case stopLogMethod:
|
||||||
handleStopLog()
|
handleStopLog()
|
||||||
result(true)
|
result.success(true)
|
||||||
return
|
return
|
||||||
case startListenerMethod:
|
case startListenerMethod:
|
||||||
result(handleStartListener())
|
result.success(handleStartListener())
|
||||||
return
|
return
|
||||||
case stopListenerMethod:
|
case stopListenerMethod:
|
||||||
result(handleStopListener())
|
result.success(handleStopListener())
|
||||||
return
|
return
|
||||||
case getCountryCodeMethod:
|
case getCountryCodeMethod:
|
||||||
ip := action.Data.(string)
|
ip := action.Data.(string)
|
||||||
handleGetCountryCode(ip, func(value string) {
|
handleGetCountryCode(ip, func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case getMemoryMethod:
|
case getMemoryMethod:
|
||||||
handleGetMemory(func(value string) {
|
handleGetMemory(func(value string) {
|
||||||
result(value)
|
result.success(value)
|
||||||
})
|
|
||||||
return
|
|
||||||
case getProfileMethod:
|
|
||||||
profileId := action.Data.(string)
|
|
||||||
handleGetMemory(func(value string) {
|
|
||||||
result(handleGetProfile(profileId))
|
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
case setStateMethod:
|
case setStateMethod:
|
||||||
data := action.Data.(string)
|
data := action.Data.(string)
|
||||||
handleSetState(data)
|
handleSetState(data)
|
||||||
result(true)
|
result.success(true)
|
||||||
case crashMethod:
|
case crashMethod:
|
||||||
result(true)
|
result.success(true)
|
||||||
handleCrash()
|
handleCrash()
|
||||||
default:
|
default:
|
||||||
handle := nextHandle(action, result)
|
nextHandle(action, result)
|
||||||
if handle {
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
result(action.DefaultValue)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,13 +43,13 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func protect(callback unsafe.Pointer, fd int) {
|
func Protect(callback unsafe.Pointer, fd int) {
|
||||||
if globalCallbacks.protectFunc != nil {
|
if globalCallbacks.protectFunc != nil {
|
||||||
C.protect(globalCallbacks.protectFunc, callback, C.int(fd))
|
C.protect(globalCallbacks.protectFunc, callback, C.int(fd))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveProcess(callback unsafe.Pointer, protocol int, source, target string, uid int) string {
|
func ResolveProcess(callback unsafe.Pointer, protocol int, source, target string, uid int) string {
|
||||||
if globalCallbacks.resolveProcessFunc == nil {
|
if globalCallbacks.resolveProcessFunc == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
320
core/common.go
320
core/common.go
@@ -1,9 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
b "bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"github.com/metacubex/mihomo/adapter"
|
"github.com/metacubex/mihomo/adapter"
|
||||||
"github.com/metacubex/mihomo/adapter/inbound"
|
"github.com/metacubex/mihomo/adapter/inbound"
|
||||||
"github.com/metacubex/mihomo/adapter/outboundgroup"
|
"github.com/metacubex/mihomo/adapter/outboundgroup"
|
||||||
@@ -21,31 +22,16 @@ import (
|
|||||||
"github.com/metacubex/mihomo/log"
|
"github.com/metacubex/mihomo/log"
|
||||||
rp "github.com/metacubex/mihomo/rules/provider"
|
rp "github.com/metacubex/mihomo/rules/provider"
|
||||||
"github.com/metacubex/mihomo/tunnel"
|
"github.com/metacubex/mihomo/tunnel"
|
||||||
"github.com/samber/lo"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
func splitByMultipleSeparators(s string) interface{} {
|
|
||||||
isSeparator := func(r rune) bool {
|
|
||||||
return r == ',' || r == ' ' || r == ';'
|
|
||||||
}
|
|
||||||
|
|
||||||
parts := strings.FieldsFunc(s, isSeparator)
|
|
||||||
if len(parts) > 1 {
|
|
||||||
return parts
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
version = 0
|
currentConfig *config.Config
|
||||||
isRunning = false
|
version = 0
|
||||||
runLock sync.Mutex
|
isRunning = false
|
||||||
ips = []string{"ipwho.is", "api.ip.sb", "ipapi.co", "ipinfo.io"}
|
runLock sync.Mutex
|
||||||
b, _ = batch.New[bool](context.Background(), batch.WithConcurrencyNum[bool](50))
|
mBatch, _ = batch.New[bool](context.Background(), batch.WithConcurrencyNum[bool](50))
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExternalProviders []ExternalProvider
|
type ExternalProviders []ExternalProvider
|
||||||
@@ -54,54 +40,6 @@ func (a ExternalProviders) Len() int { return len(a) }
|
|||||||
func (a ExternalProviders) Less(i, j int) bool { return a[i].Name < a[j].Name }
|
func (a ExternalProviders) Less(i, j int) bool { return a[i].Name < a[j].Name }
|
||||||
func (a ExternalProviders) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
func (a ExternalProviders) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||||
|
|
||||||
func readFile(path string) ([]byte, error) {
|
|
||||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
data, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return data, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func getProfilePath(id string) string {
|
|
||||||
return filepath.Join(constant.Path.HomeDir(), "profiles", id+".yaml")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getProfileProvidersPath(id string) string {
|
|
||||||
return filepath.Join(constant.Path.HomeDir(), "providers", id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getRawConfigWithId(id string) *config.RawConfig {
|
|
||||||
path := getProfilePath(id)
|
|
||||||
bytes, err := readFile(path)
|
|
||||||
if err != nil {
|
|
||||||
return config.DefaultRawConfig()
|
|
||||||
}
|
|
||||||
prof, err := config.UnmarshalRawConfig(bytes)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorln("unmarshalRawConfig error %v", err)
|
|
||||||
return config.DefaultRawConfig()
|
|
||||||
}
|
|
||||||
for _, mapping := range prof.ProxyProvider {
|
|
||||||
value, exist := mapping["path"].(string)
|
|
||||||
if !exist {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapping["path"] = filepath.Join(getProfileProvidersPath(id), value)
|
|
||||||
}
|
|
||||||
for _, mapping := range prof.RuleProvider {
|
|
||||||
value, exist := mapping["path"].(string)
|
|
||||||
if !exist {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapping["path"] = filepath.Join(getProfileProvidersPath(id), value)
|
|
||||||
}
|
|
||||||
return prof
|
|
||||||
}
|
|
||||||
|
|
||||||
func getExternalProvidersRaw() map[string]cp.Provider {
|
func getExternalProvidersRaw() map[string]cp.Provider {
|
||||||
eps := make(map[string]cp.Provider)
|
eps := make(map[string]cp.Provider)
|
||||||
for n, p := range tunnel.Providers() {
|
for n, p := range tunnel.Providers() {
|
||||||
@@ -166,143 +104,15 @@ func sideUpdateExternalProvider(p cp.Provider, bytes []byte) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func decorationConfig(profileId string, cfg config.RawConfig) *config.RawConfig {
|
func updateListeners() {
|
||||||
prof := getRawConfigWithId(profileId)
|
|
||||||
overwriteConfig(prof, cfg)
|
|
||||||
return prof
|
|
||||||
}
|
|
||||||
|
|
||||||
func attachHosts(hosts, patchHosts map[string]any) {
|
|
||||||
for k, v := range patchHosts {
|
|
||||||
if str, ok := v.(string); ok {
|
|
||||||
hosts[k] = splitByMultipleSeparators(str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func updatePatchDns(dns config.RawDNS) {
|
|
||||||
for pair := dns.NameServerPolicy.Oldest(); pair != nil; pair = pair.Next() {
|
|
||||||
if str, ok := pair.Value.(string); ok {
|
|
||||||
dns.NameServerPolicy.Set(pair.Key, splitByMultipleSeparators(str))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func trimArr(arr []string) (r []string) {
|
|
||||||
for _, e := range arr {
|
|
||||||
r = append(r, strings.Trim(e, " "))
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func overrideRules(rules, patchRules []string) []string {
|
|
||||||
target := ""
|
|
||||||
for _, line := range rules {
|
|
||||||
rule := trimArr(strings.Split(line, ","))
|
|
||||||
if len(rule) != 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if strings.EqualFold(rule[0], "MATCH") {
|
|
||||||
target = rule[1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if target == "" {
|
|
||||||
return rules
|
|
||||||
}
|
|
||||||
rulesExt := lo.Map(ips, func(ip string, _ int) string {
|
|
||||||
return fmt.Sprintf("DOMAIN,%s,%s", ip, target)
|
|
||||||
})
|
|
||||||
return append(append(rulesExt, patchRules...), rules...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func overwriteConfig(targetConfig *config.RawConfig, patchConfig config.RawConfig) {
|
|
||||||
targetConfig.ExternalController = patchConfig.ExternalController
|
|
||||||
targetConfig.ExternalUI = ""
|
|
||||||
targetConfig.Interface = ""
|
|
||||||
targetConfig.ExternalUIURL = ""
|
|
||||||
targetConfig.TCPConcurrent = patchConfig.TCPConcurrent
|
|
||||||
targetConfig.UnifiedDelay = patchConfig.UnifiedDelay
|
|
||||||
targetConfig.IPv6 = patchConfig.IPv6
|
|
||||||
targetConfig.LogLevel = patchConfig.LogLevel
|
|
||||||
targetConfig.Port = 0
|
|
||||||
targetConfig.SocksPort = 0
|
|
||||||
targetConfig.KeepAliveInterval = patchConfig.KeepAliveInterval
|
|
||||||
targetConfig.MixedPort = patchConfig.MixedPort
|
|
||||||
targetConfig.FindProcessMode = patchConfig.FindProcessMode
|
|
||||||
targetConfig.AllowLan = patchConfig.AllowLan
|
|
||||||
targetConfig.Mode = patchConfig.Mode
|
|
||||||
targetConfig.Tun.Enable = patchConfig.Tun.Enable
|
|
||||||
targetConfig.Tun.Device = patchConfig.Tun.Device
|
|
||||||
targetConfig.Tun.DNSHijack = patchConfig.Tun.DNSHijack
|
|
||||||
targetConfig.Tun.Stack = patchConfig.Tun.Stack
|
|
||||||
targetConfig.Tun.RouteAddress = patchConfig.Tun.RouteAddress
|
|
||||||
targetConfig.GeodataLoader = patchConfig.GeodataLoader
|
|
||||||
targetConfig.Profile.StoreSelected = false
|
|
||||||
targetConfig.GeoXUrl = patchConfig.GeoXUrl
|
|
||||||
targetConfig.GlobalUA = patchConfig.GlobalUA
|
|
||||||
if configParams.TestURL != nil {
|
|
||||||
constant.DefaultTestURL = *configParams.TestURL
|
|
||||||
}
|
|
||||||
for idx := range targetConfig.ProxyGroup {
|
|
||||||
targetConfig.ProxyGroup[idx]["url"] = ""
|
|
||||||
}
|
|
||||||
attachHosts(targetConfig.Hosts, patchConfig.Hosts)
|
|
||||||
if configParams.OverrideDns {
|
|
||||||
updatePatchDns(patchConfig.DNS)
|
|
||||||
targetConfig.DNS = patchConfig.DNS
|
|
||||||
} else {
|
|
||||||
if targetConfig.DNS.Enable == false {
|
|
||||||
targetConfig.DNS.Enable = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if configParams.OverrideRule {
|
|
||||||
targetConfig.Rule = overrideRules(patchConfig.Rule, []string{})
|
|
||||||
} else {
|
|
||||||
targetConfig.Rule = overrideRules(targetConfig.Rule, patchConfig.Rule)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func patchConfig() {
|
|
||||||
log.Infoln("[Apply] patch")
|
|
||||||
general := currentConfig.General
|
|
||||||
controller := currentConfig.Controller
|
|
||||||
tls := currentConfig.TLS
|
|
||||||
tunnel.SetSniffing(general.Sniffing)
|
|
||||||
tunnel.SetFindProcessMode(general.FindProcessMode)
|
|
||||||
dialer.SetTcpConcurrent(general.TCPConcurrent)
|
|
||||||
dialer.DefaultInterface.Store(general.Interface)
|
|
||||||
adapter.UnifiedDelay.Store(general.UnifiedDelay)
|
|
||||||
tunnel.SetMode(general.Mode)
|
|
||||||
log.SetLevel(general.LogLevel)
|
|
||||||
resolver.DisableIPv6 = !general.IPv6
|
|
||||||
|
|
||||||
route.ReCreateServer(&route.Config{
|
|
||||||
Addr: controller.ExternalController,
|
|
||||||
TLSAddr: controller.ExternalControllerTLS,
|
|
||||||
UnixAddr: controller.ExternalControllerUnix,
|
|
||||||
PipeAddr: controller.ExternalControllerPipe,
|
|
||||||
Secret: controller.Secret,
|
|
||||||
Certificate: tls.Certificate,
|
|
||||||
PrivateKey: tls.PrivateKey,
|
|
||||||
DohServer: controller.ExternalDohServer,
|
|
||||||
IsDebug: false,
|
|
||||||
Cors: route.Cors{
|
|
||||||
AllowOrigins: controller.Cors.AllowOrigins,
|
|
||||||
AllowPrivateNetwork: controller.Cors.AllowPrivateNetwork,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateListeners(force bool) {
|
|
||||||
if !isRunning {
|
if !isRunning {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
general := currentConfig.General
|
if currentConfig == nil {
|
||||||
listeners := currentConfig.Listeners
|
return
|
||||||
if force == true {
|
|
||||||
stopListeners()
|
|
||||||
}
|
}
|
||||||
|
listeners := currentConfig.Listeners
|
||||||
|
general := currentConfig.General
|
||||||
listener.PatchInboundListeners(listeners, tunnel.Tunnel, true)
|
listener.PatchInboundListeners(listeners, tunnel.Tunnel, true)
|
||||||
listener.SetAllowLan(general.AllowLan)
|
listener.SetAllowLan(general.AllowLan)
|
||||||
inbound.SetSkipAuthPrefixes(general.SkipAuthPrefixes)
|
inbound.SetSkipAuthPrefixes(general.SkipAuthPrefixes)
|
||||||
@@ -326,11 +136,7 @@ func stopListeners() {
|
|||||||
listener.StopListener()
|
listener.StopListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
func patchSelectGroup() {
|
func patchSelectGroup(mapping map[string]string) {
|
||||||
mapping := configParams.SelectedMap
|
|
||||||
if mapping == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for name, proxy := range tunnel.ProxiesWithProviders() {
|
for name, proxy := range tunnel.ProxiesWithProviders() {
|
||||||
outbound, ok := proxy.(*adapter.Proxy)
|
outbound, ok := proxy.(*adapter.Proxy)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -351,20 +157,102 @@ func patchSelectGroup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyConfig(rawConfig *config.RawConfig) error {
|
func defaultSetupParams() *SetupParams {
|
||||||
|
return &SetupParams{
|
||||||
|
Config: config.DefaultRawConfig(),
|
||||||
|
TestURL: "https://www.gstatic.com/generate_204",
|
||||||
|
SelectedMap: map[string]string{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readFile(path string) ([]byte, error) {
|
||||||
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateConfig(params *UpdateParams) {
|
||||||
|
runLock.Lock()
|
||||||
|
defer runLock.Unlock()
|
||||||
|
general := currentConfig.General
|
||||||
|
if params.MixedPort != nil {
|
||||||
|
general.MixedPort = *params.MixedPort
|
||||||
|
}
|
||||||
|
if params.Sniffing != nil {
|
||||||
|
general.Sniffing = *params.Sniffing
|
||||||
|
tunnel.SetSniffing(general.Sniffing)
|
||||||
|
}
|
||||||
|
if params.FindProcessMode != nil {
|
||||||
|
general.FindProcessMode = *params.FindProcessMode
|
||||||
|
tunnel.SetFindProcessMode(general.FindProcessMode)
|
||||||
|
}
|
||||||
|
if params.TCPConcurrent != nil {
|
||||||
|
general.TCPConcurrent = *params.TCPConcurrent
|
||||||
|
dialer.SetTcpConcurrent(general.TCPConcurrent)
|
||||||
|
}
|
||||||
|
if params.Interface != nil {
|
||||||
|
general.Interface = *params.Interface
|
||||||
|
dialer.DefaultInterface.Store(general.Interface)
|
||||||
|
}
|
||||||
|
if params.UnifiedDelay != nil {
|
||||||
|
general.UnifiedDelay = *params.UnifiedDelay
|
||||||
|
adapter.UnifiedDelay.Store(general.UnifiedDelay)
|
||||||
|
}
|
||||||
|
if params.Mode != nil {
|
||||||
|
general.Mode = *params.Mode
|
||||||
|
tunnel.SetMode(general.Mode)
|
||||||
|
}
|
||||||
|
if params.LogLevel != nil {
|
||||||
|
general.LogLevel = *params.LogLevel
|
||||||
|
log.SetLevel(general.LogLevel)
|
||||||
|
}
|
||||||
|
if params.IPv6 != nil {
|
||||||
|
general.IPv6 = *params.IPv6
|
||||||
|
resolver.DisableIPv6 = !general.IPv6
|
||||||
|
}
|
||||||
|
if params.ExternalController != nil {
|
||||||
|
currentConfig.Controller.ExternalController = *params.ExternalController
|
||||||
|
route.ReCreateServer(&route.Config{
|
||||||
|
Addr: currentConfig.Controller.ExternalController,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Tun != nil {
|
||||||
|
general.Tun.Enable = params.Tun.Enable
|
||||||
|
general.Tun.AutoRoute = *params.Tun.AutoRoute
|
||||||
|
general.Tun.Device = *params.Tun.Device
|
||||||
|
general.Tun.RouteAddress = *params.Tun.RouteAddress
|
||||||
|
general.Tun.DNSHijack = *params.Tun.DNSHijack
|
||||||
|
general.Tun.Stack = *params.Tun.Stack
|
||||||
|
}
|
||||||
|
|
||||||
|
updateListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupConfig(params *SetupParams) error {
|
||||||
runLock.Lock()
|
runLock.Lock()
|
||||||
defer runLock.Unlock()
|
defer runLock.Unlock()
|
||||||
var err error
|
var err error
|
||||||
currentConfig, err = config.ParseRawConfig(rawConfig)
|
constant.DefaultTestURL = params.TestURL
|
||||||
|
currentConfig, err = config.ParseRawConfig(params.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
currentConfig, _ = config.ParseRawConfig(config.DefaultRawConfig())
|
currentConfig, _ = config.ParseRawConfig(config.DefaultRawConfig())
|
||||||
}
|
}
|
||||||
if configParams.IsPatch {
|
hub.ApplyConfig(currentConfig)
|
||||||
patchConfig()
|
patchSelectGroup(params.SelectedMap)
|
||||||
} else {
|
updateListeners()
|
||||||
hub.ApplyConfig(currentConfig)
|
return err
|
||||||
patchSelectGroup()
|
}
|
||||||
}
|
|
||||||
updateListeners(false)
|
func UnmarshalJson(data []byte, v any) error {
|
||||||
|
decoder := json.NewDecoder(b.NewReader(data))
|
||||||
|
decoder.UseNumber()
|
||||||
|
err := decoder.Decode(v)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,12 @@ package main
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/metacubex/mihomo/adapter/provider"
|
"github.com/metacubex/mihomo/adapter/provider"
|
||||||
|
P "github.com/metacubex/mihomo/component/process"
|
||||||
"github.com/metacubex/mihomo/config"
|
"github.com/metacubex/mihomo/config"
|
||||||
|
"github.com/metacubex/mihomo/constant"
|
||||||
|
"github.com/metacubex/mihomo/log"
|
||||||
|
"github.com/metacubex/mihomo/tunnel"
|
||||||
|
"net/netip"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,19 +17,34 @@ type InitParams struct {
|
|||||||
Version int `json:"version"`
|
Version int `json:"version"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigExtendedParams struct {
|
type SetupParams struct {
|
||||||
IsPatch bool `json:"is-patch"`
|
Config *config.RawConfig `json:"config"`
|
||||||
IsCompatible bool `json:"is-compatible"`
|
SelectedMap map[string]string `json:"selected-map"`
|
||||||
SelectedMap map[string]string `json:"selected-map"`
|
TestURL string `json:"test-url"`
|
||||||
TestURL *string `json:"test-url"`
|
|
||||||
OverrideDns bool `json:"override-dns"`
|
|
||||||
OverrideRule bool `json:"override-rule"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type GenerateConfigParams struct {
|
type UpdateParams struct {
|
||||||
ProfileId string `json:"profile-id"`
|
Tun *tunSchema `json:"tun"`
|
||||||
Config config.RawConfig `json:"config" `
|
AllowLan *bool `json:"allow-lan"`
|
||||||
Params ConfigExtendedParams `json:"params"`
|
MixedPort *int `json:"mixed-port"`
|
||||||
|
FindProcessMode *P.FindProcessMode `json:"find-process-mode"`
|
||||||
|
Mode *tunnel.TunnelMode `json:"mode"`
|
||||||
|
LogLevel *log.LogLevel `json:"log-level"`
|
||||||
|
IPv6 *bool `json:"ipv6"`
|
||||||
|
Sniffing *bool `json:"sniffing"`
|
||||||
|
TCPConcurrent *bool `json:"tcp-concurrent"`
|
||||||
|
ExternalController *string `json:"external-controller"`
|
||||||
|
Interface *string `json:"interface-name"`
|
||||||
|
UnifiedDelay *bool `json:"unified-delay"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type tunSchema struct {
|
||||||
|
Enable bool `yaml:"enable" json:"enable"`
|
||||||
|
Device *string `yaml:"device" json:"device"`
|
||||||
|
Stack *constant.TUNStack `yaml:"stack" json:"stack"`
|
||||||
|
DNSHijack *[]string `yaml:"dns-hijack" json:"dns-hijack"`
|
||||||
|
AutoRoute *bool `yaml:"auto-route" json:"auto-route"`
|
||||||
|
RouteAddress *[]netip.Prefix `yaml:"route-address" json:"route-address,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChangeProxyParams struct {
|
type ChangeProxyParams struct {
|
||||||
@@ -64,6 +84,7 @@ const (
|
|||||||
asyncTestDelayMethod Method = "asyncTestDelay"
|
asyncTestDelayMethod Method = "asyncTestDelay"
|
||||||
getConnectionsMethod Method = "getConnections"
|
getConnectionsMethod Method = "getConnections"
|
||||||
closeConnectionsMethod Method = "closeConnections"
|
closeConnectionsMethod Method = "closeConnections"
|
||||||
|
resetConnectionsMethod Method = "resetConnectionsMethod"
|
||||||
closeConnectionMethod Method = "closeConnection"
|
closeConnectionMethod Method = "closeConnection"
|
||||||
getExternalProvidersMethod Method = "getExternalProviders"
|
getExternalProvidersMethod Method = "getExternalProviders"
|
||||||
getExternalProviderMethod Method = "getExternalProvider"
|
getExternalProviderMethod Method = "getExternalProvider"
|
||||||
@@ -81,8 +102,9 @@ const (
|
|||||||
getAndroidVpnOptionsMethod Method = "getAndroidVpnOptions"
|
getAndroidVpnOptionsMethod Method = "getAndroidVpnOptions"
|
||||||
getRunTimeMethod Method = "getRunTime"
|
getRunTimeMethod Method = "getRunTime"
|
||||||
getCurrentProfileNameMethod Method = "getCurrentProfileName"
|
getCurrentProfileNameMethod Method = "getCurrentProfileName"
|
||||||
getProfileMethod Method = "getProfile"
|
|
||||||
crashMethod Method = "crash"
|
crashMethod Method = "crash"
|
||||||
|
setupConfigMethod Method = "setupConfig"
|
||||||
|
getConfigMethod Method = "getConfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Method string
|
type Method string
|
||||||
|
|||||||
45
core/go.mod
45
core/go.mod
@@ -6,13 +6,12 @@ replace github.com/metacubex/mihomo => ./Clash.Meta
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/metacubex/mihomo v0.0.0-00010101000000-000000000000
|
github.com/metacubex/mihomo v0.0.0-00010101000000-000000000000
|
||||||
github.com/samber/lo v1.49.1
|
|
||||||
golang.org/x/sync v0.11.0
|
golang.org/x/sync v0.11.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/3andne/restls-client-go v0.1.6 // indirect
|
github.com/3andne/restls-client-go v0.1.6 // indirect
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 // indirect
|
github.com/RyuaNerin/go-krypto v1.3.0 // indirect
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
||||||
github.com/ajg/form v1.5.1 // indirect
|
github.com/ajg/form v1.5.1 // indirect
|
||||||
github.com/andybalholm/brotli v1.0.6 // indirect
|
github.com/andybalholm/brotli v1.0.6 // indirect
|
||||||
@@ -21,13 +20,13 @@ require (
|
|||||||
github.com/cloudflare/circl v1.3.7 // indirect
|
github.com/cloudflare/circl v1.3.7 // indirect
|
||||||
github.com/coreos/go-iptables v0.8.0 // indirect
|
github.com/coreos/go-iptables v0.8.0 // indirect
|
||||||
github.com/dlclark/regexp2 v1.11.5 // indirect
|
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||||
github.com/ebitengine/purego v0.8.2 // indirect
|
github.com/ebitengine/purego v0.8.3 // indirect
|
||||||
github.com/enfein/mieru/v3 v3.13.0 // indirect
|
github.com/enfein/mieru/v3 v3.13.0 // indirect
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
github.com/gaukas/godicttls v0.0.4 // indirect
|
github.com/gaukas/godicttls v0.0.4 // indirect
|
||||||
github.com/go-chi/chi/v5 v5.2.1 // indirect
|
github.com/go-chi/chi/v5 v5.2.1 // indirect
|
||||||
github.com/go-chi/render v1.0.3 // indirect
|
github.com/go-chi/render v1.0.3 // indirect
|
||||||
@@ -36,7 +35,7 @@ require (
|
|||||||
github.com/gobwas/httphead v0.1.0 // indirect
|
github.com/gobwas/httphead v0.1.0 // indirect
|
||||||
github.com/gobwas/pool v0.2.1 // indirect
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
github.com/gobwas/ws v1.4.0 // indirect
|
github.com/gobwas/ws v1.4.0 // indirect
|
||||||
github.com/gofrs/uuid/v5 v5.3.1 // indirect
|
github.com/gofrs/uuid/v5 v5.3.2 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
|
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
|
||||||
@@ -51,22 +50,27 @@ require (
|
|||||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.4.1 // indirect
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect
|
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect
|
||||||
github.com/metacubex/bart v0.19.0 // indirect
|
github.com/metacubex/bart v0.20.5 // indirect
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect
|
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect
|
||||||
github.com/metacubex/chacha v0.1.2 // indirect
|
github.com/metacubex/chacha v0.1.2 // indirect
|
||||||
|
github.com/metacubex/fswatch v0.1.1 // indirect
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
||||||
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b // indirect
|
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b // indirect
|
||||||
github.com/metacubex/quic-go v0.49.1-0.20250212162123-c135a4412996 // indirect
|
github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793 // indirect
|
||||||
|
github.com/metacubex/quic-go v0.52.1-0.20250522021943-aef454b9e639 // indirect
|
||||||
github.com/metacubex/randv2 v0.2.0 // indirect
|
github.com/metacubex/randv2 v0.2.0 // indirect
|
||||||
github.com/metacubex/sing-quic v0.0.0-20250404030904-b2cc8aab562c // indirect
|
github.com/metacubex/sing v0.5.3 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 // indirect
|
github.com/metacubex/sing-mux v0.3.2 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 // indirect
|
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f // indirect
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250412122235-0e9005731a63 // indirect
|
github.com/metacubex/sing-shadowsocks v0.2.10 // indirect
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250412144348-c426cb167db5 // indirect
|
github.com/metacubex/sing-shadowsocks2 v0.2.4 // indirect
|
||||||
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 // indirect
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 // indirect
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 // indirect
|
github.com/metacubex/sing-tun v0.4.6-0.20250524142129-9d110c0af70c // indirect
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect
|
github.com/metacubex/sing-vmess v0.2.2 // indirect
|
||||||
github.com/metacubex/utls v1.7.0-alpha.1 // indirect
|
github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f // indirect
|
||||||
|
github.com/metacubex/smux v0.0.0-20250503055512-501391591dee // indirect
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 // indirect
|
||||||
|
github.com/metacubex/utls v1.7.3 // indirect
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 // indirect
|
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 // indirect
|
||||||
github.com/miekg/dns v1.1.63 // indirect
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
||||||
@@ -78,14 +82,9 @@ require (
|
|||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect
|
github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect
|
||||||
github.com/quic-go/qpack v0.4.0 // indirect
|
github.com/quic-go/qpack v0.4.0 // indirect
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
|
||||||
github.com/sagernet/cors v1.2.1 // indirect
|
github.com/sagernet/cors v1.2.1 // indirect
|
||||||
github.com/sagernet/fswatch v0.1.1 // indirect
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
github.com/samber/lo v1.50.0 // indirect
|
||||||
github.com/sagernet/sing v0.5.2 // indirect
|
|
||||||
github.com/sagernet/sing-mux v0.2.1 // indirect
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1 // indirect
|
github.com/shirou/gopsutil/v4 v4.25.1 // indirect
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
|
||||||
|
|||||||
103
core/go.sum
103
core/go.sum
@@ -1,8 +1,8 @@
|
|||||||
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
||||||
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
||||||
github.com/RyuaNerin/elliptic2 v1.0.0/go.mod h1:wWB8fWrJI/6EPJkyV/r1Rj0hxUgrusmqSj8JN6yNf/A=
|
github.com/RyuaNerin/go-krypto v1.3.0 h1:smavTzSMAx8iuVlGb4pEwl9MD2qicqMzuXR2QWp2/Pg=
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 h1:mXuNdK6M317aPV0llW6Xpjbo4moOlPF7Yxz4tb4b4Go=
|
github.com/RyuaNerin/go-krypto v1.3.0/go.mod h1:9R9TU936laAIqAmjcHo/LsaXYOZlymudOAxjaBf62UM=
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4/go.mod h1:QqCYkoutU3yInyD9INt2PGolVRsc3W4oraQadVGXJ/8=
|
github.com/RyuaNerin/testingutil v0.1.0 h1:IYT6JL57RV3U2ml3dLHZsVtPOP6yNK7WUVdzzlpNrss=
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
||||||
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
||||||
@@ -26,12 +26,12 @@ 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/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 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
|
||||||
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
|
github.com/ebitengine/purego v0.8.3 h1:K+0AjQp63JEZTEMZiwsI9g0+hAMNohwUOtY0RPGexmc=
|
||||||
github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
github.com/ebitengine/purego v0.8.3/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
||||||
github.com/enfein/mieru/v3 v3.13.0 h1:eGyxLGkb+lut9ebmx+BGwLJ5UMbEc/wGIYO0AXEKy98=
|
github.com/enfein/mieru/v3 v3.13.0 h1:eGyxLGkb+lut9ebmx+BGwLJ5UMbEc/wGIYO0AXEKy98=
|
||||||
github.com/enfein/mieru/v3 v3.13.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
|
github.com/enfein/mieru/v3 v3.13.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8=
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
|
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=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
||||||
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
||||||
@@ -39,8 +39,8 @@ github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 h1:tlDMEdcPRQKBE
|
|||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
||||||
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
||||||
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
|
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
|
||||||
@@ -59,8 +59,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/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 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
|
||||||
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
||||||
github.com/gofrs/uuid/v5 v5.3.1 h1:aPx49MwJbekCzOyhZDjJVb0hx3A0KLjlbLx6p2gY0p0=
|
github.com/gofrs/uuid/v5 v5.3.2 h1:2jfO8j3XgSwlz/wHqemAEugfnTlikAYHhnqQ8Xh4fE0=
|
||||||
github.com/gofrs/uuid/v5 v5.3.1/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
github.com/gofrs/uuid/v5 v5.3.2/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
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/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
||||||
@@ -97,38 +97,49 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U
|
|||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4=
|
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI=
|
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI=
|
||||||
github.com/metacubex/bart v0.19.0 h1:XQ9AJeI+WO+phRPkUOoflAFwlqDJnm5BPQpixciJQBY=
|
github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=
|
||||||
github.com/metacubex/bart v0.19.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI=
|
github.com/metacubex/bart v0.20.5/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig=
|
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro=
|
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro=
|
||||||
github.com/metacubex/chacha v0.1.2 h1:QulCq3eVm3TO6+4nVIWJtmSe7BT2GMrgVHuAoqRQnlc=
|
github.com/metacubex/chacha v0.1.2 h1:QulCq3eVm3TO6+4nVIWJtmSe7BT2GMrgVHuAoqRQnlc=
|
||||||
github.com/metacubex/chacha v0.1.2/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
github.com/metacubex/chacha v0.1.2/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
||||||
|
github.com/metacubex/fswatch v0.1.1 h1:jqU7C/v+g0qc2RUFgmAOPoVvfl2BXXUXEumn6oQuxhU=
|
||||||
|
github.com/metacubex/fswatch v0.1.1/go.mod h1:czrTT7Zlbz7vWft8RQu9Qqh+JoX+Nnb+UabuyN1YsgI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
||||||
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b h1:RUh4OdVPz/jDrM9MQ2ySuqu2aeBqcA8rtfWUYLZ8RtI=
|
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b h1:RUh4OdVPz/jDrM9MQ2ySuqu2aeBqcA8rtfWUYLZ8RtI=
|
||||||
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU=
|
github.com/metacubex/gvisor v0.0.0-20250324165734-5857f47bd43b/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU=
|
||||||
github.com/metacubex/quic-go v0.49.1-0.20250212162123-c135a4412996 h1:B+AP/Pj2/jBDS/kCYjz/x+0BCOKfd2VODYevyeIt+Ds=
|
github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793 h1:1Qpuy+sU3DmyX9HwI+CrBT/oLNJngvBorR2RbajJcqo=
|
||||||
github.com/metacubex/quic-go v0.49.1-0.20250212162123-c135a4412996/go.mod h1:ExVjGyEwTUjCFqx+5uxgV7MOoA3fZI+th4D40H35xmY=
|
github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793/go.mod h1:RjRNb4G52yAgfR+Oe/kp9G4PJJ97Fnj89eY1BFO3YyA=
|
||||||
|
github.com/metacubex/quic-go v0.52.1-0.20250522021943-aef454b9e639 h1:L+1brQNzBhCCxWlicwfK1TlceemCRmrDE4HmcVHc29w=
|
||||||
|
github.com/metacubex/quic-go v0.52.1-0.20250522021943-aef454b9e639/go.mod h1:Kc6h++Q/zf3AxcUCevJhJwgrskJumv+pZdR8g/E/10k=
|
||||||
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
||||||
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20250404030904-b2cc8aab562c h1:OB3WmMA8YPJjE36RjD9X8xlrWGJ4orxbf2R/KAE28b0=
|
github.com/metacubex/sing v0.5.2/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20250404030904-b2cc8aab562c/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8=
|
github.com/metacubex/sing v0.5.3 h1:QWdN16WFKMk06x4nzkc8SvZ7y2x+TLQrpkPoHs+WSVM=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJRafgwBHO5B4=
|
github.com/metacubex/sing v0.5.3/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0=
|
github.com/metacubex/sing-mux v0.3.2 h1:nJv52pyRivHcaZJKk2JgxpaVvj1GAXG81scSa9N7ncw=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo=
|
github.com/metacubex/sing-mux v0.3.2/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q=
|
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f h1:mP3vIm+9hRFI0C0Vl3pE0NESF/L85FDbuB0tGgUii6I=
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250412122235-0e9005731a63 h1:vy/8ZYYtWUXYnOnw/NF8ThG1W/RqM/h5rkun+OXZMH0=
|
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f/go.mod h1:JPTpf7fpnojsSuwRJExhSZSy63pVbp3VM39+zj+sAJM=
|
||||||
github.com/metacubex/sing-shadowtls v0.0.0-20250412122235-0e9005731a63/go.mod h1:eDZ2JpkSkewGmUlCoLSn2MRFn1D0jKPIys/6aogFx7U=
|
github.com/metacubex/sing-shadowsocks v0.2.10 h1:Pr7LDbjMANIQHl07zWgl1vDuhpsfDQUpZ8cX6DPabfg=
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250412144348-c426cb167db5 h1:hcsz5e5lqhBxn3iQQDIF60FLZ8PQT542GTQZ+1wcIGo=
|
github.com/metacubex/sing-shadowsocks v0.2.10/go.mod h1:MtRM0ZZjR0kaDOzy9zWSt6/4/UlrnsNBq+1FNAF4vBk=
|
||||||
github.com/metacubex/sing-tun v0.4.6-0.20250412144348-c426cb167db5/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0=
|
github.com/metacubex/sing-shadowsocks2 v0.2.4 h1:Ec0x3hHR7xkld5Z09IGh16wtUUpBb2HgqZ9DExd8Q7s=
|
||||||
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 h1:zZp5uct9+/0Hb1jKGyqDjCU4/72t43rs7qOq3Rc9oU8=
|
github.com/metacubex/sing-shadowsocks2 v0.2.4/go.mod h1:WP8+S0kqtnSbX1vlIpo5i8Irm/ijZITEPBcZ26B5unY=
|
||||||
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82/go.mod h1:nE7Mdzj/QUDwgRi/8BASPtsxtIFZTHA4Yst5GgwbGCQ=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589/go.mod h1:4NclTLIZuk+QkHVCGrP87rHi/y8YjgPytxTgApJNMhc=
|
github.com/metacubex/sing-tun v0.4.6-0.20250524142129-9d110c0af70c h1:Y6jk7AH5BEg9Dsvczrf/KokYsvxeKSZZlCLHg+hC4ro=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 h1:zGeQt3UyNydIVrMRB97AA5WsYEau/TyCnRtTf1yUmJY=
|
github.com/metacubex/sing-tun v0.4.6-0.20250524142129-9d110c0af70c/go.mod h1:HDaHDL6onAX2ZGbAGUXKp++PohRdNb7Nzt6zxzhox+U=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
github.com/metacubex/sing-vmess v0.2.2 h1:nG6GIKF1UOGmlzs+BIetdGHkFZ20YqFVIYp5Htqzp+4=
|
||||||
github.com/metacubex/utls v1.7.0-alpha.1 h1:oMFsPh2oTlALJ7vKXPJuqgy0YeiZ+q/LLw+ZdxZ80l4=
|
github.com/metacubex/sing-vmess v0.2.2/go.mod h1:CVDNcdSLVYFgTHQlubr88d8CdqupAUDqLjROos+H9xk=
|
||||||
github.com/metacubex/utls v1.7.0-alpha.1/go.mod h1:oknYT0qTOwE4hjPmZOEpzVdefnW7bAdGLvZcqmk4TLU=
|
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-20250503055512-501391591dee h1:lp6hJ+4wCLZu113awp7P6odM2okB5s60HUyF0FMqKmo=
|
||||||
|
github.com/metacubex/smux v0.0.0-20250503055512-501391591dee/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 h1:j1VRTiC9JLR4nUbSikx9OGdu/3AgFDqgcLj4GoqyQkc=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||||
|
github.com/metacubex/utls v1.7.3 h1:yDcMEWojFh+t8rU9X0HPcZDPAoFze/rIIyssqivzj8A=
|
||||||
|
github.com/metacubex/utls v1.7.3/go.mod h1:oknYT0qTOwE4hjPmZOEpzVdefnW7bAdGLvZcqmk4TLU=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 h1:hJLQviGySBuaynlCwf/oYgIxbVbGRUIKZCxdya9YrbQ=
|
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 h1:hJLQviGySBuaynlCwf/oYgIxbVbGRUIKZCxdya9YrbQ=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181/go.mod h1:phewKljNYiTVT31Gcif8RiCKnTUOgVWFJjccqYM8s+Y=
|
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181/go.mod h1:phewKljNYiTVT31Gcif8RiCKnTUOgVWFJjccqYM8s+Y=
|
||||||
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
@@ -159,25 +170,12 @@ github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++
|
|||||||
github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
|
github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
|
||||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
|
||||||
github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ=
|
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/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI=
|
||||||
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
|
|
||||||
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
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/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc=
|
||||||
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
|
||||||
github.com/sagernet/sing v0.5.2 h1:2OZQJNKGtji/66QLxbf/T/dqtK/3+fF/zuHH9tsGK7M=
|
|
||||||
github.com/sagernet/sing v0.5.2/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
|
||||||
github.com/sagernet/sing-mux v0.2.1 h1:N/3MHymfnFZRd29tE3TaXwPUVVgKvxhtOkiCMLp9HVo=
|
|
||||||
github.com/sagernet/sing-mux v0.2.1/go.mod h1:dm3BWL6NvES9pbib7llpylrq7Gq+LjlzG+0RacdxcyE=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
|
||||||
github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew=
|
|
||||||
github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o=
|
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
|
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
|
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
||||||
@@ -189,9 +187,16 @@ github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e
|
|||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
|
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
||||||
@@ -251,7 +256,7 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||||
|
|||||||
89
core/hub.go
89
core/hub.go
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/metacubex/mihomo/common/observable"
|
"github.com/metacubex/mihomo/common/observable"
|
||||||
"github.com/metacubex/mihomo/common/utils"
|
"github.com/metacubex/mihomo/common/utils"
|
||||||
"github.com/metacubex/mihomo/component/mmdb"
|
"github.com/metacubex/mihomo/component/mmdb"
|
||||||
|
"github.com/metacubex/mihomo/component/resolver"
|
||||||
"github.com/metacubex/mihomo/component/updater"
|
"github.com/metacubex/mihomo/component/updater"
|
||||||
"github.com/metacubex/mihomo/config"
|
"github.com/metacubex/mihomo/config"
|
||||||
"github.com/metacubex/mihomo/constant"
|
"github.com/metacubex/mihomo/constant"
|
||||||
@@ -28,10 +29,8 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
isInit = false
|
isInit = false
|
||||||
configParams = ConfigExtendedParams{}
|
|
||||||
externalProviders = map[string]cp.Provider{}
|
externalProviders = map[string]cp.Provider{}
|
||||||
logSubscriber observable.Subscription[log.Event]
|
logSubscriber observable.Subscription[log.Event]
|
||||||
currentConfig *config.Config
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleInitClash(paramsString string) bool {
|
func handleInitClash(paramsString string) bool {
|
||||||
@@ -52,7 +51,8 @@ func handleStartListener() bool {
|
|||||||
runLock.Lock()
|
runLock.Lock()
|
||||||
defer runLock.Unlock()
|
defer runLock.Unlock()
|
||||||
isRunning = true
|
isRunning = true
|
||||||
updateListeners(true)
|
updateListeners()
|
||||||
|
resolver.ResetConnection()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,30 +91,10 @@ func handleValidateConfig(bytes []byte) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleUpdateConfig(bytes []byte) string {
|
func handleGetProxies() map[string]constant.Proxy {
|
||||||
var params = &GenerateConfigParams{}
|
|
||||||
err := json.Unmarshal(bytes, params)
|
|
||||||
if err != nil {
|
|
||||||
return err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
configParams = params.Params
|
|
||||||
prof := decorationConfig(params.ProfileId, params.Config)
|
|
||||||
err = applyConfig(prof)
|
|
||||||
if err != nil {
|
|
||||||
return err.Error()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleGetProxies() string {
|
|
||||||
runLock.Lock()
|
runLock.Lock()
|
||||||
defer runLock.Unlock()
|
defer runLock.Unlock()
|
||||||
data, err := json.Marshal(tunnel.ProxiesWithProviders())
|
return tunnel.ProxiesWithProviders()
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return string(data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleChangeProxy(data string, fn func(string string)) {
|
func handleChangeProxy(data string, fn func(string string)) {
|
||||||
@@ -184,21 +164,12 @@ func handleGetTotalTraffic() string {
|
|||||||
return string(data)
|
return string(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleGetProfile(profileId string) string {
|
|
||||||
prof := getRawConfigWithId(profileId)
|
|
||||||
data, err := json.Marshal(prof)
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return string(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleResetTraffic() {
|
func handleResetTraffic() {
|
||||||
statistic.DefaultManager.ResetStatistic()
|
statistic.DefaultManager.ResetStatistic()
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleAsyncTestDelay(paramsString string, fn func(string)) {
|
func handleAsyncTestDelay(paramsString string, fn func(string)) {
|
||||||
b.Go(paramsString, func() (bool, error) {
|
mBatch.Go(paramsString, func() (bool, error) {
|
||||||
var params = &TestDelayParams{}
|
var params = &TestDelayParams{}
|
||||||
err := json.Unmarshal([]byte(paramsString), params)
|
err := json.Unmarshal([]byte(paramsString), params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -266,6 +237,11 @@ func handleGetConnections() string {
|
|||||||
func handleCloseConnections() bool {
|
func handleCloseConnections() bool {
|
||||||
runLock.Lock()
|
runLock.Lock()
|
||||||
defer runLock.Unlock()
|
defer runLock.Unlock()
|
||||||
|
closeConnections()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func closeConnections() {
|
||||||
statistic.DefaultManager.Range(func(c statistic.Tracker) bool {
|
statistic.DefaultManager.Range(func(c statistic.Tracker) bool {
|
||||||
err := c.Close()
|
err := c.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -273,6 +249,12 @@ func handleCloseConnections() bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleResetConnections() bool {
|
||||||
|
runLock.Lock()
|
||||||
|
defer runLock.Unlock()
|
||||||
|
resolver.ResetConnection()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,10 +424,47 @@ func handleSetState(params string) {
|
|||||||
_ = json.Unmarshal([]byte(params), state.CurrentState)
|
_ = json.Unmarshal([]byte(params), state.CurrentState)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleGetConfig(path string) (*config.RawConfig, error) {
|
||||||
|
bytes, err := readFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
prof, err := config.UnmarshalRawConfig(bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return prof, nil
|
||||||
|
}
|
||||||
|
|
||||||
func handleCrash() {
|
func handleCrash() {
|
||||||
panic("handle invoke crash")
|
panic("handle invoke crash")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleUpdateConfig(bytes []byte) string {
|
||||||
|
var params = &UpdateParams{}
|
||||||
|
err := json.Unmarshal(bytes, params)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
updateConfig(params)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSetupConfig(bytes []byte) string {
|
||||||
|
var params = defaultSetupParams()
|
||||||
|
err := UnmarshalJson(bytes, params)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorln("unmarshalRawConfig error %v", err)
|
||||||
|
_ = setupConfig(defaultSetupParams())
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
err = setupConfig(params)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
adapter.UrlTestHook = func(url string, name string, delay uint16) {
|
adapter.UrlTestHook = func(url string, name string, delay uint16) {
|
||||||
delayData := &Delay{
|
delayData := &Delay{
|
||||||
|
|||||||
42
core/lib.go
42
core/lib.go
@@ -39,6 +39,14 @@ func freeCString(s *C.char) {
|
|||||||
C.free(unsafe.Pointer(s))
|
C.free(unsafe.Pointer(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (result ActionResult) send() {
|
||||||
|
data, err := result.Json()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bridge.SendToPort(result.Port, string(data))
|
||||||
|
}
|
||||||
|
|
||||||
//export invokeAction
|
//export invokeAction
|
||||||
func invokeAction(paramsChar *C.char, port C.longlong) {
|
func invokeAction(paramsChar *C.char, port C.longlong) {
|
||||||
params := C.GoString(paramsChar)
|
params := C.GoString(paramsChar)
|
||||||
@@ -49,22 +57,38 @@ func invokeAction(paramsChar *C.char, port C.longlong) {
|
|||||||
bridge.SendToPort(i, err.Error())
|
bridge.SendToPort(i, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
go handleAction(action, func(data interface{}) {
|
result := ActionResult{
|
||||||
bridge.SendToPort(i, string(action.getResult(data)))
|
Id: action.Id,
|
||||||
})
|
Method: action.Method,
|
||||||
|
Port: i,
|
||||||
|
}
|
||||||
|
go handleAction(action, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendMessage(message Message) {
|
func sendMessage(message Message) {
|
||||||
if messagePort == -1 {
|
if messagePort == -1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
res, err := message.Json()
|
result := ActionResult{
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
bridge.SendToPort(messagePort, string(Action{
|
|
||||||
Method: messageMethod,
|
Method: messageMethod,
|
||||||
}.getResult(res)))
|
Port: messagePort,
|
||||||
|
Data: message,
|
||||||
|
}
|
||||||
|
result.send()
|
||||||
|
}
|
||||||
|
|
||||||
|
//export getConfig
|
||||||
|
func getConfig(s *C.char) *C.char {
|
||||||
|
path := C.GoString(s)
|
||||||
|
config, err := handleGetConfig(path)
|
||||||
|
if err != nil {
|
||||||
|
return C.CString("")
|
||||||
|
}
|
||||||
|
marshal, err := json.Marshal(config)
|
||||||
|
if err != nil {
|
||||||
|
return C.CString("")
|
||||||
|
}
|
||||||
|
return C.CString(string(marshal))
|
||||||
}
|
}
|
||||||
|
|
||||||
//export startListener
|
//export startListener
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func (t *TunHandler) handleProtect(fd int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
protect(t.callback, fd)
|
Protect(t.callback, fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TunHandler) handleResolveProcess(source, target net.Addr) string {
|
func (t *TunHandler) handleResolveProcess(source, target net.Addr) string {
|
||||||
@@ -79,7 +79,7 @@ func (t *TunHandler) handleResolveProcess(source, target net.Addr) string {
|
|||||||
if version < 29 {
|
if version < 29 {
|
||||||
uid = platform.QuerySocketUidFromProcFs(source, target)
|
uid = platform.QuerySocketUidFromProcFs(source, target)
|
||||||
}
|
}
|
||||||
return resolveProcess(t.callback, protocol, source.String(), target.String(), uid)
|
return ResolveProcess(t.callback, protocol, source.String(), target.String(), uid)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -188,21 +188,21 @@ func handleGetCurrentProfileName() string {
|
|||||||
return state.CurrentState.CurrentProfileName
|
return state.CurrentState.CurrentProfileName
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextHandle(action *Action, result func(data interface{})) bool {
|
func nextHandle(action *Action, result ActionResult) bool {
|
||||||
switch action.Method {
|
switch action.Method {
|
||||||
case getAndroidVpnOptionsMethod:
|
case getAndroidVpnOptionsMethod:
|
||||||
result(handleGetAndroidVpnOptions())
|
result.success(handleGetAndroidVpnOptions())
|
||||||
return true
|
return true
|
||||||
case updateDnsMethod:
|
case updateDnsMethod:
|
||||||
data := action.Data.(string)
|
data := action.Data.(string)
|
||||||
handleUpdateDns(data)
|
handleUpdateDns(data)
|
||||||
result(true)
|
result.success(true)
|
||||||
return true
|
return true
|
||||||
case getRunTimeMethod:
|
case getRunTimeMethod:
|
||||||
result(handleGetRunTime())
|
result.success(handleGetRunTime())
|
||||||
return true
|
return true
|
||||||
case getCurrentProfileNameMethod:
|
case getCurrentProfileNameMethod:
|
||||||
result(handleGetCurrentProfileName())
|
result.success(handleGetCurrentProfileName())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -220,7 +220,7 @@ func quickStart(initParamsChar *C.char, paramsChar *C.char, stateParamsChar *C.c
|
|||||||
bridge.SendToPort(i, "init error")
|
bridge.SendToPort(i, "init error")
|
||||||
}
|
}
|
||||||
handleSetState(stateParams)
|
handleSetState(stateParams)
|
||||||
bridge.SendToPort(i, handleUpdateConfig(bytes))
|
bridge.SendToPort(i, handleSetupConfig(bytes))
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,20 @@ import (
|
|||||||
|
|
||||||
var conn net.Conn
|
var conn net.Conn
|
||||||
|
|
||||||
func sendMessage(message Message) {
|
func (result ActionResult) send() {
|
||||||
res, err := message.Json()
|
data, err := result.Json()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
send(Action{
|
send(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendMessage(message Message) {
|
||||||
|
result := ActionResult{
|
||||||
Method: messageMethod,
|
Method: messageMethod,
|
||||||
}.getResult(res))
|
Data: message,
|
||||||
|
}
|
||||||
|
result.send()
|
||||||
}
|
}
|
||||||
|
|
||||||
func send(data []byte) {
|
func send(data []byte) {
|
||||||
@@ -61,12 +67,15 @@ func startServer(arg string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
go handleAction(action, func(data interface{}) {
|
result := ActionResult{
|
||||||
send(action.getResult(data))
|
Id: action.Id,
|
||||||
})
|
Method: action.Method,
|
||||||
|
}
|
||||||
|
|
||||||
|
go handleAction(action, result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextHandle(action *Action, result func(data interface{})) bool {
|
func nextHandle(action *Action, result ActionResult) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||||
import 'package:fl_clash/clash/clash.dart';
|
import 'package:fl_clash/clash/clash.dart';
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:fl_clash/l10n/l10n.dart';
|
import 'package:fl_clash/l10n/l10n.dart';
|
||||||
@@ -100,7 +101,10 @@ class ApplicationState extends ConsumerState<Application> {
|
|||||||
return AppStateManager(
|
return AppStateManager(
|
||||||
child: ClashManager(
|
child: ClashManager(
|
||||||
child: ConnectivityManager(
|
child: ConnectivityManager(
|
||||||
onConnectivityChanged: () {
|
onConnectivityChanged: (results) async {
|
||||||
|
if (!results.contains(ConnectivityResult.vpn)) {
|
||||||
|
await clashCore.closeConnections();
|
||||||
|
}
|
||||||
globalState.appController.updateLocalIp();
|
globalState.appController.updateLocalIp();
|
||||||
globalState.appController.addCheckIpNumDebounce();
|
globalState.appController.addCheckIpNumDebounce();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -89,39 +89,39 @@ class ClashCore {
|
|||||||
return clashInterface.validateConfig(data);
|
return clashInterface.validateConfig(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> updateConfig(UpdateConfigParams updateConfigParams) async {
|
Future<String> updateConfig(UpdateParams updateParams) async {
|
||||||
return await clashInterface.updateConfig(updateConfigParams);
|
return await clashInterface.updateConfig(updateParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> setupConfig(SetupParams setupParams) async {
|
||||||
|
return await clashInterface.setupConfig(setupParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<Group>> getProxiesGroups() async {
|
Future<List<Group>> getProxiesGroups() async {
|
||||||
final proxiesRawString = await clashInterface.getProxies();
|
final proxies = await clashInterface.getProxies();
|
||||||
return Isolate.run<List<Group>>(() {
|
if (proxies.isEmpty) return [];
|
||||||
if (proxiesRawString.isEmpty) return [];
|
final groupNames = [
|
||||||
final proxies = (json.decode(proxiesRawString) ?? {}) as Map;
|
UsedProxy.GLOBAL.name,
|
||||||
if (proxies.isEmpty) return [];
|
...(proxies[UsedProxy.GLOBAL.name]["all"] as List).where((e) {
|
||||||
final groupNames = [
|
final proxy = proxies[e] ?? {};
|
||||||
UsedProxy.GLOBAL.name,
|
return GroupTypeExtension.valueList.contains(proxy['type']);
|
||||||
...(proxies[UsedProxy.GLOBAL.name]["all"] as List).where((e) {
|
})
|
||||||
final proxy = proxies[e] ?? {};
|
];
|
||||||
return GroupTypeExtension.valueList.contains(proxy['type']);
|
final groupsRaw = groupNames.map((groupName) {
|
||||||
})
|
final group = proxies[groupName];
|
||||||
];
|
group["all"] = ((group["all"] ?? []) as List)
|
||||||
final groupsRaw = groupNames.map((groupName) {
|
|
||||||
final group = proxies[groupName];
|
|
||||||
group["all"] = ((group["all"] ?? []) as List)
|
|
||||||
.map(
|
|
||||||
(name) => proxies[name],
|
|
||||||
)
|
|
||||||
.where((proxy) => proxy != null)
|
|
||||||
.toList();
|
|
||||||
return group;
|
|
||||||
}).toList();
|
|
||||||
return groupsRaw
|
|
||||||
.map(
|
.map(
|
||||||
(e) => Group.fromJson(e),
|
(name) => proxies[name],
|
||||||
)
|
)
|
||||||
|
.where((proxy) => proxy != null)
|
||||||
.toList();
|
.toList();
|
||||||
});
|
return group;
|
||||||
|
}).toList();
|
||||||
|
return groupsRaw
|
||||||
|
.map(
|
||||||
|
(e) => Group.fromJson(e),
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<String> changeProxy(ChangeProxyParams changeProxyParams) async {
|
FutureOr<String> changeProxy(ChangeProxyParams changeProxyParams) async {
|
||||||
@@ -143,6 +143,10 @@ class ClashCore {
|
|||||||
clashInterface.closeConnections();
|
clashInterface.closeConnections();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resetConnections() {
|
||||||
|
clashInterface.resetConnections();
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<ExternalProvider>> getExternalProviders() async {
|
Future<List<ExternalProvider>> getExternalProviders() async {
|
||||||
final externalProvidersRawString =
|
final externalProvidersRawString =
|
||||||
await clashInterface.getExternalProviders();
|
await clashInterface.getExternalProviders();
|
||||||
@@ -206,6 +210,16 @@ class ClashCore {
|
|||||||
return Delay.fromJson(json.decode(data));
|
return Delay.fromJson(json.decode(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Map<String, dynamic>> getConfig(String id) async {
|
||||||
|
final profilePath = await appPath.getProfilePath(id);
|
||||||
|
final res = await clashInterface.getConfig(profilePath);
|
||||||
|
if (res.isSuccess) {
|
||||||
|
return res.data as Map<String, dynamic>;
|
||||||
|
} else {
|
||||||
|
throw res.message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<Traffic> getTraffic() async {
|
Future<Traffic> getTraffic() async {
|
||||||
final trafficString = await clashInterface.getTraffic();
|
final trafficString = await clashInterface.getTraffic();
|
||||||
if (trafficString.isEmpty) {
|
if (trafficString.isEmpty) {
|
||||||
@@ -241,14 +255,6 @@ class ClashCore {
|
|||||||
return int.parse(value);
|
return int.parse(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ClashConfigSnippet?> getProfile(String id) async {
|
|
||||||
final res = await clashInterface.getProfile(id);
|
|
||||||
if (res.isEmpty) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return Isolate.run(() => ClashConfigSnippet.fromJson(json.decode(res)));
|
|
||||||
}
|
|
||||||
|
|
||||||
resetTraffic() {
|
resetTraffic() {
|
||||||
clashInterface.resetTraffic();
|
clashInterface.resetTraffic();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,18 +154,18 @@ class ClashFFI {
|
|||||||
late final _setrlimit =
|
late final _setrlimit =
|
||||||
_setrlimitPtr.asFunction<int Function(int, ffi.Pointer<rlimit>)>();
|
_setrlimitPtr.asFunction<int Function(int, ffi.Pointer<rlimit>)>();
|
||||||
|
|
||||||
int wait1(
|
int wait$1(
|
||||||
ffi.Pointer<ffi.Int> arg0,
|
ffi.Pointer<ffi.Int> arg0,
|
||||||
) {
|
) {
|
||||||
return _wait1(
|
return _wait$1(
|
||||||
arg0,
|
arg0,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
late final _wait1Ptr =
|
late final _wait$1Ptr =
|
||||||
_lookup<ffi.NativeFunction<pid_t Function(ffi.Pointer<ffi.Int>)>>('wait');
|
_lookup<ffi.NativeFunction<pid_t Function(ffi.Pointer<ffi.Int>)>>('wait');
|
||||||
late final _wait1 =
|
late final _wait$1 =
|
||||||
_wait1Ptr.asFunction<int Function(ffi.Pointer<ffi.Int>)>();
|
_wait$1Ptr.asFunction<int Function(ffi.Pointer<ffi.Int>)>();
|
||||||
|
|
||||||
int waitpid(
|
int waitpid(
|
||||||
int arg0,
|
int arg0,
|
||||||
@@ -2518,6 +2518,20 @@ class ClashFFI {
|
|||||||
late final _invokeAction =
|
late final _invokeAction =
|
||||||
_invokeActionPtr.asFunction<void Function(ffi.Pointer<ffi.Char>, int)>();
|
_invokeActionPtr.asFunction<void Function(ffi.Pointer<ffi.Char>, int)>();
|
||||||
|
|
||||||
|
ffi.Pointer<ffi.Char> getConfig(
|
||||||
|
ffi.Pointer<ffi.Char> s,
|
||||||
|
) {
|
||||||
|
return _getConfig(
|
||||||
|
s,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
late final _getConfigPtr = _lookup<
|
||||||
|
ffi.NativeFunction<
|
||||||
|
ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>>('getConfig');
|
||||||
|
late final _getConfig = _getConfigPtr
|
||||||
|
.asFunction<ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Char>)>();
|
||||||
|
|
||||||
void startListener() {
|
void startListener() {
|
||||||
return _startListener();
|
return _startListener();
|
||||||
}
|
}
|
||||||
@@ -2639,6 +2653,29 @@ class ClashFFI {
|
|||||||
_updateDnsPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
|
_updateDnsPtr.asFunction<void Function(ffi.Pointer<ffi.Char>)>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef __int8_t = ffi.SignedChar;
|
||||||
|
typedef Dart__int8_t = int;
|
||||||
|
typedef __uint8_t = ffi.UnsignedChar;
|
||||||
|
typedef Dart__uint8_t = int;
|
||||||
|
typedef __int16_t = ffi.Short;
|
||||||
|
typedef Dart__int16_t = int;
|
||||||
|
typedef __uint16_t = ffi.UnsignedShort;
|
||||||
|
typedef Dart__uint16_t = int;
|
||||||
|
typedef __int32_t = ffi.Int;
|
||||||
|
typedef Dart__int32_t = int;
|
||||||
|
typedef __uint32_t = ffi.UnsignedInt;
|
||||||
|
typedef Dart__uint32_t = int;
|
||||||
|
typedef __int64_t = ffi.LongLong;
|
||||||
|
typedef Dart__int64_t = int;
|
||||||
|
typedef __uint64_t = ffi.UnsignedLongLong;
|
||||||
|
typedef Dart__uint64_t = int;
|
||||||
|
typedef __darwin_intptr_t = ffi.Long;
|
||||||
|
typedef Dart__darwin_intptr_t = int;
|
||||||
|
typedef __darwin_natural_t = ffi.UnsignedInt;
|
||||||
|
typedef Dart__darwin_natural_t = int;
|
||||||
|
typedef __darwin_ct_rune_t = ffi.Int;
|
||||||
|
typedef Dart__darwin_ct_rune_t = int;
|
||||||
|
|
||||||
final class __mbstate_t extends ffi.Union {
|
final class __mbstate_t extends ffi.Union {
|
||||||
@ffi.Array.multi([128])
|
@ffi.Array.multi([128])
|
||||||
external ffi.Array<ffi.Char> __mbstate8;
|
external ffi.Array<ffi.Char> __mbstate8;
|
||||||
@@ -2647,6 +2684,46 @@ final class __mbstate_t extends ffi.Union {
|
|||||||
external int _mbstateL;
|
external int _mbstateL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef __darwin_mbstate_t = __mbstate_t;
|
||||||
|
typedef __darwin_ptrdiff_t = ffi.Long;
|
||||||
|
typedef Dart__darwin_ptrdiff_t = int;
|
||||||
|
typedef __darwin_size_t = ffi.UnsignedLong;
|
||||||
|
typedef Dart__darwin_size_t = int;
|
||||||
|
typedef __builtin_va_list = ffi.Pointer<ffi.Char>;
|
||||||
|
typedef __darwin_va_list = __builtin_va_list;
|
||||||
|
typedef __darwin_wchar_t = ffi.Int;
|
||||||
|
typedef Dart__darwin_wchar_t = int;
|
||||||
|
typedef __darwin_rune_t = __darwin_wchar_t;
|
||||||
|
typedef __darwin_wint_t = ffi.Int;
|
||||||
|
typedef Dart__darwin_wint_t = int;
|
||||||
|
typedef __darwin_clock_t = ffi.UnsignedLong;
|
||||||
|
typedef Dart__darwin_clock_t = int;
|
||||||
|
typedef __darwin_socklen_t = __uint32_t;
|
||||||
|
typedef __darwin_ssize_t = ffi.Long;
|
||||||
|
typedef Dart__darwin_ssize_t = int;
|
||||||
|
typedef __darwin_time_t = ffi.Long;
|
||||||
|
typedef Dart__darwin_time_t = int;
|
||||||
|
typedef __darwin_blkcnt_t = __int64_t;
|
||||||
|
typedef __darwin_blksize_t = __int32_t;
|
||||||
|
typedef __darwin_dev_t = __int32_t;
|
||||||
|
typedef __darwin_fsblkcnt_t = ffi.UnsignedInt;
|
||||||
|
typedef Dart__darwin_fsblkcnt_t = int;
|
||||||
|
typedef __darwin_fsfilcnt_t = ffi.UnsignedInt;
|
||||||
|
typedef Dart__darwin_fsfilcnt_t = int;
|
||||||
|
typedef __darwin_gid_t = __uint32_t;
|
||||||
|
typedef __darwin_id_t = __uint32_t;
|
||||||
|
typedef __darwin_ino64_t = __uint64_t;
|
||||||
|
typedef __darwin_ino_t = __darwin_ino64_t;
|
||||||
|
typedef __darwin_mach_port_name_t = __darwin_natural_t;
|
||||||
|
typedef __darwin_mach_port_t = __darwin_mach_port_name_t;
|
||||||
|
typedef __darwin_mode_t = __uint16_t;
|
||||||
|
typedef __darwin_off_t = __int64_t;
|
||||||
|
typedef __darwin_pid_t = __int32_t;
|
||||||
|
typedef __darwin_sigset_t = __uint32_t;
|
||||||
|
typedef __darwin_suseconds_t = __int32_t;
|
||||||
|
typedef __darwin_uid_t = __uint32_t;
|
||||||
|
typedef __darwin_useconds_t = __uint32_t;
|
||||||
|
|
||||||
final class __darwin_pthread_handler_rec extends ffi.Struct {
|
final class __darwin_pthread_handler_rec extends ffi.Struct {
|
||||||
external ffi
|
external ffi
|
||||||
.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
|
.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
|
||||||
@@ -2731,6 +2808,48 @@ final class _opaque_pthread_t extends ffi.Struct {
|
|||||||
external ffi.Array<ffi.Char> __opaque;
|
external ffi.Array<ffi.Char> __opaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef __darwin_pthread_attr_t = _opaque_pthread_attr_t;
|
||||||
|
typedef __darwin_pthread_cond_t = _opaque_pthread_cond_t;
|
||||||
|
typedef __darwin_pthread_condattr_t = _opaque_pthread_condattr_t;
|
||||||
|
typedef __darwin_pthread_key_t = ffi.UnsignedLong;
|
||||||
|
typedef Dart__darwin_pthread_key_t = int;
|
||||||
|
typedef __darwin_pthread_mutex_t = _opaque_pthread_mutex_t;
|
||||||
|
typedef __darwin_pthread_mutexattr_t = _opaque_pthread_mutexattr_t;
|
||||||
|
typedef __darwin_pthread_once_t = _opaque_pthread_once_t;
|
||||||
|
typedef __darwin_pthread_rwlock_t = _opaque_pthread_rwlock_t;
|
||||||
|
typedef __darwin_pthread_rwlockattr_t = _opaque_pthread_rwlockattr_t;
|
||||||
|
typedef __darwin_pthread_t = ffi.Pointer<_opaque_pthread_t>;
|
||||||
|
typedef __darwin_nl_item = ffi.Int;
|
||||||
|
typedef Dart__darwin_nl_item = int;
|
||||||
|
typedef __darwin_wctrans_t = ffi.Int;
|
||||||
|
typedef Dart__darwin_wctrans_t = int;
|
||||||
|
typedef __darwin_wctype_t = __uint32_t;
|
||||||
|
typedef u_int8_t = ffi.UnsignedChar;
|
||||||
|
typedef Dartu_int8_t = int;
|
||||||
|
typedef u_int16_t = ffi.UnsignedShort;
|
||||||
|
typedef Dartu_int16_t = int;
|
||||||
|
typedef u_int32_t = ffi.UnsignedInt;
|
||||||
|
typedef Dartu_int32_t = int;
|
||||||
|
typedef u_int64_t = ffi.UnsignedLongLong;
|
||||||
|
typedef Dartu_int64_t = int;
|
||||||
|
typedef register_t = ffi.Int64;
|
||||||
|
typedef Dartregister_t = int;
|
||||||
|
typedef user_addr_t = u_int64_t;
|
||||||
|
typedef user_size_t = u_int64_t;
|
||||||
|
typedef user_ssize_t = ffi.Int64;
|
||||||
|
typedef Dartuser_ssize_t = int;
|
||||||
|
typedef user_long_t = ffi.Int64;
|
||||||
|
typedef Dartuser_long_t = int;
|
||||||
|
typedef user_ulong_t = u_int64_t;
|
||||||
|
typedef user_time_t = ffi.Int64;
|
||||||
|
typedef Dartuser_time_t = int;
|
||||||
|
typedef user_off_t = ffi.Int64;
|
||||||
|
typedef Dartuser_off_t = int;
|
||||||
|
typedef syscall_arg_t = u_int64_t;
|
||||||
|
typedef ptrdiff_t = __darwin_ptrdiff_t;
|
||||||
|
typedef rsize_t = __darwin_size_t;
|
||||||
|
typedef wint_t = __darwin_wint_t;
|
||||||
|
|
||||||
final class _GoString_ extends ffi.Struct {
|
final class _GoString_ extends ffi.Struct {
|
||||||
external ffi.Pointer<ffi.Char> p;
|
external ffi.Pointer<ffi.Char> p;
|
||||||
|
|
||||||
@@ -2738,10 +2857,6 @@ final class _GoString_ extends ffi.Struct {
|
|||||||
external int n;
|
external int n;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef ptrdiff_t = __darwin_ptrdiff_t;
|
|
||||||
typedef __darwin_ptrdiff_t = ffi.Long;
|
|
||||||
typedef Dart__darwin_ptrdiff_t = int;
|
|
||||||
|
|
||||||
enum idtype_t {
|
enum idtype_t {
|
||||||
P_ALL(0),
|
P_ALL(0),
|
||||||
P_PID(1),
|
P_PID(1),
|
||||||
@@ -2754,10 +2869,15 @@ enum idtype_t {
|
|||||||
0 => P_ALL,
|
0 => P_ALL,
|
||||||
1 => P_PID,
|
1 => P_PID,
|
||||||
2 => P_PGID,
|
2 => P_PGID,
|
||||||
_ => throw ArgumentError("Unknown value for idtype_t: $value"),
|
_ => throw ArgumentError('Unknown value for idtype_t: $value'),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef pid_t = __darwin_pid_t;
|
||||||
|
typedef id_t = __darwin_id_t;
|
||||||
|
typedef sig_atomic_t = ffi.Int;
|
||||||
|
typedef Dartsig_atomic_t = int;
|
||||||
|
|
||||||
final class __darwin_arm_exception_state extends ffi.Struct {
|
final class __darwin_arm_exception_state extends ffi.Struct {
|
||||||
@__uint32_t()
|
@__uint32_t()
|
||||||
external int __exception;
|
external int __exception;
|
||||||
@@ -2769,9 +2889,6 @@ final class __darwin_arm_exception_state extends ffi.Struct {
|
|||||||
external int __far;
|
external int __far;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef __uint32_t = ffi.UnsignedInt;
|
|
||||||
typedef Dart__uint32_t = int;
|
|
||||||
|
|
||||||
final class __darwin_arm_exception_state64 extends ffi.Struct {
|
final class __darwin_arm_exception_state64 extends ffi.Struct {
|
||||||
@__uint64_t()
|
@__uint64_t()
|
||||||
external int __far;
|
external int __far;
|
||||||
@@ -2783,9 +2900,6 @@ final class __darwin_arm_exception_state64 extends ffi.Struct {
|
|||||||
external int __exception;
|
external int __exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef __uint64_t = ffi.UnsignedLongLong;
|
|
||||||
typedef Dart__uint64_t = int;
|
|
||||||
|
|
||||||
final class __darwin_arm_exception_state64_v2 extends ffi.Struct {
|
final class __darwin_arm_exception_state64_v2 extends ffi.Struct {
|
||||||
@__uint64_t()
|
@__uint64_t()
|
||||||
external int __far;
|
external int __far;
|
||||||
@@ -2914,6 +3028,9 @@ final class __darwin_mcontext32 extends ffi.Struct {
|
|||||||
|
|
||||||
final class __darwin_mcontext64 extends ffi.Opaque {}
|
final class __darwin_mcontext64 extends ffi.Opaque {}
|
||||||
|
|
||||||
|
typedef mcontext_t = ffi.Pointer<__darwin_mcontext64>;
|
||||||
|
typedef pthread_attr_t = __darwin_pthread_attr_t;
|
||||||
|
|
||||||
final class __darwin_sigaltstack extends ffi.Struct {
|
final class __darwin_sigaltstack extends ffi.Struct {
|
||||||
external ffi.Pointer<ffi.Void> ss_sp;
|
external ffi.Pointer<ffi.Void> ss_sp;
|
||||||
|
|
||||||
@@ -2924,8 +3041,7 @@ final class __darwin_sigaltstack extends ffi.Struct {
|
|||||||
external int ss_flags;
|
external int ss_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef __darwin_size_t = ffi.UnsignedLong;
|
typedef stack_t = __darwin_sigaltstack;
|
||||||
typedef Dart__darwin_size_t = int;
|
|
||||||
|
|
||||||
final class __darwin_ucontext extends ffi.Struct {
|
final class __darwin_ucontext extends ffi.Struct {
|
||||||
@ffi.Int()
|
@ffi.Int()
|
||||||
@@ -2944,7 +3060,9 @@ final class __darwin_ucontext extends ffi.Struct {
|
|||||||
external ffi.Pointer<__darwin_mcontext64> uc_mcontext;
|
external ffi.Pointer<__darwin_mcontext64> uc_mcontext;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef __darwin_sigset_t = __uint32_t;
|
typedef ucontext_t = __darwin_ucontext;
|
||||||
|
typedef sigset_t = __darwin_sigset_t;
|
||||||
|
typedef uid_t = __darwin_uid_t;
|
||||||
|
|
||||||
final class sigval extends ffi.Union {
|
final class sigval extends ffi.Union {
|
||||||
@ffi.Int()
|
@ffi.Int()
|
||||||
@@ -2968,9 +3086,6 @@ final class sigevent extends ffi.Struct {
|
|||||||
external ffi.Pointer<pthread_attr_t> sigev_notify_attributes;
|
external ffi.Pointer<pthread_attr_t> sigev_notify_attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef pthread_attr_t = __darwin_pthread_attr_t;
|
|
||||||
typedef __darwin_pthread_attr_t = _opaque_pthread_attr_t;
|
|
||||||
|
|
||||||
final class __siginfo extends ffi.Struct {
|
final class __siginfo extends ffi.Struct {
|
||||||
@ffi.Int()
|
@ffi.Int()
|
||||||
external int si_signo;
|
external int si_signo;
|
||||||
@@ -3001,12 +3116,7 @@ final class __siginfo extends ffi.Struct {
|
|||||||
external ffi.Array<ffi.UnsignedLong> __pad;
|
external ffi.Array<ffi.UnsignedLong> __pad;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef pid_t = __darwin_pid_t;
|
typedef siginfo_t = __siginfo;
|
||||||
typedef __darwin_pid_t = __int32_t;
|
|
||||||
typedef __int32_t = ffi.Int;
|
|
||||||
typedef Dart__int32_t = int;
|
|
||||||
typedef uid_t = __darwin_uid_t;
|
|
||||||
typedef __darwin_uid_t = __uint32_t;
|
|
||||||
|
|
||||||
final class __sigaction_u extends ffi.Union {
|
final class __sigaction_u extends ffi.Union {
|
||||||
external ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>
|
external ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>
|
||||||
@@ -3020,7 +3130,7 @@ final class __sigaction_u extends ffi.Union {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final class __sigaction extends ffi.Struct {
|
final class __sigaction extends ffi.Struct {
|
||||||
external __sigaction_u __sigaction_u1;
|
external __sigaction_u __sigaction_u$1;
|
||||||
|
|
||||||
external ffi.Pointer<
|
external ffi.Pointer<
|
||||||
ffi.NativeFunction<
|
ffi.NativeFunction<
|
||||||
@@ -3034,11 +3144,8 @@ final class __sigaction extends ffi.Struct {
|
|||||||
external int sa_flags;
|
external int sa_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef siginfo_t = __siginfo;
|
|
||||||
typedef sigset_t = __darwin_sigset_t;
|
|
||||||
|
|
||||||
final class sigaction extends ffi.Struct {
|
final class sigaction extends ffi.Struct {
|
||||||
external __sigaction_u __sigaction_u1;
|
external __sigaction_u __sigaction_u$1;
|
||||||
|
|
||||||
@sigset_t()
|
@sigset_t()
|
||||||
external int sa_mask;
|
external int sa_mask;
|
||||||
@@ -3047,6 +3154,10 @@ final class sigaction extends ffi.Struct {
|
|||||||
external int sa_flags;
|
external int sa_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef sig_tFunction = ffi.Void Function(ffi.Int);
|
||||||
|
typedef Dartsig_tFunction = void Function(int);
|
||||||
|
typedef sig_t = ffi.Pointer<ffi.NativeFunction<sig_tFunction>>;
|
||||||
|
|
||||||
final class sigvec extends ffi.Struct {
|
final class sigvec extends ffi.Struct {
|
||||||
external ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>
|
external ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Int)>>
|
||||||
sv_handler;
|
sv_handler;
|
||||||
@@ -3065,6 +3176,43 @@ final class sigstack extends ffi.Struct {
|
|||||||
external int ss_onstack;
|
external int ss_onstack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef int_least8_t = ffi.Int8;
|
||||||
|
typedef Dartint_least8_t = int;
|
||||||
|
typedef int_least16_t = ffi.Int16;
|
||||||
|
typedef Dartint_least16_t = int;
|
||||||
|
typedef int_least32_t = ffi.Int32;
|
||||||
|
typedef Dartint_least32_t = int;
|
||||||
|
typedef int_least64_t = ffi.Int64;
|
||||||
|
typedef Dartint_least64_t = int;
|
||||||
|
typedef uint_least8_t = ffi.Uint8;
|
||||||
|
typedef Dartuint_least8_t = int;
|
||||||
|
typedef uint_least16_t = ffi.Uint16;
|
||||||
|
typedef Dartuint_least16_t = int;
|
||||||
|
typedef uint_least32_t = ffi.Uint32;
|
||||||
|
typedef Dartuint_least32_t = int;
|
||||||
|
typedef uint_least64_t = ffi.Uint64;
|
||||||
|
typedef Dartuint_least64_t = int;
|
||||||
|
typedef int_fast8_t = ffi.Int8;
|
||||||
|
typedef Dartint_fast8_t = int;
|
||||||
|
typedef int_fast16_t = ffi.Int16;
|
||||||
|
typedef Dartint_fast16_t = int;
|
||||||
|
typedef int_fast32_t = ffi.Int32;
|
||||||
|
typedef Dartint_fast32_t = int;
|
||||||
|
typedef int_fast64_t = ffi.Int64;
|
||||||
|
typedef Dartint_fast64_t = int;
|
||||||
|
typedef uint_fast8_t = ffi.Uint8;
|
||||||
|
typedef Dartuint_fast8_t = int;
|
||||||
|
typedef uint_fast16_t = ffi.Uint16;
|
||||||
|
typedef Dartuint_fast16_t = int;
|
||||||
|
typedef uint_fast32_t = ffi.Uint32;
|
||||||
|
typedef Dartuint_fast32_t = int;
|
||||||
|
typedef uint_fast64_t = ffi.Uint64;
|
||||||
|
typedef Dartuint_fast64_t = int;
|
||||||
|
typedef intmax_t = ffi.Long;
|
||||||
|
typedef Dartintmax_t = int;
|
||||||
|
typedef uintmax_t = ffi.UnsignedLong;
|
||||||
|
typedef Dartuintmax_t = int;
|
||||||
|
|
||||||
final class timeval extends ffi.Struct {
|
final class timeval extends ffi.Struct {
|
||||||
@__darwin_time_t()
|
@__darwin_time_t()
|
||||||
external int tv_sec;
|
external int tv_sec;
|
||||||
@@ -3073,9 +3221,7 @@ final class timeval extends ffi.Struct {
|
|||||||
external int tv_usec;
|
external int tv_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef __darwin_time_t = ffi.Long;
|
typedef rlim_t = __uint64_t;
|
||||||
typedef Dart__darwin_time_t = int;
|
|
||||||
typedef __darwin_suseconds_t = __int32_t;
|
|
||||||
|
|
||||||
final class rusage extends ffi.Struct {
|
final class rusage extends ffi.Struct {
|
||||||
external timeval ru_utime;
|
external timeval ru_utime;
|
||||||
@@ -3125,6 +3271,8 @@ final class rusage extends ffi.Struct {
|
|||||||
external int ru_nivcsw;
|
external int ru_nivcsw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef rusage_info_t = ffi.Pointer<ffi.Void>;
|
||||||
|
|
||||||
final class rusage_info_v0 extends ffi.Struct {
|
final class rusage_info_v0 extends ffi.Struct {
|
||||||
@ffi.Array.multi([16])
|
@ffi.Array.multi([16])
|
||||||
external ffi.Array<ffi.Uint8> ri_uuid;
|
external ffi.Array<ffi.Uint8> ri_uuid;
|
||||||
@@ -3730,6 +3878,8 @@ final class rusage_info_v6 extends ffi.Struct {
|
|||||||
external ffi.Array<ffi.Uint64> ri_reserved;
|
external ffi.Array<ffi.Uint64> ri_reserved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef rusage_info_current = rusage_info_v6;
|
||||||
|
|
||||||
final class rlimit extends ffi.Struct {
|
final class rlimit extends ffi.Struct {
|
||||||
@rlim_t()
|
@rlim_t()
|
||||||
external int rlim_cur;
|
external int rlim_cur;
|
||||||
@@ -3738,8 +3888,6 @@ final class rlimit extends ffi.Struct {
|
|||||||
external int rlim_max;
|
external int rlim_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef rlim_t = __uint64_t;
|
|
||||||
|
|
||||||
final class proc_rlimit_control_wakeupmon extends ffi.Struct {
|
final class proc_rlimit_control_wakeupmon extends ffi.Struct {
|
||||||
@ffi.Uint32()
|
@ffi.Uint32()
|
||||||
external int wm_flags;
|
external int wm_flags;
|
||||||
@@ -3748,11 +3896,11 @@ final class proc_rlimit_control_wakeupmon extends ffi.Struct {
|
|||||||
external int wm_rate;
|
external int wm_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef id_t = __darwin_id_t;
|
|
||||||
typedef __darwin_id_t = __uint32_t;
|
|
||||||
|
|
||||||
final class wait extends ffi.Opaque {}
|
final class wait extends ffi.Opaque {}
|
||||||
|
|
||||||
|
typedef ct_rune_t = __darwin_ct_rune_t;
|
||||||
|
typedef rune_t = __darwin_rune_t;
|
||||||
|
|
||||||
final class div_t extends ffi.Struct {
|
final class div_t extends ffi.Struct {
|
||||||
@ffi.Int()
|
@ffi.Int()
|
||||||
external int quot;
|
external int quot;
|
||||||
@@ -3784,18 +3932,18 @@ final class _malloc_zone_t extends ffi.Opaque {}
|
|||||||
|
|
||||||
typedef malloc_zone_t = _malloc_zone_t;
|
typedef malloc_zone_t = _malloc_zone_t;
|
||||||
typedef dev_t = __darwin_dev_t;
|
typedef dev_t = __darwin_dev_t;
|
||||||
typedef __darwin_dev_t = __int32_t;
|
|
||||||
typedef mode_t = __darwin_mode_t;
|
typedef mode_t = __darwin_mode_t;
|
||||||
typedef __darwin_mode_t = __uint16_t;
|
typedef release_object_funcFunction = ffi.Void Function(
|
||||||
typedef __uint16_t = ffi.UnsignedShort;
|
ffi.Pointer<ffi.Void> obj);
|
||||||
typedef Dart__uint16_t = int;
|
typedef Dartrelease_object_funcFunction = void Function(
|
||||||
typedef protect_func = ffi.Pointer<ffi.NativeFunction<protect_funcFunction>>;
|
ffi.Pointer<ffi.Void> obj);
|
||||||
|
typedef release_object_func
|
||||||
|
= ffi.Pointer<ffi.NativeFunction<release_object_funcFunction>>;
|
||||||
typedef protect_funcFunction = ffi.Void Function(
|
typedef protect_funcFunction = ffi.Void Function(
|
||||||
ffi.Pointer<ffi.Void> tun_interface, ffi.Int fd);
|
ffi.Pointer<ffi.Void> tun_interface, ffi.Int fd);
|
||||||
typedef Dartprotect_funcFunction = void Function(
|
typedef Dartprotect_funcFunction = void Function(
|
||||||
ffi.Pointer<ffi.Void> tun_interface, int fd);
|
ffi.Pointer<ffi.Void> tun_interface, int fd);
|
||||||
typedef resolve_process_func
|
typedef protect_func = ffi.Pointer<ffi.NativeFunction<protect_funcFunction>>;
|
||||||
= ffi.Pointer<ffi.NativeFunction<resolve_process_funcFunction>>;
|
|
||||||
typedef resolve_process_funcFunction = ffi.Pointer<ffi.Char> Function(
|
typedef resolve_process_funcFunction = ffi.Pointer<ffi.Char> Function(
|
||||||
ffi.Pointer<ffi.Void> tun_interface,
|
ffi.Pointer<ffi.Void> tun_interface,
|
||||||
ffi.Int protocol,
|
ffi.Int protocol,
|
||||||
@@ -3808,12 +3956,35 @@ typedef Dartresolve_process_funcFunction = ffi.Pointer<ffi.Char> Function(
|
|||||||
ffi.Pointer<ffi.Char> source,
|
ffi.Pointer<ffi.Char> source,
|
||||||
ffi.Pointer<ffi.Char> target,
|
ffi.Pointer<ffi.Char> target,
|
||||||
int uid);
|
int uid);
|
||||||
typedef release_object_func
|
typedef resolve_process_func
|
||||||
= ffi.Pointer<ffi.NativeFunction<release_object_funcFunction>>;
|
= ffi.Pointer<ffi.NativeFunction<resolve_process_funcFunction>>;
|
||||||
typedef release_object_funcFunction = ffi.Void Function(
|
typedef GoInt8 = ffi.SignedChar;
|
||||||
ffi.Pointer<ffi.Void> obj);
|
typedef DartGoInt8 = int;
|
||||||
typedef Dartrelease_object_funcFunction = void Function(
|
typedef GoUint8 = ffi.UnsignedChar;
|
||||||
ffi.Pointer<ffi.Void> obj);
|
typedef DartGoUint8 = int;
|
||||||
|
typedef GoInt16 = ffi.Short;
|
||||||
|
typedef DartGoInt16 = int;
|
||||||
|
typedef GoUint16 = ffi.UnsignedShort;
|
||||||
|
typedef DartGoUint16 = int;
|
||||||
|
typedef GoInt32 = ffi.Int;
|
||||||
|
typedef DartGoInt32 = int;
|
||||||
|
typedef GoUint32 = ffi.UnsignedInt;
|
||||||
|
typedef DartGoUint32 = int;
|
||||||
|
typedef GoInt64 = ffi.LongLong;
|
||||||
|
typedef DartGoInt64 = int;
|
||||||
|
typedef GoUint64 = ffi.UnsignedLongLong;
|
||||||
|
typedef DartGoUint64 = int;
|
||||||
|
typedef GoInt = GoInt64;
|
||||||
|
typedef GoUint = GoUint64;
|
||||||
|
typedef GoUintptr = ffi.Size;
|
||||||
|
typedef DartGoUintptr = int;
|
||||||
|
typedef GoFloat32 = ffi.Float;
|
||||||
|
typedef DartGoFloat32 = double;
|
||||||
|
typedef GoFloat64 = ffi.Double;
|
||||||
|
typedef DartGoFloat64 = double;
|
||||||
|
typedef GoString = _GoString_;
|
||||||
|
typedef GoMap = ffi.Pointer<ffi.Void>;
|
||||||
|
typedef GoChan = ffi.Pointer<ffi.Void>;
|
||||||
|
|
||||||
final class GoInterface extends ffi.Struct {
|
final class GoInterface extends ffi.Struct {
|
||||||
external ffi.Pointer<ffi.Void> t;
|
external ffi.Pointer<ffi.Void> t;
|
||||||
@@ -3831,12 +4002,6 @@ final class GoSlice extends ffi.Struct {
|
|||||||
external int cap;
|
external int cap;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef GoInt = GoInt64;
|
|
||||||
typedef GoInt64 = ffi.LongLong;
|
|
||||||
typedef DartGoInt64 = int;
|
|
||||||
typedef GoUint8 = ffi.UnsignedChar;
|
|
||||||
typedef DartGoUint8 = int;
|
|
||||||
|
|
||||||
const int __has_safe_buffers = 1;
|
const int __has_safe_buffers = 1;
|
||||||
|
|
||||||
const int __DARWIN_ONLY_64_BIT_INO_T = 1;
|
const int __DARWIN_ONLY_64_BIT_INO_T = 1;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:isolate';
|
||||||
|
|
||||||
import 'package:fl_clash/clash/message.dart';
|
import 'package:fl_clash/clash/message.dart';
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
@@ -19,11 +20,15 @@ mixin ClashInterface {
|
|||||||
|
|
||||||
FutureOr<String> validateConfig(String data);
|
FutureOr<String> validateConfig(String data);
|
||||||
|
|
||||||
|
FutureOr<Result> getConfig(String path);
|
||||||
|
|
||||||
Future<String> asyncTestDelay(String url, String proxyName);
|
Future<String> asyncTestDelay(String url, String proxyName);
|
||||||
|
|
||||||
FutureOr<String> updateConfig(UpdateConfigParams updateConfigParams);
|
FutureOr<String> updateConfig(UpdateParams updateParams);
|
||||||
|
|
||||||
FutureOr<String> getProxies();
|
FutureOr<String> setupConfig(SetupParams setupParams);
|
||||||
|
|
||||||
|
FutureOr<Map> getProxies();
|
||||||
|
|
||||||
FutureOr<String> changeProxy(ChangeProxyParams changeProxyParams);
|
FutureOr<String> changeProxy(ChangeProxyParams changeProxyParams);
|
||||||
|
|
||||||
@@ -66,18 +71,12 @@ mixin ClashInterface {
|
|||||||
|
|
||||||
FutureOr<bool> closeConnections();
|
FutureOr<bool> closeConnections();
|
||||||
|
|
||||||
FutureOr<String> getProfile(String id);
|
FutureOr<bool> resetConnections();
|
||||||
|
|
||||||
Future<bool> setState(CoreState state);
|
Future<bool> setState(CoreState state);
|
||||||
}
|
}
|
||||||
|
|
||||||
mixin AndroidClashInterface {
|
mixin AndroidClashInterface {
|
||||||
Future<bool> setFdMap(int fd);
|
|
||||||
|
|
||||||
Future<bool> setProcessMap(ProcessMapItem item);
|
|
||||||
|
|
||||||
// Future<bool> stopTun();
|
|
||||||
|
|
||||||
Future<bool> updateDns(String value);
|
Future<bool> updateDns(String value);
|
||||||
|
|
||||||
Future<AndroidVpnOptions?> getAndroidVpnOptions();
|
Future<AndroidVpnOptions?> getAndroidVpnOptions();
|
||||||
@@ -90,55 +89,23 @@ mixin AndroidClashInterface {
|
|||||||
abstract class ClashHandlerInterface with ClashInterface {
|
abstract class ClashHandlerInterface with ClashInterface {
|
||||||
Map<String, Completer> callbackCompleterMap = {};
|
Map<String, Completer> callbackCompleterMap = {};
|
||||||
|
|
||||||
Future<bool> nextHandleResult(ActionResult result, Completer? completer) =>
|
|
||||||
Future.value(false);
|
|
||||||
|
|
||||||
handleResult(ActionResult result) async {
|
handleResult(ActionResult result) async {
|
||||||
final completer = callbackCompleterMap[result.id];
|
final completer = callbackCompleterMap[result.id];
|
||||||
try {
|
try {
|
||||||
switch (result.method) {
|
switch (result.method) {
|
||||||
case ActionMethod.initClash:
|
|
||||||
case ActionMethod.shutdown:
|
|
||||||
case ActionMethod.getIsInit:
|
|
||||||
case ActionMethod.startListener:
|
|
||||||
case ActionMethod.resetTraffic:
|
|
||||||
case ActionMethod.closeConnections:
|
|
||||||
case ActionMethod.closeConnection:
|
|
||||||
case ActionMethod.stopListener:
|
|
||||||
case ActionMethod.setState:
|
|
||||||
case ActionMethod.crash:
|
|
||||||
completer?.complete(result.data as bool);
|
|
||||||
return;
|
|
||||||
case ActionMethod.changeProxy:
|
|
||||||
case ActionMethod.getProxies:
|
|
||||||
case ActionMethod.getTraffic:
|
|
||||||
case ActionMethod.getTotalTraffic:
|
|
||||||
case ActionMethod.asyncTestDelay:
|
|
||||||
case ActionMethod.getConnections:
|
|
||||||
case ActionMethod.getExternalProviders:
|
|
||||||
case ActionMethod.getExternalProvider:
|
|
||||||
case ActionMethod.validateConfig:
|
|
||||||
case ActionMethod.updateConfig:
|
|
||||||
case ActionMethod.updateGeoData:
|
|
||||||
case ActionMethod.updateExternalProvider:
|
|
||||||
case ActionMethod.sideLoadExternalProvider:
|
|
||||||
case ActionMethod.getCountryCode:
|
|
||||||
case ActionMethod.getMemory:
|
|
||||||
completer?.complete(result.data as String);
|
|
||||||
return;
|
|
||||||
case ActionMethod.message:
|
case ActionMethod.message:
|
||||||
clashMessage.controller.add(result.data as String);
|
clashMessage.controller.add(result.data);
|
||||||
completer?.complete(true);
|
completer?.complete(true);
|
||||||
return;
|
return;
|
||||||
|
case ActionMethod.getConfig:
|
||||||
|
completer?.complete(result.toResult);
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
final isHandled = await nextHandleResult(result, completer);
|
|
||||||
if (isHandled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
completer?.complete(result.data);
|
completer?.complete(result.data);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} catch (_) {
|
} catch (e) {
|
||||||
commonPrint.log(result.id);
|
commonPrint.log("${result.id} error $e");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,18 +120,21 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
dynamic data,
|
dynamic data,
|
||||||
Duration? timeout,
|
Duration? timeout,
|
||||||
FutureOr<T> Function()? onTimeout,
|
FutureOr<T> Function()? onTimeout,
|
||||||
|
T? defaultValue,
|
||||||
}) async {
|
}) async {
|
||||||
final id = "${method.name}#${utils.id}";
|
final id = "${method.name}#${utils.id}";
|
||||||
|
|
||||||
callbackCompleterMap[id] = Completer<T>();
|
callbackCompleterMap[id] = Completer<T>();
|
||||||
|
|
||||||
dynamic defaultValue;
|
dynamic mDefaultValue = defaultValue;
|
||||||
|
if (mDefaultValue == null) {
|
||||||
if (T == String) {
|
if (T == String) {
|
||||||
defaultValue = "";
|
mDefaultValue = "";
|
||||||
}
|
} else if (T == bool) {
|
||||||
if (T == bool) {
|
mDefaultValue = false;
|
||||||
defaultValue = false;
|
} else if (T == Map) {
|
||||||
|
mDefaultValue = {};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sendMessage(
|
sendMessage(
|
||||||
@@ -173,7 +143,6 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
id: id,
|
id: id,
|
||||||
method: method,
|
method: method,
|
||||||
data: data,
|
data: data,
|
||||||
defaultValue: defaultValue,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -185,7 +154,7 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
},
|
},
|
||||||
onTimeout: onTimeout ??
|
onTimeout: onTimeout ??
|
||||||
() {
|
() {
|
||||||
return defaultValue;
|
return mDefaultValue;
|
||||||
},
|
},
|
||||||
functionName: id,
|
functionName: id,
|
||||||
);
|
);
|
||||||
@@ -211,6 +180,7 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
shutdown() async {
|
shutdown() async {
|
||||||
return await invoke<bool>(
|
return await invoke<bool>(
|
||||||
method: ActionMethod.shutdown,
|
method: ActionMethod.shutdown,
|
||||||
|
timeout: Duration(seconds: 1),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,10 +207,31 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> updateConfig(UpdateConfigParams updateConfigParams) async {
|
Future<String> updateConfig(UpdateParams updateParams) async {
|
||||||
return await invoke<String>(
|
return await invoke<String>(
|
||||||
method: ActionMethod.updateConfig,
|
method: ActionMethod.updateConfig,
|
||||||
data: json.encode(updateConfigParams),
|
data: json.encode(updateParams),
|
||||||
|
timeout: Duration(minutes: 2),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Result> getConfig(String path) async {
|
||||||
|
final res = await invoke<Result>(
|
||||||
|
method: ActionMethod.getConfig,
|
||||||
|
data: path,
|
||||||
|
timeout: Duration(minutes: 2),
|
||||||
|
defaultValue: Result.success({}),
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<String> setupConfig(SetupParams setupParams) async {
|
||||||
|
final data = await Isolate.run(() => json.encode(setupParams));
|
||||||
|
return await invoke<String>(
|
||||||
|
method: ActionMethod.setupConfig,
|
||||||
|
data: data,
|
||||||
timeout: Duration(minutes: 2),
|
timeout: Duration(minutes: 2),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -253,8 +244,8 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> getProxies() {
|
Future<Map> getProxies() {
|
||||||
return invoke<String>(
|
return invoke<Map>(
|
||||||
method: ActionMethod.getProxies,
|
method: ActionMethod.getProxies,
|
||||||
timeout: Duration(seconds: 5),
|
timeout: Duration(seconds: 5),
|
||||||
);
|
);
|
||||||
@@ -329,17 +320,16 @@ abstract class ClashHandlerInterface with ClashInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<bool> closeConnection(String id) {
|
Future<bool> resetConnections() {
|
||||||
return invoke<bool>(
|
return invoke<bool>(
|
||||||
method: ActionMethod.closeConnection,
|
method: ActionMethod.resetConnections,
|
||||||
data: id,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> getProfile(String id) {
|
Future<bool> closeConnection(String id) {
|
||||||
return invoke<String>(
|
return invoke<bool>(
|
||||||
method: ActionMethod.getProfile,
|
method: ActionMethod.closeConnection,
|
||||||
data: id,
|
data: id,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import 'dart:isolate';
|
|||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
import 'package:fl_clash/common/constant.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:fl_clash/models/models.dart';
|
import 'package:fl_clash/models/models.dart';
|
||||||
import 'package:fl_clash/plugins/service.dart';
|
import 'package:fl_clash/plugins/service.dart';
|
||||||
@@ -62,26 +62,6 @@ class ClashLib extends ClashHandlerInterface with AndroidClashInterface {
|
|||||||
return _instance!;
|
return _instance!;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> nextHandleResult(result, completer) async {
|
|
||||||
switch (result.method) {
|
|
||||||
case ActionMethod.setFdMap:
|
|
||||||
case ActionMethod.setProcessMap:
|
|
||||||
case ActionMethod.stopTun:
|
|
||||||
case ActionMethod.updateDns:
|
|
||||||
completer?.complete(result.data as bool);
|
|
||||||
return true;
|
|
||||||
case ActionMethod.getRunTime:
|
|
||||||
case ActionMethod.startTun:
|
|
||||||
case ActionMethod.getAndroidVpnOptions:
|
|
||||||
case ActionMethod.getCurrentProfileName:
|
|
||||||
completer?.complete(result.data as String);
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
destroy() async {
|
destroy() async {
|
||||||
await service?.destroy();
|
await service?.destroy();
|
||||||
@@ -106,22 +86,6 @@ class ClashLib extends ClashHandlerInterface with AndroidClashInterface {
|
|||||||
sendPort?.send(message);
|
sendPort?.send(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> setFdMap(int fd) {
|
|
||||||
return invoke<bool>(
|
|
||||||
method: ActionMethod.setFdMap,
|
|
||||||
data: json.encode(fd),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> setProcessMap(item) {
|
|
||||||
return invoke<bool>(
|
|
||||||
method: ActionMethod.setProcessMap,
|
|
||||||
data: item,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// @override
|
// @override
|
||||||
// Future<bool> stopTun() {
|
// Future<bool> stopTun() {
|
||||||
// return invoke<bool>(
|
// return invoke<bool>(
|
||||||
@@ -267,9 +231,32 @@ class ClashLibHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DateTime? getRunTime() {
|
||||||
|
final runTimeRaw = clashFFI.getRunTime();
|
||||||
|
final runTimeString = runTimeRaw.cast<Utf8>().toDartString();
|
||||||
|
if (runTimeString.isEmpty) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return DateTime.fromMillisecondsSinceEpoch(int.parse(runTimeString));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Map<String, dynamic>> getConfig(String id) async {
|
||||||
|
final path = await appPath.getProfilePath(id);
|
||||||
|
final pathChar = path.toNativeUtf8().cast<Char>();
|
||||||
|
final configRaw = clashFFI.getConfig(pathChar);
|
||||||
|
final configString = configRaw.cast<Utf8>().toDartString();
|
||||||
|
if (configString.isEmpty) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
final config = json.decode(configString);
|
||||||
|
malloc.free(pathChar);
|
||||||
|
clashFFI.freeCString(configRaw);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
Future<String> quickStart(
|
Future<String> quickStart(
|
||||||
InitParams initParams,
|
InitParams initParams,
|
||||||
UpdateConfigParams updateConfigParams,
|
SetupParams setupParams,
|
||||||
CoreState state,
|
CoreState state,
|
||||||
) {
|
) {
|
||||||
final completer = Completer<String>();
|
final completer = Completer<String>();
|
||||||
@@ -280,7 +267,7 @@ class ClashLibHandler {
|
|||||||
receiver.close();
|
receiver.close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
final params = json.encode(updateConfigParams);
|
final params = json.encode(setupParams);
|
||||||
final initValue = json.encode(initParams);
|
final initValue = json.encode(initParams);
|
||||||
final stateParams = json.encode(state);
|
final stateParams = json.encode(state);
|
||||||
final initParamsChar = initValue.toNativeUtf8().cast<Char>();
|
final initParamsChar = initValue.toNativeUtf8().cast<Char>();
|
||||||
@@ -297,15 +284,10 @@ class ClashLibHandler {
|
|||||||
malloc.free(stateParamsChar);
|
malloc.free(stateParamsChar);
|
||||||
return completer.future;
|
return completer.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime? getRunTime() {
|
|
||||||
final runTimeRaw = clashFFI.getRunTime();
|
|
||||||
final runTimeString = runTimeRaw.cast<Utf8>().toDartString();
|
|
||||||
clashFFI.freeCString(runTimeRaw);
|
|
||||||
if (runTimeString.isEmpty) return null;
|
|
||||||
return DateTime.fromMillisecondsSinceEpoch(int.parse(runTimeString));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClashLib? get clashLib =>
|
ClashLib? get clashLib =>
|
||||||
Platform.isAndroid && !globalState.isService ? ClashLib() : null;
|
Platform.isAndroid && !globalState.isService ? ClashLib() : null;
|
||||||
|
|
||||||
|
ClashLibHandler? get clashLibHandler =>
|
||||||
|
Platform.isAndroid && globalState.isService ? ClashLibHandler() : null;
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:fl_clash/models/models.dart';
|
import 'package:fl_clash/models/models.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
class ClashMessage {
|
class ClashMessage {
|
||||||
final controller = StreamController<String>();
|
final controller = StreamController<Map<String, Object?>>();
|
||||||
|
|
||||||
ClashMessage._() {
|
ClashMessage._() {
|
||||||
controller.stream.listen(
|
controller.stream.listen(
|
||||||
(message) {
|
(message) {
|
||||||
if(message.isEmpty){
|
if (message.isEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final m = AppMessage.fromJson(json.decode(message));
|
final m = AppMessage.fromJson(message);
|
||||||
for (final AppMessageListener listener in _listeners) {
|
for (final AppMessageListener listener in _listeners) {
|
||||||
switch (m.type) {
|
switch (m.type) {
|
||||||
case AppMessageType.log:
|
case AppMessageType.log:
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:typed_data';
|
|
||||||
|
|
||||||
import 'package:fl_clash/clash/interface.dart';
|
import 'package:fl_clash/clash/interface.dart';
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
@@ -51,23 +50,18 @@ class ClashService extends ClashHandlerInterface {
|
|||||||
await _destroySocket();
|
await _destroySocket();
|
||||||
socketCompleter.complete(socket);
|
socketCompleter.complete(socket);
|
||||||
socket
|
socket
|
||||||
.transform(
|
.transform(uint8ListToListIntConverter)
|
||||||
StreamTransformer<Uint8List, String>.fromHandlers(
|
.transform(utf8.decoder)
|
||||||
handleData: (Uint8List data, EventSink<String> sink) {
|
|
||||||
sink.add(utf8.decode(data, allowMalformed: true));
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.transform(LineSplitter())
|
.transform(LineSplitter())
|
||||||
.listen(
|
.listen(
|
||||||
(data) {
|
(data) {
|
||||||
handleResult(
|
handleResult(
|
||||||
ActionResult.fromJson(
|
ActionResult.fromJson(
|
||||||
json.decode(data.trim()),
|
json.decode(data.trim()),
|
||||||
),
|
),
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}, (error, stack) {
|
}, (error, stack) {
|
||||||
commonPrint.log(error.toString());
|
commonPrint.log(error.toString());
|
||||||
@@ -104,7 +98,13 @@ class ClashService extends ClashHandlerInterface {
|
|||||||
arg,
|
arg,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
process!.stdout.listen((_) {});
|
process?.stdout.listen((_) {});
|
||||||
|
process?.stderr.listen((e) {
|
||||||
|
final error = utf8.decode(e);
|
||||||
|
if (error.isNotEmpty) {
|
||||||
|
commonPrint.log(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
isStarting = false;
|
isStarting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ export 'app_localizations.dart';
|
|||||||
export 'color.dart';
|
export 'color.dart';
|
||||||
export 'constant.dart';
|
export 'constant.dart';
|
||||||
export 'context.dart';
|
export 'context.dart';
|
||||||
|
export 'converter.dart';
|
||||||
export 'datetime.dart';
|
export 'datetime.dart';
|
||||||
|
export 'fixed.dart';
|
||||||
export 'function.dart';
|
export 'function.dart';
|
||||||
export 'future.dart';
|
export 'future.dart';
|
||||||
export 'http.dart';
|
export 'http.dart';
|
||||||
@@ -12,28 +14,27 @@ export 'iterable.dart';
|
|||||||
export 'keyboard.dart';
|
export 'keyboard.dart';
|
||||||
export 'launch.dart';
|
export 'launch.dart';
|
||||||
export 'link.dart';
|
export 'link.dart';
|
||||||
export 'fixed.dart';
|
|
||||||
export 'lock.dart';
|
export 'lock.dart';
|
||||||
export 'measure.dart';
|
export 'measure.dart';
|
||||||
|
export 'mixin.dart';
|
||||||
export 'navigation.dart';
|
export 'navigation.dart';
|
||||||
export 'navigator.dart';
|
export 'navigator.dart';
|
||||||
export 'network.dart';
|
export 'network.dart';
|
||||||
export 'num.dart';
|
export 'num.dart';
|
||||||
export 'utils.dart';
|
|
||||||
export 'package.dart';
|
export 'package.dart';
|
||||||
export 'path.dart';
|
export 'path.dart';
|
||||||
export 'picker.dart';
|
export 'picker.dart';
|
||||||
export 'preferences.dart';
|
export 'preferences.dart';
|
||||||
|
export 'print.dart';
|
||||||
export 'protocol.dart';
|
export 'protocol.dart';
|
||||||
export 'proxy.dart';
|
export 'proxy.dart';
|
||||||
|
export 'render.dart';
|
||||||
export 'request.dart';
|
export 'request.dart';
|
||||||
export 'scroll.dart';
|
export 'scroll.dart';
|
||||||
export 'string.dart';
|
export 'string.dart';
|
||||||
export 'system.dart';
|
export 'system.dart';
|
||||||
export 'text.dart';
|
export 'text.dart';
|
||||||
export 'tray.dart';
|
export 'tray.dart';
|
||||||
|
export 'utils.dart';
|
||||||
export 'window.dart';
|
export 'window.dart';
|
||||||
export 'windows.dart';
|
export 'windows.dart';
|
||||||
export 'render.dart';
|
|
||||||
export 'mixin.dart';
|
|
||||||
export 'print.dart';
|
|
||||||
@@ -23,10 +23,12 @@ final baseInfoEdgeInsets = EdgeInsets.symmetric(
|
|||||||
horizontal: 16.ap,
|
horizontal: 16.ap,
|
||||||
);
|
);
|
||||||
|
|
||||||
final defaultTextScaleFactor = WidgetsBinding.instance.platformDispatcher.textScaleFactor;
|
final defaultTextScaleFactor =
|
||||||
|
WidgetsBinding.instance.platformDispatcher.textScaleFactor;
|
||||||
const httpTimeoutDuration = Duration(milliseconds: 5000);
|
const httpTimeoutDuration = Duration(milliseconds: 5000);
|
||||||
const moreDuration = Duration(milliseconds: 100);
|
const moreDuration = Duration(milliseconds: 100);
|
||||||
const animateDuration = Duration(milliseconds: 100);
|
const animateDuration = Duration(milliseconds: 100);
|
||||||
|
const midDuration = Duration(milliseconds: 200);
|
||||||
const commonDuration = Duration(milliseconds: 300);
|
const commonDuration = Duration(milliseconds: 300);
|
||||||
const defaultUpdateDuration = Duration(days: 1);
|
const defaultUpdateDuration = Duration(days: 1);
|
||||||
const mmdbFileName = "geoip.metadb";
|
const mmdbFileName = "geoip.metadb";
|
||||||
@@ -76,6 +78,10 @@ const viewModeColumnsMap = {
|
|||||||
ViewMode.desktop: [4, 3],
|
ViewMode.desktop: [4, 3],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// const proxiesStoreKey = PageStorageKey<String>('proxies');
|
||||||
|
// const toolsStoreKey = PageStorageKey<String>('tools');
|
||||||
|
// const profilesStoreKey = PageStorageKey<String>('profiles');
|
||||||
|
|
||||||
const defaultPrimaryColor = 0XFFD8C0C3;
|
const defaultPrimaryColor = 0XFFD8C0C3;
|
||||||
|
|
||||||
double getWidgetHeight(num lines) {
|
double getWidgetHeight(num lines) {
|
||||||
@@ -97,3 +103,8 @@ const defaultPrimaryColors = [
|
|||||||
defaultPrimaryColor,
|
defaultPrimaryColor,
|
||||||
0XFF665390,
|
0XFF665390,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const scriptTemplate = """
|
||||||
|
const main = (config) => {
|
||||||
|
return config;
|
||||||
|
}""";
|
||||||
|
|||||||
32
lib/common/converter.dart
Normal file
32
lib/common/converter.dart
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
class Uint8ListToListIntConverter extends Converter<Uint8List, List<int>> {
|
||||||
|
@override
|
||||||
|
List<int> convert(Uint8List input) {
|
||||||
|
return input.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Sink<Uint8List> startChunkedConversion(Sink<List<int>> sink) {
|
||||||
|
return _Uint8ListToListIntConverterSink(sink);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _Uint8ListToListIntConverterSink implements Sink<Uint8List> {
|
||||||
|
const _Uint8ListToListIntConverterSink(this._target);
|
||||||
|
|
||||||
|
final Sink<List<int>> _target;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void add(Uint8List data) {
|
||||||
|
_target.add(data.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void close() {
|
||||||
|
_target.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final uint8ListToListIntConverter = Uint8ListToListIntConverter();
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
|
|
||||||
class Debouncer {
|
class Debouncer {
|
||||||
final Map<dynamic, Timer?> _operations = {};
|
final Map<FunctionTag, Timer?> _operations = {};
|
||||||
|
|
||||||
call(
|
call(
|
||||||
dynamic tag,
|
FunctionTag tag,
|
||||||
Function func, {
|
Function func, {
|
||||||
List<dynamic>? args,
|
List<dynamic>? args,
|
||||||
Duration duration = const Duration(milliseconds: 600),
|
Duration duration = const Duration(milliseconds: 600),
|
||||||
@@ -33,10 +35,10 @@ class Debouncer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Throttler {
|
class Throttler {
|
||||||
final Map<dynamic, Timer?> _operations = {};
|
final Map<FunctionTag, Timer?> _operations = {};
|
||||||
|
|
||||||
call(
|
call(
|
||||||
dynamic tag,
|
FunctionTag tag,
|
||||||
Function func, {
|
Function func, {
|
||||||
List<dynamic>? args,
|
List<dynamic>? args,
|
||||||
Duration duration = const Duration(milliseconds: 600),
|
Duration duration = const Duration(milliseconds: 600),
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class FlClashHttpOverrides extends HttpOverrides {
|
|||||||
@override
|
@override
|
||||||
HttpClient createHttpClient(SecurityContext? context) {
|
HttpClient createHttpClient(SecurityContext? context) {
|
||||||
final client = super.createHttpClient(context);
|
final client = super.createHttpClient(context);
|
||||||
|
client.badCertificateCallback = (_, __, ___) => true;
|
||||||
client.findProxy = handleFindProxy;
|
client.findProxy = handleFindProxy;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:fl_clash/fragments/fragments.dart';
|
|
||||||
import 'package:fl_clash/models/models.dart';
|
import 'package:fl_clash/models/models.dart';
|
||||||
|
import 'package:fl_clash/views/views.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class Navigation {
|
class Navigation {
|
||||||
@@ -12,16 +12,17 @@ class Navigation {
|
|||||||
}) {
|
}) {
|
||||||
return [
|
return [
|
||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
|
keep: false,
|
||||||
icon: Icon(Icons.space_dashboard),
|
icon: Icon(Icons.space_dashboard),
|
||||||
label: PageLabel.dashboard,
|
label: PageLabel.dashboard,
|
||||||
fragment: DashboardFragment(
|
view: DashboardView(
|
||||||
key: GlobalObjectKey(PageLabel.dashboard),
|
key: GlobalObjectKey(PageLabel.dashboard),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
NavigationItem(
|
NavigationItem(
|
||||||
icon: const Icon(Icons.article),
|
icon: const Icon(Icons.article),
|
||||||
label: PageLabel.proxies,
|
label: PageLabel.proxies,
|
||||||
fragment: const ProxiesFragment(
|
view: const ProxiesView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.proxies,
|
PageLabel.proxies,
|
||||||
),
|
),
|
||||||
@@ -33,7 +34,7 @@ class Navigation {
|
|||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
icon: Icon(Icons.folder),
|
icon: Icon(Icons.folder),
|
||||||
label: PageLabel.profiles,
|
label: PageLabel.profiles,
|
||||||
fragment: ProfilesFragment(
|
view: ProfilesView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.profiles,
|
PageLabel.profiles,
|
||||||
),
|
),
|
||||||
@@ -42,7 +43,7 @@ class Navigation {
|
|||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
icon: Icon(Icons.view_timeline),
|
icon: Icon(Icons.view_timeline),
|
||||||
label: PageLabel.requests,
|
label: PageLabel.requests,
|
||||||
fragment: RequestsFragment(
|
view: RequestsView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.requests,
|
PageLabel.requests,
|
||||||
),
|
),
|
||||||
@@ -53,7 +54,7 @@ class Navigation {
|
|||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
icon: Icon(Icons.ballot),
|
icon: Icon(Icons.ballot),
|
||||||
label: PageLabel.connections,
|
label: PageLabel.connections,
|
||||||
fragment: ConnectionsFragment(
|
view: ConnectionsView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.connections,
|
PageLabel.connections,
|
||||||
),
|
),
|
||||||
@@ -65,8 +66,7 @@ class Navigation {
|
|||||||
icon: Icon(Icons.storage),
|
icon: Icon(Icons.storage),
|
||||||
label: PageLabel.resources,
|
label: PageLabel.resources,
|
||||||
description: "resourcesDesc",
|
description: "resourcesDesc",
|
||||||
keep: false,
|
view: ResourcesView(
|
||||||
fragment: Resources(
|
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.resources,
|
PageLabel.resources,
|
||||||
),
|
),
|
||||||
@@ -76,7 +76,7 @@ class Navigation {
|
|||||||
NavigationItem(
|
NavigationItem(
|
||||||
icon: const Icon(Icons.adb),
|
icon: const Icon(Icons.adb),
|
||||||
label: PageLabel.logs,
|
label: PageLabel.logs,
|
||||||
fragment: const LogsFragment(
|
view: const LogsView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.logs,
|
PageLabel.logs,
|
||||||
),
|
),
|
||||||
@@ -89,7 +89,7 @@ class Navigation {
|
|||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
icon: Icon(Icons.construction),
|
icon: Icon(Icons.construction),
|
||||||
label: PageLabel.tools,
|
label: PageLabel.tools,
|
||||||
fragment: ToolsFragment(
|
view: ToolsView(
|
||||||
key: GlobalObjectKey(
|
key: GlobalObjectKey(
|
||||||
PageLabel.tools,
|
PageLabel.tools,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:fl_clash/common/common.dart';
|
|||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:fl_clash/models/models.dart';
|
import 'package:fl_clash/models/models.dart';
|
||||||
import 'package:fl_clash/state.dart';
|
import 'package:fl_clash/state.dart';
|
||||||
|
import 'package:fl_clash/widgets/dialog.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class BaseNavigator {
|
class BaseNavigator {
|
||||||
@@ -19,6 +20,21 @@ class BaseNavigator {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<T?> modal<T>(BuildContext context, Widget child) async {
|
||||||
|
if (globalState.appState.viewMode != ViewMode.mobile) {
|
||||||
|
return await globalState.showCommonDialog<T>(
|
||||||
|
child: CommonModal(
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return await Navigator.of(context).push<T>(
|
||||||
|
CommonRoute(
|
||||||
|
builder: (context) => child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CommonDesktopRoute<T> extends PageRoute<T> {
|
class CommonDesktopRoute<T> extends PageRoute<T> {
|
||||||
@@ -218,8 +234,7 @@ class _CommonPageTransitionState extends State<CommonPageTransition> {
|
|||||||
begin: const _CommonEdgeShadowDecoration(),
|
begin: const _CommonEdgeShadowDecoration(),
|
||||||
end: _CommonEdgeShadowDecoration(
|
end: _CommonEdgeShadowDecoration(
|
||||||
<Color>[
|
<Color>[
|
||||||
widget.context.colorScheme.inverseSurface
|
widget.context.colorScheme.inverseSurface.withValues(alpha: 0.02),
|
||||||
.withValues(alpha: 0.02),
|
|
||||||
Colors.transparent,
|
Colors.transparent,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
import 'constant.dart';
|
|
||||||
|
|
||||||
class AppPath {
|
class AppPath {
|
||||||
static AppPath? _instance;
|
static AppPath? _instance;
|
||||||
Completer<Directory> dataDir = Completer();
|
Completer<Directory> dataDir = Completer();
|
||||||
@@ -73,16 +72,33 @@ class AppPath {
|
|||||||
return join(directory.path, profilesDirectoryName);
|
return join(directory.path, profilesDirectoryName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> getProfilePath(String? id) async {
|
Future<String> getProfilePath(String id) async {
|
||||||
if (id == null) return null;
|
|
||||||
final directory = await profilesPath;
|
final directory = await profilesPath;
|
||||||
return join(directory, "$id.yaml");
|
return join(directory, "$id.yaml");
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> getProvidersPath(String? id) async {
|
Future<String> getProvidersDirPath(String id) async {
|
||||||
if (id == null) return null;
|
|
||||||
final directory = await profilesPath;
|
final directory = await profilesPath;
|
||||||
return join(directory, "providers", id);
|
return join(
|
||||||
|
directory,
|
||||||
|
"providers",
|
||||||
|
id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> getProvidersFilePath(
|
||||||
|
String id,
|
||||||
|
String type,
|
||||||
|
String url,
|
||||||
|
) async {
|
||||||
|
final directory = await profilesPath;
|
||||||
|
return join(
|
||||||
|
directory,
|
||||||
|
"providers",
|
||||||
|
id,
|
||||||
|
type,
|
||||||
|
url.toMd5(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> get tempPath async {
|
Future<String> get tempPath async {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class CommonPrint {
|
|||||||
log(String? text) {
|
log(String? text) {
|
||||||
final payload = "[FlClash] $text";
|
final payload = "[FlClash] $text";
|
||||||
debugPrint(payload);
|
debugPrint(payload);
|
||||||
if (globalState.isService) {
|
if (!globalState.isInit) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
globalState.appController.addLog(
|
globalState.appController.addLog(
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ class Render {
|
|||||||
|
|
||||||
pause() {
|
pause() {
|
||||||
throttler.call(
|
throttler.call(
|
||||||
DebounceTag.renderPause,
|
FunctionTag.renderPause,
|
||||||
_pause,
|
_pause,
|
||||||
duration: Duration(seconds: 5),
|
duration: Duration(seconds: 5),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
resume() {
|
resume() {
|
||||||
throttler.cancel(DebounceTag.renderPause);
|
throttler.cancel(FunctionTag.renderPause);
|
||||||
_resume();
|
_resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,16 @@ class Request {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Response> getTextResponseForUrl(String url) async {
|
||||||
|
final response = await _clashDio.get(
|
||||||
|
url,
|
||||||
|
options: Options(
|
||||||
|
responseType: ResponseType.plain,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
Future<MemoryImage?> getImage(String url) async {
|
Future<MemoryImage?> getImage(String url) async {
|
||||||
if (url.isEmpty) return null;
|
if (url.isEmpty) return null;
|
||||||
final response = await _dio.get<Uint8List>(
|
final response = await _dio.get<Uint8List>(
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:crypto/crypto.dart';
|
||||||
|
|
||||||
import 'print.dart';
|
import 'print.dart';
|
||||||
|
|
||||||
extension StringExtension on String {
|
extension StringExtension on String {
|
||||||
@@ -8,6 +10,13 @@ extension StringExtension on String {
|
|||||||
return RegExp(r'^(http|https|ftp)://').hasMatch(this);
|
return RegExp(r'^(http|https|ftp)://').hasMatch(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dynamic get splitByMultipleSeparators {
|
||||||
|
final parts =
|
||||||
|
split(RegExp(r'[, ;]+')).where((part) => part.isNotEmpty).toList();
|
||||||
|
|
||||||
|
return parts.length > 1 ? parts : this;
|
||||||
|
}
|
||||||
|
|
||||||
int compareToLower(String other) {
|
int compareToLower(String other) {
|
||||||
return toLowerCase().compareTo(
|
return toLowerCase().compareTo(
|
||||||
other.toLowerCase(),
|
other.toLowerCase(),
|
||||||
@@ -38,6 +47,10 @@ extension StringExtension on String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get isSvg {
|
||||||
|
return endsWith(".svg");
|
||||||
|
}
|
||||||
|
|
||||||
bool get isRegex {
|
bool get isRegex {
|
||||||
try {
|
try {
|
||||||
RegExp(this);
|
RegExp(this);
|
||||||
@@ -47,6 +60,15 @@ extension StringExtension on String {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String toMd5() {
|
||||||
|
final bytes = utf8.encode(this);
|
||||||
|
return md5.convert(bytes).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// bool containsToLower(String target) {
|
||||||
|
// return toLowerCase().contains(target);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
extension StringExtensionSafe on String? {
|
extension StringExtensionSafe on String? {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class System {
|
|||||||
|
|
||||||
Future<AuthorizeCode> authorizeCore() async {
|
Future<AuthorizeCode> authorizeCore() async {
|
||||||
if (Platform.isAndroid) {
|
if (Platform.isAndroid) {
|
||||||
return AuthorizeCode.none;
|
return AuthorizeCode.error;
|
||||||
}
|
}
|
||||||
final corePath = appPath.corePath.replaceAll(' ', '\\\\ ');
|
final corePath = appPath.corePath.replaceAll(' ', '\\\\ ');
|
||||||
final isAdmin = await checkIsAdmin();
|
final isAdmin = await checkIsAdmin();
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:lpinyin/lpinyin.dart';
|
import 'package:lpinyin/lpinyin.dart';
|
||||||
|
|
||||||
class Utils {
|
class Utils {
|
||||||
@@ -230,7 +233,7 @@ class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getProfilesColumns(double viewWidth) {
|
int getProfilesColumns(double viewWidth) {
|
||||||
return max((viewWidth / 350).floor(), 1);
|
return max((viewWidth / 320).floor(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
final _indexPrimary = [
|
final _indexPrimary = [
|
||||||
@@ -323,6 +326,72 @@ class Utils {
|
|||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SingleActivator controlSingleActivator(LogicalKeyboardKey trigger) {
|
||||||
|
final control = Platform.isMacOS ? false : true;
|
||||||
|
return SingleActivator(
|
||||||
|
trigger,
|
||||||
|
control: control,
|
||||||
|
meta: !control,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// dynamic convertYamlNode(dynamic node) {
|
||||||
|
// if (node is YamlMap) {
|
||||||
|
// final map = <String, dynamic>{};
|
||||||
|
// YamlNode? mergeKeyNode;
|
||||||
|
// for (final entry in node.nodes.entries) {
|
||||||
|
// if (entry.key is YamlScalar &&
|
||||||
|
// (entry.key as YamlScalar).value == '<<') {
|
||||||
|
// mergeKeyNode = entry.value;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (mergeKeyNode != null) {
|
||||||
|
// final mergeValue = mergeKeyNode.value;
|
||||||
|
// if (mergeValue is YamlMap) {
|
||||||
|
// map.addAll(convertYamlNode(mergeValue) as Map<String, dynamic>);
|
||||||
|
// } else if (mergeValue is YamlList) {
|
||||||
|
// for (final node in mergeValue.nodes) {
|
||||||
|
// if (node.value is YamlMap) {
|
||||||
|
// map.addAll(convertYamlNode(node.value) as Map<String, dynamic>);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// node.nodes.forEach((key, value) {
|
||||||
|
// String stringKey;
|
||||||
|
// if (key is YamlScalar) {
|
||||||
|
// stringKey = key.value.toString();
|
||||||
|
// } else {
|
||||||
|
// stringKey = key.toString();
|
||||||
|
// }
|
||||||
|
// map[stringKey] = convertYamlNode(value.value);
|
||||||
|
// });
|
||||||
|
// return map;
|
||||||
|
// } else if (node is YamlList) {
|
||||||
|
// final list = <dynamic>[];
|
||||||
|
// for (final item in node.nodes) {
|
||||||
|
// list.add(convertYamlNode(item.value));
|
||||||
|
// }
|
||||||
|
// return list;
|
||||||
|
// } else if (node is YamlScalar) {
|
||||||
|
// return node.value;
|
||||||
|
// }
|
||||||
|
// return node;
|
||||||
|
// }
|
||||||
|
|
||||||
|
FutureOr<T> handleWatch<T>(Function function) async {
|
||||||
|
if (kDebugMode) {
|
||||||
|
final stopwatch = Stopwatch()..start();
|
||||||
|
final res = await function();
|
||||||
|
stopwatch.stop();
|
||||||
|
commonPrint.log('耗时:${stopwatch.elapsedMilliseconds} ms');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return await function();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final utils = Utils();
|
final utils = Utils();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:archive/archive.dart';
|
|||||||
import 'package:fl_clash/clash/clash.dart';
|
import 'package:fl_clash/clash/clash.dart';
|
||||||
import 'package:fl_clash/common/archive.dart';
|
import 'package:fl_clash/common/archive.dart';
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
|
import 'package:fl_clash/plugins/app.dart';
|
||||||
import 'package:fl_clash/providers/providers.dart';
|
import 'package:fl_clash/providers/providers.dart';
|
||||||
import 'package:fl_clash/state.dart';
|
import 'package:fl_clash/state.dart';
|
||||||
import 'package:fl_clash/widgets/dialog.dart';
|
import 'package:fl_clash/widgets/dialog.dart';
|
||||||
@@ -17,8 +18,8 @@ import 'package:path/path.dart';
|
|||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
import 'common/common.dart';
|
import 'common/common.dart';
|
||||||
import 'fragments/profiles/override_profile.dart';
|
|
||||||
import 'models/models.dart';
|
import 'models/models.dart';
|
||||||
|
import 'views/profiles/override_profile.dart';
|
||||||
|
|
||||||
class AppController {
|
class AppController {
|
||||||
bool lastTunEnable = false;
|
bool lastTunEnable = false;
|
||||||
@@ -29,19 +30,24 @@ class AppController {
|
|||||||
|
|
||||||
AppController(this.context, WidgetRef ref) : _ref = ref;
|
AppController(this.context, WidgetRef ref) : _ref = ref;
|
||||||
|
|
||||||
|
setupClashConfigDebounce() {
|
||||||
|
debouncer.call(FunctionTag.setupClashConfig, () async {
|
||||||
|
await setupClashConfig();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
updateClashConfigDebounce() {
|
updateClashConfigDebounce() {
|
||||||
debouncer.call(DebounceTag.updateClashConfig, () async {
|
debouncer.call(FunctionTag.updateClashConfig, () async {
|
||||||
final isPatch = globalState.appState.needApply ? false : true;
|
await updateClashConfig();
|
||||||
await updateClashConfig(isPatch);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
updateGroupsDebounce() {
|
updateGroupsDebounce() {
|
||||||
debouncer.call(DebounceTag.updateGroups, updateGroups);
|
debouncer.call(FunctionTag.updateGroups, updateGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
addCheckIpNumDebounce() {
|
addCheckIpNumDebounce() {
|
||||||
debouncer.call(DebounceTag.addCheckIpNum, () {
|
debouncer.call(FunctionTag.addCheckIpNum, () {
|
||||||
_ref.read(checkIpNumProvider.notifier).add();
|
_ref.read(checkIpNumProvider.notifier).add();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -49,17 +55,17 @@ class AppController {
|
|||||||
applyProfileDebounce({
|
applyProfileDebounce({
|
||||||
bool silence = false,
|
bool silence = false,
|
||||||
}) {
|
}) {
|
||||||
debouncer.call(DebounceTag.applyProfile, (silence) {
|
debouncer.call(FunctionTag.applyProfile, (silence) {
|
||||||
applyProfile(silence: silence);
|
applyProfile(silence: silence);
|
||||||
}, args: [silence]);
|
}, args: [silence]);
|
||||||
}
|
}
|
||||||
|
|
||||||
savePreferencesDebounce() {
|
savePreferencesDebounce() {
|
||||||
debouncer.call(DebounceTag.savePreferences, savePreferences);
|
debouncer.call(FunctionTag.savePreferences, savePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
changeProxyDebounce(String groupName, String proxyName) {
|
changeProxyDebounce(String groupName, String proxyName) {
|
||||||
debouncer.call(DebounceTag.changeProxy,
|
debouncer.call(FunctionTag.changeProxy,
|
||||||
(String groupName, String proxyName) async {
|
(String groupName, String proxyName) async {
|
||||||
await changeProxy(
|
await changeProxy(
|
||||||
groupName: groupName,
|
groupName: groupName,
|
||||||
@@ -70,9 +76,9 @@ class AppController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
restartCore() async {
|
restartCore() async {
|
||||||
|
commonPrint.log("restart core");
|
||||||
await clashService?.reStart();
|
await clashService?.reStart();
|
||||||
await _initCore();
|
await _initCore();
|
||||||
|
|
||||||
if (_ref.read(runTimeProvider.notifier).isStart) {
|
if (_ref.read(runTimeProvider.notifier).isStart) {
|
||||||
await globalState.handleStart();
|
await globalState.handleStart();
|
||||||
}
|
}
|
||||||
@@ -243,55 +249,80 @@ class AppController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateClashConfig([bool? isPatch]) async {
|
Future<void> updateClashConfig() async {
|
||||||
commonPrint.log("update clash patch: ${isPatch ?? false}");
|
|
||||||
final commonScaffoldState = globalState.homeScaffoldKey.currentState;
|
final commonScaffoldState = globalState.homeScaffoldKey.currentState;
|
||||||
if (commonScaffoldState?.mounted != true) return;
|
if (commonScaffoldState?.mounted != true) return;
|
||||||
await commonScaffoldState?.loadingRun(() async {
|
await commonScaffoldState?.loadingRun(() async {
|
||||||
await _updateClashConfig(
|
await _updateClashConfig();
|
||||||
isPatch,
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _updateClashConfig([bool? isPatch]) async {
|
Future<void> _updateClashConfig() async {
|
||||||
final profile = _ref.watch(currentProfileProvider);
|
final updateParams = _ref.read(updateParamsProvider);
|
||||||
await _ref.read(currentProfileProvider)?.checkAndUpdate();
|
final res = await _requestAdmin(updateParams.tun.enable);
|
||||||
final patchConfig = _ref.read(patchClashConfigProvider);
|
if (res.isError) {
|
||||||
final appSetting = _ref.read(appSettingProvider);
|
return;
|
||||||
bool enableTun = patchConfig.tun.enable;
|
}
|
||||||
|
lastTunEnable = res.data == true;
|
||||||
|
final message = await clashCore.updateConfig(
|
||||||
|
updateParams.copyWith.tun(
|
||||||
|
enable: lastTunEnable,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (message.isNotEmpty) throw message;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Result<bool>> _requestAdmin(bool enableTun) async {
|
||||||
if (enableTun != lastTunEnable && lastTunEnable == false) {
|
if (enableTun != lastTunEnable && lastTunEnable == false) {
|
||||||
final code = await system.authorizeCore();
|
final code = await system.authorizeCore();
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case AuthorizeCode.none:
|
case AuthorizeCode.none:
|
||||||
break;
|
return Result.success(enableTun);
|
||||||
case AuthorizeCode.success:
|
case AuthorizeCode.success:
|
||||||
lastTunEnable = enableTun;
|
|
||||||
await restartCore();
|
await restartCore();
|
||||||
return;
|
return Result.error("");
|
||||||
case AuthorizeCode.error:
|
case AuthorizeCode.error:
|
||||||
enableTun = false;
|
enableTun = false;
|
||||||
|
return Result.success(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (appSetting.openLogs) {
|
return Result.success(enableTun);
|
||||||
clashCore.startLog();
|
}
|
||||||
} else {
|
|
||||||
clashCore.stopLog();
|
Future<void> setupClashConfig() async {
|
||||||
|
final commonScaffoldState = globalState.homeScaffoldKey.currentState;
|
||||||
|
if (commonScaffoldState?.mounted != true) return;
|
||||||
|
await commonScaffoldState?.loadingRun(() async {
|
||||||
|
await _setupClashConfig();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_setupClashConfig() async {
|
||||||
|
await _ref.read(currentProfileProvider)?.checkAndUpdate();
|
||||||
|
final patchConfig = _ref.read(patchClashConfigProvider);
|
||||||
|
final res = await _requestAdmin(patchConfig.tun.enable);
|
||||||
|
if (res.isError) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
final res = await clashCore.updateConfig(
|
lastTunEnable = res.data == true;
|
||||||
globalState.getUpdateConfigParams(isPatch),
|
final realPatchConfig = patchConfig.copyWith.tun(enable: lastTunEnable);
|
||||||
|
final params = await globalState.getSetupParams(
|
||||||
|
pathConfig: realPatchConfig,
|
||||||
);
|
);
|
||||||
if (isPatch == false) {
|
final message = await clashCore.setupConfig(params);
|
||||||
_ref.read(needApplyProvider.notifier).value = false;
|
lastProfileModified = await _ref.read(
|
||||||
|
currentProfileProvider.select(
|
||||||
|
(state) => state?.profileLastModified,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (message.isNotEmpty) {
|
||||||
|
throw message;
|
||||||
}
|
}
|
||||||
if (res.isNotEmpty) throw res;
|
|
||||||
lastTunEnable = enableTun;
|
|
||||||
lastProfileModified = await profile?.profileLastModified;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _applyProfile() async {
|
Future _applyProfile() async {
|
||||||
await clashCore.requestGc();
|
await clashCore.requestGc();
|
||||||
await updateClashConfig();
|
await setupClashConfig();
|
||||||
await updateGroups();
|
await updateGroups();
|
||||||
await updateProviders();
|
await updateProviders();
|
||||||
}
|
}
|
||||||
@@ -385,6 +416,9 @@ class AppController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleBackOrExit() async {
|
handleBackOrExit() async {
|
||||||
|
if (_ref.read(backBlockProvider)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (_ref.read(appSettingProvider).minimizeOnExit) {
|
if (_ref.read(appSettingProvider).minimizeOnExit) {
|
||||||
if (system.isDesktop) {
|
if (system.isDesktop) {
|
||||||
await savePreferencesDebounce();
|
await savePreferencesDebounce();
|
||||||
@@ -395,13 +429,23 @@ class AppController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
backBlock() {
|
||||||
|
_ref.read(backBlockProvider.notifier).value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
unBackBlock() {
|
||||||
|
_ref.read(backBlockProvider.notifier).value = false;
|
||||||
|
}
|
||||||
|
|
||||||
handleExit() async {
|
handleExit() async {
|
||||||
|
Future.delayed(commonDuration, () {
|
||||||
|
system.exit();
|
||||||
|
});
|
||||||
try {
|
try {
|
||||||
await updateStatus(false);
|
await savePreferences();
|
||||||
await proxy?.stopProxy();
|
await proxy?.stopProxy();
|
||||||
await clashCore.shutdown();
|
await clashCore.shutdown();
|
||||||
await clashService?.destroy();
|
await clashService?.destroy();
|
||||||
await savePreferences();
|
|
||||||
} finally {
|
} finally {
|
||||||
system.exit();
|
system.exit();
|
||||||
}
|
}
|
||||||
@@ -498,11 +542,12 @@ class AppController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init() async {
|
init() async {
|
||||||
await _handlePreference();
|
FlutterError.onError = (details) {
|
||||||
await _handlerDisclaimer();
|
commonPrint.log(details.stack.toString());
|
||||||
|
};
|
||||||
|
updateTray(true);
|
||||||
await _initCore();
|
await _initCore();
|
||||||
await _initStatus();
|
await _initStatus();
|
||||||
updateTray(true);
|
|
||||||
autoLaunch?.updateStatus(
|
autoLaunch?.updateStatus(
|
||||||
_ref.read(appSettingProvider).autoLaunch,
|
_ref.read(appSettingProvider).autoLaunch,
|
||||||
);
|
);
|
||||||
@@ -513,6 +558,8 @@ class AppController {
|
|||||||
} else {
|
} else {
|
||||||
window?.hide();
|
window?.hide();
|
||||||
}
|
}
|
||||||
|
await _handlePreference();
|
||||||
|
await _handlerDisclaimer();
|
||||||
_ref.read(initProvider.notifier).value = true;
|
_ref.read(initProvider.notifier).value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -690,10 +737,16 @@ class AppController {
|
|||||||
return List.of(proxies)
|
return List.of(proxies)
|
||||||
..sort(
|
..sort(
|
||||||
(a, b) {
|
(a, b) {
|
||||||
final aDelay =
|
final aDelay = _ref.read(getDelayProvider(
|
||||||
_ref.read(getDelayProvider(proxyName: a.name, testUrl: testUrl));
|
proxyName: a.name,
|
||||||
final bDelay =
|
testUrl: testUrl,
|
||||||
_ref.read(getDelayProvider(proxyName: b.name, testUrl: testUrl));
|
));
|
||||||
|
final bDelay = _ref.read(
|
||||||
|
getDelayProvider(
|
||||||
|
proxyName: b.name,
|
||||||
|
testUrl: testUrl,
|
||||||
|
),
|
||||||
|
);
|
||||||
if (aDelay == null && bDelay == null) {
|
if (aDelay == null && bDelay == null) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -721,21 +774,17 @@ class AppController {
|
|||||||
|
|
||||||
clearEffect(String profileId) async {
|
clearEffect(String profileId) async {
|
||||||
final profilePath = await appPath.getProfilePath(profileId);
|
final profilePath = await appPath.getProfilePath(profileId);
|
||||||
final providersPath = await appPath.getProvidersPath(profileId);
|
final providersDirPath = await appPath.getProvidersDirPath(profileId);
|
||||||
return await Isolate.run(() async {
|
return await Isolate.run(() async {
|
||||||
if (profilePath != null) {
|
final profileFile = File(profilePath);
|
||||||
final profileFile = File(profilePath);
|
final isExists = await profileFile.exists();
|
||||||
final isExists = await profileFile.exists();
|
if (isExists) {
|
||||||
if (isExists) {
|
profileFile.delete(recursive: true);
|
||||||
profileFile.delete(recursive: true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (providersPath != null) {
|
final providersFileDir = File(providersDirPath);
|
||||||
final providersFileDir = File(providersPath);
|
final providersFileIsExists = await providersFileDir.exists();
|
||||||
final isExists = await providersFileDir.exists();
|
if (providersFileIsExists) {
|
||||||
if (isExists) {
|
providersFileDir.delete(recursive: true);
|
||||||
providersFileDir.delete(recursive: true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -754,6 +803,17 @@ class AppController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<Package>> getPackages() async {
|
||||||
|
if (_ref.read(isMobileViewProvider)) {
|
||||||
|
await Future.delayed(commonDuration);
|
||||||
|
}
|
||||||
|
if (_ref.read(packagesProvider).isEmpty) {
|
||||||
|
_ref.read(packagesProvider.notifier).value =
|
||||||
|
await app?.getPackages() ?? [];
|
||||||
|
}
|
||||||
|
return _ref.read(packagesProvider);
|
||||||
|
}
|
||||||
|
|
||||||
updateStart() {
|
updateStart() {
|
||||||
updateStatus(!_ref.read(runTimeProvider.notifier).isStart);
|
updateStatus(!_ref.read(runTimeProvider.notifier).isStart);
|
||||||
}
|
}
|
||||||
@@ -971,6 +1031,7 @@ class AppController {
|
|||||||
_ref.read(overrideDnsProvider.notifier).value = config.overrideDns;
|
_ref.read(overrideDnsProvider.notifier).value = config.overrideDns;
|
||||||
_ref.read(networkSettingProvider.notifier).value = config.networkProps;
|
_ref.read(networkSettingProvider.notifier).value = config.networkProps;
|
||||||
_ref.read(hotKeyActionsProvider.notifier).value = config.hotKeyActions;
|
_ref.read(hotKeyActionsProvider.notifier).value = config.hotKeyActions;
|
||||||
|
_ref.read(scriptStateProvider.notifier).value = config.scriptProps;
|
||||||
}
|
}
|
||||||
final currentProfile = _ref.read(currentProfileProvider);
|
final currentProfile = _ref.read(currentProfileProvider);
|
||||||
if (currentProfile == null) {
|
if (currentProfile == null) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:fl_clash/fragments/dashboard/widgets/widgets.dart';
|
import 'package:fl_clash/views/dashboard/widgets/widgets.dart';
|
||||||
import 'package:fl_clash/widgets/widgets.dart';
|
import 'package:fl_clash/widgets/widgets.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
@@ -118,7 +118,12 @@ enum AccessSortType { none, name, time }
|
|||||||
|
|
||||||
enum ProfileType { file, url }
|
enum ProfileType { file, url }
|
||||||
|
|
||||||
enum ResultType { success, error }
|
enum ResultType {
|
||||||
|
@JsonValue(0)
|
||||||
|
success,
|
||||||
|
@JsonValue(-1)
|
||||||
|
error,
|
||||||
|
}
|
||||||
|
|
||||||
enum AppMessageType {
|
enum AppMessageType {
|
||||||
log,
|
log,
|
||||||
@@ -164,9 +169,13 @@ enum DnsMode {
|
|||||||
|
|
||||||
enum ExternalControllerStatus {
|
enum ExternalControllerStatus {
|
||||||
@JsonValue("")
|
@JsonValue("")
|
||||||
close,
|
close(""),
|
||||||
@JsonValue("127.0.0.1:9090")
|
@JsonValue("127.0.0.1:9090")
|
||||||
open
|
open("127.0.0.1:9090");
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
|
||||||
|
const ExternalControllerStatus(this.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum KeyboardModifier {
|
enum KeyboardModifier {
|
||||||
@@ -248,6 +257,7 @@ enum ActionMethod {
|
|||||||
shutdown,
|
shutdown,
|
||||||
validateConfig,
|
validateConfig,
|
||||||
updateConfig,
|
updateConfig,
|
||||||
|
getConfig,
|
||||||
getProxies,
|
getProxies,
|
||||||
changeProxy,
|
changeProxy,
|
||||||
getTraffic,
|
getTraffic,
|
||||||
@@ -256,6 +266,7 @@ enum ActionMethod {
|
|||||||
asyncTestDelay,
|
asyncTestDelay,
|
||||||
getConnections,
|
getConnections,
|
||||||
closeConnections,
|
closeConnections,
|
||||||
|
resetConnections,
|
||||||
closeConnection,
|
closeConnection,
|
||||||
getExternalProviders,
|
getExternalProviders,
|
||||||
getExternalProvider,
|
getExternalProvider,
|
||||||
@@ -268,12 +279,10 @@ enum ActionMethod {
|
|||||||
stopListener,
|
stopListener,
|
||||||
getCountryCode,
|
getCountryCode,
|
||||||
getMemory,
|
getMemory,
|
||||||
getProfile,
|
|
||||||
crash,
|
crash,
|
||||||
|
setupConfig,
|
||||||
|
|
||||||
///Android,
|
///Android,
|
||||||
setFdMap,
|
|
||||||
setProcessMap,
|
|
||||||
setState,
|
setState,
|
||||||
startTun,
|
startTun,
|
||||||
stopTun,
|
stopTun,
|
||||||
@@ -291,8 +300,9 @@ enum WindowsHelperServiceStatus {
|
|||||||
running,
|
running,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum DebounceTag {
|
enum FunctionTag {
|
||||||
updateClashConfig,
|
updateClashConfig,
|
||||||
|
setupClashConfig,
|
||||||
updateStatus,
|
updateStatus,
|
||||||
updateGroups,
|
updateGroups,
|
||||||
addCheckIpNum,
|
addCheckIpNum,
|
||||||
@@ -308,6 +318,8 @@ enum DebounceTag {
|
|||||||
updatePageIndex,
|
updatePageIndex,
|
||||||
pageChange,
|
pageChange,
|
||||||
proxiesTabChange,
|
proxiesTabChange,
|
||||||
|
logs,
|
||||||
|
requests,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum DashboardWidget {
|
enum DashboardWidget {
|
||||||
@@ -482,3 +494,13 @@ enum CacheTag {
|
|||||||
rules,
|
rules,
|
||||||
requests,
|
requests,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Language {
|
||||||
|
yaml,
|
||||||
|
javaScript,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ImportOption {
|
||||||
|
file,
|
||||||
|
url,
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,430 +0,0 @@
|
|||||||
import 'package:fl_clash/common/common.dart';
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
|
||||||
import 'package:fl_clash/models/models.dart';
|
|
||||||
import 'package:fl_clash/providers/providers.dart';
|
|
||||||
import 'package:fl_clash/state.dart';
|
|
||||||
import 'package:fl_clash/widgets/widgets.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
class LogLevelItem extends ConsumerWidget {
|
|
||||||
const LogLevelItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final logLevel =
|
|
||||||
ref.watch(patchClashConfigProvider.select((state) => state.logLevel));
|
|
||||||
return ListItem<LogLevel>.options(
|
|
||||||
leading: const Icon(Icons.info_outline),
|
|
||||||
title: Text(appLocalizations.logLevel),
|
|
||||||
subtitle: Text(logLevel.name),
|
|
||||||
delegate: OptionsDelegate<LogLevel>(
|
|
||||||
title: appLocalizations.logLevel,
|
|
||||||
options: LogLevel.values,
|
|
||||||
onChanged: (LogLevel? value) {
|
|
||||||
if (value == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
logLevel: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
textBuilder: (logLevel) => logLevel.name,
|
|
||||||
value: logLevel,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UaItem extends ConsumerWidget {
|
|
||||||
const UaItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final globalUa =
|
|
||||||
ref.watch(patchClashConfigProvider.select((state) => state.globalUa));
|
|
||||||
return ListItem<String?>.options(
|
|
||||||
leading: const Icon(Icons.computer_outlined),
|
|
||||||
title: const Text("UA"),
|
|
||||||
subtitle: Text(globalUa ?? appLocalizations.defaultText),
|
|
||||||
delegate: OptionsDelegate<String?>(
|
|
||||||
title: "UA",
|
|
||||||
options: [
|
|
||||||
null,
|
|
||||||
"clash-verge/v1.6.6",
|
|
||||||
"ClashforWindows/0.19.23",
|
|
||||||
],
|
|
||||||
value: globalUa,
|
|
||||||
onChanged: (value) {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
globalUa: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
textBuilder: (ua) => ua ?? appLocalizations.defaultText,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class KeepAliveIntervalItem extends ConsumerWidget {
|
|
||||||
const KeepAliveIntervalItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final keepAliveInterval = ref.watch(
|
|
||||||
patchClashConfigProvider.select((state) => state.keepAliveInterval));
|
|
||||||
return ListItem.input(
|
|
||||||
leading: const Icon(Icons.timer_outlined),
|
|
||||||
title: Text(appLocalizations.keepAliveIntervalDesc),
|
|
||||||
subtitle: Text("$keepAliveInterval ${appLocalizations.seconds}"),
|
|
||||||
delegate: InputDelegate(
|
|
||||||
title: appLocalizations.keepAliveIntervalDesc,
|
|
||||||
suffixText: appLocalizations.seconds,
|
|
||||||
resetValue: "$defaultKeepAliveInterval",
|
|
||||||
value: "$keepAliveInterval",
|
|
||||||
onChanged: (String? value) {
|
|
||||||
if (value == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
globalState.safeRun(
|
|
||||||
() {
|
|
||||||
final intValue = int.parse(value);
|
|
||||||
if (intValue <= 0) {
|
|
||||||
throw "Invalid keepAliveInterval";
|
|
||||||
}
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
keepAliveInterval: intValue,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
silence: false,
|
|
||||||
title: appLocalizations.keepAliveIntervalDesc,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TestUrlItem extends ConsumerWidget {
|
|
||||||
const TestUrlItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final testUrl =
|
|
||||||
ref.watch(appSettingProvider.select((state) => state.testUrl));
|
|
||||||
return ListItem.input(
|
|
||||||
leading: const Icon(Icons.timeline),
|
|
||||||
title: Text(appLocalizations.testUrl),
|
|
||||||
subtitle: Text(testUrl),
|
|
||||||
delegate: InputDelegate(
|
|
||||||
resetValue: defaultTestUrl,
|
|
||||||
title: appLocalizations.testUrl,
|
|
||||||
value: testUrl,
|
|
||||||
onChanged: (String? value) {
|
|
||||||
if (value == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
globalState.safeRun(
|
|
||||||
() {
|
|
||||||
if (!value.isUrl) {
|
|
||||||
throw "Invalid url";
|
|
||||||
}
|
|
||||||
ref.read(appSettingProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
testUrl: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
silence: false,
|
|
||||||
title: appLocalizations.testUrl,
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MixedPortItem extends ConsumerWidget {
|
|
||||||
const MixedPortItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final mixedPort =
|
|
||||||
ref.watch(patchClashConfigProvider.select((state) => state.mixedPort));
|
|
||||||
return ListItem.input(
|
|
||||||
leading: const Icon(Icons.adjust_outlined),
|
|
||||||
title: Text(appLocalizations.proxyPort),
|
|
||||||
subtitle: Text("$mixedPort"),
|
|
||||||
delegate: InputDelegate(
|
|
||||||
title: appLocalizations.proxyPort,
|
|
||||||
value: "$mixedPort",
|
|
||||||
onChanged: (String? value) {
|
|
||||||
if (value == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
globalState.safeRun(
|
|
||||||
() {
|
|
||||||
final mixedPort = int.parse(value);
|
|
||||||
if (mixedPort < 1024 || mixedPort > 49151) {
|
|
||||||
throw "Invalid port";
|
|
||||||
}
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
mixedPort: mixedPort,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
silence: false,
|
|
||||||
title: appLocalizations.proxyPort,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
resetValue: "$defaultMixedPort",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HostsItem extends StatelessWidget {
|
|
||||||
const HostsItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListItem.open(
|
|
||||||
leading: const Icon(Icons.view_list_outlined),
|
|
||||||
title: const Text("Hosts"),
|
|
||||||
subtitle: Text(appLocalizations.hostsDesc),
|
|
||||||
delegate: OpenDelegate(
|
|
||||||
blur: false,
|
|
||||||
title: "Hosts",
|
|
||||||
widget: Consumer(
|
|
||||||
builder: (_, ref, __) {
|
|
||||||
final hosts = ref
|
|
||||||
.watch(patchClashConfigProvider.select((state) => state.hosts));
|
|
||||||
return MapInputPage(
|
|
||||||
title: "Hosts",
|
|
||||||
map: hosts,
|
|
||||||
titleBuilder: (item) => Text(item.key),
|
|
||||||
subtitleBuilder: (item) => Text(item.value),
|
|
||||||
onChange: (value) {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
hosts: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Ipv6Item extends ConsumerWidget {
|
|
||||||
const Ipv6Item({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final ipv6 =
|
|
||||||
ref.watch(patchClashConfigProvider.select((state) => state.ipv6));
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.water_outlined),
|
|
||||||
title: const Text("IPv6"),
|
|
||||||
subtitle: Text(appLocalizations.ipv6Desc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: ipv6,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
ipv6: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AllowLanItem extends ConsumerWidget {
|
|
||||||
const AllowLanItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final allowLan =
|
|
||||||
ref.watch(patchClashConfigProvider.select((state) => state.allowLan));
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.device_hub),
|
|
||||||
title: Text(appLocalizations.allowLan),
|
|
||||||
subtitle: Text(appLocalizations.allowLanDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: allowLan,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
allowLan: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UnifiedDelayItem extends ConsumerWidget {
|
|
||||||
const UnifiedDelayItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final unifiedDelay = ref
|
|
||||||
.watch(patchClashConfigProvider.select((state) => state.unifiedDelay));
|
|
||||||
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.compress_outlined),
|
|
||||||
title: Text(appLocalizations.unifiedDelay),
|
|
||||||
subtitle: Text(appLocalizations.unifiedDelayDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: unifiedDelay,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
unifiedDelay: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FindProcessItem extends ConsumerWidget {
|
|
||||||
const FindProcessItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final findProcess = ref.watch(patchClashConfigProvider
|
|
||||||
.select((state) => state.findProcessMode == FindProcessMode.always));
|
|
||||||
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.polymer_outlined),
|
|
||||||
title: Text(appLocalizations.findProcessMode),
|
|
||||||
subtitle: Text(appLocalizations.findProcessModeDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: findProcess,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
findProcessMode:
|
|
||||||
value ? FindProcessMode.always : FindProcessMode.off,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TcpConcurrentItem extends ConsumerWidget {
|
|
||||||
const TcpConcurrentItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final tcpConcurrent = ref
|
|
||||||
.watch(patchClashConfigProvider.select((state) => state.tcpConcurrent));
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.double_arrow_outlined),
|
|
||||||
title: Text(appLocalizations.tcpConcurrent),
|
|
||||||
subtitle: Text(appLocalizations.tcpConcurrentDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: tcpConcurrent,
|
|
||||||
onChanged: (value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
tcpConcurrent: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class GeodataLoaderItem extends ConsumerWidget {
|
|
||||||
const GeodataLoaderItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final isMemconservative = ref.watch(patchClashConfigProvider.select(
|
|
||||||
(state) => state.geodataLoader == GeodataLoader.memconservative));
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.memory),
|
|
||||||
title: Text(appLocalizations.geodataLoader),
|
|
||||||
subtitle: Text(appLocalizations.geodataLoaderDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: isMemconservative,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
geodataLoader: value
|
|
||||||
? GeodataLoader.memconservative
|
|
||||||
: GeodataLoader.standard,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExternalControllerItem extends ConsumerWidget {
|
|
||||||
const ExternalControllerItem({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final hasExternalController = ref.watch(patchClashConfigProvider.select(
|
|
||||||
(state) => state.externalController == ExternalControllerStatus.open));
|
|
||||||
return ListItem.switchItem(
|
|
||||||
leading: const Icon(Icons.api_outlined),
|
|
||||||
title: Text(appLocalizations.externalController),
|
|
||||||
subtitle: Text(appLocalizations.externalControllerDesc),
|
|
||||||
delegate: SwitchDelegate(
|
|
||||||
value: hasExternalController,
|
|
||||||
onChanged: (bool value) async {
|
|
||||||
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
externalController: value
|
|
||||||
? ExternalControllerStatus.open
|
|
||||||
: ExternalControllerStatus.close,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final generalItems = <Widget>[
|
|
||||||
LogLevelItem(),
|
|
||||||
UaItem(),
|
|
||||||
if (system.isDesktop) KeepAliveIntervalItem(),
|
|
||||||
TestUrlItem(),
|
|
||||||
MixedPortItem(),
|
|
||||||
HostsItem(),
|
|
||||||
Ipv6Item(),
|
|
||||||
AllowLanItem(),
|
|
||||||
UnifiedDelayItem(),
|
|
||||||
FindProcessItem(),
|
|
||||||
TcpConcurrentItem(),
|
|
||||||
GeodataLoaderItem(),
|
|
||||||
ExternalControllerItem(),
|
|
||||||
]
|
|
||||||
.separated(
|
|
||||||
const Divider(
|
|
||||||
height: 0,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.toList();
|
|
||||||
@@ -1,210 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
|
||||||
import 'package:fl_clash/models/models.dart';
|
|
||||||
import 'package:fl_clash/plugins/app.dart';
|
|
||||||
import 'package:fl_clash/providers/config.dart';
|
|
||||||
import 'package:fl_clash/widgets/widgets.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
class ConnectionItem extends ConsumerWidget {
|
|
||||||
final Connection connection;
|
|
||||||
final Function(String)? onClickKeyword;
|
|
||||||
final Widget? trailing;
|
|
||||||
|
|
||||||
const ConnectionItem({
|
|
||||||
super.key,
|
|
||||||
required this.connection,
|
|
||||||
this.onClickKeyword,
|
|
||||||
this.trailing,
|
|
||||||
});
|
|
||||||
|
|
||||||
Future<ImageProvider?> _getPackageIcon(Connection connection) async {
|
|
||||||
return await app?.getPackageIcon(connection.metadata.process);
|
|
||||||
}
|
|
||||||
|
|
||||||
String _getSourceText(Connection connection) {
|
|
||||||
final metadata = connection.metadata;
|
|
||||||
if (metadata.process.isEmpty) {
|
|
||||||
return connection.start.lastUpdateTimeDesc;
|
|
||||||
}
|
|
||||||
return "${metadata.process} · ${connection.start.lastUpdateTimeDesc}";
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, ref) {
|
|
||||||
final value = ref.watch(
|
|
||||||
patchClashConfigProvider.select(
|
|
||||||
(state) =>
|
|
||||||
state.findProcessMode == FindProcessMode.always &&
|
|
||||||
Platform.isAndroid,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
final title = Text(
|
|
||||||
connection.desc,
|
|
||||||
style: context.textTheme.bodyLarge,
|
|
||||||
);
|
|
||||||
final subTitle = Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
const SizedBox(
|
|
||||||
height: 8,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
_getSourceText(connection),
|
|
||||||
maxLines: 1,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
),
|
|
||||||
const SizedBox(
|
|
||||||
height: 8,
|
|
||||||
),
|
|
||||||
Wrap(
|
|
||||||
runSpacing: 6,
|
|
||||||
spacing: 6,
|
|
||||||
children: [
|
|
||||||
for (final chain in connection.chains)
|
|
||||||
CommonChip(
|
|
||||||
label: chain,
|
|
||||||
onPressed: () {
|
|
||||||
if (onClickKeyword == null) return;
|
|
||||||
onClickKeyword!(chain);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
return CommonPopupBox(
|
|
||||||
targetBuilder: (open) {
|
|
||||||
return ListItem(
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 16,
|
|
||||||
vertical: 4,
|
|
||||||
),
|
|
||||||
tileTitleAlignment: ListTileTitleAlignment.titleHeight,
|
|
||||||
leading: value
|
|
||||||
? GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
if (onClickKeyword == null) return;
|
|
||||||
final process = connection.metadata.process;
|
|
||||||
if (process.isEmpty) return;
|
|
||||||
onClickKeyword!(process);
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
margin: const EdgeInsets.only(top: 4),
|
|
||||||
width: 48,
|
|
||||||
height: 48,
|
|
||||||
child: FutureBuilder<ImageProvider?>(
|
|
||||||
future: _getPackageIcon(connection),
|
|
||||||
builder: (_, snapshot) {
|
|
||||||
if (!snapshot.hasData && snapshot.data == null) {
|
|
||||||
return Container();
|
|
||||||
} else {
|
|
||||||
return Image(
|
|
||||||
image: snapshot.data!,
|
|
||||||
gaplessPlayback: true,
|
|
||||||
width: 48,
|
|
||||||
height: 48,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: null,
|
|
||||||
title: title,
|
|
||||||
subtitle: subTitle,
|
|
||||||
trailing: trailing,
|
|
||||||
);
|
|
||||||
// return InkWell(
|
|
||||||
// child: GestureDetector(
|
|
||||||
// onLongPressStart: (details) {
|
|
||||||
// if (!system.isDesktop) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// open(
|
|
||||||
// offset: details.localPosition.translate(
|
|
||||||
// 0,
|
|
||||||
// -12,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// },
|
|
||||||
// onSecondaryTapDown: (details) {
|
|
||||||
// if (!system.isDesktop) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// open(
|
|
||||||
// offset: details.localPosition.translate(
|
|
||||||
// 0,
|
|
||||||
// -12,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// },
|
|
||||||
// child: ListItem(
|
|
||||||
// padding: const EdgeInsets.symmetric(
|
|
||||||
// horizontal: 16,
|
|
||||||
// vertical: 4,
|
|
||||||
// ),
|
|
||||||
// tileTitleAlignment: ListTileTitleAlignment.titleHeight,
|
|
||||||
// leading: value
|
|
||||||
// ? GestureDetector(
|
|
||||||
// onTap: () {
|
|
||||||
// if (onClickKeyword == null) return;
|
|
||||||
// final process = connection.metadata.process;
|
|
||||||
// if (process.isEmpty) return;
|
|
||||||
// onClickKeyword!(process);
|
|
||||||
// },
|
|
||||||
// child: Container(
|
|
||||||
// margin: const EdgeInsets.only(top: 4),
|
|
||||||
// width: 48,
|
|
||||||
// height: 48,
|
|
||||||
// child: FutureBuilder<ImageProvider?>(
|
|
||||||
// future: _getPackageIcon(connection),
|
|
||||||
// builder: (_, snapshot) {
|
|
||||||
// if (!snapshot.hasData && snapshot.data == null) {
|
|
||||||
// return Container();
|
|
||||||
// } else {
|
|
||||||
// return Image(
|
|
||||||
// image: snapshot.data!,
|
|
||||||
// gaplessPlayback: true,
|
|
||||||
// width: 48,
|
|
||||||
// height: 48,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// : null,
|
|
||||||
// title: title,
|
|
||||||
// subtitle: subTitle,
|
|
||||||
// trailing: trailing,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// onTap: () {},
|
|
||||||
// );
|
|
||||||
},
|
|
||||||
popup: CommonPopupMenu(
|
|
||||||
minWidth: 160,
|
|
||||||
items: [
|
|
||||||
PopupMenuItemData(
|
|
||||||
label: "编辑规则",
|
|
||||||
onPressed: () {
|
|
||||||
// _handleShowEditExtendPage(context);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
PopupMenuItemData(
|
|
||||||
label: "设置直连",
|
|
||||||
onPressed: () {},
|
|
||||||
),
|
|
||||||
PopupMenuItemData(
|
|
||||||
label: "一键屏蔽",
|
|
||||||
onPressed: () {},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
|
||||||
import 'package:fl_clash/providers/providers.dart';
|
|
||||||
import 'package:fl_clash/widgets/widgets.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
import 'widgets/start_button.dart';
|
|
||||||
|
|
||||||
class DashboardFragment extends ConsumerStatefulWidget {
|
|
||||||
const DashboardFragment({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
ConsumerState<DashboardFragment> createState() => _DashboardFragmentState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _DashboardFragmentState extends ConsumerState<DashboardFragment>
|
|
||||||
with PageMixin {
|
|
||||||
final key = GlobalKey<SuperGridState>();
|
|
||||||
|
|
||||||
@override
|
|
||||||
initState() {
|
|
||||||
ref.listenManual(
|
|
||||||
isCurrentPageProvider(PageLabel.dashboard),
|
|
||||||
(prev, next) {
|
|
||||||
if (prev != next && next == true) {
|
|
||||||
initPageState();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fireImmediately: true,
|
|
||||||
);
|
|
||||||
return super.initState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget? get floatingActionButton => const StartButton();
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Widget> get actions => [
|
|
||||||
ValueListenableBuilder(
|
|
||||||
valueListenable: key.currentState!.addedChildrenNotifier,
|
|
||||||
builder: (_, addedChildren, child) {
|
|
||||||
return ValueListenableBuilder(
|
|
||||||
valueListenable: key.currentState!.isEditNotifier,
|
|
||||||
builder: (_, isEdit, child) {
|
|
||||||
if (!isEdit || addedChildren.isEmpty) {
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
return child!;
|
|
||||||
},
|
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
key.currentState!.showAddModal();
|
|
||||||
},
|
|
||||||
icon: Icon(
|
|
||||||
Icons.add_circle,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
IconButton(
|
|
||||||
icon: ValueListenableBuilder(
|
|
||||||
valueListenable: key.currentState!.isEditNotifier,
|
|
||||||
builder: (_, isEdit, ___) {
|
|
||||||
return isEdit
|
|
||||||
? Icon(Icons.save)
|
|
||||||
: Icon(
|
|
||||||
Icons.edit,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
key.currentState!.isEditNotifier.value =
|
|
||||||
!key.currentState!.isEditNotifier.value;
|
|
||||||
},
|
|
||||||
),
|
|
||||||
];
|
|
||||||
|
|
||||||
_handleSave(List<GridItem> girdItems, WidgetRef ref) {
|
|
||||||
final dashboardWidgets = girdItems
|
|
||||||
.map(
|
|
||||||
(item) => DashboardWidget.getDashboardWidget(item),
|
|
||||||
)
|
|
||||||
.toList();
|
|
||||||
ref.read(appSettingProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(dashboardWidgets: dashboardWidgets),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final dashboardState = ref.watch(dashboardStateProvider);
|
|
||||||
final columns = max(4 * ((dashboardState.viewWidth / 320).ceil()), 8);
|
|
||||||
return Align(
|
|
||||||
alignment: Alignment.topCenter,
|
|
||||||
child: SingleChildScrollView(
|
|
||||||
padding: const EdgeInsets.all(16).copyWith(
|
|
||||||
bottom: 88,
|
|
||||||
),
|
|
||||||
child: SuperGrid(
|
|
||||||
key: key,
|
|
||||||
crossAxisCount: columns,
|
|
||||||
crossAxisSpacing: 16.ap,
|
|
||||||
mainAxisSpacing: 16.ap,
|
|
||||||
children: [
|
|
||||||
...dashboardState.dashboardWidgets
|
|
||||||
.where(
|
|
||||||
(item) => item.platforms.contains(
|
|
||||||
SupportPlatform.currentPlatform,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.map(
|
|
||||||
(item) => item.widget,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
onSave: (girdItems) {
|
|
||||||
_handleSave(girdItems, ref);
|
|
||||||
},
|
|
||||||
addedItemsBuilder: (girdItems) {
|
|
||||||
return DashboardWidget.values
|
|
||||||
.where(
|
|
||||||
(item) =>
|
|
||||||
!girdItems.contains(item.widget) &&
|
|
||||||
item.platforms.contains(
|
|
||||||
SupportPlatform.currentPlatform,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.map((item) => item.widget)
|
|
||||||
.toList();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
import 'package:fl_clash/common/common.dart';
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
|
||||||
import 'package:fl_clash/providers/providers.dart';
|
|
||||||
import 'package:fl_clash/state.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
class StartButton extends StatefulWidget {
|
|
||||||
const StartButton({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<StartButton> createState() => _StartButtonState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _StartButtonState extends State<StartButton>
|
|
||||||
with SingleTickerProviderStateMixin {
|
|
||||||
late AnimationController _controller;
|
|
||||||
bool isStart = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
isStart = globalState.appState.runTime != null;
|
|
||||||
_controller = AnimationController(
|
|
||||||
vsync: this,
|
|
||||||
value: isStart ? 1 : 0,
|
|
||||||
duration: const Duration(milliseconds: 200),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_controller.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
handleSwitchStart() {
|
|
||||||
isStart = !isStart;
|
|
||||||
updateController();
|
|
||||||
debouncer.call(
|
|
||||||
DebounceTag.updateStatus,
|
|
||||||
() {
|
|
||||||
globalState.appController.updateStatus(isStart);
|
|
||||||
},
|
|
||||||
duration: moreDuration,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateController() {
|
|
||||||
if (isStart) {
|
|
||||||
_controller.forward();
|
|
||||||
} else {
|
|
||||||
_controller.reverse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Consumer(
|
|
||||||
builder: (_, ref, child) {
|
|
||||||
final state = ref.watch(startButtonSelectorStateProvider);
|
|
||||||
if (!state.isInit || !state.hasProfile) {
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
ref.listenManual(
|
|
||||||
runTimeProvider.select((state) => state != null),
|
|
||||||
(prev, next) {
|
|
||||||
if (next != isStart) {
|
|
||||||
isStart = next;
|
|
||||||
updateController();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fireImmediately: true,
|
|
||||||
);
|
|
||||||
final textWidth = globalState.measure
|
|
||||||
.computeTextSize(
|
|
||||||
Text(
|
|
||||||
utils.getTimeDifference(
|
|
||||||
DateTime.now(),
|
|
||||||
),
|
|
||||||
style: context.textTheme.titleMedium?.toSoftBold,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.width +
|
|
||||||
16;
|
|
||||||
return AnimatedBuilder(
|
|
||||||
animation: _controller.view,
|
|
||||||
builder: (_, child) {
|
|
||||||
return SizedBox(
|
|
||||||
width: 56 + textWidth * _controller.value,
|
|
||||||
height: 56,
|
|
||||||
child: FloatingActionButton(
|
|
||||||
heroTag: null,
|
|
||||||
onPressed: () {
|
|
||||||
handleSwitchStart();
|
|
||||||
},
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
width: 56,
|
|
||||||
height: 56,
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: AnimatedIcon(
|
|
||||||
icon: AnimatedIcons.play_pause,
|
|
||||||
progress: _controller,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: ClipRect(
|
|
||||||
child: OverflowBox(
|
|
||||||
maxWidth: textWidth,
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.centerLeft,
|
|
||||||
child: child!,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: Consumer(
|
|
||||||
builder: (_, ref, __) {
|
|
||||||
final runTime = ref.watch(runTimeProvider);
|
|
||||||
final text = utils.getTimeText(runTime);
|
|
||||||
return Text(
|
|
||||||
text,
|
|
||||||
style: Theme.of(context)
|
|
||||||
.textTheme
|
|
||||||
.titleMedium
|
|
||||||
?.toSoftBold
|
|
||||||
.copyWith(color: context.colorScheme.onPrimaryContainer),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
import 'package:fl_clash/common/common.dart';
|
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
|
||||||
import 'package:fl_clash/fragments/proxies/list.dart';
|
|
||||||
import 'package:fl_clash/fragments/proxies/providers.dart';
|
|
||||||
import 'package:fl_clash/providers/providers.dart';
|
|
||||||
import 'package:fl_clash/widgets/widgets.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
import 'common.dart';
|
|
||||||
import 'setting.dart';
|
|
||||||
import 'tab.dart';
|
|
||||||
|
|
||||||
class ProxiesFragment extends ConsumerStatefulWidget {
|
|
||||||
const ProxiesFragment({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
ConsumerState<ProxiesFragment> createState() => _ProxiesFragmentState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ProxiesFragmentState extends ConsumerState<ProxiesFragment>
|
|
||||||
with PageMixin {
|
|
||||||
final GlobalKey<ProxiesTabFragmentState> _proxiesTabKey = GlobalKey();
|
|
||||||
bool _hasProviders = false;
|
|
||||||
bool _isTab = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
get actions => [
|
|
||||||
if (_hasProviders)
|
|
||||||
IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
showExtend(
|
|
||||||
context,
|
|
||||||
builder: (_, type) {
|
|
||||||
return ProvidersView(
|
|
||||||
type: type,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
icon: const Icon(
|
|
||||||
Icons.poll_outlined,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
_isTab
|
|
||||||
? IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
_proxiesTabKey.currentState?.scrollToGroupSelected();
|
|
||||||
},
|
|
||||||
icon: const Icon(
|
|
||||||
Icons.adjust_outlined,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
showExtend(
|
|
||||||
context,
|
|
||||||
builder: (_, type) {
|
|
||||||
return AdaptiveSheetScaffold(
|
|
||||||
type: type,
|
|
||||||
body: const _IconConfigView(),
|
|
||||||
title: appLocalizations.iconConfiguration,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
icon: const Icon(
|
|
||||||
Icons.style_outlined,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
showSheet(
|
|
||||||
context: context,
|
|
||||||
props: SheetProps(
|
|
||||||
isScrollControlled: true,
|
|
||||||
),
|
|
||||||
builder: (_, type) {
|
|
||||||
return AdaptiveSheetScaffold(
|
|
||||||
type: type,
|
|
||||||
body: const ProxiesSetting(),
|
|
||||||
title: appLocalizations.settings,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
icon: const Icon(
|
|
||||||
Icons.tune,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
];
|
|
||||||
|
|
||||||
@override
|
|
||||||
get floatingActionButton => _isTab
|
|
||||||
? DelayTestButton(
|
|
||||||
onClick: () async {
|
|
||||||
await delayTest(
|
|
||||||
currentTabProxies,
|
|
||||||
currentTabTestUrl,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
ref.listenManual(
|
|
||||||
proxiesActionsStateProvider,
|
|
||||||
fireImmediately: true,
|
|
||||||
(prev, next) {
|
|
||||||
if (prev == next) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (next.pageLabel == PageLabel.proxies) {
|
|
||||||
_hasProviders = next.hasProviders;
|
|
||||||
_isTab = next.type == ProxiesType.tab;
|
|
||||||
initPageState();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
super.initState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final proxiesType = ref.watch(
|
|
||||||
proxiesStyleSettingProvider.select(
|
|
||||||
(state) => state.type,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
ref.watch(themeSettingProvider.select((state) => state.textScale));
|
|
||||||
return switch (proxiesType) {
|
|
||||||
ProxiesType.tab => ProxiesTabFragment(
|
|
||||||
key: _proxiesTabKey,
|
|
||||||
),
|
|
||||||
ProxiesType.list => const ProxiesListFragment(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _IconConfigView extends ConsumerWidget {
|
|
||||||
const _IconConfigView();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
|
||||||
final iconMap =
|
|
||||||
ref.watch(proxiesStyleSettingProvider.select((state) => state.iconMap));
|
|
||||||
return MapInputPage(
|
|
||||||
title: appLocalizations.iconConfiguration,
|
|
||||||
map: iconMap,
|
|
||||||
keyLabel: appLocalizations.regExp,
|
|
||||||
valueLabel: appLocalizations.icon,
|
|
||||||
titleBuilder: (item) => Text(item.key),
|
|
||||||
leadingBuilder: (item) => Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(16),
|
|
||||||
),
|
|
||||||
clipBehavior: Clip.antiAlias,
|
|
||||||
child: CommonTargetIcon(
|
|
||||||
src: item.value,
|
|
||||||
size: 42,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
subtitleBuilder: (item) => Text(
|
|
||||||
item.value,
|
|
||||||
maxLines: 2,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
),
|
|
||||||
onChange: (value) {
|
|
||||||
ref.read(proxiesStyleSettingProvider.notifier).updateState(
|
|
||||||
(state) => state.copyWith(
|
|
||||||
iconMap: value,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -20,7 +20,25 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
|||||||
class MessageLookup extends MessageLookupByLibrary {
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
String get localeName => 'en';
|
String get localeName => 'en';
|
||||||
|
|
||||||
static String m0(count) => "${count} items have been selected";
|
static String m0(label) =>
|
||||||
|
"Are you sure you want to delete the selected ${label}?";
|
||||||
|
|
||||||
|
static String m1(label) =>
|
||||||
|
"Are you sure you want to delete the current ${label}?";
|
||||||
|
|
||||||
|
static String m2(label) => "${label} cannot be empty";
|
||||||
|
|
||||||
|
static String m3(label) => "Current ${label} already exists";
|
||||||
|
|
||||||
|
static String m4(label) => "No ${label} at the moment";
|
||||||
|
|
||||||
|
static String m5(label) => "${label} must be a number";
|
||||||
|
|
||||||
|
static String m6(label) => "${label} must be between 1024 and 49151";
|
||||||
|
|
||||||
|
static String m7(count) => "${count} items have been selected";
|
||||||
|
|
||||||
|
static String m8(label) => "${label} must be a url";
|
||||||
|
|
||||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
@@ -36,9 +54,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"The selected application will be excluded from VPN",
|
"The selected application will be excluded from VPN",
|
||||||
),
|
),
|
||||||
"account": MessageLookupByLibrary.simpleMessage("Account"),
|
"account": MessageLookupByLibrary.simpleMessage("Account"),
|
||||||
"accountTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Account cannot be empty",
|
|
||||||
),
|
|
||||||
"action": MessageLookupByLibrary.simpleMessage("Action"),
|
"action": MessageLookupByLibrary.simpleMessage("Action"),
|
||||||
"action_mode": MessageLookupByLibrary.simpleMessage("Switch mode"),
|
"action_mode": MessageLookupByLibrary.simpleMessage("Switch mode"),
|
||||||
"action_proxy": MessageLookupByLibrary.simpleMessage("System proxy"),
|
"action_proxy": MessageLookupByLibrary.simpleMessage("System proxy"),
|
||||||
@@ -149,9 +164,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"clearData": MessageLookupByLibrary.simpleMessage("Clear Data"),
|
"clearData": MessageLookupByLibrary.simpleMessage("Clear Data"),
|
||||||
"clipboardExport": MessageLookupByLibrary.simpleMessage("Export clipboard"),
|
"clipboardExport": MessageLookupByLibrary.simpleMessage("Export clipboard"),
|
||||||
"clipboardImport": MessageLookupByLibrary.simpleMessage("Clipboard import"),
|
"clipboardImport": MessageLookupByLibrary.simpleMessage("Clipboard import"),
|
||||||
"colorExists": MessageLookupByLibrary.simpleMessage(
|
"color": MessageLookupByLibrary.simpleMessage("Color"),
|
||||||
"Current color already exists",
|
|
||||||
),
|
|
||||||
"colorSchemes": MessageLookupByLibrary.simpleMessage("Color schemes"),
|
"colorSchemes": MessageLookupByLibrary.simpleMessage("Color schemes"),
|
||||||
"columns": MessageLookupByLibrary.simpleMessage("Columns"),
|
"columns": MessageLookupByLibrary.simpleMessage("Columns"),
|
||||||
"compatible": MessageLookupByLibrary.simpleMessage("Compatibility mode"),
|
"compatible": MessageLookupByLibrary.simpleMessage("Compatibility mode"),
|
||||||
@@ -166,9 +179,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"connectivity": MessageLookupByLibrary.simpleMessage("Connectivity:"),
|
"connectivity": MessageLookupByLibrary.simpleMessage("Connectivity:"),
|
||||||
"contactMe": MessageLookupByLibrary.simpleMessage("Contact me"),
|
"contactMe": MessageLookupByLibrary.simpleMessage("Contact me"),
|
||||||
"content": MessageLookupByLibrary.simpleMessage("Content"),
|
"content": MessageLookupByLibrary.simpleMessage("Content"),
|
||||||
"contentEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Content cannot be empty",
|
|
||||||
),
|
|
||||||
"contentScheme": MessageLookupByLibrary.simpleMessage("Content"),
|
"contentScheme": MessageLookupByLibrary.simpleMessage("Content"),
|
||||||
"copy": MessageLookupByLibrary.simpleMessage("Copy"),
|
"copy": MessageLookupByLibrary.simpleMessage("Copy"),
|
||||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -196,15 +206,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"delay": MessageLookupByLibrary.simpleMessage("Delay"),
|
"delay": MessageLookupByLibrary.simpleMessage("Delay"),
|
||||||
"delaySort": MessageLookupByLibrary.simpleMessage("Sort by delay"),
|
"delaySort": MessageLookupByLibrary.simpleMessage("Sort by delay"),
|
||||||
"delete": MessageLookupByLibrary.simpleMessage("Delete"),
|
"delete": MessageLookupByLibrary.simpleMessage("Delete"),
|
||||||
"deleteColorTip": MessageLookupByLibrary.simpleMessage(
|
"deleteMultipTip": m0,
|
||||||
"Are you sure you want to delete the current color?",
|
"deleteTip": m1,
|
||||||
),
|
|
||||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Sure you want to delete the current profile?",
|
|
||||||
),
|
|
||||||
"deleteRuleTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Are you sure you want to delete the selected rule?",
|
|
||||||
),
|
|
||||||
"desc": MessageLookupByLibrary.simpleMessage(
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.",
|
"A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.",
|
||||||
),
|
),
|
||||||
@@ -236,6 +239,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"domain": MessageLookupByLibrary.simpleMessage("Domain"),
|
"domain": MessageLookupByLibrary.simpleMessage("Domain"),
|
||||||
"download": MessageLookupByLibrary.simpleMessage("Download"),
|
"download": MessageLookupByLibrary.simpleMessage("Download"),
|
||||||
"edit": MessageLookupByLibrary.simpleMessage("Edit"),
|
"edit": MessageLookupByLibrary.simpleMessage("Edit"),
|
||||||
|
"emptyTip": m2,
|
||||||
"en": MessageLookupByLibrary.simpleMessage("English"),
|
"en": MessageLookupByLibrary.simpleMessage("English"),
|
||||||
"enableOverride": MessageLookupByLibrary.simpleMessage("Enable override"),
|
"enableOverride": MessageLookupByLibrary.simpleMessage("Enable override"),
|
||||||
"entries": MessageLookupByLibrary.simpleMessage(" entries"),
|
"entries": MessageLookupByLibrary.simpleMessage(" entries"),
|
||||||
@@ -243,6 +247,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"When the app is in the background, the app is hidden from the recent task",
|
"When the app is in the background, the app is hidden from the recent task",
|
||||||
),
|
),
|
||||||
|
"existsTip": m3,
|
||||||
"exit": MessageLookupByLibrary.simpleMessage("Exit"),
|
"exit": MessageLookupByLibrary.simpleMessage("Exit"),
|
||||||
"expand": MessageLookupByLibrary.simpleMessage("Standard"),
|
"expand": MessageLookupByLibrary.simpleMessage("Standard"),
|
||||||
"expirationTime": MessageLookupByLibrary.simpleMessage("Expiration time"),
|
"expirationTime": MessageLookupByLibrary.simpleMessage("Expiration time"),
|
||||||
@@ -318,7 +323,10 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Icon configuration",
|
"Icon configuration",
|
||||||
),
|
),
|
||||||
"iconStyle": MessageLookupByLibrary.simpleMessage("Icon style"),
|
"iconStyle": MessageLookupByLibrary.simpleMessage("Icon style"),
|
||||||
|
"import": MessageLookupByLibrary.simpleMessage("Import"),
|
||||||
|
"importFile": MessageLookupByLibrary.simpleMessage("Import from file"),
|
||||||
"importFromURL": MessageLookupByLibrary.simpleMessage("Import from URL"),
|
"importFromURL": MessageLookupByLibrary.simpleMessage("Import from URL"),
|
||||||
|
"importUrl": MessageLookupByLibrary.simpleMessage("Import from URL"),
|
||||||
"infiniteTime": MessageLookupByLibrary.simpleMessage("Long term effective"),
|
"infiniteTime": MessageLookupByLibrary.simpleMessage("Long term effective"),
|
||||||
"init": MessageLookupByLibrary.simpleMessage("Init"),
|
"init": MessageLookupByLibrary.simpleMessage("Init"),
|
||||||
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage(
|
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -328,6 +336,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Intelligent selection",
|
"Intelligent selection",
|
||||||
),
|
),
|
||||||
"internet": MessageLookupByLibrary.simpleMessage("Internet"),
|
"internet": MessageLookupByLibrary.simpleMessage("Internet"),
|
||||||
|
"interval": MessageLookupByLibrary.simpleMessage("Interval"),
|
||||||
"intranetIP": MessageLookupByLibrary.simpleMessage("Intranet IP"),
|
"intranetIP": MessageLookupByLibrary.simpleMessage("Intranet IP"),
|
||||||
"ipcidr": MessageLookupByLibrary.simpleMessage("Ipcidr"),
|
"ipcidr": MessageLookupByLibrary.simpleMessage("Ipcidr"),
|
||||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -342,9 +351,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Tcp keep alive interval",
|
"Tcp keep alive interval",
|
||||||
),
|
),
|
||||||
"key": MessageLookupByLibrary.simpleMessage("Key"),
|
"key": MessageLookupByLibrary.simpleMessage("Key"),
|
||||||
"keyExists": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"The current key already exists",
|
|
||||||
),
|
|
||||||
"language": MessageLookupByLibrary.simpleMessage("Language"),
|
"language": MessageLookupByLibrary.simpleMessage("Language"),
|
||||||
"layout": MessageLookupByLibrary.simpleMessage("Layout"),
|
"layout": MessageLookupByLibrary.simpleMessage("Layout"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("Light"),
|
"light": MessageLookupByLibrary.simpleMessage("Light"),
|
||||||
@@ -381,6 +387,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Modify the default system exit event",
|
"Modify the default system exit event",
|
||||||
),
|
),
|
||||||
"minutes": MessageLookupByLibrary.simpleMessage("Minutes"),
|
"minutes": MessageLookupByLibrary.simpleMessage("Minutes"),
|
||||||
|
"mixedPort": MessageLookupByLibrary.simpleMessage("Mixed Port"),
|
||||||
"mode": MessageLookupByLibrary.simpleMessage("Mode"),
|
"mode": MessageLookupByLibrary.simpleMessage("Mode"),
|
||||||
"monochromeScheme": MessageLookupByLibrary.simpleMessage("Monochrome"),
|
"monochromeScheme": MessageLookupByLibrary.simpleMessage("Monochrome"),
|
||||||
"months": MessageLookupByLibrary.simpleMessage("Months"),
|
"months": MessageLookupByLibrary.simpleMessage("Months"),
|
||||||
@@ -419,22 +426,14 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
),
|
),
|
||||||
"noResolve": MessageLookupByLibrary.simpleMessage("No resolve IP"),
|
"noResolve": MessageLookupByLibrary.simpleMessage("No resolve IP"),
|
||||||
"none": MessageLookupByLibrary.simpleMessage("none"),
|
"none": MessageLookupByLibrary.simpleMessage("none"),
|
||||||
"notEmpty": MessageLookupByLibrary.simpleMessage("Cannot be empty"),
|
|
||||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||||
"The current proxy group cannot be selected.",
|
"The current proxy group cannot be selected.",
|
||||||
),
|
),
|
||||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"No connections",
|
|
||||||
),
|
|
||||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Unable to obtain core info",
|
|
||||||
),
|
|
||||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("No logs"),
|
|
||||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"No profile, Please add a profile",
|
"No profile, Please add a profile",
|
||||||
),
|
),
|
||||||
"nullProxies": MessageLookupByLibrary.simpleMessage("No proxies"),
|
"nullTip": m4,
|
||||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("No requests"),
|
"numberTip": m5,
|
||||||
"oneColumn": MessageLookupByLibrary.simpleMessage("One column"),
|
"oneColumn": MessageLookupByLibrary.simpleMessage("One column"),
|
||||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("Icon"),
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("Icon"),
|
||||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -460,18 +459,21 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Turning it on will override the DNS options in the profile",
|
"Turning it on will override the DNS options in the profile",
|
||||||
),
|
),
|
||||||
|
"overrideInvalidTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Does not take effect in script mode",
|
||||||
|
),
|
||||||
"overrideOriginRules": MessageLookupByLibrary.simpleMessage(
|
"overrideOriginRules": MessageLookupByLibrary.simpleMessage(
|
||||||
"Override the original rule",
|
"Override the original rule",
|
||||||
),
|
),
|
||||||
"palette": MessageLookupByLibrary.simpleMessage("Palette"),
|
"palette": MessageLookupByLibrary.simpleMessage("Palette"),
|
||||||
"password": MessageLookupByLibrary.simpleMessage("Password"),
|
"password": MessageLookupByLibrary.simpleMessage("Password"),
|
||||||
"passwordTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Password cannot be empty",
|
|
||||||
),
|
|
||||||
"paste": MessageLookupByLibrary.simpleMessage("Paste"),
|
"paste": MessageLookupByLibrary.simpleMessage("Paste"),
|
||||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||||
"Please bind WebDAV",
|
"Please bind WebDAV",
|
||||||
),
|
),
|
||||||
|
"pleaseEnterScriptName": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Please enter a script name",
|
||||||
|
),
|
||||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
"Please enter the admin password",
|
"Please enter the admin password",
|
||||||
),
|
),
|
||||||
@@ -482,6 +484,10 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Please upload a valid QR code",
|
"Please upload a valid QR code",
|
||||||
),
|
),
|
||||||
"port": MessageLookupByLibrary.simpleMessage("Port"),
|
"port": MessageLookupByLibrary.simpleMessage("Port"),
|
||||||
|
"portConflictTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Please enter a different port",
|
||||||
|
),
|
||||||
|
"portTip": m6,
|
||||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Prioritize the use of DOH\'s http/3",
|
"Prioritize the use of DOH\'s http/3",
|
||||||
),
|
),
|
||||||
@@ -550,6 +556,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Override",
|
"Override",
|
||||||
),
|
),
|
||||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage("Recovery success"),
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage("Recovery success"),
|
||||||
|
"redirPort": MessageLookupByLibrary.simpleMessage("Redir Port"),
|
||||||
"redo": MessageLookupByLibrary.simpleMessage("redo"),
|
"redo": MessageLookupByLibrary.simpleMessage("redo"),
|
||||||
"regExp": MessageLookupByLibrary.simpleMessage("RegExp"),
|
"regExp": MessageLookupByLibrary.simpleMessage("RegExp"),
|
||||||
"remote": MessageLookupByLibrary.simpleMessage("Remote"),
|
"remote": MessageLookupByLibrary.simpleMessage("Remote"),
|
||||||
@@ -560,6 +567,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Recovery data from WebDAV",
|
"Recovery data from WebDAV",
|
||||||
),
|
),
|
||||||
"remove": MessageLookupByLibrary.simpleMessage("Remove"),
|
"remove": MessageLookupByLibrary.simpleMessage("Remove"),
|
||||||
|
"rename": MessageLookupByLibrary.simpleMessage("Rename"),
|
||||||
"requests": MessageLookupByLibrary.simpleMessage("Requests"),
|
"requests": MessageLookupByLibrary.simpleMessage("Requests"),
|
||||||
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"View recently request records",
|
"View recently request records",
|
||||||
@@ -586,14 +594,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ru": MessageLookupByLibrary.simpleMessage("Russian"),
|
"ru": MessageLookupByLibrary.simpleMessage("Russian"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("Rule"),
|
"rule": MessageLookupByLibrary.simpleMessage("Rule"),
|
||||||
"ruleName": MessageLookupByLibrary.simpleMessage("Rule name"),
|
"ruleName": MessageLookupByLibrary.simpleMessage("Rule name"),
|
||||||
"ruleProviderEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Rule provider cannot be empty",
|
|
||||||
),
|
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("Rule providers"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("Rule providers"),
|
||||||
"ruleTarget": MessageLookupByLibrary.simpleMessage("Rule target"),
|
"ruleTarget": MessageLookupByLibrary.simpleMessage("Rule target"),
|
||||||
"ruleTargetEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Rule target cannot be empty",
|
|
||||||
),
|
|
||||||
"save": MessageLookupByLibrary.simpleMessage("Save"),
|
"save": MessageLookupByLibrary.simpleMessage("Save"),
|
||||||
"saveChanges": MessageLookupByLibrary.simpleMessage(
|
"saveChanges": MessageLookupByLibrary.simpleMessage(
|
||||||
"Do you want to save the changes?",
|
"Do you want to save the changes?",
|
||||||
@@ -601,11 +603,12 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"saveTip": MessageLookupByLibrary.simpleMessage(
|
"saveTip": MessageLookupByLibrary.simpleMessage(
|
||||||
"Are you sure you want to save?",
|
"Are you sure you want to save?",
|
||||||
),
|
),
|
||||||
|
"script": MessageLookupByLibrary.simpleMessage("Script"),
|
||||||
"search": MessageLookupByLibrary.simpleMessage("Search"),
|
"search": MessageLookupByLibrary.simpleMessage("Search"),
|
||||||
"seconds": MessageLookupByLibrary.simpleMessage("Seconds"),
|
"seconds": MessageLookupByLibrary.simpleMessage("Seconds"),
|
||||||
"selectAll": MessageLookupByLibrary.simpleMessage("Select all"),
|
"selectAll": MessageLookupByLibrary.simpleMessage("Select all"),
|
||||||
"selected": MessageLookupByLibrary.simpleMessage("Selected"),
|
"selected": MessageLookupByLibrary.simpleMessage("Selected"),
|
||||||
"selectedCountTitle": m0,
|
"selectedCountTitle": m7,
|
||||||
"settings": MessageLookupByLibrary.simpleMessage("Settings"),
|
"settings": MessageLookupByLibrary.simpleMessage("Settings"),
|
||||||
"show": MessageLookupByLibrary.simpleMessage("Show"),
|
"show": MessageLookupByLibrary.simpleMessage("Show"),
|
||||||
"shrink": MessageLookupByLibrary.simpleMessage("Shrink"),
|
"shrink": MessageLookupByLibrary.simpleMessage("Shrink"),
|
||||||
@@ -614,6 +617,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Start in the background",
|
"Start in the background",
|
||||||
),
|
),
|
||||||
"size": MessageLookupByLibrary.simpleMessage("Size"),
|
"size": MessageLookupByLibrary.simpleMessage("Size"),
|
||||||
|
"socksPort": MessageLookupByLibrary.simpleMessage("Socks Port"),
|
||||||
"sort": MessageLookupByLibrary.simpleMessage("Sort"),
|
"sort": MessageLookupByLibrary.simpleMessage("Sort"),
|
||||||
"source": MessageLookupByLibrary.simpleMessage("Source"),
|
"source": MessageLookupByLibrary.simpleMessage("Source"),
|
||||||
"sourceIp": MessageLookupByLibrary.simpleMessage("Source IP"),
|
"sourceIp": MessageLookupByLibrary.simpleMessage("Source IP"),
|
||||||
@@ -629,9 +633,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"stopVpn": MessageLookupByLibrary.simpleMessage("Stopping VPN..."),
|
"stopVpn": MessageLookupByLibrary.simpleMessage("Stopping VPN..."),
|
||||||
"style": MessageLookupByLibrary.simpleMessage("Style"),
|
"style": MessageLookupByLibrary.simpleMessage("Style"),
|
||||||
"subRule": MessageLookupByLibrary.simpleMessage("Sub rule"),
|
"subRule": MessageLookupByLibrary.simpleMessage("Sub rule"),
|
||||||
"subRuleEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Sub rule content cannot be empty",
|
|
||||||
),
|
|
||||||
"submit": MessageLookupByLibrary.simpleMessage("Submit"),
|
"submit": MessageLookupByLibrary.simpleMessage("Submit"),
|
||||||
"sync": MessageLookupByLibrary.simpleMessage("Sync"),
|
"sync": MessageLookupByLibrary.simpleMessage("Sync"),
|
||||||
"system": MessageLookupByLibrary.simpleMessage("System"),
|
"system": MessageLookupByLibrary.simpleMessage("System"),
|
||||||
@@ -665,6 +666,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"toggle": MessageLookupByLibrary.simpleMessage("Toggle"),
|
"toggle": MessageLookupByLibrary.simpleMessage("Toggle"),
|
||||||
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("TonalSpot"),
|
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("TonalSpot"),
|
||||||
"tools": MessageLookupByLibrary.simpleMessage("Tools"),
|
"tools": MessageLookupByLibrary.simpleMessage("Tools"),
|
||||||
|
"tproxyPort": MessageLookupByLibrary.simpleMessage("Tproxy Port"),
|
||||||
"trafficUsage": MessageLookupByLibrary.simpleMessage("Traffic usage"),
|
"trafficUsage": MessageLookupByLibrary.simpleMessage("Traffic usage"),
|
||||||
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
"tunDesc": MessageLookupByLibrary.simpleMessage(
|
"tunDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -680,18 +682,17 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Remove extra delays such as handshaking",
|
"Remove extra delays such as handshaking",
|
||||||
),
|
),
|
||||||
"unknown": MessageLookupByLibrary.simpleMessage("Unknown"),
|
"unknown": MessageLookupByLibrary.simpleMessage("Unknown"),
|
||||||
|
"unnamed": MessageLookupByLibrary.simpleMessage("Unnamed"),
|
||||||
"update": MessageLookupByLibrary.simpleMessage("Update"),
|
"update": MessageLookupByLibrary.simpleMessage("Update"),
|
||||||
"upload": MessageLookupByLibrary.simpleMessage("Upload"),
|
"upload": MessageLookupByLibrary.simpleMessage("Upload"),
|
||||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Obtain profile through URL",
|
"Obtain profile through URL",
|
||||||
),
|
),
|
||||||
|
"urlTip": m8,
|
||||||
"useHosts": MessageLookupByLibrary.simpleMessage("Use hosts"),
|
"useHosts": MessageLookupByLibrary.simpleMessage("Use hosts"),
|
||||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage("Use system hosts"),
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage("Use system hosts"),
|
||||||
"value": MessageLookupByLibrary.simpleMessage("Value"),
|
"value": MessageLookupByLibrary.simpleMessage("Value"),
|
||||||
"valueExists": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"The current value already exists",
|
|
||||||
),
|
|
||||||
"vibrantScheme": MessageLookupByLibrary.simpleMessage("Vibrant"),
|
"vibrantScheme": MessageLookupByLibrary.simpleMessage("Vibrant"),
|
||||||
"view": MessageLookupByLibrary.simpleMessage("View"),
|
"view": MessageLookupByLibrary.simpleMessage("View"),
|
||||||
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
|||||||
@@ -20,7 +20,23 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
|||||||
class MessageLookup extends MessageLookupByLibrary {
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
String get localeName => 'ja';
|
String get localeName => 'ja';
|
||||||
|
|
||||||
static String m0(count) => "${count} 項目が選択されています";
|
static String m0(label) => "選択された${label}を削除してもよろしいですか?";
|
||||||
|
|
||||||
|
static String m1(label) => "現在の${label}を削除してもよろしいですか?";
|
||||||
|
|
||||||
|
static String m2(label) => "${label}は空欄にできません";
|
||||||
|
|
||||||
|
static String m3(label) => "現在の${label}は既に存在しています";
|
||||||
|
|
||||||
|
static String m4(label) => "現在${label}はありません";
|
||||||
|
|
||||||
|
static String m5(label) => "${label}は数字でなければなりません";
|
||||||
|
|
||||||
|
static String m6(label) => "${label} は 1024 から 49151 の間でなければなりません";
|
||||||
|
|
||||||
|
static String m7(count) => "${count} 項目が選択されています";
|
||||||
|
|
||||||
|
static String m8(label) => "${label}はURLである必要があります";
|
||||||
|
|
||||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
@@ -36,7 +52,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"選択したアプリをVPNから除外",
|
"選択したアプリをVPNから除外",
|
||||||
),
|
),
|
||||||
"account": MessageLookupByLibrary.simpleMessage("アカウント"),
|
"account": MessageLookupByLibrary.simpleMessage("アカウント"),
|
||||||
"accountTip": MessageLookupByLibrary.simpleMessage("アカウントは必須です"),
|
|
||||||
"action": MessageLookupByLibrary.simpleMessage("アクション"),
|
"action": MessageLookupByLibrary.simpleMessage("アクション"),
|
||||||
"action_mode": MessageLookupByLibrary.simpleMessage("モード切替"),
|
"action_mode": MessageLookupByLibrary.simpleMessage("モード切替"),
|
||||||
"action_proxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
"action_proxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
||||||
@@ -107,7 +122,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"clearData": MessageLookupByLibrary.simpleMessage("データを消去"),
|
"clearData": MessageLookupByLibrary.simpleMessage("データを消去"),
|
||||||
"clipboardExport": MessageLookupByLibrary.simpleMessage("クリップボードにエクスポート"),
|
"clipboardExport": MessageLookupByLibrary.simpleMessage("クリップボードにエクスポート"),
|
||||||
"clipboardImport": MessageLookupByLibrary.simpleMessage("クリップボードからインポート"),
|
"clipboardImport": MessageLookupByLibrary.simpleMessage("クリップボードからインポート"),
|
||||||
"colorExists": MessageLookupByLibrary.simpleMessage("この色は既に存在します"),
|
"color": MessageLookupByLibrary.simpleMessage("カラー"),
|
||||||
"colorSchemes": MessageLookupByLibrary.simpleMessage("カラースキーム"),
|
"colorSchemes": MessageLookupByLibrary.simpleMessage("カラースキーム"),
|
||||||
"columns": MessageLookupByLibrary.simpleMessage("列"),
|
"columns": MessageLookupByLibrary.simpleMessage("列"),
|
||||||
"compatible": MessageLookupByLibrary.simpleMessage("互換モード"),
|
"compatible": MessageLookupByLibrary.simpleMessage("互換モード"),
|
||||||
@@ -120,7 +135,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"connectivity": MessageLookupByLibrary.simpleMessage("接続性:"),
|
"connectivity": MessageLookupByLibrary.simpleMessage("接続性:"),
|
||||||
"contactMe": MessageLookupByLibrary.simpleMessage("連絡する"),
|
"contactMe": MessageLookupByLibrary.simpleMessage("連絡する"),
|
||||||
"content": MessageLookupByLibrary.simpleMessage("内容"),
|
"content": MessageLookupByLibrary.simpleMessage("内容"),
|
||||||
"contentEmptyTip": MessageLookupByLibrary.simpleMessage("内容は必須です"),
|
|
||||||
"contentScheme": MessageLookupByLibrary.simpleMessage("コンテンツテーマ"),
|
"contentScheme": MessageLookupByLibrary.simpleMessage("コンテンツテーマ"),
|
||||||
"copy": MessageLookupByLibrary.simpleMessage("コピー"),
|
"copy": MessageLookupByLibrary.simpleMessage("コピー"),
|
||||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage("環境変数をコピー"),
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage("環境変数をコピー"),
|
||||||
@@ -144,11 +158,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"delay": MessageLookupByLibrary.simpleMessage("遅延"),
|
"delay": MessageLookupByLibrary.simpleMessage("遅延"),
|
||||||
"delaySort": MessageLookupByLibrary.simpleMessage("遅延順"),
|
"delaySort": MessageLookupByLibrary.simpleMessage("遅延順"),
|
||||||
"delete": MessageLookupByLibrary.simpleMessage("削除"),
|
"delete": MessageLookupByLibrary.simpleMessage("削除"),
|
||||||
"deleteColorTip": MessageLookupByLibrary.simpleMessage("現在の色を削除しますか?"),
|
"deleteMultipTip": m0,
|
||||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
"deleteTip": m1,
|
||||||
"現在のプロファイルを削除しますか?",
|
|
||||||
),
|
|
||||||
"deleteRuleTip": MessageLookupByLibrary.simpleMessage("選択したルールを削除しますか?"),
|
|
||||||
"desc": MessageLookupByLibrary.simpleMessage(
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
"ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
||||||
),
|
),
|
||||||
@@ -170,6 +181,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"domain": MessageLookupByLibrary.simpleMessage("ドメイン"),
|
"domain": MessageLookupByLibrary.simpleMessage("ドメイン"),
|
||||||
"download": MessageLookupByLibrary.simpleMessage("ダウンロード"),
|
"download": MessageLookupByLibrary.simpleMessage("ダウンロード"),
|
||||||
"edit": MessageLookupByLibrary.simpleMessage("編集"),
|
"edit": MessageLookupByLibrary.simpleMessage("編集"),
|
||||||
|
"emptyTip": m2,
|
||||||
"en": MessageLookupByLibrary.simpleMessage("英語"),
|
"en": MessageLookupByLibrary.simpleMessage("英語"),
|
||||||
"enableOverride": MessageLookupByLibrary.simpleMessage("上書きを有効化"),
|
"enableOverride": MessageLookupByLibrary.simpleMessage("上書きを有効化"),
|
||||||
"entries": MessageLookupByLibrary.simpleMessage(" エントリ"),
|
"entries": MessageLookupByLibrary.simpleMessage(" エントリ"),
|
||||||
@@ -177,6 +189,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"アプリがバックグラウンド時に最近のタスクから非表示",
|
"アプリがバックグラウンド時に最近のタスクから非表示",
|
||||||
),
|
),
|
||||||
|
"existsTip": m3,
|
||||||
"exit": MessageLookupByLibrary.simpleMessage("終了"),
|
"exit": MessageLookupByLibrary.simpleMessage("終了"),
|
||||||
"expand": MessageLookupByLibrary.simpleMessage("標準"),
|
"expand": MessageLookupByLibrary.simpleMessage("標準"),
|
||||||
"expirationTime": MessageLookupByLibrary.simpleMessage("有効期限"),
|
"expirationTime": MessageLookupByLibrary.simpleMessage("有効期限"),
|
||||||
@@ -232,12 +245,16 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"icon": MessageLookupByLibrary.simpleMessage("アイコン"),
|
"icon": MessageLookupByLibrary.simpleMessage("アイコン"),
|
||||||
"iconConfiguration": MessageLookupByLibrary.simpleMessage("アイコン設定"),
|
"iconConfiguration": MessageLookupByLibrary.simpleMessage("アイコン設定"),
|
||||||
"iconStyle": MessageLookupByLibrary.simpleMessage("アイコンスタイル"),
|
"iconStyle": MessageLookupByLibrary.simpleMessage("アイコンスタイル"),
|
||||||
|
"import": MessageLookupByLibrary.simpleMessage("インポート"),
|
||||||
|
"importFile": MessageLookupByLibrary.simpleMessage("ファイルからインポート"),
|
||||||
"importFromURL": MessageLookupByLibrary.simpleMessage("URLからインポート"),
|
"importFromURL": MessageLookupByLibrary.simpleMessage("URLからインポート"),
|
||||||
|
"importUrl": MessageLookupByLibrary.simpleMessage("URLからインポート"),
|
||||||
"infiniteTime": MessageLookupByLibrary.simpleMessage("長期有効"),
|
"infiniteTime": MessageLookupByLibrary.simpleMessage("長期有効"),
|
||||||
"init": MessageLookupByLibrary.simpleMessage("初期化"),
|
"init": MessageLookupByLibrary.simpleMessage("初期化"),
|
||||||
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("正しいホットキーを入力"),
|
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("正しいホットキーを入力"),
|
||||||
"intelligentSelected": MessageLookupByLibrary.simpleMessage("インテリジェント選択"),
|
"intelligentSelected": MessageLookupByLibrary.simpleMessage("インテリジェント選択"),
|
||||||
"internet": MessageLookupByLibrary.simpleMessage("インターネット"),
|
"internet": MessageLookupByLibrary.simpleMessage("インターネット"),
|
||||||
|
"interval": MessageLookupByLibrary.simpleMessage("インターバル"),
|
||||||
"intranetIP": MessageLookupByLibrary.simpleMessage("イントラネットIP"),
|
"intranetIP": MessageLookupByLibrary.simpleMessage("イントラネットIP"),
|
||||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("有効化するとIPv6トラフィックを受信可能"),
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage("有効化するとIPv6トラフィックを受信可能"),
|
||||||
@@ -248,7 +265,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"TCPキープアライブ間隔",
|
"TCPキープアライブ間隔",
|
||||||
),
|
),
|
||||||
"key": MessageLookupByLibrary.simpleMessage("キー"),
|
"key": MessageLookupByLibrary.simpleMessage("キー"),
|
||||||
"keyExists": MessageLookupByLibrary.simpleMessage("現在のキーは既に存在します"),
|
|
||||||
"language": MessageLookupByLibrary.simpleMessage("言語"),
|
"language": MessageLookupByLibrary.simpleMessage("言語"),
|
||||||
"layout": MessageLookupByLibrary.simpleMessage("レイアウト"),
|
"layout": MessageLookupByLibrary.simpleMessage("レイアウト"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("ライト"),
|
"light": MessageLookupByLibrary.simpleMessage("ライト"),
|
||||||
@@ -275,6 +291,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"システムの終了イベントを変更",
|
"システムの終了イベントを変更",
|
||||||
),
|
),
|
||||||
"minutes": MessageLookupByLibrary.simpleMessage("分"),
|
"minutes": MessageLookupByLibrary.simpleMessage("分"),
|
||||||
|
"mixedPort": MessageLookupByLibrary.simpleMessage("混合ポート"),
|
||||||
"mode": MessageLookupByLibrary.simpleMessage("モード"),
|
"mode": MessageLookupByLibrary.simpleMessage("モード"),
|
||||||
"monochromeScheme": MessageLookupByLibrary.simpleMessage("モノクローム"),
|
"monochromeScheme": MessageLookupByLibrary.simpleMessage("モノクローム"),
|
||||||
"months": MessageLookupByLibrary.simpleMessage("月"),
|
"months": MessageLookupByLibrary.simpleMessage("月"),
|
||||||
@@ -305,18 +322,14 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
),
|
),
|
||||||
"noResolve": MessageLookupByLibrary.simpleMessage("IPを解決しない"),
|
"noResolve": MessageLookupByLibrary.simpleMessage("IPを解決しない"),
|
||||||
"none": MessageLookupByLibrary.simpleMessage("なし"),
|
"none": MessageLookupByLibrary.simpleMessage("なし"),
|
||||||
"notEmpty": MessageLookupByLibrary.simpleMessage("空欄不可"),
|
|
||||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||||
"現在のプロキシグループは選択できません",
|
"現在のプロキシグループは選択できません",
|
||||||
),
|
),
|
||||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage("接続なし"),
|
|
||||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage("コア情報を取得できません"),
|
|
||||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("ログがありません"),
|
|
||||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"プロファイルがありません。追加してください",
|
"プロファイルがありません。追加してください",
|
||||||
),
|
),
|
||||||
"nullProxies": MessageLookupByLibrary.simpleMessage("プロキシなし"),
|
"nullTip": m4,
|
||||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("リクエストなし"),
|
"numberTip": m5,
|
||||||
"oneColumn": MessageLookupByLibrary.simpleMessage("1列"),
|
"oneColumn": MessageLookupByLibrary.simpleMessage("1列"),
|
||||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("アイコンのみ"),
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("アイコンのみ"),
|
||||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("サードパーティアプリのみ"),
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("サードパーティアプリのみ"),
|
||||||
@@ -334,14 +347,19 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"有効化するとプロファイルのDNS設定を上書き",
|
"有効化するとプロファイルのDNS設定を上書き",
|
||||||
),
|
),
|
||||||
|
"overrideInvalidTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"スクリプトモードでは有効になりません",
|
||||||
|
),
|
||||||
"overrideOriginRules": MessageLookupByLibrary.simpleMessage("元のルールを上書き"),
|
"overrideOriginRules": MessageLookupByLibrary.simpleMessage("元のルールを上書き"),
|
||||||
"palette": MessageLookupByLibrary.simpleMessage("パレット"),
|
"palette": MessageLookupByLibrary.simpleMessage("パレット"),
|
||||||
"password": MessageLookupByLibrary.simpleMessage("パスワード"),
|
"password": MessageLookupByLibrary.simpleMessage("パスワード"),
|
||||||
"passwordTip": MessageLookupByLibrary.simpleMessage("パスワードは必須です"),
|
|
||||||
"paste": MessageLookupByLibrary.simpleMessage("貼り付け"),
|
"paste": MessageLookupByLibrary.simpleMessage("貼り付け"),
|
||||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||||
"WebDAVをバインドしてください",
|
"WebDAVをバインドしてください",
|
||||||
),
|
),
|
||||||
|
"pleaseEnterScriptName": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"スクリプト名を入力してください",
|
||||||
|
),
|
||||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
"管理者パスワードを入力",
|
"管理者パスワードを入力",
|
||||||
),
|
),
|
||||||
@@ -352,6 +370,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"有効なQRコードをアップロードしてください",
|
"有効なQRコードをアップロードしてください",
|
||||||
),
|
),
|
||||||
"port": MessageLookupByLibrary.simpleMessage("ポート"),
|
"port": MessageLookupByLibrary.simpleMessage("ポート"),
|
||||||
|
"portConflictTip": MessageLookupByLibrary.simpleMessage("別のポートを入力してください"),
|
||||||
|
"portTip": m6,
|
||||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage("DOHのHTTP/3を優先使用"),
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage("DOHのHTTP/3を優先使用"),
|
||||||
"pressKeyboard": MessageLookupByLibrary.simpleMessage("キーボードを押してください"),
|
"pressKeyboard": MessageLookupByLibrary.simpleMessage("キーボードを押してください"),
|
||||||
"preview": MessageLookupByLibrary.simpleMessage("プレビュー"),
|
"preview": MessageLookupByLibrary.simpleMessage("プレビュー"),
|
||||||
@@ -402,6 +422,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"オーバーライド",
|
"オーバーライド",
|
||||||
),
|
),
|
||||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage("復元成功"),
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage("復元成功"),
|
||||||
|
"redirPort": MessageLookupByLibrary.simpleMessage("Redirポート"),
|
||||||
"redo": MessageLookupByLibrary.simpleMessage("やり直す"),
|
"redo": MessageLookupByLibrary.simpleMessage("やり直す"),
|
||||||
"regExp": MessageLookupByLibrary.simpleMessage("正規表現"),
|
"regExp": MessageLookupByLibrary.simpleMessage("正規表現"),
|
||||||
"remote": MessageLookupByLibrary.simpleMessage("リモート"),
|
"remote": MessageLookupByLibrary.simpleMessage("リモート"),
|
||||||
@@ -412,6 +433,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"WebDAVからデータを復元",
|
"WebDAVからデータを復元",
|
||||||
),
|
),
|
||||||
"remove": MessageLookupByLibrary.simpleMessage("削除"),
|
"remove": MessageLookupByLibrary.simpleMessage("削除"),
|
||||||
|
"rename": MessageLookupByLibrary.simpleMessage("リネーム"),
|
||||||
"requests": MessageLookupByLibrary.simpleMessage("リクエスト"),
|
"requests": MessageLookupByLibrary.simpleMessage("リクエスト"),
|
||||||
"requestsDesc": MessageLookupByLibrary.simpleMessage("最近のリクエスト記録を表示"),
|
"requestsDesc": MessageLookupByLibrary.simpleMessage("最近のリクエスト記録を表示"),
|
||||||
"reset": MessageLookupByLibrary.simpleMessage("リセット"),
|
"reset": MessageLookupByLibrary.simpleMessage("リセット"),
|
||||||
@@ -432,26 +454,24 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ru": MessageLookupByLibrary.simpleMessage("ロシア語"),
|
"ru": MessageLookupByLibrary.simpleMessage("ロシア語"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("ルール"),
|
"rule": MessageLookupByLibrary.simpleMessage("ルール"),
|
||||||
"ruleName": MessageLookupByLibrary.simpleMessage("ルール名"),
|
"ruleName": MessageLookupByLibrary.simpleMessage("ルール名"),
|
||||||
"ruleProviderEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"ルールプロバイダーは必須です",
|
|
||||||
),
|
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("ルールプロバイダー"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("ルールプロバイダー"),
|
||||||
"ruleTarget": MessageLookupByLibrary.simpleMessage("ルール対象"),
|
"ruleTarget": MessageLookupByLibrary.simpleMessage("ルール対象"),
|
||||||
"ruleTargetEmptyTip": MessageLookupByLibrary.simpleMessage("ルール対象は必須です"),
|
|
||||||
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||||
"saveChanges": MessageLookupByLibrary.simpleMessage("変更を保存しますか?"),
|
"saveChanges": MessageLookupByLibrary.simpleMessage("変更を保存しますか?"),
|
||||||
"saveTip": MessageLookupByLibrary.simpleMessage("保存してもよろしいですか?"),
|
"saveTip": MessageLookupByLibrary.simpleMessage("保存してもよろしいですか?"),
|
||||||
|
"script": MessageLookupByLibrary.simpleMessage("スクリプト"),
|
||||||
"search": MessageLookupByLibrary.simpleMessage("検索"),
|
"search": MessageLookupByLibrary.simpleMessage("検索"),
|
||||||
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
||||||
"selectAll": MessageLookupByLibrary.simpleMessage("すべて選択"),
|
"selectAll": MessageLookupByLibrary.simpleMessage("すべて選択"),
|
||||||
"selected": MessageLookupByLibrary.simpleMessage("選択済み"),
|
"selected": MessageLookupByLibrary.simpleMessage("選択済み"),
|
||||||
"selectedCountTitle": m0,
|
"selectedCountTitle": m7,
|
||||||
"settings": MessageLookupByLibrary.simpleMessage("設定"),
|
"settings": MessageLookupByLibrary.simpleMessage("設定"),
|
||||||
"show": MessageLookupByLibrary.simpleMessage("表示"),
|
"show": MessageLookupByLibrary.simpleMessage("表示"),
|
||||||
"shrink": MessageLookupByLibrary.simpleMessage("縮小"),
|
"shrink": MessageLookupByLibrary.simpleMessage("縮小"),
|
||||||
"silentLaunch": MessageLookupByLibrary.simpleMessage("バックグラウンド起動"),
|
"silentLaunch": MessageLookupByLibrary.simpleMessage("バックグラウンド起動"),
|
||||||
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("バックグラウンドで起動"),
|
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("バックグラウンドで起動"),
|
||||||
"size": MessageLookupByLibrary.simpleMessage("サイズ"),
|
"size": MessageLookupByLibrary.simpleMessage("サイズ"),
|
||||||
|
"socksPort": MessageLookupByLibrary.simpleMessage("Socksポート"),
|
||||||
"sort": MessageLookupByLibrary.simpleMessage("並び替え"),
|
"sort": MessageLookupByLibrary.simpleMessage("並び替え"),
|
||||||
"source": MessageLookupByLibrary.simpleMessage("ソース"),
|
"source": MessageLookupByLibrary.simpleMessage("ソース"),
|
||||||
"sourceIp": MessageLookupByLibrary.simpleMessage("送信元IP"),
|
"sourceIp": MessageLookupByLibrary.simpleMessage("送信元IP"),
|
||||||
@@ -465,7 +485,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"stopVpn": MessageLookupByLibrary.simpleMessage("VPNを停止中..."),
|
"stopVpn": MessageLookupByLibrary.simpleMessage("VPNを停止中..."),
|
||||||
"style": MessageLookupByLibrary.simpleMessage("スタイル"),
|
"style": MessageLookupByLibrary.simpleMessage("スタイル"),
|
||||||
"subRule": MessageLookupByLibrary.simpleMessage("サブルール"),
|
"subRule": MessageLookupByLibrary.simpleMessage("サブルール"),
|
||||||
"subRuleEmptyTip": MessageLookupByLibrary.simpleMessage("サブルールの内容は必須です"),
|
|
||||||
"submit": MessageLookupByLibrary.simpleMessage("送信"),
|
"submit": MessageLookupByLibrary.simpleMessage("送信"),
|
||||||
"sync": MessageLookupByLibrary.simpleMessage("同期"),
|
"sync": MessageLookupByLibrary.simpleMessage("同期"),
|
||||||
"system": MessageLookupByLibrary.simpleMessage("システム"),
|
"system": MessageLookupByLibrary.simpleMessage("システム"),
|
||||||
@@ -493,6 +512,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"toggle": MessageLookupByLibrary.simpleMessage("トグル"),
|
"toggle": MessageLookupByLibrary.simpleMessage("トグル"),
|
||||||
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("トーンスポット"),
|
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("トーンスポット"),
|
||||||
"tools": MessageLookupByLibrary.simpleMessage("ツール"),
|
"tools": MessageLookupByLibrary.simpleMessage("ツール"),
|
||||||
|
"tproxyPort": MessageLookupByLibrary.simpleMessage("Tproxyポート"),
|
||||||
"trafficUsage": MessageLookupByLibrary.simpleMessage("トラフィック使用量"),
|
"trafficUsage": MessageLookupByLibrary.simpleMessage("トラフィック使用量"),
|
||||||
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
"tunDesc": MessageLookupByLibrary.simpleMessage("管理者モードでのみ有効"),
|
"tunDesc": MessageLookupByLibrary.simpleMessage("管理者モードでのみ有効"),
|
||||||
@@ -506,14 +526,15 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ハンドシェイクなどの余分な遅延を削除",
|
"ハンドシェイクなどの余分な遅延を削除",
|
||||||
),
|
),
|
||||||
"unknown": MessageLookupByLibrary.simpleMessage("不明"),
|
"unknown": MessageLookupByLibrary.simpleMessage("不明"),
|
||||||
|
"unnamed": MessageLookupByLibrary.simpleMessage("無題"),
|
||||||
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
||||||
"upload": MessageLookupByLibrary.simpleMessage("アップロード"),
|
"upload": MessageLookupByLibrary.simpleMessage("アップロード"),
|
||||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
"urlDesc": MessageLookupByLibrary.simpleMessage("URL経由でプロファイルを取得"),
|
"urlDesc": MessageLookupByLibrary.simpleMessage("URL経由でプロファイルを取得"),
|
||||||
|
"urlTip": m8,
|
||||||
"useHosts": MessageLookupByLibrary.simpleMessage("ホストを使用"),
|
"useHosts": MessageLookupByLibrary.simpleMessage("ホストを使用"),
|
||||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage("システムホストを使用"),
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage("システムホストを使用"),
|
||||||
"value": MessageLookupByLibrary.simpleMessage("値"),
|
"value": MessageLookupByLibrary.simpleMessage("値"),
|
||||||
"valueExists": MessageLookupByLibrary.simpleMessage("現在の値は既に存在します"),
|
|
||||||
"vibrantScheme": MessageLookupByLibrary.simpleMessage("ビブラント"),
|
"vibrantScheme": MessageLookupByLibrary.simpleMessage("ビブラント"),
|
||||||
"view": MessageLookupByLibrary.simpleMessage("表示"),
|
"view": MessageLookupByLibrary.simpleMessage("表示"),
|
||||||
"vpnDesc": MessageLookupByLibrary.simpleMessage("VPN関連設定の変更"),
|
"vpnDesc": MessageLookupByLibrary.simpleMessage("VPN関連設定の変更"),
|
||||||
|
|||||||
@@ -20,7 +20,24 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
|||||||
class MessageLookup extends MessageLookupByLibrary {
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
String get localeName => 'ru';
|
String get localeName => 'ru';
|
||||||
|
|
||||||
static String m0(count) => "Выбрано ${count} элементов";
|
static String m0(label) =>
|
||||||
|
"Вы уверены, что хотите удалить выбранные ${label}?";
|
||||||
|
|
||||||
|
static String m1(label) => "Вы уверены, что хотите удалить текущий ${label}?";
|
||||||
|
|
||||||
|
static String m2(label) => "${label} не может быть пустым";
|
||||||
|
|
||||||
|
static String m3(label) => "Текущий ${label} уже существует";
|
||||||
|
|
||||||
|
static String m4(label) => "Сейчас ${label} нет";
|
||||||
|
|
||||||
|
static String m5(label) => "${label} должно быть числом";
|
||||||
|
|
||||||
|
static String m6(label) => "${label} должен быть числом от 1024 до 49151";
|
||||||
|
|
||||||
|
static String m7(count) => "Выбрано ${count} элементов";
|
||||||
|
|
||||||
|
static String m8(label) => "${label} должен быть URL";
|
||||||
|
|
||||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
@@ -36,9 +53,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Выбранные приложения будут исключены из VPN",
|
"Выбранные приложения будут исключены из VPN",
|
||||||
),
|
),
|
||||||
"account": MessageLookupByLibrary.simpleMessage("Аккаунт"),
|
"account": MessageLookupByLibrary.simpleMessage("Аккаунт"),
|
||||||
"accountTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Аккаунт не может быть пустым",
|
|
||||||
),
|
|
||||||
"action": MessageLookupByLibrary.simpleMessage("Действие"),
|
"action": MessageLookupByLibrary.simpleMessage("Действие"),
|
||||||
"action_mode": MessageLookupByLibrary.simpleMessage("Переключить режим"),
|
"action_mode": MessageLookupByLibrary.simpleMessage("Переключить режим"),
|
||||||
"action_proxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
"action_proxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
||||||
@@ -155,9 +169,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"clipboardImport": MessageLookupByLibrary.simpleMessage(
|
"clipboardImport": MessageLookupByLibrary.simpleMessage(
|
||||||
"Импорт из буфера обмена",
|
"Импорт из буфера обмена",
|
||||||
),
|
),
|
||||||
"colorExists": MessageLookupByLibrary.simpleMessage(
|
"color": MessageLookupByLibrary.simpleMessage("Цвет"),
|
||||||
"Этот цвет уже существует",
|
|
||||||
),
|
|
||||||
"colorSchemes": MessageLookupByLibrary.simpleMessage("Цветовые схемы"),
|
"colorSchemes": MessageLookupByLibrary.simpleMessage("Цветовые схемы"),
|
||||||
"columns": MessageLookupByLibrary.simpleMessage("Столбцы"),
|
"columns": MessageLookupByLibrary.simpleMessage("Столбцы"),
|
||||||
"compatible": MessageLookupByLibrary.simpleMessage("Режим совместимости"),
|
"compatible": MessageLookupByLibrary.simpleMessage("Режим совместимости"),
|
||||||
@@ -172,9 +184,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"connectivity": MessageLookupByLibrary.simpleMessage("Связь:"),
|
"connectivity": MessageLookupByLibrary.simpleMessage("Связь:"),
|
||||||
"contactMe": MessageLookupByLibrary.simpleMessage("Свяжитесь со мной"),
|
"contactMe": MessageLookupByLibrary.simpleMessage("Свяжитесь со мной"),
|
||||||
"content": MessageLookupByLibrary.simpleMessage("Содержание"),
|
"content": MessageLookupByLibrary.simpleMessage("Содержание"),
|
||||||
"contentEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Содержание не может быть пустым",
|
|
||||||
),
|
|
||||||
"contentScheme": MessageLookupByLibrary.simpleMessage("Контентная тема"),
|
"contentScheme": MessageLookupByLibrary.simpleMessage("Контентная тема"),
|
||||||
"copy": MessageLookupByLibrary.simpleMessage("Копировать"),
|
"copy": MessageLookupByLibrary.simpleMessage("Копировать"),
|
||||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -204,15 +213,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"delay": MessageLookupByLibrary.simpleMessage("Задержка"),
|
"delay": MessageLookupByLibrary.simpleMessage("Задержка"),
|
||||||
"delaySort": MessageLookupByLibrary.simpleMessage("Сортировка по задержке"),
|
"delaySort": MessageLookupByLibrary.simpleMessage("Сортировка по задержке"),
|
||||||
"delete": MessageLookupByLibrary.simpleMessage("Удалить"),
|
"delete": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||||
"deleteColorTip": MessageLookupByLibrary.simpleMessage(
|
"deleteMultipTip": m0,
|
||||||
"Удалить текущий цвет?",
|
"deleteTip": m1,
|
||||||
),
|
|
||||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Вы уверены, что хотите удалить текущий профиль?",
|
|
||||||
),
|
|
||||||
"deleteRuleTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Вы уверены, что хотите удалить выбранное правило?",
|
|
||||||
),
|
|
||||||
"desc": MessageLookupByLibrary.simpleMessage(
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
"Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
||||||
),
|
),
|
||||||
@@ -246,6 +248,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"domain": MessageLookupByLibrary.simpleMessage("Домен"),
|
"domain": MessageLookupByLibrary.simpleMessage("Домен"),
|
||||||
"download": MessageLookupByLibrary.simpleMessage("Скачивание"),
|
"download": MessageLookupByLibrary.simpleMessage("Скачивание"),
|
||||||
"edit": MessageLookupByLibrary.simpleMessage("Редактировать"),
|
"edit": MessageLookupByLibrary.simpleMessage("Редактировать"),
|
||||||
|
"emptyTip": m2,
|
||||||
"en": MessageLookupByLibrary.simpleMessage("Английский"),
|
"en": MessageLookupByLibrary.simpleMessage("Английский"),
|
||||||
"enableOverride": MessageLookupByLibrary.simpleMessage(
|
"enableOverride": MessageLookupByLibrary.simpleMessage(
|
||||||
"Включить переопределение",
|
"Включить переопределение",
|
||||||
@@ -257,6 +260,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
"Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
||||||
),
|
),
|
||||||
|
"existsTip": m3,
|
||||||
"exit": MessageLookupByLibrary.simpleMessage("Выход"),
|
"exit": MessageLookupByLibrary.simpleMessage("Выход"),
|
||||||
"expand": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
"expand": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
||||||
"expirationTime": MessageLookupByLibrary.simpleMessage("Время истечения"),
|
"expirationTime": MessageLookupByLibrary.simpleMessage("Время истечения"),
|
||||||
@@ -338,7 +342,10 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Конфигурация иконки",
|
"Конфигурация иконки",
|
||||||
),
|
),
|
||||||
"iconStyle": MessageLookupByLibrary.simpleMessage("Стиль иконки"),
|
"iconStyle": MessageLookupByLibrary.simpleMessage("Стиль иконки"),
|
||||||
|
"import": MessageLookupByLibrary.simpleMessage("Импорт"),
|
||||||
|
"importFile": MessageLookupByLibrary.simpleMessage("Импорт из файла"),
|
||||||
"importFromURL": MessageLookupByLibrary.simpleMessage("Импорт из URL"),
|
"importFromURL": MessageLookupByLibrary.simpleMessage("Импорт из URL"),
|
||||||
|
"importUrl": MessageLookupByLibrary.simpleMessage("Импорт по URL"),
|
||||||
"infiniteTime": MessageLookupByLibrary.simpleMessage(
|
"infiniteTime": MessageLookupByLibrary.simpleMessage(
|
||||||
"Долгосрочное действие",
|
"Долгосрочное действие",
|
||||||
),
|
),
|
||||||
@@ -350,6 +357,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Интеллектуальный выбор",
|
"Интеллектуальный выбор",
|
||||||
),
|
),
|
||||||
"internet": MessageLookupByLibrary.simpleMessage("Интернет"),
|
"internet": MessageLookupByLibrary.simpleMessage("Интернет"),
|
||||||
|
"interval": MessageLookupByLibrary.simpleMessage("Интервал"),
|
||||||
"intranetIP": MessageLookupByLibrary.simpleMessage("Внутренний IP"),
|
"intranetIP": MessageLookupByLibrary.simpleMessage("Внутренний IP"),
|
||||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -364,9 +372,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Интервал поддержания TCP-соединения",
|
"Интервал поддержания TCP-соединения",
|
||||||
),
|
),
|
||||||
"key": MessageLookupByLibrary.simpleMessage("Ключ"),
|
"key": MessageLookupByLibrary.simpleMessage("Ключ"),
|
||||||
"keyExists": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Текущий ключ уже существует",
|
|
||||||
),
|
|
||||||
"language": MessageLookupByLibrary.simpleMessage("Язык"),
|
"language": MessageLookupByLibrary.simpleMessage("Язык"),
|
||||||
"layout": MessageLookupByLibrary.simpleMessage("Макет"),
|
"layout": MessageLookupByLibrary.simpleMessage("Макет"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("Светлый"),
|
"light": MessageLookupByLibrary.simpleMessage("Светлый"),
|
||||||
@@ -407,6 +412,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Изменить стандартное событие выхода из системы",
|
"Изменить стандартное событие выхода из системы",
|
||||||
),
|
),
|
||||||
"minutes": MessageLookupByLibrary.simpleMessage("Минут"),
|
"minutes": MessageLookupByLibrary.simpleMessage("Минут"),
|
||||||
|
"mixedPort": MessageLookupByLibrary.simpleMessage("Смешанный порт"),
|
||||||
"mode": MessageLookupByLibrary.simpleMessage("Режим"),
|
"mode": MessageLookupByLibrary.simpleMessage("Режим"),
|
||||||
"monochromeScheme": MessageLookupByLibrary.simpleMessage("Монохром"),
|
"monochromeScheme": MessageLookupByLibrary.simpleMessage("Монохром"),
|
||||||
"months": MessageLookupByLibrary.simpleMessage("Месяцев"),
|
"months": MessageLookupByLibrary.simpleMessage("Месяцев"),
|
||||||
@@ -447,22 +453,14 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
),
|
),
|
||||||
"noResolve": MessageLookupByLibrary.simpleMessage("Не разрешать IP"),
|
"noResolve": MessageLookupByLibrary.simpleMessage("Не разрешать IP"),
|
||||||
"none": MessageLookupByLibrary.simpleMessage("Нет"),
|
"none": MessageLookupByLibrary.simpleMessage("Нет"),
|
||||||
"notEmpty": MessageLookupByLibrary.simpleMessage("Не может быть пустым"),
|
|
||||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||||
"Текущая группа прокси не может быть выбрана.",
|
"Текущая группа прокси не может быть выбрана.",
|
||||||
),
|
),
|
||||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Нет соединений",
|
|
||||||
),
|
|
||||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Не удалось получить информацию о ядре",
|
|
||||||
),
|
|
||||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("Нет логов"),
|
|
||||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Нет профиля, пожалуйста, добавьте профиль",
|
"Нет профиля, пожалуйста, добавьте профиль",
|
||||||
),
|
),
|
||||||
"nullProxies": MessageLookupByLibrary.simpleMessage("Нет прокси"),
|
"nullTip": m4,
|
||||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("Нет запросов"),
|
"numberTip": m5,
|
||||||
"oneColumn": MessageLookupByLibrary.simpleMessage("Один столбец"),
|
"oneColumn": MessageLookupByLibrary.simpleMessage("Один столбец"),
|
||||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("Только иконка"),
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("Только иконка"),
|
||||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -490,18 +488,21 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Включение переопределит настройки DNS в профиле",
|
"Включение переопределит настройки DNS в профиле",
|
||||||
),
|
),
|
||||||
|
"overrideInvalidTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"В скриптовом режиме не действует",
|
||||||
|
),
|
||||||
"overrideOriginRules": MessageLookupByLibrary.simpleMessage(
|
"overrideOriginRules": MessageLookupByLibrary.simpleMessage(
|
||||||
"Переопределить оригинальное правило",
|
"Переопределить оригинальное правило",
|
||||||
),
|
),
|
||||||
"palette": MessageLookupByLibrary.simpleMessage("Палитра"),
|
"palette": MessageLookupByLibrary.simpleMessage("Палитра"),
|
||||||
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
|
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
|
||||||
"passwordTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Пароль не может быть пустым",
|
|
||||||
),
|
|
||||||
"paste": MessageLookupByLibrary.simpleMessage("Вставить"),
|
"paste": MessageLookupByLibrary.simpleMessage("Вставить"),
|
||||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||||
"Пожалуйста, привяжите WebDAV",
|
"Пожалуйста, привяжите WebDAV",
|
||||||
),
|
),
|
||||||
|
"pleaseEnterScriptName": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите название скрипта",
|
||||||
|
),
|
||||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
"Пожалуйста, введите пароль администратора",
|
"Пожалуйста, введите пароль администратора",
|
||||||
),
|
),
|
||||||
@@ -512,6 +513,10 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Пожалуйста, загрузите действительный QR-код",
|
"Пожалуйста, загрузите действительный QR-код",
|
||||||
),
|
),
|
||||||
"port": MessageLookupByLibrary.simpleMessage("Порт"),
|
"port": MessageLookupByLibrary.simpleMessage("Порт"),
|
||||||
|
"portConflictTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Введите другой порт",
|
||||||
|
),
|
||||||
|
"portTip": m6,
|
||||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Приоритетное использование HTTP/3 для DOH",
|
"Приоритетное использование HTTP/3 для DOH",
|
||||||
),
|
),
|
||||||
@@ -586,6 +591,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage(
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage(
|
||||||
"Восстановление успешно",
|
"Восстановление успешно",
|
||||||
),
|
),
|
||||||
|
"redirPort": MessageLookupByLibrary.simpleMessage("Redir-порт"),
|
||||||
"redo": MessageLookupByLibrary.simpleMessage("Повторить"),
|
"redo": MessageLookupByLibrary.simpleMessage("Повторить"),
|
||||||
"regExp": MessageLookupByLibrary.simpleMessage("Регулярное выражение"),
|
"regExp": MessageLookupByLibrary.simpleMessage("Регулярное выражение"),
|
||||||
"remote": MessageLookupByLibrary.simpleMessage("Удаленный"),
|
"remote": MessageLookupByLibrary.simpleMessage("Удаленный"),
|
||||||
@@ -596,6 +602,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Восстановление данных с WebDAV",
|
"Восстановление данных с WebDAV",
|
||||||
),
|
),
|
||||||
"remove": MessageLookupByLibrary.simpleMessage("Удалить"),
|
"remove": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||||
|
"rename": MessageLookupByLibrary.simpleMessage("Переименовать"),
|
||||||
"requests": MessageLookupByLibrary.simpleMessage("Запросы"),
|
"requests": MessageLookupByLibrary.simpleMessage("Запросы"),
|
||||||
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Просмотр последних записей запросов",
|
"Просмотр последних записей запросов",
|
||||||
@@ -626,24 +633,19 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ru": MessageLookupByLibrary.simpleMessage("Русский"),
|
"ru": MessageLookupByLibrary.simpleMessage("Русский"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("Правило"),
|
"rule": MessageLookupByLibrary.simpleMessage("Правило"),
|
||||||
"ruleName": MessageLookupByLibrary.simpleMessage("Название правила"),
|
"ruleName": MessageLookupByLibrary.simpleMessage("Название правила"),
|
||||||
"ruleProviderEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Поставщик правил не может быть пустым",
|
|
||||||
),
|
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("Провайдеры правил"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("Провайдеры правил"),
|
||||||
"ruleTarget": MessageLookupByLibrary.simpleMessage("Цель правила"),
|
"ruleTarget": MessageLookupByLibrary.simpleMessage("Цель правила"),
|
||||||
"ruleTargetEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Цель правила не может быть пустой",
|
|
||||||
),
|
|
||||||
"save": MessageLookupByLibrary.simpleMessage("Сохранить"),
|
"save": MessageLookupByLibrary.simpleMessage("Сохранить"),
|
||||||
"saveChanges": MessageLookupByLibrary.simpleMessage("Сохранить изменения?"),
|
"saveChanges": MessageLookupByLibrary.simpleMessage("Сохранить изменения?"),
|
||||||
"saveTip": MessageLookupByLibrary.simpleMessage(
|
"saveTip": MessageLookupByLibrary.simpleMessage(
|
||||||
"Вы уверены, что хотите сохранить?",
|
"Вы уверены, что хотите сохранить?",
|
||||||
),
|
),
|
||||||
|
"script": MessageLookupByLibrary.simpleMessage("Скрипт"),
|
||||||
"search": MessageLookupByLibrary.simpleMessage("Поиск"),
|
"search": MessageLookupByLibrary.simpleMessage("Поиск"),
|
||||||
"seconds": MessageLookupByLibrary.simpleMessage("Секунд"),
|
"seconds": MessageLookupByLibrary.simpleMessage("Секунд"),
|
||||||
"selectAll": MessageLookupByLibrary.simpleMessage("Выбрать все"),
|
"selectAll": MessageLookupByLibrary.simpleMessage("Выбрать все"),
|
||||||
"selected": MessageLookupByLibrary.simpleMessage("Выбрано"),
|
"selected": MessageLookupByLibrary.simpleMessage("Выбрано"),
|
||||||
"selectedCountTitle": m0,
|
"selectedCountTitle": m7,
|
||||||
"settings": MessageLookupByLibrary.simpleMessage("Настройки"),
|
"settings": MessageLookupByLibrary.simpleMessage("Настройки"),
|
||||||
"show": MessageLookupByLibrary.simpleMessage("Показать"),
|
"show": MessageLookupByLibrary.simpleMessage("Показать"),
|
||||||
"shrink": MessageLookupByLibrary.simpleMessage("Сжать"),
|
"shrink": MessageLookupByLibrary.simpleMessage("Сжать"),
|
||||||
@@ -652,6 +654,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Запуск в фоновом режиме",
|
"Запуск в фоновом режиме",
|
||||||
),
|
),
|
||||||
"size": MessageLookupByLibrary.simpleMessage("Размер"),
|
"size": MessageLookupByLibrary.simpleMessage("Размер"),
|
||||||
|
"socksPort": MessageLookupByLibrary.simpleMessage("Socks-порт"),
|
||||||
"sort": MessageLookupByLibrary.simpleMessage("Сортировка"),
|
"sort": MessageLookupByLibrary.simpleMessage("Сортировка"),
|
||||||
"source": MessageLookupByLibrary.simpleMessage("Источник"),
|
"source": MessageLookupByLibrary.simpleMessage("Источник"),
|
||||||
"sourceIp": MessageLookupByLibrary.simpleMessage("Исходный IP"),
|
"sourceIp": MessageLookupByLibrary.simpleMessage("Исходный IP"),
|
||||||
@@ -667,9 +670,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"stopVpn": MessageLookupByLibrary.simpleMessage("Остановка VPN..."),
|
"stopVpn": MessageLookupByLibrary.simpleMessage("Остановка VPN..."),
|
||||||
"style": MessageLookupByLibrary.simpleMessage("Стиль"),
|
"style": MessageLookupByLibrary.simpleMessage("Стиль"),
|
||||||
"subRule": MessageLookupByLibrary.simpleMessage("Подправило"),
|
"subRule": MessageLookupByLibrary.simpleMessage("Подправило"),
|
||||||
"subRuleEmptyTip": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Содержание подправила не может быть пустым",
|
|
||||||
),
|
|
||||||
"submit": MessageLookupByLibrary.simpleMessage("Отправить"),
|
"submit": MessageLookupByLibrary.simpleMessage("Отправить"),
|
||||||
"sync": MessageLookupByLibrary.simpleMessage("Синхронизация"),
|
"sync": MessageLookupByLibrary.simpleMessage("Синхронизация"),
|
||||||
"system": MessageLookupByLibrary.simpleMessage("Система"),
|
"system": MessageLookupByLibrary.simpleMessage("Система"),
|
||||||
@@ -703,6 +703,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"toggle": MessageLookupByLibrary.simpleMessage("Переключить"),
|
"toggle": MessageLookupByLibrary.simpleMessage("Переключить"),
|
||||||
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("Тональный акцент"),
|
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("Тональный акцент"),
|
||||||
"tools": MessageLookupByLibrary.simpleMessage("Инструменты"),
|
"tools": MessageLookupByLibrary.simpleMessage("Инструменты"),
|
||||||
|
"tproxyPort": MessageLookupByLibrary.simpleMessage("Tproxy-порт"),
|
||||||
"trafficUsage": MessageLookupByLibrary.simpleMessage(
|
"trafficUsage": MessageLookupByLibrary.simpleMessage(
|
||||||
"Использование трафика",
|
"Использование трафика",
|
||||||
),
|
),
|
||||||
@@ -722,20 +723,19 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Убрать дополнительные задержки, такие как рукопожатие",
|
"Убрать дополнительные задержки, такие как рукопожатие",
|
||||||
),
|
),
|
||||||
"unknown": MessageLookupByLibrary.simpleMessage("Неизвестно"),
|
"unknown": MessageLookupByLibrary.simpleMessage("Неизвестно"),
|
||||||
|
"unnamed": MessageLookupByLibrary.simpleMessage("Без имени"),
|
||||||
"update": MessageLookupByLibrary.simpleMessage("Обновить"),
|
"update": MessageLookupByLibrary.simpleMessage("Обновить"),
|
||||||
"upload": MessageLookupByLibrary.simpleMessage("Загрузка"),
|
"upload": MessageLookupByLibrary.simpleMessage("Загрузка"),
|
||||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Получить профиль через URL",
|
"Получить профиль через URL",
|
||||||
),
|
),
|
||||||
|
"urlTip": m8,
|
||||||
"useHosts": MessageLookupByLibrary.simpleMessage("Использовать hosts"),
|
"useHosts": MessageLookupByLibrary.simpleMessage("Использовать hosts"),
|
||||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage(
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage(
|
||||||
"Использовать системные hosts",
|
"Использовать системные hosts",
|
||||||
),
|
),
|
||||||
"value": MessageLookupByLibrary.simpleMessage("Значение"),
|
"value": MessageLookupByLibrary.simpleMessage("Значение"),
|
||||||
"valueExists": MessageLookupByLibrary.simpleMessage(
|
|
||||||
"Текущее значение уже существует",
|
|
||||||
),
|
|
||||||
"vibrantScheme": MessageLookupByLibrary.simpleMessage("Яркие"),
|
"vibrantScheme": MessageLookupByLibrary.simpleMessage("Яркие"),
|
||||||
"view": MessageLookupByLibrary.simpleMessage("Просмотр"),
|
"view": MessageLookupByLibrary.simpleMessage("Просмотр"),
|
||||||
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
|||||||
@@ -20,7 +20,23 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
|||||||
class MessageLookup extends MessageLookupByLibrary {
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
String get localeName => 'zh_CN';
|
String get localeName => 'zh_CN';
|
||||||
|
|
||||||
static String m0(count) => "已选择 ${count} 项";
|
static String m0(label) => "确定删除选中的${label}吗?";
|
||||||
|
|
||||||
|
static String m1(label) => "确定删除当前${label}吗?";
|
||||||
|
|
||||||
|
static String m2(label) => "${label}不能为空";
|
||||||
|
|
||||||
|
static String m3(label) => "${label}当前已存在";
|
||||||
|
|
||||||
|
static String m4(label) => "暂无${label}";
|
||||||
|
|
||||||
|
static String m5(label) => "${label}必须为数字";
|
||||||
|
|
||||||
|
static String m6(label) => "${label} 必须在 1024 到 49151 之间";
|
||||||
|
|
||||||
|
static String m7(count) => "已选择 ${count} 项";
|
||||||
|
|
||||||
|
static String m8(label) => "${label}必须为URL";
|
||||||
|
|
||||||
final messages = _notInlinedMessages(_notInlinedMessages);
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
@@ -34,7 +50,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"选中应用将会被排除在VPN之外",
|
"选中应用将会被排除在VPN之外",
|
||||||
),
|
),
|
||||||
"account": MessageLookupByLibrary.simpleMessage("账号"),
|
"account": MessageLookupByLibrary.simpleMessage("账号"),
|
||||||
"accountTip": MessageLookupByLibrary.simpleMessage("账号不能为空"),
|
|
||||||
"action": MessageLookupByLibrary.simpleMessage("操作"),
|
"action": MessageLookupByLibrary.simpleMessage("操作"),
|
||||||
"action_mode": MessageLookupByLibrary.simpleMessage("切换模式"),
|
"action_mode": MessageLookupByLibrary.simpleMessage("切换模式"),
|
||||||
"action_proxy": MessageLookupByLibrary.simpleMessage("系统代理"),
|
"action_proxy": MessageLookupByLibrary.simpleMessage("系统代理"),
|
||||||
@@ -97,7 +112,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"clearData": MessageLookupByLibrary.simpleMessage("清除数据"),
|
"clearData": MessageLookupByLibrary.simpleMessage("清除数据"),
|
||||||
"clipboardExport": MessageLookupByLibrary.simpleMessage("导出剪贴板"),
|
"clipboardExport": MessageLookupByLibrary.simpleMessage("导出剪贴板"),
|
||||||
"clipboardImport": MessageLookupByLibrary.simpleMessage("剪贴板导入"),
|
"clipboardImport": MessageLookupByLibrary.simpleMessage("剪贴板导入"),
|
||||||
"colorExists": MessageLookupByLibrary.simpleMessage("该颜色已存在"),
|
"color": MessageLookupByLibrary.simpleMessage("颜色"),
|
||||||
"colorSchemes": MessageLookupByLibrary.simpleMessage("配色方案"),
|
"colorSchemes": MessageLookupByLibrary.simpleMessage("配色方案"),
|
||||||
"columns": MessageLookupByLibrary.simpleMessage("列数"),
|
"columns": MessageLookupByLibrary.simpleMessage("列数"),
|
||||||
"compatible": MessageLookupByLibrary.simpleMessage("兼容模式"),
|
"compatible": MessageLookupByLibrary.simpleMessage("兼容模式"),
|
||||||
@@ -110,7 +125,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"connectivity": MessageLookupByLibrary.simpleMessage("连通性:"),
|
"connectivity": MessageLookupByLibrary.simpleMessage("连通性:"),
|
||||||
"contactMe": MessageLookupByLibrary.simpleMessage("联系我"),
|
"contactMe": MessageLookupByLibrary.simpleMessage("联系我"),
|
||||||
"content": MessageLookupByLibrary.simpleMessage("内容"),
|
"content": MessageLookupByLibrary.simpleMessage("内容"),
|
||||||
"contentEmptyTip": MessageLookupByLibrary.simpleMessage("内容不能为空"),
|
|
||||||
"contentScheme": MessageLookupByLibrary.simpleMessage("内容主题"),
|
"contentScheme": MessageLookupByLibrary.simpleMessage("内容主题"),
|
||||||
"copy": MessageLookupByLibrary.simpleMessage("复制"),
|
"copy": MessageLookupByLibrary.simpleMessage("复制"),
|
||||||
"copyEnvVar": MessageLookupByLibrary.simpleMessage("复制环境变量"),
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage("复制环境变量"),
|
||||||
@@ -132,9 +146,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"delay": MessageLookupByLibrary.simpleMessage("延迟"),
|
"delay": MessageLookupByLibrary.simpleMessage("延迟"),
|
||||||
"delaySort": MessageLookupByLibrary.simpleMessage("按延迟排序"),
|
"delaySort": MessageLookupByLibrary.simpleMessage("按延迟排序"),
|
||||||
"delete": MessageLookupByLibrary.simpleMessage("删除"),
|
"delete": MessageLookupByLibrary.simpleMessage("删除"),
|
||||||
"deleteColorTip": MessageLookupByLibrary.simpleMessage("确定删除当前颜色吗?"),
|
"deleteMultipTip": m0,
|
||||||
"deleteProfileTip": MessageLookupByLibrary.simpleMessage("确定要删除当前配置吗?"),
|
"deleteTip": m1,
|
||||||
"deleteRuleTip": MessageLookupByLibrary.simpleMessage("确定要删除选中的规则吗?"),
|
|
||||||
"desc": MessageLookupByLibrary.simpleMessage(
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"基于ClashMeta的多平台代理客户端,简单易用,开源无广告。",
|
"基于ClashMeta的多平台代理客户端,简单易用,开源无广告。",
|
||||||
),
|
),
|
||||||
@@ -154,11 +167,13 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"domain": MessageLookupByLibrary.simpleMessage("域名"),
|
"domain": MessageLookupByLibrary.simpleMessage("域名"),
|
||||||
"download": MessageLookupByLibrary.simpleMessage("下载"),
|
"download": MessageLookupByLibrary.simpleMessage("下载"),
|
||||||
"edit": MessageLookupByLibrary.simpleMessage("编辑"),
|
"edit": MessageLookupByLibrary.simpleMessage("编辑"),
|
||||||
|
"emptyTip": m2,
|
||||||
"en": MessageLookupByLibrary.simpleMessage("英语"),
|
"en": MessageLookupByLibrary.simpleMessage("英语"),
|
||||||
"enableOverride": MessageLookupByLibrary.simpleMessage("启用覆写"),
|
"enableOverride": MessageLookupByLibrary.simpleMessage("启用覆写"),
|
||||||
"entries": MessageLookupByLibrary.simpleMessage("个条目"),
|
"entries": MessageLookupByLibrary.simpleMessage("个条目"),
|
||||||
"exclude": MessageLookupByLibrary.simpleMessage("从最近任务中隐藏"),
|
"exclude": MessageLookupByLibrary.simpleMessage("从最近任务中隐藏"),
|
||||||
"excludeDesc": MessageLookupByLibrary.simpleMessage("应用在后台时,从最近任务中隐藏应用"),
|
"excludeDesc": MessageLookupByLibrary.simpleMessage("应用在后台时,从最近任务中隐藏应用"),
|
||||||
|
"existsTip": m3,
|
||||||
"exit": MessageLookupByLibrary.simpleMessage("退出"),
|
"exit": MessageLookupByLibrary.simpleMessage("退出"),
|
||||||
"expand": MessageLookupByLibrary.simpleMessage("标准"),
|
"expand": MessageLookupByLibrary.simpleMessage("标准"),
|
||||||
"expirationTime": MessageLookupByLibrary.simpleMessage("到期时间"),
|
"expirationTime": MessageLookupByLibrary.simpleMessage("到期时间"),
|
||||||
@@ -206,12 +221,16 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"icon": MessageLookupByLibrary.simpleMessage("图片"),
|
"icon": MessageLookupByLibrary.simpleMessage("图片"),
|
||||||
"iconConfiguration": MessageLookupByLibrary.simpleMessage("图片配置"),
|
"iconConfiguration": MessageLookupByLibrary.simpleMessage("图片配置"),
|
||||||
"iconStyle": MessageLookupByLibrary.simpleMessage("图标样式"),
|
"iconStyle": MessageLookupByLibrary.simpleMessage("图标样式"),
|
||||||
|
"import": MessageLookupByLibrary.simpleMessage("导入"),
|
||||||
|
"importFile": MessageLookupByLibrary.simpleMessage("通过文件导入"),
|
||||||
"importFromURL": MessageLookupByLibrary.simpleMessage("从URL导入"),
|
"importFromURL": MessageLookupByLibrary.simpleMessage("从URL导入"),
|
||||||
|
"importUrl": MessageLookupByLibrary.simpleMessage("通过URL导入"),
|
||||||
"infiniteTime": MessageLookupByLibrary.simpleMessage("长期有效"),
|
"infiniteTime": MessageLookupByLibrary.simpleMessage("长期有效"),
|
||||||
"init": MessageLookupByLibrary.simpleMessage("初始化"),
|
"init": MessageLookupByLibrary.simpleMessage("初始化"),
|
||||||
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("请输入正确的快捷键"),
|
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("请输入正确的快捷键"),
|
||||||
"intelligentSelected": MessageLookupByLibrary.simpleMessage("智能选择"),
|
"intelligentSelected": MessageLookupByLibrary.simpleMessage("智能选择"),
|
||||||
"internet": MessageLookupByLibrary.simpleMessage("互联网"),
|
"internet": MessageLookupByLibrary.simpleMessage("互联网"),
|
||||||
|
"interval": MessageLookupByLibrary.simpleMessage("间隔"),
|
||||||
"intranetIP": MessageLookupByLibrary.simpleMessage("内网 IP"),
|
"intranetIP": MessageLookupByLibrary.simpleMessage("内网 IP"),
|
||||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IP/掩码"),
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IP/掩码"),
|
||||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
||||||
@@ -220,7 +239,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
||||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage("TCP保持活动间隔"),
|
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage("TCP保持活动间隔"),
|
||||||
"key": MessageLookupByLibrary.simpleMessage("键"),
|
"key": MessageLookupByLibrary.simpleMessage("键"),
|
||||||
"keyExists": MessageLookupByLibrary.simpleMessage("当前键已存在"),
|
|
||||||
"language": MessageLookupByLibrary.simpleMessage("语言"),
|
"language": MessageLookupByLibrary.simpleMessage("语言"),
|
||||||
"layout": MessageLookupByLibrary.simpleMessage("布局"),
|
"layout": MessageLookupByLibrary.simpleMessage("布局"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("浅色"),
|
"light": MessageLookupByLibrary.simpleMessage("浅色"),
|
||||||
@@ -245,6 +263,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"minimizeOnExit": MessageLookupByLibrary.simpleMessage("退出时最小化"),
|
"minimizeOnExit": MessageLookupByLibrary.simpleMessage("退出时最小化"),
|
||||||
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage("修改系统默认退出事件"),
|
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage("修改系统默认退出事件"),
|
||||||
"minutes": MessageLookupByLibrary.simpleMessage("分钟"),
|
"minutes": MessageLookupByLibrary.simpleMessage("分钟"),
|
||||||
|
"mixedPort": MessageLookupByLibrary.simpleMessage("混合端口"),
|
||||||
"mode": MessageLookupByLibrary.simpleMessage("模式"),
|
"mode": MessageLookupByLibrary.simpleMessage("模式"),
|
||||||
"monochromeScheme": MessageLookupByLibrary.simpleMessage("单色"),
|
"monochromeScheme": MessageLookupByLibrary.simpleMessage("单色"),
|
||||||
"months": MessageLookupByLibrary.simpleMessage("月"),
|
"months": MessageLookupByLibrary.simpleMessage("月"),
|
||||||
@@ -271,14 +290,10 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"noProxyDesc": MessageLookupByLibrary.simpleMessage("请创建配置文件或者添加有效配置文件"),
|
"noProxyDesc": MessageLookupByLibrary.simpleMessage("请创建配置文件或者添加有效配置文件"),
|
||||||
"noResolve": MessageLookupByLibrary.simpleMessage("不解析IP"),
|
"noResolve": MessageLookupByLibrary.simpleMessage("不解析IP"),
|
||||||
"none": MessageLookupByLibrary.simpleMessage("无"),
|
"none": MessageLookupByLibrary.simpleMessage("无"),
|
||||||
"notEmpty": MessageLookupByLibrary.simpleMessage("不能为空"),
|
|
||||||
"notSelectedTip": MessageLookupByLibrary.simpleMessage("当前代理组无法选中"),
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage("当前代理组无法选中"),
|
||||||
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage("暂无连接"),
|
|
||||||
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage("无法获取内核信息"),
|
|
||||||
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("暂无日志"),
|
|
||||||
"nullProfileDesc": MessageLookupByLibrary.simpleMessage("没有配置文件,请先添加配置文件"),
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage("没有配置文件,请先添加配置文件"),
|
||||||
"nullProxies": MessageLookupByLibrary.simpleMessage("暂无代理"),
|
"nullTip": m4,
|
||||||
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("暂无请求"),
|
"numberTip": m5,
|
||||||
"oneColumn": MessageLookupByLibrary.simpleMessage("一列"),
|
"oneColumn": MessageLookupByLibrary.simpleMessage("一列"),
|
||||||
"onlyIcon": MessageLookupByLibrary.simpleMessage("仅图标"),
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("仅图标"),
|
||||||
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("仅第三方应用"),
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("仅第三方应用"),
|
||||||
@@ -294,12 +309,13 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"overrideDesc": MessageLookupByLibrary.simpleMessage("覆写代理相关配置"),
|
"overrideDesc": MessageLookupByLibrary.simpleMessage("覆写代理相关配置"),
|
||||||
"overrideDns": MessageLookupByLibrary.simpleMessage("覆写DNS"),
|
"overrideDns": MessageLookupByLibrary.simpleMessage("覆写DNS"),
|
||||||
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage("开启后将覆盖配置中的DNS选项"),
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage("开启后将覆盖配置中的DNS选项"),
|
||||||
|
"overrideInvalidTip": MessageLookupByLibrary.simpleMessage("在脚本模式下不生效"),
|
||||||
"overrideOriginRules": MessageLookupByLibrary.simpleMessage("覆盖原始规则"),
|
"overrideOriginRules": MessageLookupByLibrary.simpleMessage("覆盖原始规则"),
|
||||||
"palette": MessageLookupByLibrary.simpleMessage("调色板"),
|
"palette": MessageLookupByLibrary.simpleMessage("调色板"),
|
||||||
"password": MessageLookupByLibrary.simpleMessage("密码"),
|
"password": MessageLookupByLibrary.simpleMessage("密码"),
|
||||||
"passwordTip": MessageLookupByLibrary.simpleMessage("密码不能为空"),
|
|
||||||
"paste": MessageLookupByLibrary.simpleMessage("粘贴"),
|
"paste": MessageLookupByLibrary.simpleMessage("粘贴"),
|
||||||
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage("请绑定WebDAV"),
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage("请绑定WebDAV"),
|
||||||
|
"pleaseEnterScriptName": MessageLookupByLibrary.simpleMessage("请输入脚本名称"),
|
||||||
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
"请输入管理员密码",
|
"请输入管理员密码",
|
||||||
),
|
),
|
||||||
@@ -308,6 +324,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"请上传有效的二维码",
|
"请上传有效的二维码",
|
||||||
),
|
),
|
||||||
"port": MessageLookupByLibrary.simpleMessage("端口"),
|
"port": MessageLookupByLibrary.simpleMessage("端口"),
|
||||||
|
"portConflictTip": MessageLookupByLibrary.simpleMessage("请输入不同的端口"),
|
||||||
|
"portTip": m6,
|
||||||
"preferH3Desc": MessageLookupByLibrary.simpleMessage("优先使用DOH的http/3"),
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage("优先使用DOH的http/3"),
|
||||||
"pressKeyboard": MessageLookupByLibrary.simpleMessage("请按下按键"),
|
"pressKeyboard": MessageLookupByLibrary.simpleMessage("请按下按键"),
|
||||||
"preview": MessageLookupByLibrary.simpleMessage("预览"),
|
"preview": MessageLookupByLibrary.simpleMessage("预览"),
|
||||||
@@ -352,12 +370,14 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"recoveryStrategy_compatible": MessageLookupByLibrary.simpleMessage("兼容"),
|
"recoveryStrategy_compatible": MessageLookupByLibrary.simpleMessage("兼容"),
|
||||||
"recoveryStrategy_override": MessageLookupByLibrary.simpleMessage("覆盖"),
|
"recoveryStrategy_override": MessageLookupByLibrary.simpleMessage("覆盖"),
|
||||||
"recoverySuccess": MessageLookupByLibrary.simpleMessage("恢复成功"),
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage("恢复成功"),
|
||||||
|
"redirPort": MessageLookupByLibrary.simpleMessage("Redir端口"),
|
||||||
"redo": MessageLookupByLibrary.simpleMessage("重做"),
|
"redo": MessageLookupByLibrary.simpleMessage("重做"),
|
||||||
"regExp": MessageLookupByLibrary.simpleMessage("正则"),
|
"regExp": MessageLookupByLibrary.simpleMessage("正则"),
|
||||||
"remote": MessageLookupByLibrary.simpleMessage("远程"),
|
"remote": MessageLookupByLibrary.simpleMessage("远程"),
|
||||||
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage("备份数据到WebDAV"),
|
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage("备份数据到WebDAV"),
|
||||||
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage("通过WebDAV恢复数据"),
|
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage("通过WebDAV恢复数据"),
|
||||||
"remove": MessageLookupByLibrary.simpleMessage("移除"),
|
"remove": MessageLookupByLibrary.simpleMessage("移除"),
|
||||||
|
"rename": MessageLookupByLibrary.simpleMessage("重命名"),
|
||||||
"requests": MessageLookupByLibrary.simpleMessage("请求"),
|
"requests": MessageLookupByLibrary.simpleMessage("请求"),
|
||||||
"requestsDesc": MessageLookupByLibrary.simpleMessage("查看最近请求记录"),
|
"requestsDesc": MessageLookupByLibrary.simpleMessage("查看最近请求记录"),
|
||||||
"reset": MessageLookupByLibrary.simpleMessage("重置"),
|
"reset": MessageLookupByLibrary.simpleMessage("重置"),
|
||||||
@@ -376,24 +396,24 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ru": MessageLookupByLibrary.simpleMessage("俄语"),
|
"ru": MessageLookupByLibrary.simpleMessage("俄语"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("规则"),
|
"rule": MessageLookupByLibrary.simpleMessage("规则"),
|
||||||
"ruleName": MessageLookupByLibrary.simpleMessage("规则名称"),
|
"ruleName": MessageLookupByLibrary.simpleMessage("规则名称"),
|
||||||
"ruleProviderEmptyTip": MessageLookupByLibrary.simpleMessage("规则提供者不能为空"),
|
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("规则提供者"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("规则提供者"),
|
||||||
"ruleTarget": MessageLookupByLibrary.simpleMessage("规则目标"),
|
"ruleTarget": MessageLookupByLibrary.simpleMessage("规则目标"),
|
||||||
"ruleTargetEmptyTip": MessageLookupByLibrary.simpleMessage("规则目标不能为空"),
|
|
||||||
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||||
"saveChanges": MessageLookupByLibrary.simpleMessage("是否保存更改?"),
|
"saveChanges": MessageLookupByLibrary.simpleMessage("是否保存更改?"),
|
||||||
"saveTip": MessageLookupByLibrary.simpleMessage("确定要保存吗?"),
|
"saveTip": MessageLookupByLibrary.simpleMessage("确定要保存吗?"),
|
||||||
|
"script": MessageLookupByLibrary.simpleMessage("脚本"),
|
||||||
"search": MessageLookupByLibrary.simpleMessage("搜索"),
|
"search": MessageLookupByLibrary.simpleMessage("搜索"),
|
||||||
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
||||||
"selectAll": MessageLookupByLibrary.simpleMessage("全选"),
|
"selectAll": MessageLookupByLibrary.simpleMessage("全选"),
|
||||||
"selected": MessageLookupByLibrary.simpleMessage("已选择"),
|
"selected": MessageLookupByLibrary.simpleMessage("已选择"),
|
||||||
"selectedCountTitle": m0,
|
"selectedCountTitle": m7,
|
||||||
"settings": MessageLookupByLibrary.simpleMessage("设置"),
|
"settings": MessageLookupByLibrary.simpleMessage("设置"),
|
||||||
"show": MessageLookupByLibrary.simpleMessage("显示"),
|
"show": MessageLookupByLibrary.simpleMessage("显示"),
|
||||||
"shrink": MessageLookupByLibrary.simpleMessage("紧凑"),
|
"shrink": MessageLookupByLibrary.simpleMessage("紧凑"),
|
||||||
"silentLaunch": MessageLookupByLibrary.simpleMessage("静默启动"),
|
"silentLaunch": MessageLookupByLibrary.simpleMessage("静默启动"),
|
||||||
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("后台启动"),
|
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("后台启动"),
|
||||||
"size": MessageLookupByLibrary.simpleMessage("尺寸"),
|
"size": MessageLookupByLibrary.simpleMessage("尺寸"),
|
||||||
|
"socksPort": MessageLookupByLibrary.simpleMessage("Socks端口"),
|
||||||
"sort": MessageLookupByLibrary.simpleMessage("排序"),
|
"sort": MessageLookupByLibrary.simpleMessage("排序"),
|
||||||
"source": MessageLookupByLibrary.simpleMessage("来源"),
|
"source": MessageLookupByLibrary.simpleMessage("来源"),
|
||||||
"sourceIp": MessageLookupByLibrary.simpleMessage("源IP"),
|
"sourceIp": MessageLookupByLibrary.simpleMessage("源IP"),
|
||||||
@@ -407,7 +427,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"stopVpn": MessageLookupByLibrary.simpleMessage("正在停止VPN..."),
|
"stopVpn": MessageLookupByLibrary.simpleMessage("正在停止VPN..."),
|
||||||
"style": MessageLookupByLibrary.simpleMessage("风格"),
|
"style": MessageLookupByLibrary.simpleMessage("风格"),
|
||||||
"subRule": MessageLookupByLibrary.simpleMessage("子规则"),
|
"subRule": MessageLookupByLibrary.simpleMessage("子规则"),
|
||||||
"subRuleEmptyTip": MessageLookupByLibrary.simpleMessage("子规则内容不能为空"),
|
|
||||||
"submit": MessageLookupByLibrary.simpleMessage("提交"),
|
"submit": MessageLookupByLibrary.simpleMessage("提交"),
|
||||||
"sync": MessageLookupByLibrary.simpleMessage("同步"),
|
"sync": MessageLookupByLibrary.simpleMessage("同步"),
|
||||||
"system": MessageLookupByLibrary.simpleMessage("系统"),
|
"system": MessageLookupByLibrary.simpleMessage("系统"),
|
||||||
@@ -433,6 +452,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"toggle": MessageLookupByLibrary.simpleMessage("切换"),
|
"toggle": MessageLookupByLibrary.simpleMessage("切换"),
|
||||||
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("调性点缀"),
|
"tonalSpotScheme": MessageLookupByLibrary.simpleMessage("调性点缀"),
|
||||||
"tools": MessageLookupByLibrary.simpleMessage("工具"),
|
"tools": MessageLookupByLibrary.simpleMessage("工具"),
|
||||||
|
"tproxyPort": MessageLookupByLibrary.simpleMessage("Tproxy端口"),
|
||||||
"trafficUsage": MessageLookupByLibrary.simpleMessage("流量统计"),
|
"trafficUsage": MessageLookupByLibrary.simpleMessage("流量统计"),
|
||||||
"tun": MessageLookupByLibrary.simpleMessage("虚拟网卡"),
|
"tun": MessageLookupByLibrary.simpleMessage("虚拟网卡"),
|
||||||
"tunDesc": MessageLookupByLibrary.simpleMessage("仅在管理员模式生效"),
|
"tunDesc": MessageLookupByLibrary.simpleMessage("仅在管理员模式生效"),
|
||||||
@@ -444,14 +464,15 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"unifiedDelay": MessageLookupByLibrary.simpleMessage("统一延迟"),
|
"unifiedDelay": MessageLookupByLibrary.simpleMessage("统一延迟"),
|
||||||
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage("去除握手等额外延迟"),
|
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage("去除握手等额外延迟"),
|
||||||
"unknown": MessageLookupByLibrary.simpleMessage("未知"),
|
"unknown": MessageLookupByLibrary.simpleMessage("未知"),
|
||||||
|
"unnamed": MessageLookupByLibrary.simpleMessage("未命名"),
|
||||||
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
||||||
"upload": MessageLookupByLibrary.simpleMessage("上传"),
|
"upload": MessageLookupByLibrary.simpleMessage("上传"),
|
||||||
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
"urlDesc": MessageLookupByLibrary.simpleMessage("通过URL获取配置文件"),
|
"urlDesc": MessageLookupByLibrary.simpleMessage("通过URL获取配置文件"),
|
||||||
|
"urlTip": m8,
|
||||||
"useHosts": MessageLookupByLibrary.simpleMessage("使用Hosts"),
|
"useHosts": MessageLookupByLibrary.simpleMessage("使用Hosts"),
|
||||||
"useSystemHosts": MessageLookupByLibrary.simpleMessage("使用系统Hosts"),
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage("使用系统Hosts"),
|
||||||
"value": MessageLookupByLibrary.simpleMessage("值"),
|
"value": MessageLookupByLibrary.simpleMessage("值"),
|
||||||
"valueExists": MessageLookupByLibrary.simpleMessage("当前值已存在"),
|
|
||||||
"vibrantScheme": MessageLookupByLibrary.simpleMessage("活力"),
|
"vibrantScheme": MessageLookupByLibrary.simpleMessage("活力"),
|
||||||
"view": MessageLookupByLibrary.simpleMessage("查看"),
|
"view": MessageLookupByLibrary.simpleMessage("查看"),
|
||||||
"vpnDesc": MessageLookupByLibrary.simpleMessage("修改VPN相关设置"),
|
"vpnDesc": MessageLookupByLibrary.simpleMessage("修改VPN相关设置"),
|
||||||
|
|||||||
@@ -140,16 +140,6 @@ class AppLocalizations {
|
|||||||
return Intl.message('Core info', name: 'coreInfo', desc: '', args: []);
|
return Intl.message('Core info', name: 'coreInfo', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Unable to obtain core info`
|
|
||||||
String get nullCoreInfoDesc {
|
|
||||||
return Intl.message(
|
|
||||||
'Unable to obtain core info',
|
|
||||||
name: 'nullCoreInfoDesc',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Network speed`
|
/// `Network speed`
|
||||||
String get networkSpeed {
|
String get networkSpeed {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -215,11 +205,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `No logs`
|
|
||||||
String get nullLogsDesc {
|
|
||||||
return Intl.message('No logs', name: 'nullLogsDesc', desc: '', args: []);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Settings`
|
/// `Settings`
|
||||||
String get settings {
|
String get settings {
|
||||||
return Intl.message('Settings', name: 'settings', desc: '', args: []);
|
return Intl.message('Settings', name: 'settings', desc: '', args: []);
|
||||||
@@ -1160,26 +1145,6 @@ class AppLocalizations {
|
|||||||
return Intl.message('Password', name: 'password', desc: '', args: []);
|
return Intl.message('Password', name: 'password', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Password cannot be empty`
|
|
||||||
String get passwordTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Password cannot be empty',
|
|
||||||
name: 'passwordTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Account cannot be empty`
|
|
||||||
String get accountTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Account cannot be empty',
|
|
||||||
name: 'accountTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Check for updates`
|
/// `Check for updates`
|
||||||
String get checkUpdate {
|
String get checkUpdate {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -1465,26 +1430,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `No requests`
|
|
||||||
String get nullRequestsDesc {
|
|
||||||
return Intl.message(
|
|
||||||
'No requests',
|
|
||||||
name: 'nullRequestsDesc',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `No connections`
|
|
||||||
String get nullConnectionsDesc {
|
|
||||||
return Intl.message(
|
|
||||||
'No connections',
|
|
||||||
name: 'nullConnectionsDesc',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Intranet IP`
|
/// `Intranet IP`
|
||||||
String get intranetIP {
|
String get intranetIP {
|
||||||
return Intl.message('Intranet IP', name: 'intranetIP', desc: '', args: []);
|
return Intl.message('Intranet IP', name: 'intranetIP', desc: '', args: []);
|
||||||
@@ -1700,16 +1645,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Sure you want to delete the current profile?`
|
|
||||||
String get deleteProfileTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Sure you want to delete the current profile?',
|
|
||||||
name: 'deleteProfileTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Pure black mode`
|
/// `Pure black mode`
|
||||||
String get pureBlackMode {
|
String get pureBlackMode {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -1930,16 +1865,6 @@ class AppLocalizations {
|
|||||||
return Intl.message('Value', name: 'value', desc: '', args: []);
|
return Intl.message('Value', name: 'value', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Cannot be empty`
|
|
||||||
String get notEmpty {
|
|
||||||
return Intl.message(
|
|
||||||
'Cannot be empty',
|
|
||||||
name: 'notEmpty',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Add Hosts`
|
/// `Add Hosts`
|
||||||
String get hostsDesc {
|
String get hostsDesc {
|
||||||
return Intl.message('Add Hosts', name: 'hostsDesc', desc: '', args: []);
|
return Intl.message('Add Hosts', name: 'hostsDesc', desc: '', args: []);
|
||||||
@@ -2615,11 +2540,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `No proxies`
|
|
||||||
String get nullProxies {
|
|
||||||
return Intl.message('No proxies', name: 'nullProxies', desc: '', args: []);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Copy success`
|
/// `Copy success`
|
||||||
String get copySuccess {
|
String get copySuccess {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -2665,26 +2585,6 @@ class AppLocalizations {
|
|||||||
return Intl.message('Listen', name: 'listen', desc: '', args: []);
|
return Intl.message('Listen', name: 'listen', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `The current key already exists`
|
|
||||||
String get keyExists {
|
|
||||||
return Intl.message(
|
|
||||||
'The current key already exists',
|
|
||||||
name: 'keyExists',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `The current value already exists`
|
|
||||||
String get valueExists {
|
|
||||||
return Intl.message(
|
|
||||||
'The current value already exists',
|
|
||||||
name: 'valueExists',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `undo`
|
/// `undo`
|
||||||
String get undo {
|
String get undo {
|
||||||
return Intl.message('undo', name: 'undo', desc: '', args: []);
|
return Intl.message('undo', name: 'undo', desc: '', args: []);
|
||||||
@@ -2735,16 +2635,6 @@ class AppLocalizations {
|
|||||||
return Intl.message('Add rule', name: 'addRule', desc: '', args: []);
|
return Intl.message('Add rule', name: 'addRule', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Rule provider cannot be empty`
|
|
||||||
String get ruleProviderEmptyTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Rule provider cannot be empty',
|
|
||||||
name: 'ruleProviderEmptyTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Rule name`
|
/// `Rule name`
|
||||||
String get ruleName {
|
String get ruleName {
|
||||||
return Intl.message('Rule name', name: 'ruleName', desc: '', args: []);
|
return Intl.message('Rule name', name: 'ruleName', desc: '', args: []);
|
||||||
@@ -2755,46 +2645,16 @@ class AppLocalizations {
|
|||||||
return Intl.message('Content', name: 'content', desc: '', args: []);
|
return Intl.message('Content', name: 'content', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Content cannot be empty`
|
|
||||||
String get contentEmptyTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Content cannot be empty',
|
|
||||||
name: 'contentEmptyTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Sub rule`
|
/// `Sub rule`
|
||||||
String get subRule {
|
String get subRule {
|
||||||
return Intl.message('Sub rule', name: 'subRule', desc: '', args: []);
|
return Intl.message('Sub rule', name: 'subRule', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Sub rule content cannot be empty`
|
|
||||||
String get subRuleEmptyTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Sub rule content cannot be empty',
|
|
||||||
name: 'subRuleEmptyTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Rule target`
|
/// `Rule target`
|
||||||
String get ruleTarget {
|
String get ruleTarget {
|
||||||
return Intl.message('Rule target', name: 'ruleTarget', desc: '', args: []);
|
return Intl.message('Rule target', name: 'ruleTarget', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Rule target cannot be empty`
|
|
||||||
String get ruleTargetEmptyTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Rule target cannot be empty',
|
|
||||||
name: 'ruleTargetEmptyTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Source IP`
|
/// `Source IP`
|
||||||
String get sourceIp {
|
String get sourceIp {
|
||||||
return Intl.message('Source IP', name: 'sourceIp', desc: '', args: []);
|
return Intl.message('Source IP', name: 'sourceIp', desc: '', args: []);
|
||||||
@@ -2845,16 +2705,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Are you sure you want to delete the selected rule?`
|
|
||||||
String get deleteRuleTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Are you sure you want to delete the selected rule?',
|
|
||||||
name: 'deleteRuleTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Do you want to save the changes?`
|
/// `Do you want to save the changes?`
|
||||||
String get saveChanges {
|
String get saveChanges {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -2905,26 +2755,6 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Are you sure you want to delete the current color?`
|
|
||||||
String get deleteColorTip {
|
|
||||||
return Intl.message(
|
|
||||||
'Are you sure you want to delete the current color?',
|
|
||||||
name: 'deleteColorTip',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Current color already exists`
|
|
||||||
String get colorExists {
|
|
||||||
return Intl.message(
|
|
||||||
'Current color already exists',
|
|
||||||
name: 'colorExists',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Color schemes`
|
/// `Color schemes`
|
||||||
String get colorSchemes {
|
String get colorSchemes {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -3119,6 +2949,186 @@ class AppLocalizations {
|
|||||||
String get logsTest {
|
String get logsTest {
|
||||||
return Intl.message('Logs test', name: 'logsTest', desc: '', args: []);
|
return Intl.message('Logs test', name: 'logsTest', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `{label} cannot be empty`
|
||||||
|
String emptyTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'$label cannot be empty',
|
||||||
|
name: 'emptyTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `{label} must be a url`
|
||||||
|
String urlTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'$label must be a url',
|
||||||
|
name: 'urlTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `{label} must be a number`
|
||||||
|
String numberTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'$label must be a number',
|
||||||
|
name: 'numberTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Interval`
|
||||||
|
String get interval {
|
||||||
|
return Intl.message('Interval', name: 'interval', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Current {label} already exists`
|
||||||
|
String existsTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'Current $label already exists',
|
||||||
|
name: 'existsTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Are you sure you want to delete the current {label}?`
|
||||||
|
String deleteTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'Are you sure you want to delete the current $label?',
|
||||||
|
name: 'deleteTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Are you sure you want to delete the selected {label}?`
|
||||||
|
String deleteMultipTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'Are you sure you want to delete the selected $label?',
|
||||||
|
name: 'deleteMultipTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `No {label} at the moment`
|
||||||
|
String nullTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'No $label at the moment',
|
||||||
|
name: 'nullTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Script`
|
||||||
|
String get script {
|
||||||
|
return Intl.message('Script', name: 'script', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Color`
|
||||||
|
String get color {
|
||||||
|
return Intl.message('Color', name: 'color', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Rename`
|
||||||
|
String get rename {
|
||||||
|
return Intl.message('Rename', name: 'rename', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Unnamed`
|
||||||
|
String get unnamed {
|
||||||
|
return Intl.message('Unnamed', name: 'unnamed', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Please enter a script name`
|
||||||
|
String get pleaseEnterScriptName {
|
||||||
|
return Intl.message(
|
||||||
|
'Please enter a script name',
|
||||||
|
name: 'pleaseEnterScriptName',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Does not take effect in script mode`
|
||||||
|
String get overrideInvalidTip {
|
||||||
|
return Intl.message(
|
||||||
|
'Does not take effect in script mode',
|
||||||
|
name: 'overrideInvalidTip',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Mixed Port`
|
||||||
|
String get mixedPort {
|
||||||
|
return Intl.message('Mixed Port', name: 'mixedPort', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Socks Port`
|
||||||
|
String get socksPort {
|
||||||
|
return Intl.message('Socks Port', name: 'socksPort', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Redir Port`
|
||||||
|
String get redirPort {
|
||||||
|
return Intl.message('Redir Port', name: 'redirPort', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Tproxy Port`
|
||||||
|
String get tproxyPort {
|
||||||
|
return Intl.message('Tproxy Port', name: 'tproxyPort', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `{label} must be between 1024 and 49151`
|
||||||
|
String portTip(Object label) {
|
||||||
|
return Intl.message(
|
||||||
|
'$label must be between 1024 and 49151',
|
||||||
|
name: 'portTip',
|
||||||
|
desc: '',
|
||||||
|
args: [label],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Please enter a different port`
|
||||||
|
String get portConflictTip {
|
||||||
|
return Intl.message(
|
||||||
|
'Please enter a different port',
|
||||||
|
name: 'portConflictTip',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Import`
|
||||||
|
String get import {
|
||||||
|
return Intl.message('Import', name: 'import', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Import from file`
|
||||||
|
String get importFile {
|
||||||
|
return Intl.message(
|
||||||
|
'Import from file',
|
||||||
|
name: 'importFile',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Import from URL`
|
||||||
|
String get importUrl {
|
||||||
|
return Intl.message(
|
||||||
|
'Import from URL',
|
||||||
|
name: 'importUrl',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import 'dart:io';
|
|||||||
import 'dart:isolate';
|
import 'dart:isolate';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:fl_clash/models/core.dart';
|
|
||||||
import 'package:fl_clash/plugins/app.dart';
|
import 'package:fl_clash/plugins/app.dart';
|
||||||
import 'package:fl_clash/plugins/tile.dart';
|
import 'package:fl_clash/plugins/tile.dart';
|
||||||
import 'package:fl_clash/plugins/vpn.dart';
|
import 'package:fl_clash/plugins/vpn.dart';
|
||||||
@@ -17,13 +16,11 @@ import 'application.dart';
|
|||||||
import 'clash/core.dart';
|
import 'clash/core.dart';
|
||||||
import 'clash/lib.dart';
|
import 'clash/lib.dart';
|
||||||
import 'common/common.dart';
|
import 'common/common.dart';
|
||||||
|
import 'models/models.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
globalState.isService = false;
|
globalState.isService = false;
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
FlutterError.onError = (details) {
|
|
||||||
commonPrint.log(details.stack.toString());
|
|
||||||
};
|
|
||||||
final version = await system.version;
|
final version = await system.version;
|
||||||
await clashCore.preload();
|
await clashCore.preload();
|
||||||
await globalState.initApp(version);
|
await globalState.initApp(version);
|
||||||
@@ -77,27 +74,35 @@ Future<void> _service(List<String> flags) async {
|
|||||||
app?.tip(appLocalizations.startVpn);
|
app?.tip(appLocalizations.startVpn);
|
||||||
final homeDirPath = await appPath.homeDirPath;
|
final homeDirPath = await appPath.homeDirPath;
|
||||||
final version = await system.version;
|
final version = await system.version;
|
||||||
clashLibHandler
|
final clashConfig = globalState.config.patchClashConfig.copyWith.tun(
|
||||||
.quickStart(
|
enable: false,
|
||||||
InitParams(
|
|
||||||
homeDir: homeDirPath,
|
|
||||||
version: version,
|
|
||||||
),
|
|
||||||
globalState.getUpdateConfigParams(),
|
|
||||||
globalState.getCoreState(),
|
|
||||||
)
|
|
||||||
.then(
|
|
||||||
(res) async {
|
|
||||||
if (res.isNotEmpty) {
|
|
||||||
await vpn?.stop();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
await vpn?.start(
|
|
||||||
clashLibHandler.getAndroidVpnOptions(),
|
|
||||||
);
|
|
||||||
clashLibHandler.startListener();
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
Future(() async {
|
||||||
|
final profileId = globalState.config.currentProfileId;
|
||||||
|
if (profileId == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final params = await globalState.getSetupParams(
|
||||||
|
pathConfig: clashConfig,
|
||||||
|
);
|
||||||
|
final res = await clashLibHandler.quickStart(
|
||||||
|
InitParams(
|
||||||
|
homeDir: homeDirPath,
|
||||||
|
version: version,
|
||||||
|
),
|
||||||
|
params,
|
||||||
|
globalState.getCoreState(),
|
||||||
|
);
|
||||||
|
debugPrint(res);
|
||||||
|
if (res.isNotEmpty) {
|
||||||
|
await vpn?.stop();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
await vpn?.start(
|
||||||
|
clashLibHandler.getAndroidVpnOptions(),
|
||||||
|
);
|
||||||
|
clashLibHandler.startListener();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,20 @@ class _AppStateManagerState extends ConsumerState<AppStateManager>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
ref.listenManual(
|
||||||
|
checkIpProvider,
|
||||||
|
(prev, next) {
|
||||||
|
if (prev != next && next.b) {
|
||||||
|
detectionState.startCheck();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fireImmediately: true,
|
||||||
|
);
|
||||||
|
ref.listenManual(configStateProvider, (prev, next) {
|
||||||
|
if (prev != next) {
|
||||||
|
globalState.appController.savePreferencesDebounce();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class _ClashContainerState extends ConsumerState<ClashManager>
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
clashMessage.addListener(this);
|
clashMessage.addListener(this);
|
||||||
ref.listenManual(currentProfileIdProvider, (prev, next) {
|
ref.listenManual(needSetupProvider, (prev, next) {
|
||||||
if (prev != next) {
|
if (prev != next) {
|
||||||
globalState.appController.handleChangeProfile();
|
globalState.appController.handleChangeProfile();
|
||||||
}
|
}
|
||||||
@@ -42,11 +42,23 @@ class _ClashContainerState extends ConsumerState<ClashManager>
|
|||||||
await clashCore.setState(next);
|
await clashCore.setState(next);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ref.listenManual(clashConfigStateProvider, (prev, next) {
|
ref.listenManual(updateParamsProvider, (prev, next) {
|
||||||
if (prev != next) {
|
if (prev != next) {
|
||||||
globalState.appController.updateClashConfigDebounce();
|
globalState.appController.updateClashConfigDebounce();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ref.listenManual(
|
||||||
|
appSettingProvider.select((state) => state.openLogs),
|
||||||
|
(prev, next) {
|
||||||
|
if (next) {
|
||||||
|
clashCore.startLog();
|
||||||
|
} else {
|
||||||
|
clashCore.stopLog();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fireImmediately: true,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -61,7 +73,7 @@ class _ClashContainerState extends ConsumerState<ClashManager>
|
|||||||
final appController = globalState.appController;
|
final appController = globalState.appController;
|
||||||
appController.setDelay(delay);
|
appController.setDelay(delay);
|
||||||
debouncer.call(
|
debouncer.call(
|
||||||
DebounceTag.updateDelay,
|
FunctionTag.updateDelay,
|
||||||
() async {
|
() async {
|
||||||
await appController.updateGroupsDebounce();
|
await appController.updateGroupsDebounce();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class ConnectivityManager extends StatefulWidget {
|
class ConnectivityManager extends StatefulWidget {
|
||||||
final VoidCallback? onConnectivityChanged;
|
final Function(List<ConnectivityResult> results)? onConnectivityChanged;
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
const ConnectivityManager({
|
const ConnectivityManager({
|
||||||
@@ -23,9 +23,9 @@ class _ConnectivityManagerState extends State<ConnectivityManager> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
subscription = Connectivity().onConnectivityChanged.listen((_) async {
|
subscription = Connectivity().onConnectivityChanged.listen((results) async {
|
||||||
if (widget.onConnectivityChanged != null) {
|
if (widget.onConnectivityChanged != null) {
|
||||||
widget.onConnectivityChanged!();
|
widget.onConnectivityChanged!(results);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:hotkey_manager/hotkey_manager.dart';
|
import 'package:hotkey_manager/hotkey_manager.dart';
|
||||||
|
|
||||||
class HotKeyManager extends StatelessWidget {
|
class HotKeyManager extends ConsumerStatefulWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
const HotKeyManager({
|
const HotKeyManager({
|
||||||
@@ -16,6 +16,25 @@ class HotKeyManager extends StatelessWidget {
|
|||||||
required this.child,
|
required this.child,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
ConsumerState<HotKeyManager> createState() => _HotKeyManagerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _HotKeyManagerState extends ConsumerState<HotKeyManager> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
ref.listenManual(
|
||||||
|
hotKeyActionsProvider,
|
||||||
|
(prev, next) {
|
||||||
|
if (!hotKeyActionListEquality.equals(prev, next)) {
|
||||||
|
_updateHotKeys(hotKeyActions: next);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fireImmediately: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
_handleHotKeyAction(HotAction action) async {
|
_handleHotKeyAction(HotAction action) async {
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case HotAction.mode:
|
case HotAction.mode:
|
||||||
@@ -59,22 +78,30 @@ class HotKeyManager extends StatelessWidget {
|
|||||||
await Future.wait(hotkeyActionHandles);
|
await Future.wait(hotkeyActionHandles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_buildShortcuts(Widget child) {
|
||||||
|
return Shortcuts(
|
||||||
|
shortcuts: {
|
||||||
|
utils.controlSingleActivator(LogicalKeyboardKey.keyW):
|
||||||
|
CloseWindowIntent(),
|
||||||
|
},
|
||||||
|
child: Actions(
|
||||||
|
actions: {
|
||||||
|
CloseWindowIntent: CallbackAction<CloseWindowIntent>(
|
||||||
|
onInvoke: (_) => globalState.appController.handleBackOrExit(),
|
||||||
|
),
|
||||||
|
DoNothingIntent: CallbackAction<DoNothingIntent>(
|
||||||
|
onInvoke: (_) => null,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Consumer(
|
return _buildShortcuts(
|
||||||
builder: (_, ref, child) {
|
widget.child,
|
||||||
ref.listenManual(
|
|
||||||
hotKeyActionsProvider,
|
|
||||||
(prev, next) {
|
|
||||||
if (!hotKeyActionListEquality.equals(prev, next)) {
|
|
||||||
_updateHotKeys(hotKeyActions: next);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fireImmediately: true,
|
|
||||||
);
|
|
||||||
return child!;
|
|
||||||
},
|
|
||||||
child: child,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class MessageManagerState extends State<MessageManager> {
|
|||||||
id: utils.uuidV4,
|
id: utils.uuidV4,
|
||||||
text: text,
|
text: text,
|
||||||
);
|
);
|
||||||
|
commonPrint.log(text);
|
||||||
_bufferMessages.add(commonMessage);
|
_bufferMessages.add(commonMessage);
|
||||||
await _showMessage();
|
await _showMessage();
|
||||||
}
|
}
|
||||||
@@ -87,32 +88,32 @@ class MessageManagerState extends State<MessageManager> {
|
|||||||
child: messages.isEmpty
|
child: messages.isEmpty
|
||||||
? SizedBox()
|
? SizedBox()
|
||||||
: LayoutBuilder(
|
: LayoutBuilder(
|
||||||
key: Key(messages.last.id),
|
key: Key(messages.last.id),
|
||||||
builder: (_, constraints) {
|
builder: (_, constraints) {
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(
|
shape: const RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.all(
|
borderRadius: BorderRadius.all(
|
||||||
Radius.circular(12.0),
|
Radius.circular(12.0),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
elevation: 10,
|
||||||
|
color: context.colorScheme.surfaceContainerHigh,
|
||||||
|
child: Container(
|
||||||
|
width: min(
|
||||||
|
constraints.maxWidth,
|
||||||
|
500,
|
||||||
|
),
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 12,
|
||||||
|
vertical: 16,
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
messages.last.text,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
elevation: 10,
|
|
||||||
color: context.colorScheme.surfaceContainerHigh,
|
|
||||||
child: Container(
|
|
||||||
width: min(
|
|
||||||
constraints.maxWidth,
|
|
||||||
500,
|
|
||||||
),
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
horizontal: 12,
|
|
||||||
vertical: 16,
|
|
||||||
),
|
|
||||||
child: Text(
|
|
||||||
messages.last.text,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class ThemeManager extends ConsumerWidget {
|
|||||||
textScaleFactor,
|
textScaleFactor,
|
||||||
),
|
),
|
||||||
padding: padding.copyWith(
|
padding: padding.copyWith(
|
||||||
top: padding.top > height * 0.3 ? 0.0 : padding.top,
|
top: padding.top > height * 0.3 ? 20.0 : padding.top,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: LayoutBuilder(
|
child: LayoutBuilder(
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class _VpnContainerState extends ConsumerState<VpnManager> {
|
|||||||
|
|
||||||
showTip() {
|
showTip() {
|
||||||
debouncer.call(
|
debouncer.call(
|
||||||
DebounceTag.vpnTip,
|
FunctionTag.vpnTip,
|
||||||
() {
|
() {
|
||||||
if (ref.read(runTimeProvider.notifier).isStart) {
|
if (ref.read(runTimeProvider.notifier).isStart) {
|
||||||
globalState.showNotifier(
|
globalState.showNotifier(
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class _WindowContainerState extends ConsumerState<WindowManager>
|
|||||||
(prev, next) {
|
(prev, next) {
|
||||||
if (prev != next) {
|
if (prev != next) {
|
||||||
debouncer.call(
|
debouncer.call(
|
||||||
DebounceTag.autoLaunch,
|
FunctionTag.autoLaunch,
|
||||||
() {
|
() {
|
||||||
autoLaunch?.updateStatus(next);
|
autoLaunch?.updateStatus(next);
|
||||||
},
|
},
|
||||||
@@ -102,9 +102,10 @@ class _WindowContainerState extends ConsumerState<WindowManager>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> onTaskbarCreated() async {
|
void onWindowRestore() {
|
||||||
globalState.appController.updateTray(true);
|
commonPrint.log("restore");
|
||||||
super.onTaskbarCreated();
|
render?.resume();
|
||||||
|
super.onWindowRestore();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ typedef DelayMap = Map<String, Map<String, int?>>;
|
|||||||
class AppState with _$AppState {
|
class AppState with _$AppState {
|
||||||
const factory AppState({
|
const factory AppState({
|
||||||
@Default(false) bool isInit,
|
@Default(false) bool isInit,
|
||||||
|
@Default(false) bool backBlock,
|
||||||
@Default(PageLabel.dashboard) PageLabel pageLabel,
|
@Default(PageLabel.dashboard) PageLabel pageLabel,
|
||||||
@Default([]) List<Package> packages,
|
@Default([]) List<Package> packages,
|
||||||
@Default(0) int sortNum,
|
@Default(0) int sortNum,
|
||||||
@@ -30,7 +31,7 @@ class AppState with _$AppState {
|
|||||||
required FixedList<Log> logs,
|
required FixedList<Log> logs,
|
||||||
required FixedList<Traffic> traffics,
|
required FixedList<Traffic> traffics,
|
||||||
required Traffic totalTraffic,
|
required Traffic totalTraffic,
|
||||||
@Default(false) bool needApply,
|
@Default("") String proxiesQuery,
|
||||||
}) = _AppState;
|
}) = _AppState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
// ignore_for_file: invalid_annotation_target
|
// ignore_for_file: invalid_annotation_target
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
import '../enum/enum.dart';
|
|
||||||
|
|
||||||
part 'generated/clash_config.freezed.dart';
|
part 'generated/clash_config.freezed.dart';
|
||||||
|
|
||||||
part 'generated/clash_config.g.dart';
|
part 'generated/clash_config.g.dart';
|
||||||
|
|
||||||
typedef HostsMap = Map<String, String>;
|
typedef HostsMap = Map<String, String>;
|
||||||
@@ -142,6 +140,41 @@ class RuleProvider with _$RuleProvider {
|
|||||||
_$RuleProviderFromJson(json);
|
_$RuleProviderFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class Sniffer with _$Sniffer {
|
||||||
|
const factory Sniffer({
|
||||||
|
@Default(false) bool enable,
|
||||||
|
@Default(true) @JsonKey(name: "override-destination") bool overrideDest,
|
||||||
|
@Default([]) List<String> sniffing,
|
||||||
|
@Default([]) @JsonKey(name: "force-domain") List<String> forceDomain,
|
||||||
|
@Default([]) @JsonKey(name: "skip-src-address") List<String> skipSrcAddress,
|
||||||
|
@Default([]) @JsonKey(name: "skip-dst-address") List<String> skipDstAddress,
|
||||||
|
@Default([]) @JsonKey(name: "skip-domain") List<String> skipDomain,
|
||||||
|
@Default([]) @JsonKey(name: "port-whitelist") List<String> port,
|
||||||
|
@Default(true) @JsonKey(name: "force-dns-mapping") bool forceDnsMapping,
|
||||||
|
@Default(true) @JsonKey(name: "parse-pure-ip") bool parsePureIp,
|
||||||
|
@Default({}) Map<String, SnifferConfig> sniff,
|
||||||
|
}) = _Sniffer;
|
||||||
|
|
||||||
|
factory Sniffer.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$SnifferFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> _formJsonPorts(List? ports) {
|
||||||
|
return ports?.map((item) => item.toString()).toList() ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class SnifferConfig with _$SnifferConfig {
|
||||||
|
const factory SnifferConfig({
|
||||||
|
@Default([]) @JsonKey(fromJson: _formJsonPorts) List<String> ports,
|
||||||
|
@JsonKey(name: "override-destination") bool? overrideDest,
|
||||||
|
}) = _SnifferConfig;
|
||||||
|
|
||||||
|
factory SnifferConfig.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$SnifferConfigFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class Tun with _$Tun {
|
class Tun with _$Tun {
|
||||||
const factory Tun({
|
const factory Tun({
|
||||||
@@ -408,7 +441,7 @@ List<SubRule> _genSubRules(Map<String, dynamic> json) {
|
|||||||
class ClashConfigSnippet with _$ClashConfigSnippet {
|
class ClashConfigSnippet with _$ClashConfigSnippet {
|
||||||
const factory ClashConfigSnippet({
|
const factory ClashConfigSnippet({
|
||||||
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
@JsonKey(fromJson: _genRule) @Default([]) List<Rule> rule,
|
@JsonKey(fromJson: _genRule, name: "rules") @Default([]) List<Rule> rule,
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
@Default([])
|
@Default([])
|
||||||
List<RuleProvider> ruleProvider,
|
List<RuleProvider> ruleProvider,
|
||||||
@@ -425,6 +458,10 @@ class ClashConfigSnippet with _$ClashConfigSnippet {
|
|||||||
class ClashConfig with _$ClashConfig {
|
class ClashConfig with _$ClashConfig {
|
||||||
const factory ClashConfig({
|
const factory ClashConfig({
|
||||||
@Default(defaultMixedPort) @JsonKey(name: "mixed-port") int mixedPort,
|
@Default(defaultMixedPort) @JsonKey(name: "mixed-port") int mixedPort,
|
||||||
|
@Default(0) @JsonKey(name: "socks-port") int socksPort,
|
||||||
|
@Default(0) @JsonKey(name: "port") int port,
|
||||||
|
@Default(0) @JsonKey(name: "redir-port") int redirPort,
|
||||||
|
@Default(0) @JsonKey(name: "tproxy-port") int tproxyPort,
|
||||||
@Default(Mode.rule) Mode mode,
|
@Default(Mode.rule) Mode mode,
|
||||||
@Default(false) @JsonKey(name: "allow-lan") bool allowLan,
|
@Default(false) @JsonKey(name: "allow-lan") bool allowLan,
|
||||||
@Default(LogLevel.error) @JsonKey(name: "log-level") LogLevel logLevel,
|
@Default(LogLevel.error) @JsonKey(name: "log-level") LogLevel logLevel,
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
part 'generated/common.freezed.dart';
|
part 'generated/common.freezed.dart';
|
||||||
|
|
||||||
part 'generated/common.g.dart';
|
part 'generated/common.g.dart';
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
@@ -17,7 +16,7 @@ class NavigationItem with _$NavigationItem {
|
|||||||
required Icon icon,
|
required Icon icon,
|
||||||
required PageLabel label,
|
required PageLabel label,
|
||||||
final String? description,
|
final String? description,
|
||||||
required Widget fragment,
|
required Widget view,
|
||||||
@Default(true) bool keep,
|
@Default(true) bool keep,
|
||||||
String? path,
|
String? path,
|
||||||
@Default([NavigationItemMode.mobile, NavigationItemMode.desktop])
|
@Default([NavigationItemMode.mobile, NavigationItemMode.desktop])
|
||||||
@@ -129,10 +128,10 @@ extension LogsStateExt on LogsState {
|
|||||||
final lowQuery = query.toLowerCase();
|
final lowQuery = query.toLowerCase();
|
||||||
return logs.where(
|
return logs.where(
|
||||||
(log) {
|
(log) {
|
||||||
final payload = log.payload.toLowerCase();
|
|
||||||
final logLevelName = log.logLevel.name;
|
final logLevelName = log.logLevel.name;
|
||||||
return {logLevelName}.containsAll(keywords) &&
|
return {logLevelName}.containsAll(keywords) &&
|
||||||
((payload.contains(lowQuery)) || logLevelName.contains(lowQuery));
|
((log.payload.toLowerCase().contains(lowQuery)) ||
|
||||||
|
logLevelName.contains(lowQuery));
|
||||||
},
|
},
|
||||||
).toList();
|
).toList();
|
||||||
}
|
}
|
||||||
@@ -504,15 +503,11 @@ class PopupMenuItemData {
|
|||||||
this.icon,
|
this.icon,
|
||||||
required this.label,
|
required this.label,
|
||||||
required this.onPressed,
|
required this.onPressed,
|
||||||
this.type,
|
|
||||||
this.iconSize,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
final double? iconSize;
|
|
||||||
final String label;
|
final String label;
|
||||||
final VoidCallback? onPressed;
|
final VoidCallback? onPressed;
|
||||||
final IconData? icon;
|
final IconData? icon;
|
||||||
final PopupMenuItemType? type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
@@ -528,3 +523,56 @@ class TextPainterParams with _$TextPainterParams {
|
|||||||
factory TextPainterParams.fromJson(Map<String, Object?> json) =>
|
factory TextPainterParams.fromJson(Map<String, Object?> json) =>
|
||||||
_$TextPainterParamsFromJson(json);
|
_$TextPainterParamsFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CloseWindowIntent extends Intent {
|
||||||
|
const CloseWindowIntent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class Result<T> with _$Result<T> {
|
||||||
|
const factory Result({
|
||||||
|
required T? data,
|
||||||
|
required ResultType type,
|
||||||
|
required String message,
|
||||||
|
}) = _Result;
|
||||||
|
|
||||||
|
factory Result.success(T data) => Result(
|
||||||
|
data: data,
|
||||||
|
type: ResultType.success,
|
||||||
|
message: "",
|
||||||
|
);
|
||||||
|
|
||||||
|
factory Result.error(String message) => Result(
|
||||||
|
data: null,
|
||||||
|
type: ResultType.error,
|
||||||
|
message: message,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ResultExt on Result {
|
||||||
|
bool get isError => type == ResultType.error;
|
||||||
|
|
||||||
|
bool get isSuccess => type == ResultType.success;
|
||||||
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class Script with _$Script {
|
||||||
|
const factory Script({
|
||||||
|
required String id,
|
||||||
|
required String label,
|
||||||
|
required String content,
|
||||||
|
}) = _Script;
|
||||||
|
|
||||||
|
factory Script.create({
|
||||||
|
required String label,
|
||||||
|
required String content,
|
||||||
|
}) {
|
||||||
|
return Script(
|
||||||
|
id: utils.uuidV4,
|
||||||
|
label: label,
|
||||||
|
content: content,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
factory Script.fromJson(Map<String, Object?> json) => _$ScriptFromJson(json);
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
|||||||
import 'models.dart';
|
import 'models.dart';
|
||||||
|
|
||||||
part 'generated/config.freezed.dart';
|
part 'generated/config.freezed.dart';
|
||||||
|
|
||||||
part 'generated/config.g.dart';
|
part 'generated/config.g.dart';
|
||||||
|
|
||||||
const defaultBypassDomain = [
|
const defaultBypassDomain = [
|
||||||
@@ -212,6 +211,35 @@ class ThemeProps with _$ThemeProps {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class ScriptProps with _$ScriptProps {
|
||||||
|
const factory ScriptProps({
|
||||||
|
String? currentId,
|
||||||
|
@Default([]) List<Script> scripts,
|
||||||
|
}) = _ScriptProps;
|
||||||
|
|
||||||
|
factory ScriptProps.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$ScriptPropsFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ScriptPropsExt on ScriptProps {
|
||||||
|
String? get realId {
|
||||||
|
final index = scripts.indexWhere((script) => script.id == currentId);
|
||||||
|
if (index != -1) {
|
||||||
|
return currentId;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Script? get currentScript {
|
||||||
|
final index = scripts.indexWhere((script) => script.id == currentId);
|
||||||
|
if (index != -1) {
|
||||||
|
return scripts[index];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class Config with _$Config {
|
class Config with _$Config {
|
||||||
const factory Config({
|
const factory Config({
|
||||||
@@ -229,6 +257,7 @@ class Config with _$Config {
|
|||||||
@Default(defaultProxiesStyle) ProxiesStyle proxiesStyle,
|
@Default(defaultProxiesStyle) ProxiesStyle proxiesStyle,
|
||||||
@Default(defaultWindowProps) WindowProps windowProps,
|
@Default(defaultWindowProps) WindowProps windowProps,
|
||||||
@Default(defaultClashConfig) ClashConfig patchClashConfig,
|
@Default(defaultClashConfig) ClashConfig patchClashConfig,
|
||||||
|
@Default(ScriptProps()) ScriptProps scriptProps,
|
||||||
}) = _Config;
|
}) = _Config;
|
||||||
|
|
||||||
factory Config.fromJson(Map<String, Object?> json) => _$ConfigFromJson(json);
|
factory Config.fromJson(Map<String, Object?> json) => _$ConfigFromJson(json);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import 'package:fl_clash/models/models.dart';
|
|||||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
part 'generated/core.freezed.dart';
|
part 'generated/core.freezed.dart';
|
||||||
|
|
||||||
part 'generated/core.g.dart';
|
part 'generated/core.g.dart';
|
||||||
|
|
||||||
abstract mixin class AppMessageListener {
|
abstract mixin class AppMessageListener {
|
||||||
@@ -18,10 +17,52 @@ abstract mixin class AppMessageListener {
|
|||||||
void onLoaded(String providerName) {}
|
void onLoaded(String providerName) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract mixin class ServiceMessageListener {
|
// abstract mixin class ServiceMessageListener {
|
||||||
onProtect(Fd fd) {}
|
// onProtect(Fd fd) {}
|
||||||
|
//
|
||||||
|
// onProcess(ProcessData process) {}
|
||||||
|
// }
|
||||||
|
|
||||||
onProcess(ProcessData process) {}
|
@freezed
|
||||||
|
class SetupParams with _$SetupParams {
|
||||||
|
const factory SetupParams({
|
||||||
|
@JsonKey(name: "config") required Map<String, dynamic> config,
|
||||||
|
@JsonKey(name: "selected-map") required Map<String, String> selectedMap,
|
||||||
|
@JsonKey(name: "test-url") required String testUrl,
|
||||||
|
}) = _SetupParams;
|
||||||
|
|
||||||
|
factory SetupParams.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SetupParamsFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
// extension SetupParamsExt on SetupParams {
|
||||||
|
// Map<String, dynamic> get json {
|
||||||
|
// final json = Map<String, dynamic>.from(config);
|
||||||
|
// json["selected-map"] = selectedMap;
|
||||||
|
// json["test-url"] = testUrl;
|
||||||
|
// return json;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class UpdateParams with _$UpdateParams {
|
||||||
|
const factory UpdateParams({
|
||||||
|
required Tun tun,
|
||||||
|
@JsonKey(name: 'mixed-port') required int mixedPort,
|
||||||
|
@JsonKey(name: 'allow-lan') required bool allowLan,
|
||||||
|
@JsonKey(name: 'find-process-mode')
|
||||||
|
required FindProcessMode findProcessMode,
|
||||||
|
required Mode mode,
|
||||||
|
@JsonKey(name: 'log-level') required LogLevel logLevel,
|
||||||
|
required bool ipv6,
|
||||||
|
@JsonKey(name: 'tcp-concurrent') required bool tcpConcurrent,
|
||||||
|
@JsonKey(name: 'external-controller')
|
||||||
|
required ExternalControllerStatus externalController,
|
||||||
|
@JsonKey(name: 'unified-delay') required bool unifiedDelay,
|
||||||
|
}) = _UpdateParams;
|
||||||
|
|
||||||
|
factory UpdateParams.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$UpdateParamsFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
@@ -56,32 +97,6 @@ class AndroidVpnOptions with _$AndroidVpnOptions {
|
|||||||
_$AndroidVpnOptionsFromJson(json);
|
_$AndroidVpnOptionsFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
|
||||||
class ConfigExtendedParams with _$ConfigExtendedParams {
|
|
||||||
const factory ConfigExtendedParams({
|
|
||||||
@JsonKey(name: "is-patch") required bool isPatch,
|
|
||||||
@JsonKey(name: "selected-map") required SelectedMap selectedMap,
|
|
||||||
@JsonKey(name: "override-dns") required bool overrideDns,
|
|
||||||
@JsonKey(name: "override-rule") required bool overrideRule,
|
|
||||||
@JsonKey(name: "test-url") required String testUrl,
|
|
||||||
}) = _ConfigExtendedParams;
|
|
||||||
|
|
||||||
factory ConfigExtendedParams.fromJson(Map<String, Object?> json) =>
|
|
||||||
_$ConfigExtendedParamsFromJson(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@freezed
|
|
||||||
class UpdateConfigParams with _$UpdateConfigParams {
|
|
||||||
const factory UpdateConfigParams({
|
|
||||||
@JsonKey(name: "profile-id") required String profileId,
|
|
||||||
required ClashConfig config,
|
|
||||||
required ConfigExtendedParams params,
|
|
||||||
}) = _UpdateConfigParams;
|
|
||||||
|
|
||||||
factory UpdateConfigParams.fromJson(Map<String, Object?> json) =>
|
|
||||||
_$UpdateConfigParamsFromJson(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class InitParams with _$InitParams {
|
class InitParams with _$InitParams {
|
||||||
const factory InitParams({
|
const factory InitParams({
|
||||||
@@ -158,37 +173,26 @@ class Now with _$Now {
|
|||||||
factory Now.fromJson(Map<String, Object?> json) => _$NowFromJson(json);
|
factory Now.fromJson(Map<String, Object?> json) => _$NowFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
// @freezed
|
||||||
class ProcessData with _$ProcessData {
|
// class ProcessData with _$ProcessData {
|
||||||
const factory ProcessData({
|
// const factory ProcessData({
|
||||||
required String id,
|
// required String id,
|
||||||
required Metadata metadata,
|
// required Metadata metadata,
|
||||||
}) = _ProcessData;
|
// }) = _ProcessData;
|
||||||
|
//
|
||||||
factory ProcessData.fromJson(Map<String, Object?> json) =>
|
// factory ProcessData.fromJson(Map<String, Object?> json) =>
|
||||||
_$ProcessDataFromJson(json);
|
// _$ProcessDataFromJson(json);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@freezed
|
// @freezed
|
||||||
class Fd with _$Fd {
|
// class Fd with _$Fd {
|
||||||
const factory Fd({
|
// const factory Fd({
|
||||||
required String id,
|
// required String id,
|
||||||
required int value,
|
// required int value,
|
||||||
}) = _Fd;
|
// }) = _Fd;
|
||||||
|
//
|
||||||
factory Fd.fromJson(Map<String, Object?> json) => _$FdFromJson(json);
|
// factory Fd.fromJson(Map<String, Object?> json) => _$FdFromJson(json);
|
||||||
}
|
// }
|
||||||
|
|
||||||
@freezed
|
|
||||||
class ProcessMapItem with _$ProcessMapItem {
|
|
||||||
const factory ProcessMapItem({
|
|
||||||
required String id,
|
|
||||||
required String value,
|
|
||||||
}) = _ProcessMapItem;
|
|
||||||
|
|
||||||
factory ProcessMapItem.fromJson(Map<String, Object?> json) =>
|
|
||||||
_$ProcessMapItemFromJson(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class ProviderSubscriptionInfo with _$ProviderSubscriptionInfo {
|
class ProviderSubscriptionInfo with _$ProviderSubscriptionInfo {
|
||||||
@@ -231,28 +235,11 @@ class ExternalProvider with _$ExternalProvider {
|
|||||||
_$ExternalProviderFromJson(json);
|
_$ExternalProviderFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
|
||||||
class TunProps with _$TunProps {
|
|
||||||
const factory TunProps({
|
|
||||||
required int fd,
|
|
||||||
required String gateway,
|
|
||||||
required String gateway6,
|
|
||||||
required String portal,
|
|
||||||
required String portal6,
|
|
||||||
required String dns,
|
|
||||||
required String dns6,
|
|
||||||
}) = _TunProps;
|
|
||||||
|
|
||||||
factory TunProps.fromJson(Map<String, Object?> json) =>
|
|
||||||
_$TunPropsFromJson(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class Action with _$Action {
|
class Action with _$Action {
|
||||||
const factory Action({
|
const factory Action({
|
||||||
required ActionMethod method,
|
required ActionMethod method,
|
||||||
required dynamic data,
|
required dynamic data,
|
||||||
@JsonKey(name: "default-value") required dynamic defaultValue,
|
|
||||||
required String id,
|
required String id,
|
||||||
}) = _Action;
|
}) = _Action;
|
||||||
|
|
||||||
@@ -265,8 +252,19 @@ class ActionResult with _$ActionResult {
|
|||||||
required ActionMethod method,
|
required ActionMethod method,
|
||||||
required dynamic data,
|
required dynamic data,
|
||||||
String? id,
|
String? id,
|
||||||
|
@Default(ResultType.success) ResultType code,
|
||||||
}) = _ActionResult;
|
}) = _ActionResult;
|
||||||
|
|
||||||
factory ActionResult.fromJson(Map<String, Object?> json) =>
|
factory ActionResult.fromJson(Map<String, Object?> json) =>
|
||||||
_$ActionResultFromJson(json);
|
_$ActionResultFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension ActionResultExt on ActionResult {
|
||||||
|
Result get toResult {
|
||||||
|
if (code == ResultType.success) {
|
||||||
|
return Result.success(data);
|
||||||
|
} else {
|
||||||
|
return Result.error(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ final _privateConstructorUsedError = UnsupportedError(
|
|||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$AppState {
|
mixin _$AppState {
|
||||||
bool get isInit => throw _privateConstructorUsedError;
|
bool get isInit => throw _privateConstructorUsedError;
|
||||||
|
bool get backBlock => throw _privateConstructorUsedError;
|
||||||
PageLabel get pageLabel => throw _privateConstructorUsedError;
|
PageLabel get pageLabel => throw _privateConstructorUsedError;
|
||||||
List<Package> get packages => throw _privateConstructorUsedError;
|
List<Package> get packages => throw _privateConstructorUsedError;
|
||||||
int get sortNum => throw _privateConstructorUsedError;
|
int get sortNum => throw _privateConstructorUsedError;
|
||||||
@@ -34,7 +35,7 @@ mixin _$AppState {
|
|||||||
FixedList<Log> get logs => throw _privateConstructorUsedError;
|
FixedList<Log> get logs => throw _privateConstructorUsedError;
|
||||||
FixedList<Traffic> get traffics => throw _privateConstructorUsedError;
|
FixedList<Traffic> get traffics => throw _privateConstructorUsedError;
|
||||||
Traffic get totalTraffic => throw _privateConstructorUsedError;
|
Traffic get totalTraffic => throw _privateConstructorUsedError;
|
||||||
bool get needApply => throw _privateConstructorUsedError;
|
String get proxiesQuery => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
/// Create a copy of AppState
|
/// Create a copy of AppState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -50,6 +51,7 @@ abstract class $AppStateCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{bool isInit,
|
{bool isInit,
|
||||||
|
bool backBlock,
|
||||||
PageLabel pageLabel,
|
PageLabel pageLabel,
|
||||||
List<Package> packages,
|
List<Package> packages,
|
||||||
int sortNum,
|
int sortNum,
|
||||||
@@ -66,7 +68,7 @@ abstract class $AppStateCopyWith<$Res> {
|
|||||||
FixedList<Log> logs,
|
FixedList<Log> logs,
|
||||||
FixedList<Traffic> traffics,
|
FixedList<Traffic> traffics,
|
||||||
Traffic totalTraffic,
|
Traffic totalTraffic,
|
||||||
bool needApply});
|
String proxiesQuery});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -85,6 +87,7 @@ class _$AppStateCopyWithImpl<$Res, $Val extends AppState>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? isInit = null,
|
Object? isInit = null,
|
||||||
|
Object? backBlock = null,
|
||||||
Object? pageLabel = null,
|
Object? pageLabel = null,
|
||||||
Object? packages = null,
|
Object? packages = null,
|
||||||
Object? sortNum = null,
|
Object? sortNum = null,
|
||||||
@@ -101,13 +104,17 @@ class _$AppStateCopyWithImpl<$Res, $Val extends AppState>
|
|||||||
Object? logs = null,
|
Object? logs = null,
|
||||||
Object? traffics = null,
|
Object? traffics = null,
|
||||||
Object? totalTraffic = null,
|
Object? totalTraffic = null,
|
||||||
Object? needApply = null,
|
Object? proxiesQuery = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_value.copyWith(
|
return _then(_value.copyWith(
|
||||||
isInit: null == isInit
|
isInit: null == isInit
|
||||||
? _value.isInit
|
? _value.isInit
|
||||||
: isInit // ignore: cast_nullable_to_non_nullable
|
: isInit // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
backBlock: null == backBlock
|
||||||
|
? _value.backBlock
|
||||||
|
: backBlock // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
pageLabel: null == pageLabel
|
pageLabel: null == pageLabel
|
||||||
? _value.pageLabel
|
? _value.pageLabel
|
||||||
: pageLabel // ignore: cast_nullable_to_non_nullable
|
: pageLabel // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -172,10 +179,10 @@ class _$AppStateCopyWithImpl<$Res, $Val extends AppState>
|
|||||||
? _value.totalTraffic
|
? _value.totalTraffic
|
||||||
: totalTraffic // ignore: cast_nullable_to_non_nullable
|
: totalTraffic // ignore: cast_nullable_to_non_nullable
|
||||||
as Traffic,
|
as Traffic,
|
||||||
needApply: null == needApply
|
proxiesQuery: null == proxiesQuery
|
||||||
? _value.needApply
|
? _value.proxiesQuery
|
||||||
: needApply // ignore: cast_nullable_to_non_nullable
|
: proxiesQuery // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as String,
|
||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,6 +197,7 @@ abstract class _$$AppStateImplCopyWith<$Res>
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{bool isInit,
|
{bool isInit,
|
||||||
|
bool backBlock,
|
||||||
PageLabel pageLabel,
|
PageLabel pageLabel,
|
||||||
List<Package> packages,
|
List<Package> packages,
|
||||||
int sortNum,
|
int sortNum,
|
||||||
@@ -206,7 +214,7 @@ abstract class _$$AppStateImplCopyWith<$Res>
|
|||||||
FixedList<Log> logs,
|
FixedList<Log> logs,
|
||||||
FixedList<Traffic> traffics,
|
FixedList<Traffic> traffics,
|
||||||
Traffic totalTraffic,
|
Traffic totalTraffic,
|
||||||
bool needApply});
|
String proxiesQuery});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -223,6 +231,7 @@ class __$$AppStateImplCopyWithImpl<$Res>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? isInit = null,
|
Object? isInit = null,
|
||||||
|
Object? backBlock = null,
|
||||||
Object? pageLabel = null,
|
Object? pageLabel = null,
|
||||||
Object? packages = null,
|
Object? packages = null,
|
||||||
Object? sortNum = null,
|
Object? sortNum = null,
|
||||||
@@ -239,13 +248,17 @@ class __$$AppStateImplCopyWithImpl<$Res>
|
|||||||
Object? logs = null,
|
Object? logs = null,
|
||||||
Object? traffics = null,
|
Object? traffics = null,
|
||||||
Object? totalTraffic = null,
|
Object? totalTraffic = null,
|
||||||
Object? needApply = null,
|
Object? proxiesQuery = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_$AppStateImpl(
|
return _then(_$AppStateImpl(
|
||||||
isInit: null == isInit
|
isInit: null == isInit
|
||||||
? _value.isInit
|
? _value.isInit
|
||||||
: isInit // ignore: cast_nullable_to_non_nullable
|
: isInit // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
backBlock: null == backBlock
|
||||||
|
? _value.backBlock
|
||||||
|
: backBlock // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
pageLabel: null == pageLabel
|
pageLabel: null == pageLabel
|
||||||
? _value.pageLabel
|
? _value.pageLabel
|
||||||
: pageLabel // ignore: cast_nullable_to_non_nullable
|
: pageLabel // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -310,10 +323,10 @@ class __$$AppStateImplCopyWithImpl<$Res>
|
|||||||
? _value.totalTraffic
|
? _value.totalTraffic
|
||||||
: totalTraffic // ignore: cast_nullable_to_non_nullable
|
: totalTraffic // ignore: cast_nullable_to_non_nullable
|
||||||
as Traffic,
|
as Traffic,
|
||||||
needApply: null == needApply
|
proxiesQuery: null == proxiesQuery
|
||||||
? _value.needApply
|
? _value.proxiesQuery
|
||||||
: needApply // ignore: cast_nullable_to_non_nullable
|
: proxiesQuery // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as String,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -323,6 +336,7 @@ class __$$AppStateImplCopyWithImpl<$Res>
|
|||||||
class _$AppStateImpl implements _AppState {
|
class _$AppStateImpl implements _AppState {
|
||||||
const _$AppStateImpl(
|
const _$AppStateImpl(
|
||||||
{this.isInit = false,
|
{this.isInit = false,
|
||||||
|
this.backBlock = false,
|
||||||
this.pageLabel = PageLabel.dashboard,
|
this.pageLabel = PageLabel.dashboard,
|
||||||
final List<Package> packages = const [],
|
final List<Package> packages = const [],
|
||||||
this.sortNum = 0,
|
this.sortNum = 0,
|
||||||
@@ -339,7 +353,7 @@ class _$AppStateImpl implements _AppState {
|
|||||||
required this.logs,
|
required this.logs,
|
||||||
required this.traffics,
|
required this.traffics,
|
||||||
required this.totalTraffic,
|
required this.totalTraffic,
|
||||||
this.needApply = false})
|
this.proxiesQuery = ""})
|
||||||
: _packages = packages,
|
: _packages = packages,
|
||||||
_delayMap = delayMap,
|
_delayMap = delayMap,
|
||||||
_groups = groups,
|
_groups = groups,
|
||||||
@@ -350,6 +364,9 @@ class _$AppStateImpl implements _AppState {
|
|||||||
final bool isInit;
|
final bool isInit;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
|
final bool backBlock;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
final PageLabel pageLabel;
|
final PageLabel pageLabel;
|
||||||
final List<Package> _packages;
|
final List<Package> _packages;
|
||||||
@override
|
@override
|
||||||
@@ -413,11 +430,11 @@ class _$AppStateImpl implements _AppState {
|
|||||||
final Traffic totalTraffic;
|
final Traffic totalTraffic;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
final bool needApply;
|
final String proxiesQuery;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'AppState(isInit: $isInit, pageLabel: $pageLabel, packages: $packages, sortNum: $sortNum, viewSize: $viewSize, delayMap: $delayMap, groups: $groups, checkIpNum: $checkIpNum, brightness: $brightness, runTime: $runTime, providers: $providers, localIp: $localIp, requests: $requests, version: $version, logs: $logs, traffics: $traffics, totalTraffic: $totalTraffic, needApply: $needApply)';
|
return 'AppState(isInit: $isInit, backBlock: $backBlock, pageLabel: $pageLabel, packages: $packages, sortNum: $sortNum, viewSize: $viewSize, delayMap: $delayMap, groups: $groups, checkIpNum: $checkIpNum, brightness: $brightness, runTime: $runTime, providers: $providers, localIp: $localIp, requests: $requests, version: $version, logs: $logs, traffics: $traffics, totalTraffic: $totalTraffic, proxiesQuery: $proxiesQuery)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -426,6 +443,8 @@ class _$AppStateImpl implements _AppState {
|
|||||||
(other.runtimeType == runtimeType &&
|
(other.runtimeType == runtimeType &&
|
||||||
other is _$AppStateImpl &&
|
other is _$AppStateImpl &&
|
||||||
(identical(other.isInit, isInit) || other.isInit == isInit) &&
|
(identical(other.isInit, isInit) || other.isInit == isInit) &&
|
||||||
|
(identical(other.backBlock, backBlock) ||
|
||||||
|
other.backBlock == backBlock) &&
|
||||||
(identical(other.pageLabel, pageLabel) ||
|
(identical(other.pageLabel, pageLabel) ||
|
||||||
other.pageLabel == pageLabel) &&
|
other.pageLabel == pageLabel) &&
|
||||||
const DeepCollectionEquality().equals(other._packages, _packages) &&
|
const DeepCollectionEquality().equals(other._packages, _packages) &&
|
||||||
@@ -450,31 +469,33 @@ class _$AppStateImpl implements _AppState {
|
|||||||
other.traffics == traffics) &&
|
other.traffics == traffics) &&
|
||||||
(identical(other.totalTraffic, totalTraffic) ||
|
(identical(other.totalTraffic, totalTraffic) ||
|
||||||
other.totalTraffic == totalTraffic) &&
|
other.totalTraffic == totalTraffic) &&
|
||||||
(identical(other.needApply, needApply) ||
|
(identical(other.proxiesQuery, proxiesQuery) ||
|
||||||
other.needApply == needApply));
|
other.proxiesQuery == proxiesQuery));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hashAll([
|
||||||
runtimeType,
|
runtimeType,
|
||||||
isInit,
|
isInit,
|
||||||
pageLabel,
|
backBlock,
|
||||||
const DeepCollectionEquality().hash(_packages),
|
pageLabel,
|
||||||
sortNum,
|
const DeepCollectionEquality().hash(_packages),
|
||||||
viewSize,
|
sortNum,
|
||||||
const DeepCollectionEquality().hash(_delayMap),
|
viewSize,
|
||||||
const DeepCollectionEquality().hash(_groups),
|
const DeepCollectionEquality().hash(_delayMap),
|
||||||
checkIpNum,
|
const DeepCollectionEquality().hash(_groups),
|
||||||
brightness,
|
checkIpNum,
|
||||||
runTime,
|
brightness,
|
||||||
const DeepCollectionEquality().hash(_providers),
|
runTime,
|
||||||
localIp,
|
const DeepCollectionEquality().hash(_providers),
|
||||||
requests,
|
localIp,
|
||||||
version,
|
requests,
|
||||||
logs,
|
version,
|
||||||
traffics,
|
logs,
|
||||||
totalTraffic,
|
traffics,
|
||||||
needApply);
|
totalTraffic,
|
||||||
|
proxiesQuery
|
||||||
|
]);
|
||||||
|
|
||||||
/// Create a copy of AppState
|
/// Create a copy of AppState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -488,6 +509,7 @@ class _$AppStateImpl implements _AppState {
|
|||||||
abstract class _AppState implements AppState {
|
abstract class _AppState implements AppState {
|
||||||
const factory _AppState(
|
const factory _AppState(
|
||||||
{final bool isInit,
|
{final bool isInit,
|
||||||
|
final bool backBlock,
|
||||||
final PageLabel pageLabel,
|
final PageLabel pageLabel,
|
||||||
final List<Package> packages,
|
final List<Package> packages,
|
||||||
final int sortNum,
|
final int sortNum,
|
||||||
@@ -504,11 +526,13 @@ abstract class _AppState implements AppState {
|
|||||||
required final FixedList<Log> logs,
|
required final FixedList<Log> logs,
|
||||||
required final FixedList<Traffic> traffics,
|
required final FixedList<Traffic> traffics,
|
||||||
required final Traffic totalTraffic,
|
required final Traffic totalTraffic,
|
||||||
final bool needApply}) = _$AppStateImpl;
|
final String proxiesQuery}) = _$AppStateImpl;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isInit;
|
bool get isInit;
|
||||||
@override
|
@override
|
||||||
|
bool get backBlock;
|
||||||
|
@override
|
||||||
PageLabel get pageLabel;
|
PageLabel get pageLabel;
|
||||||
@override
|
@override
|
||||||
List<Package> get packages;
|
List<Package> get packages;
|
||||||
@@ -541,7 +565,7 @@ abstract class _AppState implements AppState {
|
|||||||
@override
|
@override
|
||||||
Traffic get totalTraffic;
|
Traffic get totalTraffic;
|
||||||
@override
|
@override
|
||||||
bool get needApply;
|
String get proxiesQuery;
|
||||||
|
|
||||||
/// Create a copy of AppState
|
/// Create a copy of AppState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
|||||||
@@ -652,6 +652,640 @@ abstract class _RuleProvider implements RuleProvider {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sniffer _$SnifferFromJson(Map<String, dynamic> json) {
|
||||||
|
return _Sniffer.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$Sniffer {
|
||||||
|
bool get enable => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
bool get overrideDest => throw _privateConstructorUsedError;
|
||||||
|
List<String> get sniffing => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "force-domain")
|
||||||
|
List<String> get forceDomain => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "skip-src-address")
|
||||||
|
List<String> get skipSrcAddress => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "skip-dst-address")
|
||||||
|
List<String> get skipDstAddress => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "skip-domain")
|
||||||
|
List<String> get skipDomain => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "port-whitelist")
|
||||||
|
List<String> get port => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "force-dns-mapping")
|
||||||
|
bool get forceDnsMapping => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "parse-pure-ip")
|
||||||
|
bool get parsePureIp => throw _privateConstructorUsedError;
|
||||||
|
Map<String, SnifferConfig> get sniff => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this Sniffer to a JSON map.
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of Sniffer
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$SnifferCopyWith<Sniffer> get copyWith => throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $SnifferCopyWith<$Res> {
|
||||||
|
factory $SnifferCopyWith(Sniffer value, $Res Function(Sniffer) then) =
|
||||||
|
_$SnifferCopyWithImpl<$Res, Sniffer>;
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{bool enable,
|
||||||
|
@JsonKey(name: "override-destination") bool overrideDest,
|
||||||
|
List<String> sniffing,
|
||||||
|
@JsonKey(name: "force-domain") List<String> forceDomain,
|
||||||
|
@JsonKey(name: "skip-src-address") List<String> skipSrcAddress,
|
||||||
|
@JsonKey(name: "skip-dst-address") List<String> skipDstAddress,
|
||||||
|
@JsonKey(name: "skip-domain") List<String> skipDomain,
|
||||||
|
@JsonKey(name: "port-whitelist") List<String> port,
|
||||||
|
@JsonKey(name: "force-dns-mapping") bool forceDnsMapping,
|
||||||
|
@JsonKey(name: "parse-pure-ip") bool parsePureIp,
|
||||||
|
Map<String, SnifferConfig> sniff});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$SnifferCopyWithImpl<$Res, $Val extends Sniffer>
|
||||||
|
implements $SnifferCopyWith<$Res> {
|
||||||
|
_$SnifferCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of Sniffer
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? enable = null,
|
||||||
|
Object? overrideDest = null,
|
||||||
|
Object? sniffing = null,
|
||||||
|
Object? forceDomain = null,
|
||||||
|
Object? skipSrcAddress = null,
|
||||||
|
Object? skipDstAddress = null,
|
||||||
|
Object? skipDomain = null,
|
||||||
|
Object? port = null,
|
||||||
|
Object? forceDnsMapping = null,
|
||||||
|
Object? parsePureIp = null,
|
||||||
|
Object? sniff = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
enable: null == enable
|
||||||
|
? _value.enable
|
||||||
|
: enable // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
overrideDest: null == overrideDest
|
||||||
|
? _value.overrideDest
|
||||||
|
: overrideDest // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
sniffing: null == sniffing
|
||||||
|
? _value.sniffing
|
||||||
|
: sniffing // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
forceDomain: null == forceDomain
|
||||||
|
? _value.forceDomain
|
||||||
|
: forceDomain // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipSrcAddress: null == skipSrcAddress
|
||||||
|
? _value.skipSrcAddress
|
||||||
|
: skipSrcAddress // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipDstAddress: null == skipDstAddress
|
||||||
|
? _value.skipDstAddress
|
||||||
|
: skipDstAddress // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipDomain: null == skipDomain
|
||||||
|
? _value.skipDomain
|
||||||
|
: skipDomain // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
port: null == port
|
||||||
|
? _value.port
|
||||||
|
: port // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
forceDnsMapping: null == forceDnsMapping
|
||||||
|
? _value.forceDnsMapping
|
||||||
|
: forceDnsMapping // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
parsePureIp: null == parsePureIp
|
||||||
|
? _value.parsePureIp
|
||||||
|
: parsePureIp // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
sniff: null == sniff
|
||||||
|
? _value.sniff
|
||||||
|
: sniff // ignore: cast_nullable_to_non_nullable
|
||||||
|
as Map<String, SnifferConfig>,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$SnifferImplCopyWith<$Res> implements $SnifferCopyWith<$Res> {
|
||||||
|
factory _$$SnifferImplCopyWith(
|
||||||
|
_$SnifferImpl value, $Res Function(_$SnifferImpl) then) =
|
||||||
|
__$$SnifferImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{bool enable,
|
||||||
|
@JsonKey(name: "override-destination") bool overrideDest,
|
||||||
|
List<String> sniffing,
|
||||||
|
@JsonKey(name: "force-domain") List<String> forceDomain,
|
||||||
|
@JsonKey(name: "skip-src-address") List<String> skipSrcAddress,
|
||||||
|
@JsonKey(name: "skip-dst-address") List<String> skipDstAddress,
|
||||||
|
@JsonKey(name: "skip-domain") List<String> skipDomain,
|
||||||
|
@JsonKey(name: "port-whitelist") List<String> port,
|
||||||
|
@JsonKey(name: "force-dns-mapping") bool forceDnsMapping,
|
||||||
|
@JsonKey(name: "parse-pure-ip") bool parsePureIp,
|
||||||
|
Map<String, SnifferConfig> sniff});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$SnifferImplCopyWithImpl<$Res>
|
||||||
|
extends _$SnifferCopyWithImpl<$Res, _$SnifferImpl>
|
||||||
|
implements _$$SnifferImplCopyWith<$Res> {
|
||||||
|
__$$SnifferImplCopyWithImpl(
|
||||||
|
_$SnifferImpl _value, $Res Function(_$SnifferImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of Sniffer
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? enable = null,
|
||||||
|
Object? overrideDest = null,
|
||||||
|
Object? sniffing = null,
|
||||||
|
Object? forceDomain = null,
|
||||||
|
Object? skipSrcAddress = null,
|
||||||
|
Object? skipDstAddress = null,
|
||||||
|
Object? skipDomain = null,
|
||||||
|
Object? port = null,
|
||||||
|
Object? forceDnsMapping = null,
|
||||||
|
Object? parsePureIp = null,
|
||||||
|
Object? sniff = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$SnifferImpl(
|
||||||
|
enable: null == enable
|
||||||
|
? _value.enable
|
||||||
|
: enable // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
overrideDest: null == overrideDest
|
||||||
|
? _value.overrideDest
|
||||||
|
: overrideDest // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
sniffing: null == sniffing
|
||||||
|
? _value._sniffing
|
||||||
|
: sniffing // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
forceDomain: null == forceDomain
|
||||||
|
? _value._forceDomain
|
||||||
|
: forceDomain // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipSrcAddress: null == skipSrcAddress
|
||||||
|
? _value._skipSrcAddress
|
||||||
|
: skipSrcAddress // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipDstAddress: null == skipDstAddress
|
||||||
|
? _value._skipDstAddress
|
||||||
|
: skipDstAddress // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
skipDomain: null == skipDomain
|
||||||
|
? _value._skipDomain
|
||||||
|
: skipDomain // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
port: null == port
|
||||||
|
? _value._port
|
||||||
|
: port // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
forceDnsMapping: null == forceDnsMapping
|
||||||
|
? _value.forceDnsMapping
|
||||||
|
: forceDnsMapping // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
parsePureIp: null == parsePureIp
|
||||||
|
? _value.parsePureIp
|
||||||
|
: parsePureIp // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
|
sniff: null == sniff
|
||||||
|
? _value._sniff
|
||||||
|
: sniff // ignore: cast_nullable_to_non_nullable
|
||||||
|
as Map<String, SnifferConfig>,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$SnifferImpl implements _Sniffer {
|
||||||
|
const _$SnifferImpl(
|
||||||
|
{this.enable = false,
|
||||||
|
@JsonKey(name: "override-destination") this.overrideDest = true,
|
||||||
|
final List<String> sniffing = const [],
|
||||||
|
@JsonKey(name: "force-domain") final List<String> forceDomain = const [],
|
||||||
|
@JsonKey(name: "skip-src-address")
|
||||||
|
final List<String> skipSrcAddress = const [],
|
||||||
|
@JsonKey(name: "skip-dst-address")
|
||||||
|
final List<String> skipDstAddress = const [],
|
||||||
|
@JsonKey(name: "skip-domain") final List<String> skipDomain = const [],
|
||||||
|
@JsonKey(name: "port-whitelist") final List<String> port = const [],
|
||||||
|
@JsonKey(name: "force-dns-mapping") this.forceDnsMapping = true,
|
||||||
|
@JsonKey(name: "parse-pure-ip") this.parsePureIp = true,
|
||||||
|
final Map<String, SnifferConfig> sniff = const {}})
|
||||||
|
: _sniffing = sniffing,
|
||||||
|
_forceDomain = forceDomain,
|
||||||
|
_skipSrcAddress = skipSrcAddress,
|
||||||
|
_skipDstAddress = skipDstAddress,
|
||||||
|
_skipDomain = skipDomain,
|
||||||
|
_port = port,
|
||||||
|
_sniff = sniff;
|
||||||
|
|
||||||
|
factory _$SnifferImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$SnifferImplFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
final bool enable;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
final bool overrideDest;
|
||||||
|
final List<String> _sniffing;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
List<String> get sniffing {
|
||||||
|
if (_sniffing is EqualUnmodifiableListView) return _sniffing;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_sniffing);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _forceDomain;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "force-domain")
|
||||||
|
List<String> get forceDomain {
|
||||||
|
if (_forceDomain is EqualUnmodifiableListView) return _forceDomain;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_forceDomain);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _skipSrcAddress;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-src-address")
|
||||||
|
List<String> get skipSrcAddress {
|
||||||
|
if (_skipSrcAddress is EqualUnmodifiableListView) return _skipSrcAddress;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_skipSrcAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _skipDstAddress;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-dst-address")
|
||||||
|
List<String> get skipDstAddress {
|
||||||
|
if (_skipDstAddress is EqualUnmodifiableListView) return _skipDstAddress;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_skipDstAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _skipDomain;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-domain")
|
||||||
|
List<String> get skipDomain {
|
||||||
|
if (_skipDomain is EqualUnmodifiableListView) return _skipDomain;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_skipDomain);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _port;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "port-whitelist")
|
||||||
|
List<String> get port {
|
||||||
|
if (_port is EqualUnmodifiableListView) return _port;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "force-dns-mapping")
|
||||||
|
final bool forceDnsMapping;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "parse-pure-ip")
|
||||||
|
final bool parsePureIp;
|
||||||
|
final Map<String, SnifferConfig> _sniff;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
Map<String, SnifferConfig> get sniff {
|
||||||
|
if (_sniff is EqualUnmodifiableMapView) return _sniff;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableMapView(_sniff);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'Sniffer(enable: $enable, overrideDest: $overrideDest, sniffing: $sniffing, forceDomain: $forceDomain, skipSrcAddress: $skipSrcAddress, skipDstAddress: $skipDstAddress, skipDomain: $skipDomain, port: $port, forceDnsMapping: $forceDnsMapping, parsePureIp: $parsePureIp, sniff: $sniff)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$SnifferImpl &&
|
||||||
|
(identical(other.enable, enable) || other.enable == enable) &&
|
||||||
|
(identical(other.overrideDest, overrideDest) ||
|
||||||
|
other.overrideDest == overrideDest) &&
|
||||||
|
const DeepCollectionEquality().equals(other._sniffing, _sniffing) &&
|
||||||
|
const DeepCollectionEquality()
|
||||||
|
.equals(other._forceDomain, _forceDomain) &&
|
||||||
|
const DeepCollectionEquality()
|
||||||
|
.equals(other._skipSrcAddress, _skipSrcAddress) &&
|
||||||
|
const DeepCollectionEquality()
|
||||||
|
.equals(other._skipDstAddress, _skipDstAddress) &&
|
||||||
|
const DeepCollectionEquality()
|
||||||
|
.equals(other._skipDomain, _skipDomain) &&
|
||||||
|
const DeepCollectionEquality().equals(other._port, _port) &&
|
||||||
|
(identical(other.forceDnsMapping, forceDnsMapping) ||
|
||||||
|
other.forceDnsMapping == forceDnsMapping) &&
|
||||||
|
(identical(other.parsePureIp, parsePureIp) ||
|
||||||
|
other.parsePureIp == parsePureIp) &&
|
||||||
|
const DeepCollectionEquality().equals(other._sniff, _sniff));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType,
|
||||||
|
enable,
|
||||||
|
overrideDest,
|
||||||
|
const DeepCollectionEquality().hash(_sniffing),
|
||||||
|
const DeepCollectionEquality().hash(_forceDomain),
|
||||||
|
const DeepCollectionEquality().hash(_skipSrcAddress),
|
||||||
|
const DeepCollectionEquality().hash(_skipDstAddress),
|
||||||
|
const DeepCollectionEquality().hash(_skipDomain),
|
||||||
|
const DeepCollectionEquality().hash(_port),
|
||||||
|
forceDnsMapping,
|
||||||
|
parsePureIp,
|
||||||
|
const DeepCollectionEquality().hash(_sniff));
|
||||||
|
|
||||||
|
/// Create a copy of Sniffer
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$SnifferImplCopyWith<_$SnifferImpl> get copyWith =>
|
||||||
|
__$$SnifferImplCopyWithImpl<_$SnifferImpl>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$SnifferImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Sniffer implements Sniffer {
|
||||||
|
const factory _Sniffer(
|
||||||
|
{final bool enable,
|
||||||
|
@JsonKey(name: "override-destination") final bool overrideDest,
|
||||||
|
final List<String> sniffing,
|
||||||
|
@JsonKey(name: "force-domain") final List<String> forceDomain,
|
||||||
|
@JsonKey(name: "skip-src-address") final List<String> skipSrcAddress,
|
||||||
|
@JsonKey(name: "skip-dst-address") final List<String> skipDstAddress,
|
||||||
|
@JsonKey(name: "skip-domain") final List<String> skipDomain,
|
||||||
|
@JsonKey(name: "port-whitelist") final List<String> port,
|
||||||
|
@JsonKey(name: "force-dns-mapping") final bool forceDnsMapping,
|
||||||
|
@JsonKey(name: "parse-pure-ip") final bool parsePureIp,
|
||||||
|
final Map<String, SnifferConfig> sniff}) = _$SnifferImpl;
|
||||||
|
|
||||||
|
factory _Sniffer.fromJson(Map<String, dynamic> json) = _$SnifferImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get enable;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
bool get overrideDest;
|
||||||
|
@override
|
||||||
|
List<String> get sniffing;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "force-domain")
|
||||||
|
List<String> get forceDomain;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-src-address")
|
||||||
|
List<String> get skipSrcAddress;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-dst-address")
|
||||||
|
List<String> get skipDstAddress;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "skip-domain")
|
||||||
|
List<String> get skipDomain;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "port-whitelist")
|
||||||
|
List<String> get port;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "force-dns-mapping")
|
||||||
|
bool get forceDnsMapping;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "parse-pure-ip")
|
||||||
|
bool get parsePureIp;
|
||||||
|
@override
|
||||||
|
Map<String, SnifferConfig> get sniff;
|
||||||
|
|
||||||
|
/// Create a copy of Sniffer
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$SnifferImplCopyWith<_$SnifferImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
SnifferConfig _$SnifferConfigFromJson(Map<String, dynamic> json) {
|
||||||
|
return _SnifferConfig.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$SnifferConfig {
|
||||||
|
@JsonKey(fromJson: _formJsonPorts)
|
||||||
|
List<String> get ports => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
bool? get overrideDest => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this SnifferConfig to a JSON map.
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of SnifferConfig
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$SnifferConfigCopyWith<SnifferConfig> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $SnifferConfigCopyWith<$Res> {
|
||||||
|
factory $SnifferConfigCopyWith(
|
||||||
|
SnifferConfig value, $Res Function(SnifferConfig) then) =
|
||||||
|
_$SnifferConfigCopyWithImpl<$Res, SnifferConfig>;
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{@JsonKey(fromJson: _formJsonPorts) List<String> ports,
|
||||||
|
@JsonKey(name: "override-destination") bool? overrideDest});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$SnifferConfigCopyWithImpl<$Res, $Val extends SnifferConfig>
|
||||||
|
implements $SnifferConfigCopyWith<$Res> {
|
||||||
|
_$SnifferConfigCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of SnifferConfig
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? ports = null,
|
||||||
|
Object? overrideDest = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
ports: null == ports
|
||||||
|
? _value.ports
|
||||||
|
: ports // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
overrideDest: freezed == overrideDest
|
||||||
|
? _value.overrideDest
|
||||||
|
: overrideDest // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool?,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$SnifferConfigImplCopyWith<$Res>
|
||||||
|
implements $SnifferConfigCopyWith<$Res> {
|
||||||
|
factory _$$SnifferConfigImplCopyWith(
|
||||||
|
_$SnifferConfigImpl value, $Res Function(_$SnifferConfigImpl) then) =
|
||||||
|
__$$SnifferConfigImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{@JsonKey(fromJson: _formJsonPorts) List<String> ports,
|
||||||
|
@JsonKey(name: "override-destination") bool? overrideDest});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$SnifferConfigImplCopyWithImpl<$Res>
|
||||||
|
extends _$SnifferConfigCopyWithImpl<$Res, _$SnifferConfigImpl>
|
||||||
|
implements _$$SnifferConfigImplCopyWith<$Res> {
|
||||||
|
__$$SnifferConfigImplCopyWithImpl(
|
||||||
|
_$SnifferConfigImpl _value, $Res Function(_$SnifferConfigImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of SnifferConfig
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? ports = null,
|
||||||
|
Object? overrideDest = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_$SnifferConfigImpl(
|
||||||
|
ports: null == ports
|
||||||
|
? _value._ports
|
||||||
|
: ports // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
overrideDest: freezed == overrideDest
|
||||||
|
? _value.overrideDest
|
||||||
|
: overrideDest // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$SnifferConfigImpl implements _SnifferConfig {
|
||||||
|
const _$SnifferConfigImpl(
|
||||||
|
{@JsonKey(fromJson: _formJsonPorts) final List<String> ports = const [],
|
||||||
|
@JsonKey(name: "override-destination") this.overrideDest})
|
||||||
|
: _ports = ports;
|
||||||
|
|
||||||
|
factory _$SnifferConfigImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$SnifferConfigImplFromJson(json);
|
||||||
|
|
||||||
|
final List<String> _ports;
|
||||||
|
@override
|
||||||
|
@JsonKey(fromJson: _formJsonPorts)
|
||||||
|
List<String> get ports {
|
||||||
|
if (_ports is EqualUnmodifiableListView) return _ports;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
final bool? overrideDest;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SnifferConfig(ports: $ports, overrideDest: $overrideDest)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$SnifferConfigImpl &&
|
||||||
|
const DeepCollectionEquality().equals(other._ports, _ports) &&
|
||||||
|
(identical(other.overrideDest, overrideDest) ||
|
||||||
|
other.overrideDest == overrideDest));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType, const DeepCollectionEquality().hash(_ports), overrideDest);
|
||||||
|
|
||||||
|
/// Create a copy of SnifferConfig
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$SnifferConfigImplCopyWith<_$SnifferConfigImpl> get copyWith =>
|
||||||
|
__$$SnifferConfigImplCopyWithImpl<_$SnifferConfigImpl>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$SnifferConfigImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _SnifferConfig implements SnifferConfig {
|
||||||
|
const factory _SnifferConfig(
|
||||||
|
{@JsonKey(fromJson: _formJsonPorts) final List<String> ports,
|
||||||
|
@JsonKey(name: "override-destination") final bool? overrideDest}) =
|
||||||
|
_$SnifferConfigImpl;
|
||||||
|
|
||||||
|
factory _SnifferConfig.fromJson(Map<String, dynamic> json) =
|
||||||
|
_$SnifferConfigImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey(fromJson: _formJsonPorts)
|
||||||
|
List<String> get ports;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "override-destination")
|
||||||
|
bool? get overrideDest;
|
||||||
|
|
||||||
|
/// Create a copy of SnifferConfig
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$SnifferConfigImplCopyWith<_$SnifferConfigImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
Tun _$TunFromJson(Map<String, dynamic> json) {
|
Tun _$TunFromJson(Map<String, dynamic> json) {
|
||||||
return _Tun.fromJson(json);
|
return _Tun.fromJson(json);
|
||||||
}
|
}
|
||||||
@@ -2582,7 +3216,7 @@ ClashConfigSnippet _$ClashConfigSnippetFromJson(Map<String, dynamic> json) {
|
|||||||
mixin _$ClashConfigSnippet {
|
mixin _$ClashConfigSnippet {
|
||||||
@JsonKey(name: "proxy-groups")
|
@JsonKey(name: "proxy-groups")
|
||||||
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
||||||
@JsonKey(fromJson: _genRule)
|
@JsonKey(fromJson: _genRule, name: "rules")
|
||||||
List<Rule> get rule => throw _privateConstructorUsedError;
|
List<Rule> get rule => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
List<RuleProvider> get ruleProvider => throw _privateConstructorUsedError;
|
List<RuleProvider> get ruleProvider => throw _privateConstructorUsedError;
|
||||||
@@ -2607,7 +3241,7 @@ abstract class $ClashConfigSnippetCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
@JsonKey(fromJson: _genRule) List<Rule> rule,
|
@JsonKey(fromJson: _genRule, name: "rules") List<Rule> rule,
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
List<RuleProvider> ruleProvider,
|
List<RuleProvider> ruleProvider,
|
||||||
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
||||||
@@ -2665,7 +3299,7 @@ abstract class _$$ClashConfigSnippetImplCopyWith<$Res>
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
@JsonKey(fromJson: _genRule) List<Rule> rule,
|
@JsonKey(fromJson: _genRule, name: "rules") List<Rule> rule,
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
List<RuleProvider> ruleProvider,
|
List<RuleProvider> ruleProvider,
|
||||||
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
||||||
@@ -2717,7 +3351,8 @@ class _$ClashConfigSnippetImpl implements _ClashConfigSnippet {
|
|||||||
const _$ClashConfigSnippetImpl(
|
const _$ClashConfigSnippetImpl(
|
||||||
{@JsonKey(name: "proxy-groups")
|
{@JsonKey(name: "proxy-groups")
|
||||||
final List<ProxyGroup> proxyGroups = const [],
|
final List<ProxyGroup> proxyGroups = const [],
|
||||||
@JsonKey(fromJson: _genRule) final List<Rule> rule = const [],
|
@JsonKey(fromJson: _genRule, name: "rules")
|
||||||
|
final List<Rule> rule = const [],
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
final List<RuleProvider> ruleProvider = const [],
|
final List<RuleProvider> ruleProvider = const [],
|
||||||
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
||||||
@@ -2741,7 +3376,7 @@ class _$ClashConfigSnippetImpl implements _ClashConfigSnippet {
|
|||||||
|
|
||||||
final List<Rule> _rule;
|
final List<Rule> _rule;
|
||||||
@override
|
@override
|
||||||
@JsonKey(fromJson: _genRule)
|
@JsonKey(fromJson: _genRule, name: "rules")
|
||||||
List<Rule> get rule {
|
List<Rule> get rule {
|
||||||
if (_rule is EqualUnmodifiableListView) return _rule;
|
if (_rule is EqualUnmodifiableListView) return _rule;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
@@ -2813,7 +3448,7 @@ class _$ClashConfigSnippetImpl implements _ClashConfigSnippet {
|
|||||||
abstract class _ClashConfigSnippet implements ClashConfigSnippet {
|
abstract class _ClashConfigSnippet implements ClashConfigSnippet {
|
||||||
const factory _ClashConfigSnippet(
|
const factory _ClashConfigSnippet(
|
||||||
{@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
{@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
||||||
@JsonKey(fromJson: _genRule) final List<Rule> rule,
|
@JsonKey(fromJson: _genRule, name: "rules") final List<Rule> rule,
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
final List<RuleProvider> ruleProvider,
|
final List<RuleProvider> ruleProvider,
|
||||||
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
@JsonKey(name: "sub-rules", fromJson: _genSubRules)
|
||||||
@@ -2826,7 +3461,7 @@ abstract class _ClashConfigSnippet implements ClashConfigSnippet {
|
|||||||
@JsonKey(name: "proxy-groups")
|
@JsonKey(name: "proxy-groups")
|
||||||
List<ProxyGroup> get proxyGroups;
|
List<ProxyGroup> get proxyGroups;
|
||||||
@override
|
@override
|
||||||
@JsonKey(fromJson: _genRule)
|
@JsonKey(fromJson: _genRule, name: "rules")
|
||||||
List<Rule> get rule;
|
List<Rule> get rule;
|
||||||
@override
|
@override
|
||||||
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
@JsonKey(name: "rule-providers", fromJson: _genRuleProviders)
|
||||||
@@ -2851,6 +3486,14 @@ ClashConfig _$ClashConfigFromJson(Map<String, dynamic> json) {
|
|||||||
mixin _$ClashConfig {
|
mixin _$ClashConfig {
|
||||||
@JsonKey(name: "mixed-port")
|
@JsonKey(name: "mixed-port")
|
||||||
int get mixedPort => throw _privateConstructorUsedError;
|
int get mixedPort => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "socks-port")
|
||||||
|
int get socksPort => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "port")
|
||||||
|
int get port => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "redir-port")
|
||||||
|
int get redirPort => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(name: "tproxy-port")
|
||||||
|
int get tproxyPort => throw _privateConstructorUsedError;
|
||||||
Mode get mode => throw _privateConstructorUsedError;
|
Mode get mode => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "allow-lan")
|
@JsonKey(name: "allow-lan")
|
||||||
bool get allowLan => throw _privateConstructorUsedError;
|
bool get allowLan => throw _privateConstructorUsedError;
|
||||||
@@ -2901,6 +3544,10 @@ abstract class $ClashConfigCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{@JsonKey(name: "mixed-port") int mixedPort,
|
{@JsonKey(name: "mixed-port") int mixedPort,
|
||||||
|
@JsonKey(name: "socks-port") int socksPort,
|
||||||
|
@JsonKey(name: "port") int port,
|
||||||
|
@JsonKey(name: "redir-port") int redirPort,
|
||||||
|
@JsonKey(name: "tproxy-port") int tproxyPort,
|
||||||
Mode mode,
|
Mode mode,
|
||||||
@JsonKey(name: "allow-lan") bool allowLan,
|
@JsonKey(name: "allow-lan") bool allowLan,
|
||||||
@JsonKey(name: "log-level") LogLevel logLevel,
|
@JsonKey(name: "log-level") LogLevel logLevel,
|
||||||
@@ -2944,6 +3591,10 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? mixedPort = null,
|
Object? mixedPort = null,
|
||||||
|
Object? socksPort = null,
|
||||||
|
Object? port = null,
|
||||||
|
Object? redirPort = null,
|
||||||
|
Object? tproxyPort = null,
|
||||||
Object? mode = null,
|
Object? mode = null,
|
||||||
Object? allowLan = null,
|
Object? allowLan = null,
|
||||||
Object? logLevel = null,
|
Object? logLevel = null,
|
||||||
@@ -2967,6 +3618,22 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
|||||||
? _value.mixedPort
|
? _value.mixedPort
|
||||||
: mixedPort // ignore: cast_nullable_to_non_nullable
|
: mixedPort // ignore: cast_nullable_to_non_nullable
|
||||||
as int,
|
as int,
|
||||||
|
socksPort: null == socksPort
|
||||||
|
? _value.socksPort
|
||||||
|
: socksPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
port: null == port
|
||||||
|
? _value.port
|
||||||
|
: port // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
redirPort: null == redirPort
|
||||||
|
? _value.redirPort
|
||||||
|
: redirPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
tproxyPort: null == tproxyPort
|
||||||
|
? _value.tproxyPort
|
||||||
|
: tproxyPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
mode: null == mode
|
mode: null == mode
|
||||||
? _value.mode
|
? _value.mode
|
||||||
: mode // ignore: cast_nullable_to_non_nullable
|
: mode // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -3079,6 +3746,10 @@ abstract class _$$ClashConfigImplCopyWith<$Res>
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{@JsonKey(name: "mixed-port") int mixedPort,
|
{@JsonKey(name: "mixed-port") int mixedPort,
|
||||||
|
@JsonKey(name: "socks-port") int socksPort,
|
||||||
|
@JsonKey(name: "port") int port,
|
||||||
|
@JsonKey(name: "redir-port") int redirPort,
|
||||||
|
@JsonKey(name: "tproxy-port") int tproxyPort,
|
||||||
Mode mode,
|
Mode mode,
|
||||||
@JsonKey(name: "allow-lan") bool allowLan,
|
@JsonKey(name: "allow-lan") bool allowLan,
|
||||||
@JsonKey(name: "log-level") LogLevel logLevel,
|
@JsonKey(name: "log-level") LogLevel logLevel,
|
||||||
@@ -3123,6 +3794,10 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? mixedPort = null,
|
Object? mixedPort = null,
|
||||||
|
Object? socksPort = null,
|
||||||
|
Object? port = null,
|
||||||
|
Object? redirPort = null,
|
||||||
|
Object? tproxyPort = null,
|
||||||
Object? mode = null,
|
Object? mode = null,
|
||||||
Object? allowLan = null,
|
Object? allowLan = null,
|
||||||
Object? logLevel = null,
|
Object? logLevel = null,
|
||||||
@@ -3146,6 +3821,22 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
|||||||
? _value.mixedPort
|
? _value.mixedPort
|
||||||
: mixedPort // ignore: cast_nullable_to_non_nullable
|
: mixedPort // ignore: cast_nullable_to_non_nullable
|
||||||
as int,
|
as int,
|
||||||
|
socksPort: null == socksPort
|
||||||
|
? _value.socksPort
|
||||||
|
: socksPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
port: null == port
|
||||||
|
? _value.port
|
||||||
|
: port // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
redirPort: null == redirPort
|
||||||
|
? _value.redirPort
|
||||||
|
: redirPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
|
tproxyPort: null == tproxyPort
|
||||||
|
? _value.tproxyPort
|
||||||
|
: tproxyPort // ignore: cast_nullable_to_non_nullable
|
||||||
|
as int,
|
||||||
mode: null == mode
|
mode: null == mode
|
||||||
? _value.mode
|
? _value.mode
|
||||||
: mode // ignore: cast_nullable_to_non_nullable
|
: mode // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -3223,6 +3914,10 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
|||||||
class _$ClashConfigImpl implements _ClashConfig {
|
class _$ClashConfigImpl implements _ClashConfig {
|
||||||
const _$ClashConfigImpl(
|
const _$ClashConfigImpl(
|
||||||
{@JsonKey(name: "mixed-port") this.mixedPort = defaultMixedPort,
|
{@JsonKey(name: "mixed-port") this.mixedPort = defaultMixedPort,
|
||||||
|
@JsonKey(name: "socks-port") this.socksPort = 0,
|
||||||
|
@JsonKey(name: "port") this.port = 0,
|
||||||
|
@JsonKey(name: "redir-port") this.redirPort = 0,
|
||||||
|
@JsonKey(name: "tproxy-port") this.tproxyPort = 0,
|
||||||
this.mode = Mode.rule,
|
this.mode = Mode.rule,
|
||||||
@JsonKey(name: "allow-lan") this.allowLan = false,
|
@JsonKey(name: "allow-lan") this.allowLan = false,
|
||||||
@JsonKey(name: "log-level") this.logLevel = LogLevel.error,
|
@JsonKey(name: "log-level") this.logLevel = LogLevel.error,
|
||||||
@@ -3258,6 +3953,18 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
@JsonKey(name: "mixed-port")
|
@JsonKey(name: "mixed-port")
|
||||||
final int mixedPort;
|
final int mixedPort;
|
||||||
@override
|
@override
|
||||||
|
@JsonKey(name: "socks-port")
|
||||||
|
final int socksPort;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "port")
|
||||||
|
final int port;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "redir-port")
|
||||||
|
final int redirPort;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "tproxy-port")
|
||||||
|
final int tproxyPort;
|
||||||
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
final Mode mode;
|
final Mode mode;
|
||||||
@override
|
@override
|
||||||
@@ -3328,7 +4035,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'ClashConfig(mixedPort: $mixedPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rule: $rule, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
return 'ClashConfig(mixedPort: $mixedPort, socksPort: $socksPort, port: $port, redirPort: $redirPort, tproxyPort: $tproxyPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rule: $rule, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -3338,6 +4045,13 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
other is _$ClashConfigImpl &&
|
other is _$ClashConfigImpl &&
|
||||||
(identical(other.mixedPort, mixedPort) ||
|
(identical(other.mixedPort, mixedPort) ||
|
||||||
other.mixedPort == mixedPort) &&
|
other.mixedPort == mixedPort) &&
|
||||||
|
(identical(other.socksPort, socksPort) ||
|
||||||
|
other.socksPort == socksPort) &&
|
||||||
|
(identical(other.port, port) || other.port == port) &&
|
||||||
|
(identical(other.redirPort, redirPort) ||
|
||||||
|
other.redirPort == redirPort) &&
|
||||||
|
(identical(other.tproxyPort, tproxyPort) ||
|
||||||
|
other.tproxyPort == tproxyPort) &&
|
||||||
(identical(other.mode, mode) || other.mode == mode) &&
|
(identical(other.mode, mode) || other.mode == mode) &&
|
||||||
(identical(other.allowLan, allowLan) ||
|
(identical(other.allowLan, allowLan) ||
|
||||||
other.allowLan == allowLan) &&
|
other.allowLan == allowLan) &&
|
||||||
@@ -3369,26 +4083,31 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hashAll([
|
||||||
runtimeType,
|
runtimeType,
|
||||||
mixedPort,
|
mixedPort,
|
||||||
mode,
|
socksPort,
|
||||||
allowLan,
|
port,
|
||||||
logLevel,
|
redirPort,
|
||||||
ipv6,
|
tproxyPort,
|
||||||
findProcessMode,
|
mode,
|
||||||
keepAliveInterval,
|
allowLan,
|
||||||
unifiedDelay,
|
logLevel,
|
||||||
tcpConcurrent,
|
ipv6,
|
||||||
tun,
|
findProcessMode,
|
||||||
dns,
|
keepAliveInterval,
|
||||||
geoXUrl,
|
unifiedDelay,
|
||||||
geodataLoader,
|
tcpConcurrent,
|
||||||
const DeepCollectionEquality().hash(_proxyGroups),
|
tun,
|
||||||
const DeepCollectionEquality().hash(_rule),
|
dns,
|
||||||
globalUa,
|
geoXUrl,
|
||||||
externalController,
|
geodataLoader,
|
||||||
const DeepCollectionEquality().hash(_hosts));
|
const DeepCollectionEquality().hash(_proxyGroups),
|
||||||
|
const DeepCollectionEquality().hash(_rule),
|
||||||
|
globalUa,
|
||||||
|
externalController,
|
||||||
|
const DeepCollectionEquality().hash(_hosts)
|
||||||
|
]);
|
||||||
|
|
||||||
/// Create a copy of ClashConfig
|
/// Create a copy of ClashConfig
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -3409,6 +4128,10 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
abstract class _ClashConfig implements ClashConfig {
|
abstract class _ClashConfig implements ClashConfig {
|
||||||
const factory _ClashConfig(
|
const factory _ClashConfig(
|
||||||
{@JsonKey(name: "mixed-port") final int mixedPort,
|
{@JsonKey(name: "mixed-port") final int mixedPort,
|
||||||
|
@JsonKey(name: "socks-port") final int socksPort,
|
||||||
|
@JsonKey(name: "port") final int port,
|
||||||
|
@JsonKey(name: "redir-port") final int redirPort,
|
||||||
|
@JsonKey(name: "tproxy-port") final int tproxyPort,
|
||||||
final Mode mode,
|
final Mode mode,
|
||||||
@JsonKey(name: "allow-lan") final bool allowLan,
|
@JsonKey(name: "allow-lan") final bool allowLan,
|
||||||
@JsonKey(name: "log-level") final LogLevel logLevel,
|
@JsonKey(name: "log-level") final LogLevel logLevel,
|
||||||
@@ -3438,6 +4161,18 @@ abstract class _ClashConfig implements ClashConfig {
|
|||||||
@JsonKey(name: "mixed-port")
|
@JsonKey(name: "mixed-port")
|
||||||
int get mixedPort;
|
int get mixedPort;
|
||||||
@override
|
@override
|
||||||
|
@JsonKey(name: "socks-port")
|
||||||
|
int get socksPort;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "port")
|
||||||
|
int get port;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "redir-port")
|
||||||
|
int get redirPort;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "tproxy-port")
|
||||||
|
int get tproxyPort;
|
||||||
|
@override
|
||||||
Mode get mode;
|
Mode get mode;
|
||||||
@override
|
@override
|
||||||
@JsonKey(name: "allow-lan")
|
@JsonKey(name: "allow-lan")
|
||||||
|
|||||||
@@ -63,6 +63,72 @@ Map<String, dynamic> _$$RuleProviderImplToJson(_$RuleProviderImpl instance) =>
|
|||||||
'name': instance.name,
|
'name': instance.name,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_$SnifferImpl _$$SnifferImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SnifferImpl(
|
||||||
|
enable: json['enable'] as bool? ?? false,
|
||||||
|
overrideDest: json['override-destination'] as bool? ?? true,
|
||||||
|
sniffing: (json['sniffing'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
forceDomain: (json['force-domain'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
skipSrcAddress: (json['skip-src-address'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
skipDstAddress: (json['skip-dst-address'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
skipDomain: (json['skip-domain'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
port: (json['port-whitelist'] as List<dynamic>?)
|
||||||
|
?.map((e) => e as String)
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
forceDnsMapping: json['force-dns-mapping'] as bool? ?? true,
|
||||||
|
parsePureIp: json['parse-pure-ip'] as bool? ?? true,
|
||||||
|
sniff: (json['sniff'] as Map<String, dynamic>?)?.map(
|
||||||
|
(k, e) =>
|
||||||
|
MapEntry(k, SnifferConfig.fromJson(e as Map<String, dynamic>)),
|
||||||
|
) ??
|
||||||
|
const {},
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$SnifferImplToJson(_$SnifferImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'enable': instance.enable,
|
||||||
|
'override-destination': instance.overrideDest,
|
||||||
|
'sniffing': instance.sniffing,
|
||||||
|
'force-domain': instance.forceDomain,
|
||||||
|
'skip-src-address': instance.skipSrcAddress,
|
||||||
|
'skip-dst-address': instance.skipDstAddress,
|
||||||
|
'skip-domain': instance.skipDomain,
|
||||||
|
'port-whitelist': instance.port,
|
||||||
|
'force-dns-mapping': instance.forceDnsMapping,
|
||||||
|
'parse-pure-ip': instance.parsePureIp,
|
||||||
|
'sniff': instance.sniff,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$SnifferConfigImpl _$$SnifferConfigImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SnifferConfigImpl(
|
||||||
|
ports: json['ports'] == null
|
||||||
|
? const []
|
||||||
|
: _formJsonPorts(json['ports'] as List?),
|
||||||
|
overrideDest: json['override-destination'] as bool?,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$SnifferConfigImplToJson(_$SnifferConfigImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'ports': instance.ports,
|
||||||
|
'override-destination': instance.overrideDest,
|
||||||
|
};
|
||||||
|
|
||||||
_$TunImpl _$$TunImplFromJson(Map<String, dynamic> json) => _$TunImpl(
|
_$TunImpl _$$TunImplFromJson(Map<String, dynamic> json) => _$TunImpl(
|
||||||
enable: json['enable'] as bool? ?? false,
|
enable: json['enable'] as bool? ?? false,
|
||||||
device: json['device'] as String? ?? appName,
|
device: json['device'] as String? ?? appName,
|
||||||
@@ -246,7 +312,7 @@ _$ClashConfigSnippetImpl _$$ClashConfigSnippetImplFromJson(
|
|||||||
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
||||||
.toList() ??
|
.toList() ??
|
||||||
const [],
|
const [],
|
||||||
rule: json['rule'] == null ? const [] : _genRule(json['rule'] as List?),
|
rule: json['rules'] == null ? const [] : _genRule(json['rules'] as List?),
|
||||||
ruleProvider: json['rule-providers'] == null
|
ruleProvider: json['rule-providers'] == null
|
||||||
? const []
|
? const []
|
||||||
: _genRuleProviders(json['rule-providers'] as Map<String, dynamic>),
|
: _genRuleProviders(json['rule-providers'] as Map<String, dynamic>),
|
||||||
@@ -259,7 +325,7 @@ Map<String, dynamic> _$$ClashConfigSnippetImplToJson(
|
|||||||
_$ClashConfigSnippetImpl instance) =>
|
_$ClashConfigSnippetImpl instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'proxy-groups': instance.proxyGroups,
|
'proxy-groups': instance.proxyGroups,
|
||||||
'rule': instance.rule,
|
'rules': instance.rule,
|
||||||
'rule-providers': instance.ruleProvider,
|
'rule-providers': instance.ruleProvider,
|
||||||
'sub-rules': instance.subRules,
|
'sub-rules': instance.subRules,
|
||||||
};
|
};
|
||||||
@@ -267,6 +333,10 @@ Map<String, dynamic> _$$ClashConfigSnippetImplToJson(
|
|||||||
_$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
_$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
||||||
_$ClashConfigImpl(
|
_$ClashConfigImpl(
|
||||||
mixedPort: (json['mixed-port'] as num?)?.toInt() ?? defaultMixedPort,
|
mixedPort: (json['mixed-port'] as num?)?.toInt() ?? defaultMixedPort,
|
||||||
|
socksPort: (json['socks-port'] as num?)?.toInt() ?? 0,
|
||||||
|
port: (json['port'] as num?)?.toInt() ?? 0,
|
||||||
|
redirPort: (json['redir-port'] as num?)?.toInt() ?? 0,
|
||||||
|
tproxyPort: (json['tproxy-port'] as num?)?.toInt() ?? 0,
|
||||||
mode: $enumDecodeNullable(_$ModeEnumMap, json['mode']) ?? Mode.rule,
|
mode: $enumDecodeNullable(_$ModeEnumMap, json['mode']) ?? Mode.rule,
|
||||||
allowLan: json['allow-lan'] as bool? ?? false,
|
allowLan: json['allow-lan'] as bool? ?? false,
|
||||||
logLevel: $enumDecodeNullable(_$LogLevelEnumMap, json['log-level']) ??
|
logLevel: $enumDecodeNullable(_$LogLevelEnumMap, json['log-level']) ??
|
||||||
@@ -312,6 +382,10 @@ _$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
|||||||
Map<String, dynamic> _$$ClashConfigImplToJson(_$ClashConfigImpl instance) =>
|
Map<String, dynamic> _$$ClashConfigImplToJson(_$ClashConfigImpl instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'mixed-port': instance.mixedPort,
|
'mixed-port': instance.mixedPort,
|
||||||
|
'socks-port': instance.socksPort,
|
||||||
|
'port': instance.port,
|
||||||
|
'redir-port': instance.redirPort,
|
||||||
|
'tproxy-port': instance.tproxyPort,
|
||||||
'mode': _$ModeEnumMap[instance.mode]!,
|
'mode': _$ModeEnumMap[instance.mode]!,
|
||||||
'allow-lan': instance.allowLan,
|
'allow-lan': instance.allowLan,
|
||||||
'log-level': _$LogLevelEnumMap[instance.logLevel]!,
|
'log-level': _$LogLevelEnumMap[instance.logLevel]!,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ mixin _$NavigationItem {
|
|||||||
Icon get icon => throw _privateConstructorUsedError;
|
Icon get icon => throw _privateConstructorUsedError;
|
||||||
PageLabel get label => throw _privateConstructorUsedError;
|
PageLabel get label => throw _privateConstructorUsedError;
|
||||||
String? get description => throw _privateConstructorUsedError;
|
String? get description => throw _privateConstructorUsedError;
|
||||||
Widget get fragment => throw _privateConstructorUsedError;
|
Widget get view => throw _privateConstructorUsedError;
|
||||||
bool get keep => throw _privateConstructorUsedError;
|
bool get keep => throw _privateConstructorUsedError;
|
||||||
String? get path => throw _privateConstructorUsedError;
|
String? get path => throw _privateConstructorUsedError;
|
||||||
List<NavigationItemMode> get modes => throw _privateConstructorUsedError;
|
List<NavigationItemMode> get modes => throw _privateConstructorUsedError;
|
||||||
@@ -41,7 +41,7 @@ abstract class $NavigationItemCopyWith<$Res> {
|
|||||||
{Icon icon,
|
{Icon icon,
|
||||||
PageLabel label,
|
PageLabel label,
|
||||||
String? description,
|
String? description,
|
||||||
Widget fragment,
|
Widget view,
|
||||||
bool keep,
|
bool keep,
|
||||||
String? path,
|
String? path,
|
||||||
List<NavigationItemMode> modes});
|
List<NavigationItemMode> modes});
|
||||||
@@ -65,7 +65,7 @@ class _$NavigationItemCopyWithImpl<$Res, $Val extends NavigationItem>
|
|||||||
Object? icon = null,
|
Object? icon = null,
|
||||||
Object? label = null,
|
Object? label = null,
|
||||||
Object? description = freezed,
|
Object? description = freezed,
|
||||||
Object? fragment = null,
|
Object? view = null,
|
||||||
Object? keep = null,
|
Object? keep = null,
|
||||||
Object? path = freezed,
|
Object? path = freezed,
|
||||||
Object? modes = null,
|
Object? modes = null,
|
||||||
@@ -83,9 +83,9 @@ class _$NavigationItemCopyWithImpl<$Res, $Val extends NavigationItem>
|
|||||||
? _value.description
|
? _value.description
|
||||||
: description // ignore: cast_nullable_to_non_nullable
|
: description // ignore: cast_nullable_to_non_nullable
|
||||||
as String?,
|
as String?,
|
||||||
fragment: null == fragment
|
view: null == view
|
||||||
? _value.fragment
|
? _value.view
|
||||||
: fragment // ignore: cast_nullable_to_non_nullable
|
: view // ignore: cast_nullable_to_non_nullable
|
||||||
as Widget,
|
as Widget,
|
||||||
keep: null == keep
|
keep: null == keep
|
||||||
? _value.keep
|
? _value.keep
|
||||||
@@ -115,7 +115,7 @@ abstract class _$$NavigationItemImplCopyWith<$Res>
|
|||||||
{Icon icon,
|
{Icon icon,
|
||||||
PageLabel label,
|
PageLabel label,
|
||||||
String? description,
|
String? description,
|
||||||
Widget fragment,
|
Widget view,
|
||||||
bool keep,
|
bool keep,
|
||||||
String? path,
|
String? path,
|
||||||
List<NavigationItemMode> modes});
|
List<NavigationItemMode> modes});
|
||||||
@@ -137,7 +137,7 @@ class __$$NavigationItemImplCopyWithImpl<$Res>
|
|||||||
Object? icon = null,
|
Object? icon = null,
|
||||||
Object? label = null,
|
Object? label = null,
|
||||||
Object? description = freezed,
|
Object? description = freezed,
|
||||||
Object? fragment = null,
|
Object? view = null,
|
||||||
Object? keep = null,
|
Object? keep = null,
|
||||||
Object? path = freezed,
|
Object? path = freezed,
|
||||||
Object? modes = null,
|
Object? modes = null,
|
||||||
@@ -155,9 +155,9 @@ class __$$NavigationItemImplCopyWithImpl<$Res>
|
|||||||
? _value.description
|
? _value.description
|
||||||
: description // ignore: cast_nullable_to_non_nullable
|
: description // ignore: cast_nullable_to_non_nullable
|
||||||
as String?,
|
as String?,
|
||||||
fragment: null == fragment
|
view: null == view
|
||||||
? _value.fragment
|
? _value.view
|
||||||
: fragment // ignore: cast_nullable_to_non_nullable
|
: view // ignore: cast_nullable_to_non_nullable
|
||||||
as Widget,
|
as Widget,
|
||||||
keep: null == keep
|
keep: null == keep
|
||||||
? _value.keep
|
? _value.keep
|
||||||
@@ -182,7 +182,7 @@ class _$NavigationItemImpl implements _NavigationItem {
|
|||||||
{required this.icon,
|
{required this.icon,
|
||||||
required this.label,
|
required this.label,
|
||||||
this.description,
|
this.description,
|
||||||
required this.fragment,
|
required this.view,
|
||||||
this.keep = true,
|
this.keep = true,
|
||||||
this.path,
|
this.path,
|
||||||
final List<NavigationItemMode> modes = const [
|
final List<NavigationItemMode> modes = const [
|
||||||
@@ -198,7 +198,7 @@ class _$NavigationItemImpl implements _NavigationItem {
|
|||||||
@override
|
@override
|
||||||
final String? description;
|
final String? description;
|
||||||
@override
|
@override
|
||||||
final Widget fragment;
|
final Widget view;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
final bool keep;
|
final bool keep;
|
||||||
@@ -215,7 +215,7 @@ class _$NavigationItemImpl implements _NavigationItem {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'NavigationItem(icon: $icon, label: $label, description: $description, fragment: $fragment, keep: $keep, path: $path, modes: $modes)';
|
return 'NavigationItem(icon: $icon, label: $label, description: $description, view: $view, keep: $keep, path: $path, modes: $modes)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -227,16 +227,15 @@ class _$NavigationItemImpl implements _NavigationItem {
|
|||||||
(identical(other.label, label) || other.label == label) &&
|
(identical(other.label, label) || other.label == label) &&
|
||||||
(identical(other.description, description) ||
|
(identical(other.description, description) ||
|
||||||
other.description == description) &&
|
other.description == description) &&
|
||||||
(identical(other.fragment, fragment) ||
|
(identical(other.view, view) || other.view == view) &&
|
||||||
other.fragment == fragment) &&
|
|
||||||
(identical(other.keep, keep) || other.keep == keep) &&
|
(identical(other.keep, keep) || other.keep == keep) &&
|
||||||
(identical(other.path, path) || other.path == path) &&
|
(identical(other.path, path) || other.path == path) &&
|
||||||
const DeepCollectionEquality().equals(other._modes, _modes));
|
const DeepCollectionEquality().equals(other._modes, _modes));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, icon, label, description,
|
int get hashCode => Object.hash(runtimeType, icon, label, description, view,
|
||||||
fragment, keep, path, const DeepCollectionEquality().hash(_modes));
|
keep, path, const DeepCollectionEquality().hash(_modes));
|
||||||
|
|
||||||
/// Create a copy of NavigationItem
|
/// Create a copy of NavigationItem
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -253,7 +252,7 @@ abstract class _NavigationItem implements NavigationItem {
|
|||||||
{required final Icon icon,
|
{required final Icon icon,
|
||||||
required final PageLabel label,
|
required final PageLabel label,
|
||||||
final String? description,
|
final String? description,
|
||||||
required final Widget fragment,
|
required final Widget view,
|
||||||
final bool keep,
|
final bool keep,
|
||||||
final String? path,
|
final String? path,
|
||||||
final List<NavigationItemMode> modes}) = _$NavigationItemImpl;
|
final List<NavigationItemMode> modes}) = _$NavigationItemImpl;
|
||||||
@@ -265,7 +264,7 @@ abstract class _NavigationItem implements NavigationItem {
|
|||||||
@override
|
@override
|
||||||
String? get description;
|
String? get description;
|
||||||
@override
|
@override
|
||||||
Widget get fragment;
|
Widget get view;
|
||||||
@override
|
@override
|
||||||
bool get keep;
|
bool get keep;
|
||||||
@override
|
@override
|
||||||
@@ -3466,3 +3465,348 @@ abstract class _TextPainterParams implements TextPainterParams {
|
|||||||
_$$TextPainterParamsImplCopyWith<_$TextPainterParamsImpl> get copyWith =>
|
_$$TextPainterParamsImplCopyWith<_$TextPainterParamsImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$Result<T> {
|
||||||
|
T? get data => throw _privateConstructorUsedError;
|
||||||
|
ResultType get type => throw _privateConstructorUsedError;
|
||||||
|
String get message => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of Result
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$ResultCopyWith<T, Result<T>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $ResultCopyWith<T, $Res> {
|
||||||
|
factory $ResultCopyWith(Result<T> value, $Res Function(Result<T>) then) =
|
||||||
|
_$ResultCopyWithImpl<T, $Res, Result<T>>;
|
||||||
|
@useResult
|
||||||
|
$Res call({T? data, ResultType type, String message});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$ResultCopyWithImpl<T, $Res, $Val extends Result<T>>
|
||||||
|
implements $ResultCopyWith<T, $Res> {
|
||||||
|
_$ResultCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of Result
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? data = freezed,
|
||||||
|
Object? type = null,
|
||||||
|
Object? message = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
data: freezed == data
|
||||||
|
? _value.data
|
||||||
|
: data // ignore: cast_nullable_to_non_nullable
|
||||||
|
as T?,
|
||||||
|
type: null == type
|
||||||
|
? _value.type
|
||||||
|
: type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as ResultType,
|
||||||
|
message: null == message
|
||||||
|
? _value.message
|
||||||
|
: message // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ResultImplCopyWith<T, $Res>
|
||||||
|
implements $ResultCopyWith<T, $Res> {
|
||||||
|
factory _$$ResultImplCopyWith(
|
||||||
|
_$ResultImpl<T> value, $Res Function(_$ResultImpl<T>) then) =
|
||||||
|
__$$ResultImplCopyWithImpl<T, $Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({T? data, ResultType type, String message});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ResultImplCopyWithImpl<T, $Res>
|
||||||
|
extends _$ResultCopyWithImpl<T, $Res, _$ResultImpl<T>>
|
||||||
|
implements _$$ResultImplCopyWith<T, $Res> {
|
||||||
|
__$$ResultImplCopyWithImpl(
|
||||||
|
_$ResultImpl<T> _value, $Res Function(_$ResultImpl<T>) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of Result
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? data = freezed,
|
||||||
|
Object? type = null,
|
||||||
|
Object? message = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$ResultImpl<T>(
|
||||||
|
data: freezed == data
|
||||||
|
? _value.data
|
||||||
|
: data // ignore: cast_nullable_to_non_nullable
|
||||||
|
as T?,
|
||||||
|
type: null == type
|
||||||
|
? _value.type
|
||||||
|
: type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as ResultType,
|
||||||
|
message: null == message
|
||||||
|
? _value.message
|
||||||
|
: message // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$ResultImpl<T> implements _Result<T> {
|
||||||
|
const _$ResultImpl(
|
||||||
|
{required this.data, required this.type, required this.message});
|
||||||
|
|
||||||
|
@override
|
||||||
|
final T? data;
|
||||||
|
@override
|
||||||
|
final ResultType type;
|
||||||
|
@override
|
||||||
|
final String message;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'Result<$T>(data: $data, type: $type, message: $message)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$ResultImpl<T> &&
|
||||||
|
const DeepCollectionEquality().equals(other.data, data) &&
|
||||||
|
(identical(other.type, type) || other.type == type) &&
|
||||||
|
(identical(other.message, message) || other.message == message));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType, const DeepCollectionEquality().hash(data), type, message);
|
||||||
|
|
||||||
|
/// Create a copy of Result
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$ResultImplCopyWith<T, _$ResultImpl<T>> get copyWith =>
|
||||||
|
__$$ResultImplCopyWithImpl<T, _$ResultImpl<T>>(this, _$identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Result<T> implements Result<T> {
|
||||||
|
const factory _Result(
|
||||||
|
{required final T? data,
|
||||||
|
required final ResultType type,
|
||||||
|
required final String message}) = _$ResultImpl<T>;
|
||||||
|
|
||||||
|
@override
|
||||||
|
T? get data;
|
||||||
|
@override
|
||||||
|
ResultType get type;
|
||||||
|
@override
|
||||||
|
String get message;
|
||||||
|
|
||||||
|
/// Create a copy of Result
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$ResultImplCopyWith<T, _$ResultImpl<T>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
Script _$ScriptFromJson(Map<String, dynamic> json) {
|
||||||
|
return _Script.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$Script {
|
||||||
|
String get id => throw _privateConstructorUsedError;
|
||||||
|
String get label => throw _privateConstructorUsedError;
|
||||||
|
String get content => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this Script to a JSON map.
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of Script
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$ScriptCopyWith<Script> get copyWith => throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $ScriptCopyWith<$Res> {
|
||||||
|
factory $ScriptCopyWith(Script value, $Res Function(Script) then) =
|
||||||
|
_$ScriptCopyWithImpl<$Res, Script>;
|
||||||
|
@useResult
|
||||||
|
$Res call({String id, String label, String content});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$ScriptCopyWithImpl<$Res, $Val extends Script>
|
||||||
|
implements $ScriptCopyWith<$Res> {
|
||||||
|
_$ScriptCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of Script
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? id = null,
|
||||||
|
Object? label = null,
|
||||||
|
Object? content = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
id: null == id
|
||||||
|
? _value.id
|
||||||
|
: id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
label: null == label
|
||||||
|
? _value.label
|
||||||
|
: label // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
content: null == content
|
||||||
|
? _value.content
|
||||||
|
: content // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ScriptImplCopyWith<$Res> implements $ScriptCopyWith<$Res> {
|
||||||
|
factory _$$ScriptImplCopyWith(
|
||||||
|
_$ScriptImpl value, $Res Function(_$ScriptImpl) then) =
|
||||||
|
__$$ScriptImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({String id, String label, String content});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ScriptImplCopyWithImpl<$Res>
|
||||||
|
extends _$ScriptCopyWithImpl<$Res, _$ScriptImpl>
|
||||||
|
implements _$$ScriptImplCopyWith<$Res> {
|
||||||
|
__$$ScriptImplCopyWithImpl(
|
||||||
|
_$ScriptImpl _value, $Res Function(_$ScriptImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of Script
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? id = null,
|
||||||
|
Object? label = null,
|
||||||
|
Object? content = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$ScriptImpl(
|
||||||
|
id: null == id
|
||||||
|
? _value.id
|
||||||
|
: id // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
label: null == label
|
||||||
|
? _value.label
|
||||||
|
: label // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
content: null == content
|
||||||
|
? _value.content
|
||||||
|
: content // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$ScriptImpl implements _Script {
|
||||||
|
const _$ScriptImpl(
|
||||||
|
{required this.id, required this.label, required this.content});
|
||||||
|
|
||||||
|
factory _$ScriptImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$ScriptImplFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
final String id;
|
||||||
|
@override
|
||||||
|
final String label;
|
||||||
|
@override
|
||||||
|
final String content;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'Script(id: $id, label: $label, content: $content)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$ScriptImpl &&
|
||||||
|
(identical(other.id, id) || other.id == id) &&
|
||||||
|
(identical(other.label, label) || other.label == label) &&
|
||||||
|
(identical(other.content, content) || other.content == content));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(runtimeType, id, label, content);
|
||||||
|
|
||||||
|
/// Create a copy of Script
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$ScriptImplCopyWith<_$ScriptImpl> get copyWith =>
|
||||||
|
__$$ScriptImplCopyWithImpl<_$ScriptImpl>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$ScriptImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Script implements Script {
|
||||||
|
const factory _Script(
|
||||||
|
{required final String id,
|
||||||
|
required final String label,
|
||||||
|
required final String content}) = _$ScriptImpl;
|
||||||
|
|
||||||
|
factory _Script.fromJson(Map<String, dynamic> json) = _$ScriptImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get id;
|
||||||
|
@override
|
||||||
|
String get label;
|
||||||
|
@override
|
||||||
|
String get content;
|
||||||
|
|
||||||
|
/// Create a copy of Script
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$ScriptImplCopyWith<_$ScriptImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|||||||
@@ -218,3 +218,16 @@ Map<String, dynamic> _$$TextPainterParamsImplToJson(
|
|||||||
'maxWidth': instance.maxWidth,
|
'maxWidth': instance.maxWidth,
|
||||||
'maxLines': instance.maxLines,
|
'maxLines': instance.maxLines,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_$ScriptImpl _$$ScriptImplFromJson(Map<String, dynamic> json) => _$ScriptImpl(
|
||||||
|
id: json['id'] as String,
|
||||||
|
label: json['label'] as String,
|
||||||
|
content: json['content'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$ScriptImplToJson(_$ScriptImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'label': instance.label,
|
||||||
|
'content': instance.content,
|
||||||
|
};
|
||||||
|
|||||||
@@ -2243,6 +2243,183 @@ abstract class _ThemeProps implements ThemeProps {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScriptProps _$ScriptPropsFromJson(Map<String, dynamic> json) {
|
||||||
|
return _ScriptProps.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$ScriptProps {
|
||||||
|
String? get currentId => throw _privateConstructorUsedError;
|
||||||
|
List<Script> get scripts => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this ScriptProps to a JSON map.
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of ScriptProps
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$ScriptPropsCopyWith<ScriptProps> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $ScriptPropsCopyWith<$Res> {
|
||||||
|
factory $ScriptPropsCopyWith(
|
||||||
|
ScriptProps value, $Res Function(ScriptProps) then) =
|
||||||
|
_$ScriptPropsCopyWithImpl<$Res, ScriptProps>;
|
||||||
|
@useResult
|
||||||
|
$Res call({String? currentId, List<Script> scripts});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$ScriptPropsCopyWithImpl<$Res, $Val extends ScriptProps>
|
||||||
|
implements $ScriptPropsCopyWith<$Res> {
|
||||||
|
_$ScriptPropsCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of ScriptProps
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? currentId = freezed,
|
||||||
|
Object? scripts = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
currentId: freezed == currentId
|
||||||
|
? _value.currentId
|
||||||
|
: currentId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
scripts: null == scripts
|
||||||
|
? _value.scripts
|
||||||
|
: scripts // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<Script>,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ScriptPropsImplCopyWith<$Res>
|
||||||
|
implements $ScriptPropsCopyWith<$Res> {
|
||||||
|
factory _$$ScriptPropsImplCopyWith(
|
||||||
|
_$ScriptPropsImpl value, $Res Function(_$ScriptPropsImpl) then) =
|
||||||
|
__$$ScriptPropsImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({String? currentId, List<Script> scripts});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ScriptPropsImplCopyWithImpl<$Res>
|
||||||
|
extends _$ScriptPropsCopyWithImpl<$Res, _$ScriptPropsImpl>
|
||||||
|
implements _$$ScriptPropsImplCopyWith<$Res> {
|
||||||
|
__$$ScriptPropsImplCopyWithImpl(
|
||||||
|
_$ScriptPropsImpl _value, $Res Function(_$ScriptPropsImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of ScriptProps
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? currentId = freezed,
|
||||||
|
Object? scripts = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$ScriptPropsImpl(
|
||||||
|
currentId: freezed == currentId
|
||||||
|
? _value.currentId
|
||||||
|
: currentId // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
scripts: null == scripts
|
||||||
|
? _value._scripts
|
||||||
|
: scripts // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<Script>,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$ScriptPropsImpl implements _ScriptProps {
|
||||||
|
const _$ScriptPropsImpl(
|
||||||
|
{this.currentId, final List<Script> scripts = const []})
|
||||||
|
: _scripts = scripts;
|
||||||
|
|
||||||
|
factory _$ScriptPropsImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$ScriptPropsImplFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
final String? currentId;
|
||||||
|
final List<Script> _scripts;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
List<Script> get scripts {
|
||||||
|
if (_scripts is EqualUnmodifiableListView) return _scripts;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_scripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'ScriptProps(currentId: $currentId, scripts: $scripts)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$ScriptPropsImpl &&
|
||||||
|
(identical(other.currentId, currentId) ||
|
||||||
|
other.currentId == currentId) &&
|
||||||
|
const DeepCollectionEquality().equals(other._scripts, _scripts));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType, currentId, const DeepCollectionEquality().hash(_scripts));
|
||||||
|
|
||||||
|
/// Create a copy of ScriptProps
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$ScriptPropsImplCopyWith<_$ScriptPropsImpl> get copyWith =>
|
||||||
|
__$$ScriptPropsImplCopyWithImpl<_$ScriptPropsImpl>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$ScriptPropsImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _ScriptProps implements ScriptProps {
|
||||||
|
const factory _ScriptProps(
|
||||||
|
{final String? currentId,
|
||||||
|
final List<Script> scripts}) = _$ScriptPropsImpl;
|
||||||
|
|
||||||
|
factory _ScriptProps.fromJson(Map<String, dynamic> json) =
|
||||||
|
_$ScriptPropsImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get currentId;
|
||||||
|
@override
|
||||||
|
List<Script> get scripts;
|
||||||
|
|
||||||
|
/// Create a copy of ScriptProps
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$ScriptPropsImplCopyWith<_$ScriptPropsImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
Config _$ConfigFromJson(Map<String, dynamic> json) {
|
Config _$ConfigFromJson(Map<String, dynamic> json) {
|
||||||
return _Config.fromJson(json);
|
return _Config.fromJson(json);
|
||||||
}
|
}
|
||||||
@@ -2263,6 +2440,7 @@ mixin _$Config {
|
|||||||
ProxiesStyle get proxiesStyle => throw _privateConstructorUsedError;
|
ProxiesStyle get proxiesStyle => throw _privateConstructorUsedError;
|
||||||
WindowProps get windowProps => throw _privateConstructorUsedError;
|
WindowProps get windowProps => throw _privateConstructorUsedError;
|
||||||
ClashConfig get patchClashConfig => throw _privateConstructorUsedError;
|
ClashConfig get patchClashConfig => throw _privateConstructorUsedError;
|
||||||
|
ScriptProps get scriptProps => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
/// Serializes this Config to a JSON map.
|
/// Serializes this Config to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@@ -2291,7 +2469,8 @@ abstract class $ConfigCopyWith<$Res> {
|
|||||||
@JsonKey(fromJson: ThemeProps.safeFromJson) ThemeProps themeProps,
|
@JsonKey(fromJson: ThemeProps.safeFromJson) ThemeProps themeProps,
|
||||||
ProxiesStyle proxiesStyle,
|
ProxiesStyle proxiesStyle,
|
||||||
WindowProps windowProps,
|
WindowProps windowProps,
|
||||||
ClashConfig patchClashConfig});
|
ClashConfig patchClashConfig,
|
||||||
|
ScriptProps scriptProps});
|
||||||
|
|
||||||
$AppSettingPropsCopyWith<$Res> get appSetting;
|
$AppSettingPropsCopyWith<$Res> get appSetting;
|
||||||
$DAVCopyWith<$Res>? get dav;
|
$DAVCopyWith<$Res>? get dav;
|
||||||
@@ -2301,6 +2480,7 @@ abstract class $ConfigCopyWith<$Res> {
|
|||||||
$ProxiesStyleCopyWith<$Res> get proxiesStyle;
|
$ProxiesStyleCopyWith<$Res> get proxiesStyle;
|
||||||
$WindowPropsCopyWith<$Res> get windowProps;
|
$WindowPropsCopyWith<$Res> get windowProps;
|
||||||
$ClashConfigCopyWith<$Res> get patchClashConfig;
|
$ClashConfigCopyWith<$Res> get patchClashConfig;
|
||||||
|
$ScriptPropsCopyWith<$Res> get scriptProps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -2330,6 +2510,7 @@ class _$ConfigCopyWithImpl<$Res, $Val extends Config>
|
|||||||
Object? proxiesStyle = null,
|
Object? proxiesStyle = null,
|
||||||
Object? windowProps = null,
|
Object? windowProps = null,
|
||||||
Object? patchClashConfig = null,
|
Object? patchClashConfig = null,
|
||||||
|
Object? scriptProps = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_value.copyWith(
|
return _then(_value.copyWith(
|
||||||
appSetting: null == appSetting
|
appSetting: null == appSetting
|
||||||
@@ -2380,6 +2561,10 @@ class _$ConfigCopyWithImpl<$Res, $Val extends Config>
|
|||||||
? _value.patchClashConfig
|
? _value.patchClashConfig
|
||||||
: patchClashConfig // ignore: cast_nullable_to_non_nullable
|
: patchClashConfig // ignore: cast_nullable_to_non_nullable
|
||||||
as ClashConfig,
|
as ClashConfig,
|
||||||
|
scriptProps: null == scriptProps
|
||||||
|
? _value.scriptProps
|
||||||
|
: scriptProps // ignore: cast_nullable_to_non_nullable
|
||||||
|
as ScriptProps,
|
||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2466,6 +2651,16 @@ class _$ConfigCopyWithImpl<$Res, $Val extends Config>
|
|||||||
return _then(_value.copyWith(patchClashConfig: value) as $Val);
|
return _then(_value.copyWith(patchClashConfig: value) as $Val);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a copy of Config
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
$ScriptPropsCopyWith<$Res> get scriptProps {
|
||||||
|
return $ScriptPropsCopyWith<$Res>(_value.scriptProps, (value) {
|
||||||
|
return _then(_value.copyWith(scriptProps: value) as $Val);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -2488,7 +2683,8 @@ abstract class _$$ConfigImplCopyWith<$Res> implements $ConfigCopyWith<$Res> {
|
|||||||
@JsonKey(fromJson: ThemeProps.safeFromJson) ThemeProps themeProps,
|
@JsonKey(fromJson: ThemeProps.safeFromJson) ThemeProps themeProps,
|
||||||
ProxiesStyle proxiesStyle,
|
ProxiesStyle proxiesStyle,
|
||||||
WindowProps windowProps,
|
WindowProps windowProps,
|
||||||
ClashConfig patchClashConfig});
|
ClashConfig patchClashConfig,
|
||||||
|
ScriptProps scriptProps});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
$AppSettingPropsCopyWith<$Res> get appSetting;
|
$AppSettingPropsCopyWith<$Res> get appSetting;
|
||||||
@@ -2506,6 +2702,8 @@ abstract class _$$ConfigImplCopyWith<$Res> implements $ConfigCopyWith<$Res> {
|
|||||||
$WindowPropsCopyWith<$Res> get windowProps;
|
$WindowPropsCopyWith<$Res> get windowProps;
|
||||||
@override
|
@override
|
||||||
$ClashConfigCopyWith<$Res> get patchClashConfig;
|
$ClashConfigCopyWith<$Res> get patchClashConfig;
|
||||||
|
@override
|
||||||
|
$ScriptPropsCopyWith<$Res> get scriptProps;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -2533,6 +2731,7 @@ class __$$ConfigImplCopyWithImpl<$Res>
|
|||||||
Object? proxiesStyle = null,
|
Object? proxiesStyle = null,
|
||||||
Object? windowProps = null,
|
Object? windowProps = null,
|
||||||
Object? patchClashConfig = null,
|
Object? patchClashConfig = null,
|
||||||
|
Object? scriptProps = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_$ConfigImpl(
|
return _then(_$ConfigImpl(
|
||||||
appSetting: null == appSetting
|
appSetting: null == appSetting
|
||||||
@@ -2583,6 +2782,10 @@ class __$$ConfigImplCopyWithImpl<$Res>
|
|||||||
? _value.patchClashConfig
|
? _value.patchClashConfig
|
||||||
: patchClashConfig // ignore: cast_nullable_to_non_nullable
|
: patchClashConfig // ignore: cast_nullable_to_non_nullable
|
||||||
as ClashConfig,
|
as ClashConfig,
|
||||||
|
scriptProps: null == scriptProps
|
||||||
|
? _value.scriptProps
|
||||||
|
: scriptProps // ignore: cast_nullable_to_non_nullable
|
||||||
|
as ScriptProps,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2603,7 +2806,8 @@ class _$ConfigImpl implements _Config {
|
|||||||
@JsonKey(fromJson: ThemeProps.safeFromJson) required this.themeProps,
|
@JsonKey(fromJson: ThemeProps.safeFromJson) required this.themeProps,
|
||||||
this.proxiesStyle = defaultProxiesStyle,
|
this.proxiesStyle = defaultProxiesStyle,
|
||||||
this.windowProps = defaultWindowProps,
|
this.windowProps = defaultWindowProps,
|
||||||
this.patchClashConfig = defaultClashConfig})
|
this.patchClashConfig = defaultClashConfig,
|
||||||
|
this.scriptProps = const ScriptProps()})
|
||||||
: _profiles = profiles,
|
: _profiles = profiles,
|
||||||
_hotKeyActions = hotKeyActions;
|
_hotKeyActions = hotKeyActions;
|
||||||
|
|
||||||
@@ -2656,10 +2860,13 @@ class _$ConfigImpl implements _Config {
|
|||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
final ClashConfig patchClashConfig;
|
final ClashConfig patchClashConfig;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
final ScriptProps scriptProps;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Config(appSetting: $appSetting, profiles: $profiles, hotKeyActions: $hotKeyActions, currentProfileId: $currentProfileId, overrideDns: $overrideDns, dav: $dav, networkProps: $networkProps, vpnProps: $vpnProps, themeProps: $themeProps, proxiesStyle: $proxiesStyle, windowProps: $windowProps, patchClashConfig: $patchClashConfig)';
|
return 'Config(appSetting: $appSetting, profiles: $profiles, hotKeyActions: $hotKeyActions, currentProfileId: $currentProfileId, overrideDns: $overrideDns, dav: $dav, networkProps: $networkProps, vpnProps: $vpnProps, themeProps: $themeProps, proxiesStyle: $proxiesStyle, windowProps: $windowProps, patchClashConfig: $patchClashConfig, scriptProps: $scriptProps)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -2688,7 +2895,9 @@ class _$ConfigImpl implements _Config {
|
|||||||
(identical(other.windowProps, windowProps) ||
|
(identical(other.windowProps, windowProps) ||
|
||||||
other.windowProps == windowProps) &&
|
other.windowProps == windowProps) &&
|
||||||
(identical(other.patchClashConfig, patchClashConfig) ||
|
(identical(other.patchClashConfig, patchClashConfig) ||
|
||||||
other.patchClashConfig == patchClashConfig));
|
other.patchClashConfig == patchClashConfig) &&
|
||||||
|
(identical(other.scriptProps, scriptProps) ||
|
||||||
|
other.scriptProps == scriptProps));
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@@ -2706,7 +2915,8 @@ class _$ConfigImpl implements _Config {
|
|||||||
themeProps,
|
themeProps,
|
||||||
proxiesStyle,
|
proxiesStyle,
|
||||||
windowProps,
|
windowProps,
|
||||||
patchClashConfig);
|
patchClashConfig,
|
||||||
|
scriptProps);
|
||||||
|
|
||||||
/// Create a copy of Config
|
/// Create a copy of Config
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -2739,7 +2949,8 @@ abstract class _Config implements Config {
|
|||||||
required final ThemeProps themeProps,
|
required final ThemeProps themeProps,
|
||||||
final ProxiesStyle proxiesStyle,
|
final ProxiesStyle proxiesStyle,
|
||||||
final WindowProps windowProps,
|
final WindowProps windowProps,
|
||||||
final ClashConfig patchClashConfig}) = _$ConfigImpl;
|
final ClashConfig patchClashConfig,
|
||||||
|
final ScriptProps scriptProps}) = _$ConfigImpl;
|
||||||
|
|
||||||
factory _Config.fromJson(Map<String, dynamic> json) = _$ConfigImpl.fromJson;
|
factory _Config.fromJson(Map<String, dynamic> json) = _$ConfigImpl.fromJson;
|
||||||
|
|
||||||
@@ -2769,6 +2980,8 @@ abstract class _Config implements Config {
|
|||||||
WindowProps get windowProps;
|
WindowProps get windowProps;
|
||||||
@override
|
@override
|
||||||
ClashConfig get patchClashConfig;
|
ClashConfig get patchClashConfig;
|
||||||
|
@override
|
||||||
|
ScriptProps get scriptProps;
|
||||||
|
|
||||||
/// Create a copy of Config
|
/// Create a copy of Config
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
|||||||
@@ -292,6 +292,21 @@ const _$DynamicSchemeVariantEnumMap = {
|
|||||||
DynamicSchemeVariant.fruitSalad: 'fruitSalad',
|
DynamicSchemeVariant.fruitSalad: 'fruitSalad',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_$ScriptPropsImpl _$$ScriptPropsImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$ScriptPropsImpl(
|
||||||
|
currentId: json['currentId'] as String?,
|
||||||
|
scripts: (json['scripts'] as List<dynamic>?)
|
||||||
|
?.map((e) => Script.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$ScriptPropsImplToJson(_$ScriptPropsImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'currentId': instance.currentId,
|
||||||
|
'scripts': instance.scripts,
|
||||||
|
};
|
||||||
|
|
||||||
_$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
_$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
||||||
appSetting: json['appSetting'] == null
|
appSetting: json['appSetting'] == null
|
||||||
? defaultAppSettingProps
|
? defaultAppSettingProps
|
||||||
@@ -330,6 +345,9 @@ _$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
|||||||
? defaultClashConfig
|
? defaultClashConfig
|
||||||
: ClashConfig.fromJson(
|
: ClashConfig.fromJson(
|
||||||
json['patchClashConfig'] as Map<String, dynamic>),
|
json['patchClashConfig'] as Map<String, dynamic>),
|
||||||
|
scriptProps: json['scriptProps'] == null
|
||||||
|
? const ScriptProps()
|
||||||
|
: ScriptProps.fromJson(json['scriptProps'] as Map<String, dynamic>),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$ConfigImplToJson(_$ConfigImpl instance) =>
|
Map<String, dynamic> _$$ConfigImplToJson(_$ConfigImpl instance) =>
|
||||||
@@ -346,4 +364,5 @@ Map<String, dynamic> _$$ConfigImplToJson(_$ConfigImpl instance) =>
|
|||||||
'proxiesStyle': instance.proxiesStyle,
|
'proxiesStyle': instance.proxiesStyle,
|
||||||
'windowProps': instance.windowProps,
|
'windowProps': instance.windowProps,
|
||||||
'patchClashConfig': instance.patchClashConfig,
|
'patchClashConfig': instance.patchClashConfig,
|
||||||
|
'scriptProps': instance.scriptProps,
|
||||||
};
|
};
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,76 @@ part of '../core.dart';
|
|||||||
// JsonSerializableGenerator
|
// JsonSerializableGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
|
_$SetupParamsImpl _$$SetupParamsImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$SetupParamsImpl(
|
||||||
|
config: json['config'] as Map<String, dynamic>,
|
||||||
|
selectedMap: Map<String, String>.from(json['selected-map'] as Map),
|
||||||
|
testUrl: json['test-url'] as String,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$SetupParamsImplToJson(_$SetupParamsImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'config': instance.config,
|
||||||
|
'selected-map': instance.selectedMap,
|
||||||
|
'test-url': instance.testUrl,
|
||||||
|
};
|
||||||
|
|
||||||
|
_$UpdateParamsImpl _$$UpdateParamsImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$UpdateParamsImpl(
|
||||||
|
tun: Tun.fromJson(json['tun'] as Map<String, dynamic>),
|
||||||
|
mixedPort: (json['mixed-port'] as num).toInt(),
|
||||||
|
allowLan: json['allow-lan'] as bool,
|
||||||
|
findProcessMode:
|
||||||
|
$enumDecode(_$FindProcessModeEnumMap, json['find-process-mode']),
|
||||||
|
mode: $enumDecode(_$ModeEnumMap, json['mode']),
|
||||||
|
logLevel: $enumDecode(_$LogLevelEnumMap, json['log-level']),
|
||||||
|
ipv6: json['ipv6'] as bool,
|
||||||
|
tcpConcurrent: json['tcp-concurrent'] as bool,
|
||||||
|
externalController: $enumDecode(
|
||||||
|
_$ExternalControllerStatusEnumMap, json['external-controller']),
|
||||||
|
unifiedDelay: json['unified-delay'] as bool,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$UpdateParamsImplToJson(_$UpdateParamsImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'tun': instance.tun,
|
||||||
|
'mixed-port': instance.mixedPort,
|
||||||
|
'allow-lan': instance.allowLan,
|
||||||
|
'find-process-mode': _$FindProcessModeEnumMap[instance.findProcessMode]!,
|
||||||
|
'mode': _$ModeEnumMap[instance.mode]!,
|
||||||
|
'log-level': _$LogLevelEnumMap[instance.logLevel]!,
|
||||||
|
'ipv6': instance.ipv6,
|
||||||
|
'tcp-concurrent': instance.tcpConcurrent,
|
||||||
|
'external-controller':
|
||||||
|
_$ExternalControllerStatusEnumMap[instance.externalController]!,
|
||||||
|
'unified-delay': instance.unifiedDelay,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$FindProcessModeEnumMap = {
|
||||||
|
FindProcessMode.always: 'always',
|
||||||
|
FindProcessMode.off: 'off',
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$ModeEnumMap = {
|
||||||
|
Mode.rule: 'rule',
|
||||||
|
Mode.global: 'global',
|
||||||
|
Mode.direct: 'direct',
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$LogLevelEnumMap = {
|
||||||
|
LogLevel.debug: 'debug',
|
||||||
|
LogLevel.info: 'info',
|
||||||
|
LogLevel.warning: 'warning',
|
||||||
|
LogLevel.error: 'error',
|
||||||
|
LogLevel.silent: 'silent',
|
||||||
|
LogLevel.app: 'app',
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$ExternalControllerStatusEnumMap = {
|
||||||
|
ExternalControllerStatus.close: '',
|
||||||
|
ExternalControllerStatus.open: '127.0.0.1:9090',
|
||||||
|
};
|
||||||
|
|
||||||
_$CoreStateImpl _$$CoreStateImplFromJson(Map<String, dynamic> json) =>
|
_$CoreStateImpl _$$CoreStateImplFromJson(Map<String, dynamic> json) =>
|
||||||
_$CoreStateImpl(
|
_$CoreStateImpl(
|
||||||
vpnProps: VpnProps.fromJson(json['vpn-props'] as Map<String, dynamic>?),
|
vpnProps: VpnProps.fromJson(json['vpn-props'] as Map<String, dynamic>?),
|
||||||
@@ -63,43 +133,6 @@ Map<String, dynamic> _$$AndroidVpnOptionsImplToJson(
|
|||||||
'dnsServerAddress': instance.dnsServerAddress,
|
'dnsServerAddress': instance.dnsServerAddress,
|
||||||
};
|
};
|
||||||
|
|
||||||
_$ConfigExtendedParamsImpl _$$ConfigExtendedParamsImplFromJson(
|
|
||||||
Map<String, dynamic> json) =>
|
|
||||||
_$ConfigExtendedParamsImpl(
|
|
||||||
isPatch: json['is-patch'] as bool,
|
|
||||||
selectedMap: Map<String, String>.from(json['selected-map'] as Map),
|
|
||||||
overrideDns: json['override-dns'] as bool,
|
|
||||||
overrideRule: json['override-rule'] as bool,
|
|
||||||
testUrl: json['test-url'] as String,
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$ConfigExtendedParamsImplToJson(
|
|
||||||
_$ConfigExtendedParamsImpl instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'is-patch': instance.isPatch,
|
|
||||||
'selected-map': instance.selectedMap,
|
|
||||||
'override-dns': instance.overrideDns,
|
|
||||||
'override-rule': instance.overrideRule,
|
|
||||||
'test-url': instance.testUrl,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$UpdateConfigParamsImpl _$$UpdateConfigParamsImplFromJson(
|
|
||||||
Map<String, dynamic> json) =>
|
|
||||||
_$UpdateConfigParamsImpl(
|
|
||||||
profileId: json['profile-id'] as String,
|
|
||||||
config: ClashConfig.fromJson(json['config'] as Map<String, dynamic>),
|
|
||||||
params:
|
|
||||||
ConfigExtendedParams.fromJson(json['params'] as Map<String, dynamic>),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$UpdateConfigParamsImplToJson(
|
|
||||||
_$UpdateConfigParamsImpl instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'profile-id': instance.profileId,
|
|
||||||
'config': instance.config,
|
|
||||||
'params': instance.params,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$InitParamsImpl _$$InitParamsImplFromJson(Map<String, dynamic> json) =>
|
_$InitParamsImpl _$$InitParamsImplFromJson(Map<String, dynamic> json) =>
|
||||||
_$InitParamsImpl(
|
_$InitParamsImpl(
|
||||||
homeDir: json['home-dir'] as String,
|
homeDir: json['home-dir'] as String,
|
||||||
@@ -199,41 +232,6 @@ Map<String, dynamic> _$$NowImplToJson(_$NowImpl instance) => <String, dynamic>{
|
|||||||
'value': instance.value,
|
'value': instance.value,
|
||||||
};
|
};
|
||||||
|
|
||||||
_$ProcessDataImpl _$$ProcessDataImplFromJson(Map<String, dynamic> json) =>
|
|
||||||
_$ProcessDataImpl(
|
|
||||||
id: json['id'] as String,
|
|
||||||
metadata: Metadata.fromJson(json['metadata'] as Map<String, dynamic>),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$ProcessDataImplToJson(_$ProcessDataImpl instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'id': instance.id,
|
|
||||||
'metadata': instance.metadata,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$FdImpl _$$FdImplFromJson(Map<String, dynamic> json) => _$FdImpl(
|
|
||||||
id: json['id'] as String,
|
|
||||||
value: (json['value'] as num).toInt(),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$FdImplToJson(_$FdImpl instance) => <String, dynamic>{
|
|
||||||
'id': instance.id,
|
|
||||||
'value': instance.value,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$ProcessMapItemImpl _$$ProcessMapItemImplFromJson(Map<String, dynamic> json) =>
|
|
||||||
_$ProcessMapItemImpl(
|
|
||||||
id: json['id'] as String,
|
|
||||||
value: json['value'] as String,
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$ProcessMapItemImplToJson(
|
|
||||||
_$ProcessMapItemImpl instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'id': instance.id,
|
|
||||||
'value': instance.value,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$ProviderSubscriptionInfoImpl _$$ProviderSubscriptionInfoImplFromJson(
|
_$ProviderSubscriptionInfoImpl _$$ProviderSubscriptionInfoImplFromJson(
|
||||||
Map<String, dynamic> json) =>
|
Map<String, dynamic> json) =>
|
||||||
_$ProviderSubscriptionInfoImpl(
|
_$ProviderSubscriptionInfoImpl(
|
||||||
@@ -279,32 +277,9 @@ Map<String, dynamic> _$$ExternalProviderImplToJson(
|
|||||||
'update-at': instance.updateAt.toIso8601String(),
|
'update-at': instance.updateAt.toIso8601String(),
|
||||||
};
|
};
|
||||||
|
|
||||||
_$TunPropsImpl _$$TunPropsImplFromJson(Map<String, dynamic> json) =>
|
|
||||||
_$TunPropsImpl(
|
|
||||||
fd: (json['fd'] as num).toInt(),
|
|
||||||
gateway: json['gateway'] as String,
|
|
||||||
gateway6: json['gateway6'] as String,
|
|
||||||
portal: json['portal'] as String,
|
|
||||||
portal6: json['portal6'] as String,
|
|
||||||
dns: json['dns'] as String,
|
|
||||||
dns6: json['dns6'] as String,
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$$TunPropsImplToJson(_$TunPropsImpl instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'fd': instance.fd,
|
|
||||||
'gateway': instance.gateway,
|
|
||||||
'gateway6': instance.gateway6,
|
|
||||||
'portal': instance.portal,
|
|
||||||
'portal6': instance.portal6,
|
|
||||||
'dns': instance.dns,
|
|
||||||
'dns6': instance.dns6,
|
|
||||||
};
|
|
||||||
|
|
||||||
_$ActionImpl _$$ActionImplFromJson(Map<String, dynamic> json) => _$ActionImpl(
|
_$ActionImpl _$$ActionImplFromJson(Map<String, dynamic> json) => _$ActionImpl(
|
||||||
method: $enumDecode(_$ActionMethodEnumMap, json['method']),
|
method: $enumDecode(_$ActionMethodEnumMap, json['method']),
|
||||||
data: json['data'],
|
data: json['data'],
|
||||||
defaultValue: json['default-value'],
|
|
||||||
id: json['id'] as String,
|
id: json['id'] as String,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -312,7 +287,6 @@ Map<String, dynamic> _$$ActionImplToJson(_$ActionImpl instance) =>
|
|||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'method': _$ActionMethodEnumMap[instance.method]!,
|
'method': _$ActionMethodEnumMap[instance.method]!,
|
||||||
'data': instance.data,
|
'data': instance.data,
|
||||||
'default-value': instance.defaultValue,
|
|
||||||
'id': instance.id,
|
'id': instance.id,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -324,6 +298,7 @@ const _$ActionMethodEnumMap = {
|
|||||||
ActionMethod.shutdown: 'shutdown',
|
ActionMethod.shutdown: 'shutdown',
|
||||||
ActionMethod.validateConfig: 'validateConfig',
|
ActionMethod.validateConfig: 'validateConfig',
|
||||||
ActionMethod.updateConfig: 'updateConfig',
|
ActionMethod.updateConfig: 'updateConfig',
|
||||||
|
ActionMethod.getConfig: 'getConfig',
|
||||||
ActionMethod.getProxies: 'getProxies',
|
ActionMethod.getProxies: 'getProxies',
|
||||||
ActionMethod.changeProxy: 'changeProxy',
|
ActionMethod.changeProxy: 'changeProxy',
|
||||||
ActionMethod.getTraffic: 'getTraffic',
|
ActionMethod.getTraffic: 'getTraffic',
|
||||||
@@ -332,6 +307,7 @@ const _$ActionMethodEnumMap = {
|
|||||||
ActionMethod.asyncTestDelay: 'asyncTestDelay',
|
ActionMethod.asyncTestDelay: 'asyncTestDelay',
|
||||||
ActionMethod.getConnections: 'getConnections',
|
ActionMethod.getConnections: 'getConnections',
|
||||||
ActionMethod.closeConnections: 'closeConnections',
|
ActionMethod.closeConnections: 'closeConnections',
|
||||||
|
ActionMethod.resetConnections: 'resetConnections',
|
||||||
ActionMethod.closeConnection: 'closeConnection',
|
ActionMethod.closeConnection: 'closeConnection',
|
||||||
ActionMethod.getExternalProviders: 'getExternalProviders',
|
ActionMethod.getExternalProviders: 'getExternalProviders',
|
||||||
ActionMethod.getExternalProvider: 'getExternalProvider',
|
ActionMethod.getExternalProvider: 'getExternalProvider',
|
||||||
@@ -344,10 +320,8 @@ const _$ActionMethodEnumMap = {
|
|||||||
ActionMethod.stopListener: 'stopListener',
|
ActionMethod.stopListener: 'stopListener',
|
||||||
ActionMethod.getCountryCode: 'getCountryCode',
|
ActionMethod.getCountryCode: 'getCountryCode',
|
||||||
ActionMethod.getMemory: 'getMemory',
|
ActionMethod.getMemory: 'getMemory',
|
||||||
ActionMethod.getProfile: 'getProfile',
|
|
||||||
ActionMethod.crash: 'crash',
|
ActionMethod.crash: 'crash',
|
||||||
ActionMethod.setFdMap: 'setFdMap',
|
ActionMethod.setupConfig: 'setupConfig',
|
||||||
ActionMethod.setProcessMap: 'setProcessMap',
|
|
||||||
ActionMethod.setState: 'setState',
|
ActionMethod.setState: 'setState',
|
||||||
ActionMethod.startTun: 'startTun',
|
ActionMethod.startTun: 'startTun',
|
||||||
ActionMethod.stopTun: 'stopTun',
|
ActionMethod.stopTun: 'stopTun',
|
||||||
@@ -362,6 +336,8 @@ _$ActionResultImpl _$$ActionResultImplFromJson(Map<String, dynamic> json) =>
|
|||||||
method: $enumDecode(_$ActionMethodEnumMap, json['method']),
|
method: $enumDecode(_$ActionMethodEnumMap, json['method']),
|
||||||
data: json['data'],
|
data: json['data'],
|
||||||
id: json['id'] as String?,
|
id: json['id'] as String?,
|
||||||
|
code: $enumDecodeNullable(_$ResultTypeEnumMap, json['code']) ??
|
||||||
|
ResultType.success,
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$ActionResultImplToJson(_$ActionResultImpl instance) =>
|
Map<String, dynamic> _$$ActionResultImplToJson(_$ActionResultImpl instance) =>
|
||||||
@@ -369,4 +345,10 @@ Map<String, dynamic> _$$ActionResultImplToJson(_$ActionResultImpl instance) =>
|
|||||||
'method': _$ActionMethodEnumMap[instance.method]!,
|
'method': _$ActionMethodEnumMap[instance.method]!,
|
||||||
'data': instance.data,
|
'data': instance.data,
|
||||||
'id': instance.id,
|
'id': instance.id,
|
||||||
|
'code': _$ResultTypeEnumMap[instance.code]!,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const _$ResultTypeEnumMap = {
|
||||||
|
ResultType.success: 0,
|
||||||
|
ResultType.error: -1,
|
||||||
|
};
|
||||||
|
|||||||
@@ -514,6 +514,215 @@ abstract class _VM4<A, B, C, D> implements VM4<A, B, C, D> {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$VM5<A, B, C, D, E> {
|
||||||
|
A get a => throw _privateConstructorUsedError;
|
||||||
|
B get b => throw _privateConstructorUsedError;
|
||||||
|
C get c => throw _privateConstructorUsedError;
|
||||||
|
D get d => throw _privateConstructorUsedError;
|
||||||
|
E get e => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of VM5
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$VM5CopyWith<A, B, C, D, E, VM5<A, B, C, D, E>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $VM5CopyWith<A, B, C, D, E, $Res> {
|
||||||
|
factory $VM5CopyWith(
|
||||||
|
VM5<A, B, C, D, E> value, $Res Function(VM5<A, B, C, D, E>) then) =
|
||||||
|
_$VM5CopyWithImpl<A, B, C, D, E, $Res, VM5<A, B, C, D, E>>;
|
||||||
|
@useResult
|
||||||
|
$Res call({A a, B b, C c, D d, E e});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$VM5CopyWithImpl<A, B, C, D, E, $Res, $Val extends VM5<A, B, C, D, E>>
|
||||||
|
implements $VM5CopyWith<A, B, C, D, E, $Res> {
|
||||||
|
_$VM5CopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of VM5
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? a = freezed,
|
||||||
|
Object? b = freezed,
|
||||||
|
Object? c = freezed,
|
||||||
|
Object? d = freezed,
|
||||||
|
Object? e = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
a: freezed == a
|
||||||
|
? _value.a
|
||||||
|
: a // ignore: cast_nullable_to_non_nullable
|
||||||
|
as A,
|
||||||
|
b: freezed == b
|
||||||
|
? _value.b
|
||||||
|
: b // ignore: cast_nullable_to_non_nullable
|
||||||
|
as B,
|
||||||
|
c: freezed == c
|
||||||
|
? _value.c
|
||||||
|
: c // ignore: cast_nullable_to_non_nullable
|
||||||
|
as C,
|
||||||
|
d: freezed == d
|
||||||
|
? _value.d
|
||||||
|
: d // ignore: cast_nullable_to_non_nullable
|
||||||
|
as D,
|
||||||
|
e: freezed == e
|
||||||
|
? _value.e
|
||||||
|
: e // ignore: cast_nullable_to_non_nullable
|
||||||
|
as E,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$VM5ImplCopyWith<A, B, C, D, E, $Res>
|
||||||
|
implements $VM5CopyWith<A, B, C, D, E, $Res> {
|
||||||
|
factory _$$VM5ImplCopyWith(_$VM5Impl<A, B, C, D, E> value,
|
||||||
|
$Res Function(_$VM5Impl<A, B, C, D, E>) then) =
|
||||||
|
__$$VM5ImplCopyWithImpl<A, B, C, D, E, $Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({A a, B b, C c, D d, E e});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$VM5ImplCopyWithImpl<A, B, C, D, E, $Res>
|
||||||
|
extends _$VM5CopyWithImpl<A, B, C, D, E, $Res, _$VM5Impl<A, B, C, D, E>>
|
||||||
|
implements _$$VM5ImplCopyWith<A, B, C, D, E, $Res> {
|
||||||
|
__$$VM5ImplCopyWithImpl(_$VM5Impl<A, B, C, D, E> _value,
|
||||||
|
$Res Function(_$VM5Impl<A, B, C, D, E>) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of VM5
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? a = freezed,
|
||||||
|
Object? b = freezed,
|
||||||
|
Object? c = freezed,
|
||||||
|
Object? d = freezed,
|
||||||
|
Object? e = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_$VM5Impl<A, B, C, D, E>(
|
||||||
|
a: freezed == a
|
||||||
|
? _value.a
|
||||||
|
: a // ignore: cast_nullable_to_non_nullable
|
||||||
|
as A,
|
||||||
|
b: freezed == b
|
||||||
|
? _value.b
|
||||||
|
: b // ignore: cast_nullable_to_non_nullable
|
||||||
|
as B,
|
||||||
|
c: freezed == c
|
||||||
|
? _value.c
|
||||||
|
: c // ignore: cast_nullable_to_non_nullable
|
||||||
|
as C,
|
||||||
|
d: freezed == d
|
||||||
|
? _value.d
|
||||||
|
: d // ignore: cast_nullable_to_non_nullable
|
||||||
|
as D,
|
||||||
|
e: freezed == e
|
||||||
|
? _value.e
|
||||||
|
: e // ignore: cast_nullable_to_non_nullable
|
||||||
|
as E,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$VM5Impl<A, B, C, D, E> implements _VM5<A, B, C, D, E> {
|
||||||
|
const _$VM5Impl(
|
||||||
|
{required this.a,
|
||||||
|
required this.b,
|
||||||
|
required this.c,
|
||||||
|
required this.d,
|
||||||
|
required this.e});
|
||||||
|
|
||||||
|
@override
|
||||||
|
final A a;
|
||||||
|
@override
|
||||||
|
final B b;
|
||||||
|
@override
|
||||||
|
final C c;
|
||||||
|
@override
|
||||||
|
final D d;
|
||||||
|
@override
|
||||||
|
final E e;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'VM5<$A, $B, $C, $D, $E>(a: $a, b: $b, c: $c, d: $d, e: $e)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$VM5Impl<A, B, C, D, E> &&
|
||||||
|
const DeepCollectionEquality().equals(other.a, a) &&
|
||||||
|
const DeepCollectionEquality().equals(other.b, b) &&
|
||||||
|
const DeepCollectionEquality().equals(other.c, c) &&
|
||||||
|
const DeepCollectionEquality().equals(other.d, d) &&
|
||||||
|
const DeepCollectionEquality().equals(other.e, e));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType,
|
||||||
|
const DeepCollectionEquality().hash(a),
|
||||||
|
const DeepCollectionEquality().hash(b),
|
||||||
|
const DeepCollectionEquality().hash(c),
|
||||||
|
const DeepCollectionEquality().hash(d),
|
||||||
|
const DeepCollectionEquality().hash(e));
|
||||||
|
|
||||||
|
/// Create a copy of VM5
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$VM5ImplCopyWith<A, B, C, D, E, _$VM5Impl<A, B, C, D, E>> get copyWith =>
|
||||||
|
__$$VM5ImplCopyWithImpl<A, B, C, D, E, _$VM5Impl<A, B, C, D, E>>(
|
||||||
|
this, _$identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _VM5<A, B, C, D, E> implements VM5<A, B, C, D, E> {
|
||||||
|
const factory _VM5(
|
||||||
|
{required final A a,
|
||||||
|
required final B b,
|
||||||
|
required final C c,
|
||||||
|
required final D d,
|
||||||
|
required final E e}) = _$VM5Impl<A, B, C, D, E>;
|
||||||
|
|
||||||
|
@override
|
||||||
|
A get a;
|
||||||
|
@override
|
||||||
|
B get b;
|
||||||
|
@override
|
||||||
|
C get c;
|
||||||
|
@override
|
||||||
|
D get d;
|
||||||
|
@override
|
||||||
|
E get e;
|
||||||
|
|
||||||
|
/// Create a copy of VM5
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$VM5ImplCopyWith<A, B, C, D, E, _$VM5Impl<A, B, C, D, E>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$StartButtonSelectorState {
|
mixin _$StartButtonSelectorState {
|
||||||
bool get isInit => throw _privateConstructorUsedError;
|
bool get isInit => throw _privateConstructorUsedError;
|
||||||
@@ -2142,6 +2351,7 @@ mixin _$ProxiesListSelectorState {
|
|||||||
ProxyCardType get proxyCardType => throw _privateConstructorUsedError;
|
ProxyCardType get proxyCardType => throw _privateConstructorUsedError;
|
||||||
num get sortNum => throw _privateConstructorUsedError;
|
num get sortNum => throw _privateConstructorUsedError;
|
||||||
int get columns => throw _privateConstructorUsedError;
|
int get columns => throw _privateConstructorUsedError;
|
||||||
|
String get query => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
/// Create a copy of ProxiesListSelectorState
|
/// Create a copy of ProxiesListSelectorState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -2162,7 +2372,8 @@ abstract class $ProxiesListSelectorStateCopyWith<$Res> {
|
|||||||
ProxiesSortType proxiesSortType,
|
ProxiesSortType proxiesSortType,
|
||||||
ProxyCardType proxyCardType,
|
ProxyCardType proxyCardType,
|
||||||
num sortNum,
|
num sortNum,
|
||||||
int columns});
|
int columns,
|
||||||
|
String query});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -2187,6 +2398,7 @@ class _$ProxiesListSelectorStateCopyWithImpl<$Res,
|
|||||||
Object? proxyCardType = null,
|
Object? proxyCardType = null,
|
||||||
Object? sortNum = null,
|
Object? sortNum = null,
|
||||||
Object? columns = null,
|
Object? columns = null,
|
||||||
|
Object? query = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_value.copyWith(
|
return _then(_value.copyWith(
|
||||||
groupNames: null == groupNames
|
groupNames: null == groupNames
|
||||||
@@ -2213,6 +2425,10 @@ class _$ProxiesListSelectorStateCopyWithImpl<$Res,
|
|||||||
? _value.columns
|
? _value.columns
|
||||||
: columns // ignore: cast_nullable_to_non_nullable
|
: columns // ignore: cast_nullable_to_non_nullable
|
||||||
as int,
|
as int,
|
||||||
|
query: null == query
|
||||||
|
? _value.query
|
||||||
|
: query // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2232,7 +2448,8 @@ abstract class _$$ProxiesListSelectorStateImplCopyWith<$Res>
|
|||||||
ProxiesSortType proxiesSortType,
|
ProxiesSortType proxiesSortType,
|
||||||
ProxyCardType proxyCardType,
|
ProxyCardType proxyCardType,
|
||||||
num sortNum,
|
num sortNum,
|
||||||
int columns});
|
int columns,
|
||||||
|
String query});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -2256,6 +2473,7 @@ class __$$ProxiesListSelectorStateImplCopyWithImpl<$Res>
|
|||||||
Object? proxyCardType = null,
|
Object? proxyCardType = null,
|
||||||
Object? sortNum = null,
|
Object? sortNum = null,
|
||||||
Object? columns = null,
|
Object? columns = null,
|
||||||
|
Object? query = null,
|
||||||
}) {
|
}) {
|
||||||
return _then(_$ProxiesListSelectorStateImpl(
|
return _then(_$ProxiesListSelectorStateImpl(
|
||||||
groupNames: null == groupNames
|
groupNames: null == groupNames
|
||||||
@@ -2282,6 +2500,10 @@ class __$$ProxiesListSelectorStateImplCopyWithImpl<$Res>
|
|||||||
? _value.columns
|
? _value.columns
|
||||||
: columns // ignore: cast_nullable_to_non_nullable
|
: columns // ignore: cast_nullable_to_non_nullable
|
||||||
as int,
|
as int,
|
||||||
|
query: null == query
|
||||||
|
? _value.query
|
||||||
|
: query // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2295,7 +2517,8 @@ class _$ProxiesListSelectorStateImpl implements _ProxiesListSelectorState {
|
|||||||
required this.proxiesSortType,
|
required this.proxiesSortType,
|
||||||
required this.proxyCardType,
|
required this.proxyCardType,
|
||||||
required this.sortNum,
|
required this.sortNum,
|
||||||
required this.columns})
|
required this.columns,
|
||||||
|
required this.query})
|
||||||
: _groupNames = groupNames,
|
: _groupNames = groupNames,
|
||||||
_currentUnfoldSet = currentUnfoldSet;
|
_currentUnfoldSet = currentUnfoldSet;
|
||||||
|
|
||||||
@@ -2323,10 +2546,12 @@ class _$ProxiesListSelectorStateImpl implements _ProxiesListSelectorState {
|
|||||||
final num sortNum;
|
final num sortNum;
|
||||||
@override
|
@override
|
||||||
final int columns;
|
final int columns;
|
||||||
|
@override
|
||||||
|
final String query;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'ProxiesListSelectorState(groupNames: $groupNames, currentUnfoldSet: $currentUnfoldSet, proxiesSortType: $proxiesSortType, proxyCardType: $proxyCardType, sortNum: $sortNum, columns: $columns)';
|
return 'ProxiesListSelectorState(groupNames: $groupNames, currentUnfoldSet: $currentUnfoldSet, proxiesSortType: $proxiesSortType, proxyCardType: $proxyCardType, sortNum: $sortNum, columns: $columns, query: $query)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -2343,7 +2568,8 @@ class _$ProxiesListSelectorStateImpl implements _ProxiesListSelectorState {
|
|||||||
(identical(other.proxyCardType, proxyCardType) ||
|
(identical(other.proxyCardType, proxyCardType) ||
|
||||||
other.proxyCardType == proxyCardType) &&
|
other.proxyCardType == proxyCardType) &&
|
||||||
(identical(other.sortNum, sortNum) || other.sortNum == sortNum) &&
|
(identical(other.sortNum, sortNum) || other.sortNum == sortNum) &&
|
||||||
(identical(other.columns, columns) || other.columns == columns));
|
(identical(other.columns, columns) || other.columns == columns) &&
|
||||||
|
(identical(other.query, query) || other.query == query));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -2354,7 +2580,8 @@ class _$ProxiesListSelectorStateImpl implements _ProxiesListSelectorState {
|
|||||||
proxiesSortType,
|
proxiesSortType,
|
||||||
proxyCardType,
|
proxyCardType,
|
||||||
sortNum,
|
sortNum,
|
||||||
columns);
|
columns,
|
||||||
|
query);
|
||||||
|
|
||||||
/// Create a copy of ProxiesListSelectorState
|
/// Create a copy of ProxiesListSelectorState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -2373,7 +2600,8 @@ abstract class _ProxiesListSelectorState implements ProxiesListSelectorState {
|
|||||||
required final ProxiesSortType proxiesSortType,
|
required final ProxiesSortType proxiesSortType,
|
||||||
required final ProxyCardType proxyCardType,
|
required final ProxyCardType proxyCardType,
|
||||||
required final num sortNum,
|
required final num sortNum,
|
||||||
required final int columns}) = _$ProxiesListSelectorStateImpl;
|
required final int columns,
|
||||||
|
required final String query}) = _$ProxiesListSelectorStateImpl;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<String> get groupNames;
|
List<String> get groupNames;
|
||||||
@@ -2387,6 +2615,8 @@ abstract class _ProxiesListSelectorState implements ProxiesListSelectorState {
|
|||||||
num get sortNum;
|
num get sortNum;
|
||||||
@override
|
@override
|
||||||
int get columns;
|
int get columns;
|
||||||
|
@override
|
||||||
|
String get query;
|
||||||
|
|
||||||
/// Create a copy of ProxiesListSelectorState
|
/// Create a copy of ProxiesListSelectorState
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -4216,7 +4446,6 @@ abstract class _VpnState implements VpnState {
|
|||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$ProfileOverrideStateModel {
|
mixin _$ProfileOverrideStateModel {
|
||||||
ClashConfigSnippet? get snippet => throw _privateConstructorUsedError;
|
ClashConfigSnippet? get snippet => throw _privateConstructorUsedError;
|
||||||
bool get isEdit => throw _privateConstructorUsedError;
|
|
||||||
Set<String> get selectedRules => throw _privateConstructorUsedError;
|
Set<String> get selectedRules => throw _privateConstructorUsedError;
|
||||||
OverrideData? get overrideData => throw _privateConstructorUsedError;
|
OverrideData? get overrideData => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
@@ -4235,7 +4464,6 @@ abstract class $ProfileOverrideStateModelCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{ClashConfigSnippet? snippet,
|
{ClashConfigSnippet? snippet,
|
||||||
bool isEdit,
|
|
||||||
Set<String> selectedRules,
|
Set<String> selectedRules,
|
||||||
OverrideData? overrideData});
|
OverrideData? overrideData});
|
||||||
|
|
||||||
@@ -4260,7 +4488,6 @@ class _$ProfileOverrideStateModelCopyWithImpl<$Res,
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? snippet = freezed,
|
Object? snippet = freezed,
|
||||||
Object? isEdit = null,
|
|
||||||
Object? selectedRules = null,
|
Object? selectedRules = null,
|
||||||
Object? overrideData = freezed,
|
Object? overrideData = freezed,
|
||||||
}) {
|
}) {
|
||||||
@@ -4269,10 +4496,6 @@ class _$ProfileOverrideStateModelCopyWithImpl<$Res,
|
|||||||
? _value.snippet
|
? _value.snippet
|
||||||
: snippet // ignore: cast_nullable_to_non_nullable
|
: snippet // ignore: cast_nullable_to_non_nullable
|
||||||
as ClashConfigSnippet?,
|
as ClashConfigSnippet?,
|
||||||
isEdit: null == isEdit
|
|
||||||
? _value.isEdit
|
|
||||||
: isEdit // ignore: cast_nullable_to_non_nullable
|
|
||||||
as bool,
|
|
||||||
selectedRules: null == selectedRules
|
selectedRules: null == selectedRules
|
||||||
? _value.selectedRules
|
? _value.selectedRules
|
||||||
: selectedRules // ignore: cast_nullable_to_non_nullable
|
: selectedRules // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -4324,7 +4547,6 @@ abstract class _$$ProfileOverrideStateModelImplCopyWith<$Res>
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{ClashConfigSnippet? snippet,
|
{ClashConfigSnippet? snippet,
|
||||||
bool isEdit,
|
|
||||||
Set<String> selectedRules,
|
Set<String> selectedRules,
|
||||||
OverrideData? overrideData});
|
OverrideData? overrideData});
|
||||||
|
|
||||||
@@ -4350,7 +4572,6 @@ class __$$ProfileOverrideStateModelImplCopyWithImpl<$Res>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? snippet = freezed,
|
Object? snippet = freezed,
|
||||||
Object? isEdit = null,
|
|
||||||
Object? selectedRules = null,
|
Object? selectedRules = null,
|
||||||
Object? overrideData = freezed,
|
Object? overrideData = freezed,
|
||||||
}) {
|
}) {
|
||||||
@@ -4359,10 +4580,6 @@ class __$$ProfileOverrideStateModelImplCopyWithImpl<$Res>
|
|||||||
? _value.snippet
|
? _value.snippet
|
||||||
: snippet // ignore: cast_nullable_to_non_nullable
|
: snippet // ignore: cast_nullable_to_non_nullable
|
||||||
as ClashConfigSnippet?,
|
as ClashConfigSnippet?,
|
||||||
isEdit: null == isEdit
|
|
||||||
? _value.isEdit
|
|
||||||
: isEdit // ignore: cast_nullable_to_non_nullable
|
|
||||||
as bool,
|
|
||||||
selectedRules: null == selectedRules
|
selectedRules: null == selectedRules
|
||||||
? _value._selectedRules
|
? _value._selectedRules
|
||||||
: selectedRules // ignore: cast_nullable_to_non_nullable
|
: selectedRules // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -4380,15 +4597,12 @@ class __$$ProfileOverrideStateModelImplCopyWithImpl<$Res>
|
|||||||
class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
||||||
const _$ProfileOverrideStateModelImpl(
|
const _$ProfileOverrideStateModelImpl(
|
||||||
{this.snippet,
|
{this.snippet,
|
||||||
required this.isEdit,
|
|
||||||
required final Set<String> selectedRules,
|
required final Set<String> selectedRules,
|
||||||
this.overrideData})
|
this.overrideData})
|
||||||
: _selectedRules = selectedRules;
|
: _selectedRules = selectedRules;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
final ClashConfigSnippet? snippet;
|
final ClashConfigSnippet? snippet;
|
||||||
@override
|
|
||||||
final bool isEdit;
|
|
||||||
final Set<String> _selectedRules;
|
final Set<String> _selectedRules;
|
||||||
@override
|
@override
|
||||||
Set<String> get selectedRules {
|
Set<String> get selectedRules {
|
||||||
@@ -4402,7 +4616,7 @@ class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'ProfileOverrideStateModel(snippet: $snippet, isEdit: $isEdit, selectedRules: $selectedRules, overrideData: $overrideData)';
|
return 'ProfileOverrideStateModel(snippet: $snippet, selectedRules: $selectedRules, overrideData: $overrideData)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -4411,7 +4625,6 @@ class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
|||||||
(other.runtimeType == runtimeType &&
|
(other.runtimeType == runtimeType &&
|
||||||
other is _$ProfileOverrideStateModelImpl &&
|
other is _$ProfileOverrideStateModelImpl &&
|
||||||
(identical(other.snippet, snippet) || other.snippet == snippet) &&
|
(identical(other.snippet, snippet) || other.snippet == snippet) &&
|
||||||
(identical(other.isEdit, isEdit) || other.isEdit == isEdit) &&
|
|
||||||
const DeepCollectionEquality()
|
const DeepCollectionEquality()
|
||||||
.equals(other._selectedRules, _selectedRules) &&
|
.equals(other._selectedRules, _selectedRules) &&
|
||||||
(identical(other.overrideData, overrideData) ||
|
(identical(other.overrideData, overrideData) ||
|
||||||
@@ -4419,7 +4632,7 @@ class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(runtimeType, snippet, isEdit,
|
int get hashCode => Object.hash(runtimeType, snippet,
|
||||||
const DeepCollectionEquality().hash(_selectedRules), overrideData);
|
const DeepCollectionEquality().hash(_selectedRules), overrideData);
|
||||||
|
|
||||||
/// Create a copy of ProfileOverrideStateModel
|
/// Create a copy of ProfileOverrideStateModel
|
||||||
@@ -4435,15 +4648,12 @@ class _$ProfileOverrideStateModelImpl implements _ProfileOverrideStateModel {
|
|||||||
abstract class _ProfileOverrideStateModel implements ProfileOverrideStateModel {
|
abstract class _ProfileOverrideStateModel implements ProfileOverrideStateModel {
|
||||||
const factory _ProfileOverrideStateModel(
|
const factory _ProfileOverrideStateModel(
|
||||||
{final ClashConfigSnippet? snippet,
|
{final ClashConfigSnippet? snippet,
|
||||||
required final bool isEdit,
|
|
||||||
required final Set<String> selectedRules,
|
required final Set<String> selectedRules,
|
||||||
final OverrideData? overrideData}) = _$ProfileOverrideStateModelImpl;
|
final OverrideData? overrideData}) = _$ProfileOverrideStateModelImpl;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ClashConfigSnippet? get snippet;
|
ClashConfigSnippet? get snippet;
|
||||||
@override
|
@override
|
||||||
bool get isEdit;
|
|
||||||
@override
|
|
||||||
Set<String> get selectedRules;
|
Set<String> get selectedRules;
|
||||||
@override
|
@override
|
||||||
OverrideData? get overrideData;
|
OverrideData? get overrideData;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user