Files
MWClash/core/action.go
chen08209 ed7868282a Add android separates the core process
Support core status check and force restart

Optimize proxies page and access page

Update flutter and pub dependencies

Update go version

Optimize more details
2025-09-23 15:23:58 +08:00

192 lines
4.5 KiB
Go

package main
import (
"encoding/json"
"unsafe"
)
type Action struct {
Id string `json:"id"`
Method Method `json:"method"`
Data interface{} `json:"data"`
}
type ActionResult struct {
Id string `json:"id"`
Method Method `json:"method"`
Data interface{} `json:"data"`
Code int `json:"code"`
callback unsafe.Pointer
}
func (result ActionResult) Json() ([]byte, error) {
data, err := json.Marshal(result)
return data, err
}
func (result ActionResult) success(data interface{}) {
result.Code = 0
result.Data = data
result.send()
}
func (result ActionResult) error(data interface{}) {
result.Code = -1
result.Data = data
result.send()
}
func handleAction(action *Action, result ActionResult) {
switch action.Method {
case initClashMethod:
paramsString := action.Data.(string)
result.success(handleInitClash(paramsString))
return
case getIsInitMethod:
result.success(handleGetIsInit())
return
case forceGcMethod:
handleForceGC()
result.success(true)
return
case shutdownMethod:
result.success(handleShutdown())
return
case validateConfigMethod:
data := []byte(action.Data.(string))
result.success(handleValidateConfig(data))
return
case updateConfigMethod:
data := []byte(action.Data.(string))
result.success(handleUpdateConfig(data))
return
case setupConfigMethod:
data := []byte(action.Data.(string))
result.success(handleSetupConfig(data))
return
case getProxiesMethod:
result.success(handleGetProxies())
return
case changeProxyMethod:
data := action.Data.(string)
handleChangeProxy(data, func(value string) {
result.success(value)
})
return
case getTrafficMethod:
data := action.Data.(bool)
result.success(handleGetTraffic(data))
return
case getTotalTrafficMethod:
data := action.Data.(bool)
result.success(handleGetTotalTraffic(data))
return
case resetTrafficMethod:
handleResetTraffic()
result.success(true)
return
case asyncTestDelayMethod:
data := action.Data.(string)
handleAsyncTestDelay(data, func(value string) {
result.success(value)
})
return
case getConnectionsMethod:
result.success(handleGetConnections())
return
case closeConnectionsMethod:
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
case closeConnectionMethod:
id := action.Data.(string)
result.success(handleCloseConnection(id))
return
case getExternalProvidersMethod:
result.success(handleGetExternalProviders())
return
case getExternalProviderMethod:
externalProviderName := action.Data.(string)
result.success(handleGetExternalProvider(externalProviderName))
case updateGeoDataMethod:
paramsString := action.Data.(string)
var params = map[string]string{}
err := json.Unmarshal([]byte(paramsString), &params)
if err != nil {
result.success(err.Error())
return
}
geoType := params["geo-type"]
geoName := params["geo-name"]
handleUpdateGeoData(geoType, geoName, func(value string) {
result.success(value)
})
return
case updateExternalProviderMethod:
providerName := action.Data.(string)
handleUpdateExternalProvider(providerName, func(value string) {
result.success(value)
})
return
case sideLoadExternalProviderMethod:
paramsString := action.Data.(string)
var params = map[string]string{}
err := json.Unmarshal([]byte(paramsString), &params)
if err != nil {
result.success(err.Error())
return
}
providerName := params["providerName"]
data := params["data"]
handleSideLoadExternalProvider(providerName, []byte(data), func(value string) {
result.success(value)
})
return
case startLogMethod:
handleStartLog()
result.success(true)
return
case stopLogMethod:
handleStopLog()
result.success(true)
return
case startListenerMethod:
result.success(handleStartListener())
return
case stopListenerMethod:
result.success(handleStopListener())
return
case getCountryCodeMethod:
ip := action.Data.(string)
handleGetCountryCode(ip, func(value string) {
result.success(value)
})
return
case getMemoryMethod:
handleGetMemory(func(value string) {
result.success(value)
})
return
case crashMethod:
result.success(true)
handleCrash()
case deleteFile:
path := action.Data.(string)
handleDelFile(path, result)
return
default:
nextHandle(action, result)
}
}