168 lines
6.4 KiB
Kotlin
168 lines
6.4 KiB
Kotlin
package com.yingmao.clash.base
|
||
|
||
|
||
import android.text.TextUtils
|
||
import com.yingmao.clash.net.http.HttpApi
|
||
import com.yingmao.clash.net.http.NetService
|
||
import com.orhanobut.logger.Logger
|
||
import com.tencent.mmkv.MMKV
|
||
import com.yingmao.clash.BuildConfig
|
||
import com.yingmao.clash.conf.BZYConstants
|
||
import com.yingmao.clash.entity.DomainRsp
|
||
import com.yingmao.clash.listener.AsyncCallback
|
||
import com.yingmao.clash.net.http.HttpReqType
|
||
import com.yingmao.clash.util.AESUtil
|
||
import kotlinx.coroutines.GlobalScope
|
||
import kotlinx.coroutines.launch
|
||
import java.util.ArrayList
|
||
|
||
open class PublicViewMode: BaseViewMode() {
|
||
// fun hasLocalAcl() :Boolean{
|
||
// val acls = Acl.getFile(Acl.CUSTOM_RULES).readLines()
|
||
// Logger.d("sss ====> "+acls+"size:${acls.size}")
|
||
// //默认的acl有3个 小于3个表示需要从服务器获取acl
|
||
// return acls.size > 3
|
||
// }
|
||
|
||
fun getHost(callback: AsyncCallback) {
|
||
val rt =
|
||
NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/")
|
||
doAsyncNoNeedReturn(HttpReqType.GET_HOST) {
|
||
try { //TODO bug 会引起崩溃
|
||
var host = if (BuildConfig.is_ym) {
|
||
rt.getHost()
|
||
|
||
} else if (BuildConfig.is_tz) {
|
||
rt.getHostTZ()
|
||
} else {
|
||
rt.getHostDef()
|
||
}
|
||
// Log.e("data", "2:$host")
|
||
if (!TextUtils.isEmpty(host)) {
|
||
host = AESUtil.decrypt(host)
|
||
val hostSet = host.split("+").toSet()
|
||
MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_ROUTER_HOST, hostSet)
|
||
}
|
||
// Log.e("data", "22:$host")
|
||
|
||
callback.suc()
|
||
} catch (e: Exception) {
|
||
e.printStackTrace()
|
||
callback.err()
|
||
}
|
||
}
|
||
}
|
||
|
||
fun getHostByGithub(callback: AsyncCallback) {
|
||
val rt = NetService.instances.createFreeBaseUrl("https://raw.githubusercontent.com/")
|
||
doAsyncNoNeedReturn(HttpReqType.GET_HOST) {
|
||
try {
|
||
val host = when {
|
||
BuildConfig.is_ym -> {
|
||
rt.getHostGithub()
|
||
}
|
||
BuildConfig.is_tz -> {
|
||
rt.getHostTZ()
|
||
}
|
||
else -> {
|
||
rt.getHostDef()
|
||
}
|
||
}
|
||
host?.takeIf { it.isNotEmpty() }?.let {
|
||
com.cncat.vpn.common.log.Log.d("getHostByGithub host-->${it}")
|
||
val decryptedHost = AESUtil.decrypt(it)
|
||
com.cncat.vpn.common.log.Log.d("getHostByGithub decryptedHost-->${decryptedHost}")
|
||
val hostSet = decryptedHost.split("+").toSet()
|
||
MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_ROUTER_HOST, hostSet)
|
||
}
|
||
callback.suc()
|
||
} catch (e: Exception) {
|
||
e.printStackTrace()
|
||
callback.err()
|
||
}
|
||
}
|
||
}
|
||
|
||
fun getHostByAWS(callback: AsyncCallback) {
|
||
val rt = NetService.instances.createFreeBaseUrl("https://yingmao2.s3.ap-east-1.amazonaws.com/")
|
||
doAsyncNoNeedReturn(HttpReqType.GET_HOST) {
|
||
try {
|
||
val host = when {
|
||
BuildConfig.is_ym -> {
|
||
rt.getHostAWS()
|
||
}
|
||
BuildConfig.is_tz -> {
|
||
rt.getHostTZ()
|
||
}
|
||
else -> {
|
||
rt.getHostDef()
|
||
}
|
||
}
|
||
host?.takeIf { it.isNotEmpty() }?.let {
|
||
com.cncat.vpn.common.log.Log.d("getHostByAWS host-->${it}")
|
||
val decryptedHost = AESUtil.decrypt(it)
|
||
com.cncat.vpn.common.log.Log.d("getHostByAWS decryptedHost-->${decryptedHost}")
|
||
val hostSet = decryptedHost.split("+").toSet()
|
||
MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_ROUTER_HOST, hostSet)
|
||
}
|
||
callback.suc()
|
||
} catch (e: Exception) {
|
||
e.printStackTrace()
|
||
callback.err()
|
||
}
|
||
}
|
||
}
|
||
|
||
fun getServiceAclAndSet(){
|
||
val httpApi = NetService.instances.createHttpsEncodeStr(HttpApi::class.java)
|
||
GlobalScope.launch {
|
||
val rsp = doAsyncEncodeStrBg(DomainRsp::class.java) { httpApi.getDomain()}
|
||
Logger.d("~~~~~! ${rsp}")
|
||
val acls = ArrayList<String>()
|
||
// proxyPattern:0:全局,1:代理
|
||
(rsp as DomainRsp).let {
|
||
if(it.data?.proxyPattern == 0){
|
||
acls.add("[proxy_all]")
|
||
acls.add("[bypass_list]")
|
||
}else{
|
||
acls.add("[bypass_all]")
|
||
acls.add("[proxy_list]")
|
||
}
|
||
|
||
it.data?.domain?.let { domains -> domains.forEach { domain ->
|
||
var domainFormat = domain
|
||
// domainFormat =domainFormat.replace(".","\\.")
|
||
Logger.d("domainFormat : $domainFormat")
|
||
if(domainFormat.startsWith( "https://www.",true)){
|
||
domainFormat = domainFormat.replaceFirst("https://www.","")
|
||
Logger.d("domainFormat 1 : $domainFormat")
|
||
}else{
|
||
// domainFormat = "(^|\\.)${domainFormat}"
|
||
Logger.d("domainFormat 2 : $domainFormat")
|
||
}
|
||
if(domainFormat.endsWith("/")){
|
||
domainFormat = domainFormat.substring(0,domainFormat.lastIndex)
|
||
Logger.d("domainFormat 3 : $domainFormat")
|
||
}
|
||
// domainFormat = "${domainFormat}$"
|
||
Logger.d("domainFormat 11 : $domainFormat")
|
||
acls.add(domainFormat)
|
||
//youtobe 播放视频需要添加的域名
|
||
// acls.add("youtu.be")
|
||
// acls.add("youtube.com")
|
||
// acls.add("ytimg.com")
|
||
// acls.add("googlevideo.com")
|
||
|
||
}
|
||
}
|
||
}
|
||
// Acl.getFile(Acl.CUSTOM_RULES).printWriter().use {
|
||
// val printWriter = it
|
||
// acls.forEach {
|
||
// printWriter.write(it)
|
||
// printWriter.write("\n")
|
||
// }
|
||
// }
|
||
}
|
||
}
|
||
} |