diff options
| author | Grant Limberg <glimberg@gmail.com> | 2016-06-30 21:24:45 -0700 |
|---|---|---|
| committer | Grant Limberg <glimberg@gmail.com> | 2016-06-30 21:24:45 -0700 |
| commit | a156fec25ade8629a9fe880cd34fb8011d58080e (patch) | |
| tree | a6611e1515b5deb0cd5c2bdff1443144b7cb5326 /ZeroTier One | |
| parent | fe725f999547c7fd525d84f7f06fcf56992dae38 (diff) | |
| download | infinitytier-a156fec25ade8629a9fe880cd34fb8011d58080e.tar.gz infinitytier-a156fec25ade8629a9fe880cd34fb8011d58080e.zip | |
put node ID into the main menu.
Clicking on the menu item copies the node ID into the clipboard.
Diffstat (limited to 'ZeroTier One')
| -rw-r--r-- | ZeroTier One/AppDelegate.swift | 26 | ||||
| -rw-r--r-- | ZeroTier One/NetworkMonitor.swift | 9 | ||||
| -rw-r--r-- | ZeroTier One/NodeStatus.swift | 59 | ||||
| -rw-r--r-- | ZeroTier One/ServiceCom.swift | 34 |
4 files changed, 126 insertions, 2 deletions
diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 887bab56..584b54ae 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -27,7 +27,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { var networks = [Network]() + var status: NodeStatus? = nil + + var pasteboard = NSPasteboard.generalPasteboard() + func applicationDidFinishLaunching(aNotification: NSNotification) { + pasteboard.declareTypes([NSPasteboardTypeString], owner: nil) let defaults = NSUserDefaults.standardUserDefaults() let defaultsDict = ["firstRun": true] @@ -47,10 +52,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { } - - let nc = NSNotificationCenter.defaultCenter() nc.addObserver(self, selector: #selector(onNetworkListUpdated(_:)), name: networkUpdateKey, object: nil) + nc.addObserver(self, selector: #selector(onNodeStatusUpdated(_:)), name: statusUpdateKey, object: nil) statusItem.image = NSImage(named: "MenuBarIconMac") @@ -161,9 +165,21 @@ class AppDelegate: NSObject, NSApplicationDelegate { buildMenu() } + func onNodeStatusUpdated(note: NSNotification) { + let status = note.userInfo!["status"] as! NodeStatus + self.status = status + + buildMenu() + } + func buildMenu() { let menu = NSMenu() + if let s = self.status { + menu.addItem(NSMenuItem(title: "Node ID: \(s.address)", action: #selector(AppDelegate.copyNodeID), keyEquivalent: "")) + menu.addItem(NSMenuItem.separatorItem()) + } + menu.addItem(NSMenuItem(title: "Network Details...", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) menu.addItem(NSMenuItem(title: "Join Network...", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) menu.addItem(NSMenuItem.separatorItem()) @@ -224,5 +240,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { ServiceCom.joinNetwork(id) } } + + func copyNodeID() { + if let s = self.status { + pasteboard.setString(s.address, forType: NSPasteboardTypeString) + } + } } diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift index c81ac47d..2071fbbb 100644 --- a/ZeroTier One/NetworkMonitor.swift +++ b/ZeroTier One/NetworkMonitor.swift @@ -9,6 +9,7 @@ import Cocoa let networkUpdateKey = "com.zerotier.one.network-list" +let statusUpdateKey = "com.zerotier.one.status" class NetworkMonitor: NSObject { @@ -58,6 +59,14 @@ class NetworkMonitor: NSObject { self.internal_updateNetworkInfo() } } + + ServiceCom.getNodeStatus() { nodeStatus -> Void in + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + let nc = NSNotificationCenter.defaultCenter() + + nc.postNotificationName(statusUpdateKey, object: nil, userInfo: ["status": nodeStatus]) + } + } } func deleteSavedNetwork(nwid: String) { diff --git a/ZeroTier One/NodeStatus.swift b/ZeroTier One/NodeStatus.swift new file mode 100644 index 00000000..e2ba0820 --- /dev/null +++ b/ZeroTier One/NodeStatus.swift @@ -0,0 +1,59 @@ +// +// NodeStatus.swift +// ZeroTier One +// +// Created by Grant Limberg on 6/30/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class NodeStatus: NSObject { + var address: String = "" + var publicIdentity: String = "" + var online: Bool = false + var tcpFallbackActive: Bool = false + var versionMajor: Int = 0 + var versionMinor: Int = 0 + var versionRev: Int = 0 + var version: String = "" + var clock: UInt64 = 0 + + init(jsonData: [String: AnyObject]) { + if let a = jsonData["address"] as? String { + self.address = a + } + + if let p = jsonData["publicIdentity"] as? String { + self.publicIdentity = p + } + + if let o = jsonData["online"] as? NSNumber { + self.online = o.boolValue + } + + if let t = jsonData["tcpFallbackActive"] as? NSNumber { + self.tcpFallbackActive = t.boolValue + } + + if let v = jsonData["versionMajor"] as? NSNumber { + self.versionMajor = v.integerValue + } + + if let v = jsonData["versionMinor"] as? NSNumber { + self.versionMinor = v.integerValue + } + + if let v = jsonData["versionRev"] as? NSNumber { + self.versionRev = v.integerValue + } + + if let v = jsonData["version"] as? String { + self.version = v + } + + if let c = jsonData["version"] as? NSNumber { + self.clock = c.unsignedLongLongValue + } + } +} diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 2a98ec36..6ebf0986 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -118,6 +118,40 @@ class ServiceCom: NSObject { } } + static func getNodeStatus(completionHandler: (NodeStatus -> Void)) { + let urlString = baseURL + "/status?auth=\(ServiceCom.getKey())" + + if let u = NSURL(string: urlString) { + let request = NSMutableURLRequest(URL: u) + let session = NSURLSession.sharedSession() + let task = session.dataTaskWithRequest(request) { (data, response, error) in + if error != nil{ + NSLog("\(error)") + return + } + + let httpResponse = response as! NSHTTPURLResponse + let status = httpResponse.statusCode + + if status == 200 { + do { + let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! [String: AnyObject] + + let status = NodeStatus(jsonData: json) + + completionHandler(status) + } + catch { + } + } + } + + task.resume() + } + else { + NSLog("bad URL") + } + } static func joinNetwork(network: String, allowManaged: Bool = true, allowGlobal: Bool = false, allowDefault: Bool = false) { let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.getKey())" |
