Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
XinSSS committed Jun 5, 2020
1 parent e576abc commit f0cded3
Show file tree
Hide file tree
Showing 16 changed files with 274 additions and 76 deletions.
12 changes: 8 additions & 4 deletions ClashX.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
49D176AB23575BB20093DD7B /* ProxyGroupMenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D176AA23575BB20093DD7B /* ProxyGroupMenuItemView.swift */; };
6E2A2C7C2455369D007BBE7D /* ProxyDelayHistoryMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E2A2C7B2455369D007BBE7D /* ProxyDelayHistoryMenu.swift */; };
6E6B9F67245A65BE00F72A94 /* ClashStatusTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E6B9F66245A65BE00F72A94 /* ClashStatusTool.swift */; };
6E73DAF1248891410059D1C7 /* iCloudManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E73DAF0248891410059D1C7 /* iCloudManager.swift */; };
F910AA24240134AF00116E95 /* ProxyGroupMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = F910AA23240134AF00116E95 /* ProxyGroupMenu.swift */; };
F915A4622366ADEF004840BE /* ClashConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F915A4612366ADEF004840BE /* ClashConnection.swift */; };
F9203A26236342820020D57D /* AppDelegate+..swift in Sources */ = {isa = PBXBuildFile; fileRef = F9203A25236342820020D57D /* AppDelegate+..swift */; };
Expand Down Expand Up @@ -174,6 +175,7 @@
5217C006C5A22A1CEA24BFC1 /* Pods-ClashX.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ClashX.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ClashX/Pods-ClashX.debug.xcconfig"; sourceTree = "<group>"; };
6E2A2C7B2455369D007BBE7D /* ProxyDelayHistoryMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyDelayHistoryMenu.swift; sourceTree = "<group>"; };
6E6B9F66245A65BE00F72A94 /* ClashStatusTool.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClashStatusTool.swift; sourceTree = "<group>"; };
6E73DAF0248891410059D1C7 /* iCloudManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iCloudManager.swift; sourceTree = "<group>"; };
A1485BCE642059532D01B8BA /* Pods-ClashX.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ClashX.release.xcconfig"; path = "Pods/Target Support Files/Pods-ClashX/Pods-ClashX.release.xcconfig"; sourceTree = "<group>"; };
F910AA23240134AF00116E95 /* ProxyGroupMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyGroupMenu.swift; sourceTree = "<group>"; };
F915A4612366ADEF004840BE /* ClashConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClashConnection.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -267,6 +269,7 @@
4952C3CF2117027C004A4FA8 /* ConfigFileManager.swift */,
49CF3B5B20CE8068001EBF94 /* ClashResourceManager.swift */,
49CF3B6420CEE06C001EBF94 /* ConfigManager.swift */,
6E73DAF0248891410059D1C7 /* iCloudManager.swift */,
495BFB8721919B9800C8779D /* RemoteConfigManager.swift */,
4952C3BE2115C7CA004A4FA8 /* MenuItemFactory.swift */,
F935B2FB23085515009E4D33 /* SystemProxyManager.swift */,
Expand Down Expand Up @@ -698,6 +701,7 @@
F976275C23634DF8000EDEFE /* LoginServiceKit.swift in Sources */,
4966E9E6211824F300A391FB /* NSImage+extension.swift in Sources */,
F92D0B2E236D35C000575E15 /* ProxyItemView.swift in Sources */,
6E73DAF1248891410059D1C7 /* iCloudManager.swift in Sources */,
49B1086A216A356D0064FFCE /* String+Extension.swift in Sources */,
F92D0B2C236C7C3600575E15 /* MenuItemBaseView.swift in Sources */,
4960A6DB2136529200B940C9 /* JSBridgeHandler.swift in Sources */,
Expand Down Expand Up @@ -876,7 +880,7 @@
CODE_SIGN_IDENTITY = "Apple Development: [email protected] (6VT57CBDXM)";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1.20.0.2;
CURRENT_PROJECT_VERSION = 1.20.2;
DEVELOPMENT_TEAM = J7P29E7C2F;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -898,7 +902,7 @@
"$(PROJECT_DIR)/ClashX/goClash",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 1.20.0.2;
MARKETING_VERSION = 1.20.2;
PRODUCT_BUNDLE_IDENTIFIER = com.shaox.ClashX;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
Expand All @@ -917,7 +921,7 @@
CODE_SIGN_IDENTITY = "Apple Development: [email protected] (6VT57CBDXM)";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1.20.0.2;
CURRENT_PROJECT_VERSION = 1.20.2;
DEVELOPMENT_TEAM = J7P29E7C2F;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -939,7 +943,7 @@
"$(PROJECT_DIR)/ClashX/goClash",
);
MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 1.20.0.2;
MARKETING_VERSION = 1.20.2;
OTHER_CODE_SIGN_FLAGS = "--timestamp";
PRODUCT_BUNDLE_IDENTIFIER = com.shaox.ClashX;
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down
20 changes: 12 additions & 8 deletions ClashX/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
statusItemView.frame = CGRect(x: 0, y: 0, width: statusItemLengthWithSpeed, height: 22)
statusMenu.delegate = self
setupStatusMenuItemData()

DispatchQueue.main.async {
self.postFinishLaunching()
}
Expand All @@ -83,6 +82,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
defer {
statusItem.menu = statusMenu
}
iCloudManager.shared.setup()
setupExperimentalMenuItem()

// install proxy helper
Expand All @@ -108,7 +108,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
updateLoggingLevel()

// start watch config file change
ConfigFileManager.shared.watchConfigFile(configName: ConfigManager.selectConfigName)
ConfigManager.watchCurrentConfigFile()

RemoteConfigManager.shared.autoUpdateCheck()

Expand Down Expand Up @@ -323,12 +323,15 @@ class AppDelegate: NSObject, NSApplicationDelegate {

func updateConfigFiles() {
guard let menu = configSeparatorLine.menu else { return }
let lineIndex = menu.items.firstIndex(of: configSeparatorLine)!
for _ in 0..<lineIndex {
menu.removeItem(at: 0)
}
for item in MenuItemFactory.generateSwitchConfigMenuItems().reversed() {
menu.insertItem(item, at: 0)
MenuItemFactory.generateSwitchConfigMenuItems {
items in
let lineIndex = menu.items.firstIndex(of: self.configSeparatorLine)!
for _ in 0..<lineIndex {
menu.removeItem(at: 0)
}
for item in items.reversed() {
menu.insertItem(item, at: 0)
}
}
}

Expand Down Expand Up @@ -432,6 +435,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
if WebPortalManager.hasWebProtal {
WebPortalManager.shared.addWebProtalMenuItem(&statusMenu)
}
iCloudManager.shared.addEnableMenuItem(&experimentalMenu)
AutoUpgardeManager.shared.setup()
AutoUpgardeManager.shared.addChanelMenuItem(&experimentalMenu)
updateExperimentalFeatureStatus()
Expand Down
24 changes: 21 additions & 3 deletions ClashX/General/ApiRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -96,18 +96,34 @@ class ApiRequest {
}

static func requestConfigUpdate(configName: String, callback: @escaping ((ErrorString?) -> Void)) {
let filePath = Paths.configPath(for: configName)
if iCloudManager.shared.isICloudEnable() {
iCloudManager.shared.getUrl { url in
guard let url = url else {
callback("icloud error")
return
}
let configPath = url.appendingPathComponent(Paths.configFileName(for: configName)).path
requestConfigUpdate(configPath: configPath, callback: callback)
}
} else {
let filePath = Paths.localConfigPath(for: configName)
requestConfigUpdate(configPath: filePath, callback: callback)
}
}

static func requestConfigUpdate(configPath: String, callback: @escaping ((ErrorString?) -> Void)) {
let placeHolderErrorDesp = "Error occoured, Please try to fix it by restarting ClashX. "

// DEV MODE: Use API
if !ConfigManager.builtInApiMode {
req("/configs", method: .put, parameters: ["Path": filePath], encoding: JSONEncoding.default).responseJSON { res in
req("/configs", method: .put, parameters: ["Path": configPath], encoding: JSONEncoding.default).responseJSON { res in
if res.response?.statusCode == 204 {
ConfigManager.shared.isRunning = true
callback(nil)
} else {
let errorJson = try? res.result.get()
let err = JSON(errorJson ?? "")["message"].string ?? placeHolderErrorDesp
Logger.log(err)
callback(err)
}
}
Expand All @@ -116,11 +132,12 @@ class ApiRequest {

// NORMAL MODE: Use internal api
clashRequestQueue.async {
let res = clashUpdateConfig(filePath.goStringBuffer())?.toString() ?? placeHolderErrorDesp
let res = clashUpdateConfig(configPath.goStringBuffer())?.toString() ?? placeHolderErrorDesp
DispatchQueue.main.async {
if res == "success" {
callback(nil)
} else {
Logger.log(res)
callback(res)
}
}
Expand Down Expand Up @@ -174,6 +191,7 @@ class ApiRequest {
}

static func updateAllowLan(allow: Bool, completeHandler: (() -> Void)? = nil) {
Logger.log("update allow lan:\(allow)", level: .debug)
req("/configs",
method: .patch,
parameters: ["allow-lan": allow],
Expand Down
8 changes: 6 additions & 2 deletions ClashX/General/Managers/ConfigFileManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ class ConfigFileManager {
pause = true
}

func watchConfigFile(configName: String) {
let path = Paths.configPath(for: configName)
func watchFile(path: String) {
witness = Witness(paths: [path], flags: .FileEvents, latency: 0.3) {
[weak self] events in
guard let self = self else { return }
Expand All @@ -40,6 +39,11 @@ class ConfigFileManager {
}
}

func stopWatchConfigFile() {
witness = nil
pause = false
}

@discardableResult
static func backupAndRemoveConfigFile() -> Bool {
let path = kDefaultConfigFilePath
Expand Down
14 changes: 13 additions & 1 deletion ClashX/General/Managers/ConfigManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,19 @@ class ConfigManager {
}
set {
UserDefaults.standard.set(newValue, forKey: "selectConfigName")
ConfigFileManager.shared.watchConfigFile(configName: newValue)
watchCurrentConfigFile()
}
}

static func watchCurrentConfigFile() {
if iCloudManager.shared.isICloudEnable() {
iCloudManager.shared.getUrl { url in
guard let url = url else { return }
let configUrl = url.appendingPathComponent(Paths.configFileName(for: selectConfigName))
ConfigFileManager.shared.watchFile(path: configUrl.path)
}
} else {
ConfigFileManager.shared.watchFile(path: Paths.localConfigPath(for: selectConfigName))
}
}

Expand Down
17 changes: 12 additions & 5 deletions ClashX/General/Managers/MenuItemFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,22 @@ class MenuItemFactory {
updateProxyList(withMenus: items)
}

static func generateSwitchConfigMenuItems() -> [NSMenuItem] {
var items = [NSMenuItem]()
for config in ConfigManager.getConfigFilesList() {
static func generateSwitchConfigMenuItems(complete: @escaping (([NSMenuItem]) -> Void)) {
let generateMenuItem: ((String) -> NSMenuItem) = {
config in
let item = NSMenuItem(title: config, action: #selector(MenuItemFactory.actionSelectConfig(sender:)), keyEquivalent: "")
item.target = MenuItemFactory.self
item.state = ConfigManager.selectConfigName == config ? .on : .off
items.append(item)
return item
}

if iCloudManager.shared.isICloudEnable() {
iCloudManager.shared.getConfigFilesList {
complete($0.map { generateMenuItem($0) })
}
} else {
complete(ConfigManager.getConfigFilesList().map { generateMenuItem($0) })
}
return items
}

// MARK: - Private
Expand Down
20 changes: 17 additions & 3 deletions ClashX/General/Managers/RemoteConfigManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,14 @@ class RemoteConfigManager {
}
config.isPlaceHolderName = false

let savePath = Paths.configPath(for: config.name)

if config.name == ConfigManager.selectConfigName {
if iCloudManager.shared.isICloudEnable() {
ConfigFileManager.shared.stopWatchConfigFile()
} else if config.name == ConfigManager.selectConfigName {
ConfigFileManager.shared.pauseForNextChange()
}

let saveAction: ((String) -> Void) = {
savePath in
do {
if FileManager.default.fileExists(atPath: savePath) {
try FileManager.default.removeItem(atPath: savePath)
Expand All @@ -188,6 +190,18 @@ class RemoteConfigManager {
complete?(err.localizedDescription)
}
}

if iCloudManager.shared.isICloudEnable() {
iCloudManager.shared.getUrl { url in
guard let url = url else { return }
let saveUrl = url.appendingPathComponent(Paths.configFileName(for: config.name))
saveAction(saveUrl.path)
}
} else {
let savePath = Paths.localConfigPath(for: config.name)
saveAction(savePath)
}
}
}

static func verifyConfig(string: String) -> ErrorString? {
Expand Down
Loading

0 comments on commit f0cded3

Please sign in to comment.