From 75d71ae3a283a7fa122b7651d5f396179ac49bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E5=AE=87=E8=88=AA?= Date: Thu, 13 Jul 2017 22:20:54 +0800 Subject: [PATCH] Add Subscribe Class Subscribe Class Now Can download the Server Profiles To local. TODO add manual update subscribe and period update subscribe and finish subscribe manager functions --- ShadowsocksX-NG/Subscribe.swift | 94 +++++++++++++++---- ShadowsocksX-NG/SubscribeManager.swift | 3 + .../SubscribePreferenceWindowController.swift | 16 +++- .../SubscribePreferenceWindowController.xib | 46 ++++++--- ShadowsocksX-NG/Utils.swift | 2 +- 5 files changed, 131 insertions(+), 30 deletions(-) diff --git a/ShadowsocksX-NG/Subscribe.swift b/ShadowsocksX-NG/Subscribe.swift index 0893ffb..ed65ba5 100644 --- a/ShadowsocksX-NG/Subscribe.swift +++ b/ShadowsocksX-NG/Subscribe.swift @@ -13,10 +13,25 @@ class Subscribe: NSObject{ var subscribeFeed = "" var isActive = true + var maxCount = -1 // -1 is not limited + var groupName = "" + var token = "" + var profileMgr: ServerProfileManager! - init(initUrlString:String){ + init(initUrlString:String, initGroupName: String, initToken: String, initMaxCount: Int){ + super.init() subscribeFeed = initUrlString + groupName = initGroupName + token = initToken + + if initMaxCount == 0 { + setMaxCount() + } + else { + maxCount = initMaxCount + } + profileMgr = ServerProfileManager.instance } func getFeed() -> String{ return subscribeFeed @@ -30,30 +45,74 @@ class Subscribe: NSObject{ func activateSubscribe(){ isActive = true } - func updateServerFromFeed(){ - if (!isActive){ return } - Alamofire.request(subscribeFeed) - .responseString { + func setGroupName(newGroupName: String) -> Bool { + groupName = newGroupName + return true + } + func getGroupName() -> String { + return groupName + } + func getMaxCount() -> Int { + return maxCount + } + fileprivate func sendRequest(url: String, options: Any, callback: @escaping (String) -> Void) { + let headers: HTTPHeaders = [ + // "Authorization": "Basic U2hhZG93c29ja1gtTkctUg==", + // "Accept": "application/json", + "token": self.token, + "User-Agent": "ShadowsocksX-NG-R" + ] + + Alamofire.request(url, headers: headers) + .responseString{ response in if response.result.isSuccess { - if let v = response.result.value { - // HERE DO the loop and check things IF exist update; if Duplicated skip - print(v) - let profile = ServerProfile() - profile.remark = "New Server".localized - self.profileMgr.profiles.append(profile) - self.profileMgr.save() - } + callback(response.result.value!) } else{ - // res failed pushNotification - print(response.result) + callback("")//give a empty callback + // alse push a notification indicate that the profile may not available } } } + func setMaxCount() { + sendRequest(url: self.subscribeFeed, options: "", callback: { resString in + + let maxCountReg = "MAX=[0-9]+" + let decodeRes = decode64(resString)! + let range = decodeRes.range(of: maxCountReg, options: .regularExpression) + if range != nil { + let result = decodeRes.substring(with:range!) + self.maxCount = Int(result.replacingOccurrences(of: "MAX=", with: ""))! + } + else{ + self.maxCount = -1 + } + + }) + } + func updateServerFromFeed(){ + if (!isActive){ return } + sendRequest(url: self.subscribeFeed, options: "", callback: { resString in + let decodeRes = decode64(resString)! + let ssrregexp = "ssr://([A-Za-z0-9_-]+)" + let urls = splitor(url: decodeRes, regexp: ssrregexp) + let maxN = self.maxCount == -1 ? urls.count: self.maxCount + for index in 0.. Bool{ // is the right format - return true + return subscribeFeed != "" && groupName != "" && token != "" } fileprivate func pushNotification(){ @@ -67,4 +126,7 @@ class Subscribe: NSObject{ // if duplicated skip return false } + fileprivate func isSame(source: Subscribe, target: Subscribe) -> Bool { + return source.subscribeFeed == target.subscribeFeed && source.token == target.token && source.maxCount == target.maxCount + } } diff --git a/ShadowsocksX-NG/SubscribeManager.swift b/ShadowsocksX-NG/SubscribeManager.swift index 79f64bd..94386b9 100644 --- a/ShadowsocksX-NG/SubscribeManager.swift +++ b/ShadowsocksX-NG/SubscribeManager.swift @@ -31,4 +31,7 @@ class SubscribeManager:NSObject{ defaults.set(subscribes, forKey: "Subscribe") return true } + func updateAllServerFromSubscribe(){ + + } } diff --git a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift index 8fcc045..48e53e8 100644 --- a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift +++ b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift @@ -12,16 +12,30 @@ class SubscribePreferenceWindowController: NSWindowController { @IBOutlet weak var FeedLabel: NSTextField! @IBOutlet weak var OKButton: NSButton! + @IBOutlet weak var FeedTextField: NSTextField! + @IBOutlet weak var TokenTextField: NSTextField! + @IBOutlet weak var GroupTextField: NSTextField! + @IBOutlet weak var MaxCountTextField: NSTextField! + override func windowDidLoad() { super.windowDidLoad() // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. + // TODO load stored subscribes and prepare the manager } @IBAction func onOk(_ sender: NSButton) { - print(FeedTextField.stringValue) + // TODO append to manager and save + var subscribe = Subscribe.init(initUrlString: FeedTextField.stringValue, initGroupName: GroupTextField.stringValue, initToken: TokenTextField.stringValue, initMaxCount: MaxCountTextField.integerValue) window?.performClose(self) } + func bindSubscribe(index: Int){ + if index >= 0 && index <= SubscribeManager.instance.subscribes.count { + var editSubscribe = SubscribeManager.instance.subscribes[index] + FeedTextField.bind("value", to: editSubscribe, withKeyPath: "subscribeFeed", options: [NSContinuouslyUpdatesValueBindingOption: true]) + } + } + } diff --git a/ShadowsocksX-NG/SubscribePreferenceWindowController.xib b/ShadowsocksX-NG/SubscribePreferenceWindowController.xib index 1b5b000..3c23cdd 100644 --- a/ShadowsocksX-NG/SubscribePreferenceWindowController.xib +++ b/ShadowsocksX-NG/SubscribePreferenceWindowController.xib @@ -9,7 +9,11 @@ + + + + @@ -33,16 +37,16 @@ - + - + - + - + @@ -54,7 +58,7 @@ - + @@ -83,7 +87,7 @@