added support for multiple custom configs in subscriptions + remarks
Accepting both single config and multiple configs i.e:
{customConfig} or [{customConfig1}, {customConfig2} ...]
Furtheremore added an optional 'remarks' field to v2rayConfig class to keep remote customConfig name.
This commit is contained in:
1 parent
52273db482
commit
cdaff4da06
2 files changed
+40
-8
No files matched your search
@@ -10,6 +10,7 @@ import com.google.gson.reflect.TypeToken
|
|||||||
import java.lang.reflect.Type
|
import java.lang.reflect.Type
|
||||||
|
|
||||||
data class V2rayConfig(
|
data class V2rayConfig(
|
||||||
|
var remarks: String? = null,
|
||||||
var stats: Any? = null,
|
var stats: Any? = null,
|
||||||
val log: LogBean,
|
val log: LogBean,
|
||||||
var policy: PolicyBean?,
|
var policy: PolicyBean?,
|
||||||
@@ -69,6 +70,7 @@ data class V2rayConfig(
|
|||||||
val mux: MuxBean? = MuxBean(false)) {
|
val mux: MuxBean? = MuxBean(false)) {
|
||||||
|
|
||||||
data class OutSettingsBean(var vnext: List<VnextBean>? = null,
|
data class OutSettingsBean(var vnext: List<VnextBean>? = null,
|
||||||
|
var fragment: FragmentBean? = null,
|
||||||
var servers: List<ServersBean>? = null,
|
var servers: List<ServersBean>? = null,
|
||||||
/*Blackhole*/
|
/*Blackhole*/
|
||||||
var response: Response? = null,
|
var response: Response? = null,
|
||||||
@@ -101,6 +103,10 @@ data class V2rayConfig(
|
|||||||
var flow: String = "")
|
var flow: String = "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class FragmentBean(var packets: String = "",
|
||||||
|
var length: String = "10-20",
|
||||||
|
var interval: String = "10-20")
|
||||||
|
|
||||||
data class ServersBean(var address: String = "",
|
data class ServersBean(var address: String = "",
|
||||||
var method: String = "chacha20-poly1305",
|
var method: String = "chacha20-poly1305",
|
||||||
var ota: Boolean = false,
|
var ota: Boolean = false,
|
||||||
@@ -135,7 +141,7 @@ data class V2rayConfig(
|
|||||||
var realitySettings: TlsSettingsBean? = null,
|
var realitySettings: TlsSettingsBean? = null,
|
||||||
var grpcSettings: GrpcSettingsBean? = null,
|
var grpcSettings: GrpcSettingsBean? = null,
|
||||||
val dsSettings: Any? = null,
|
val dsSettings: Any? = null,
|
||||||
val sockopt: Any? = null
|
val sockopt: SockoptBean? = null
|
||||||
) {
|
) {
|
||||||
|
|
||||||
data class TcpSettingsBean(var header: HeaderBean = HeaderBean(),
|
data class TcpSettingsBean(var header: HeaderBean = HeaderBean(),
|
||||||
@@ -181,6 +187,12 @@ data class V2rayConfig(
|
|||||||
data class HttpSettingsBean(var host: List<String> = ArrayList(),
|
data class HttpSettingsBean(var host: List<String> = ArrayList(),
|
||||||
var path: String = "")
|
var path: String = "")
|
||||||
|
|
||||||
|
data class SockoptBean(var TcpNoDelay: Boolean? = null,
|
||||||
|
var tcpKeepAliveIdle: Int? = null,
|
||||||
|
var tcpFastOpen: Boolean? = null,
|
||||||
|
var tproxy: String? = null,
|
||||||
|
var mark: Int? = null)
|
||||||
|
|
||||||
data class TlsSettingsBean(var allowInsecure: Boolean = false,
|
data class TlsSettingsBean(var allowInsecure: Boolean = false,
|
||||||
var serverName: String = "",
|
var serverName: String = "",
|
||||||
val alpn: List<String>? = null,
|
val alpn: List<String>? = null,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.text.TextUtils
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
import com.tencent.mmkv.MMKV
|
import com.tencent.mmkv.MMKV
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.AppConfig.ANG_CONFIG
|
import com.v2ray.ang.AppConfig.ANG_CONFIG
|
||||||
@@ -985,13 +986,32 @@ object AngConfigManager {
|
|||||||
&& server.contains("outbounds")
|
&& server.contains("outbounds")
|
||||||
&& server.contains("routing")
|
&& server.contains("routing")
|
||||||
) {
|
) {
|
||||||
val config = ServerConfig.create(EConfigType.CUSTOM)
|
val gson = GsonBuilder().setPrettyPrinting().create()
|
||||||
config.remarks = System.currentTimeMillis().toString()
|
val serverList: Array<V2rayConfig> = Gson().fromJson(server, Array<V2rayConfig>::class.java)
|
||||||
config.subscriptionId = subid
|
if (serverList.size > 0) {
|
||||||
config.fullConfig = Gson().fromJson(server, V2rayConfig::class.java)
|
var count = 0
|
||||||
val key = MmkvManager.encodeServerConfig("", config)
|
for (srv in serverList) {
|
||||||
serverRawStorage?.encode(key, server)
|
if (srv.inbounds != null && srv.outbounds != null && srv.routing != null) {
|
||||||
return 1
|
var config = ServerConfig.create(EConfigType.CUSTOM)
|
||||||
|
config.remarks = srv.remarks ?: "%04d-".format(count + 1) + System.currentTimeMillis().toString()
|
||||||
|
config.subscriptionId = subid
|
||||||
|
config.fullConfig = srv
|
||||||
|
var key = MmkvManager.encodeServerConfig("", config)
|
||||||
|
serverRawStorage?.encode(key, gson.toJson(srv))
|
||||||
|
count = count + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
} else { // For compatibility
|
||||||
|
val config = ServerConfig.create(EConfigType.CUSTOM)
|
||||||
|
config.subscriptionId = subid
|
||||||
|
config.fullConfig = Gson().fromJson(server, V2rayConfig::class.java)
|
||||||
|
config.remarks = System.currentTimeMillis().toString()
|
||||||
|
// config.remarks = config.fullConfig?.remarks ?: System.currentTimeMillis().toString()
|
||||||
|
val key = MmkvManager.encodeServerConfig("", config)
|
||||||
|
serverRawStorage?.encode(key, server)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user