Last active
November 7, 2017 09:11
-
-
Save codeOfRobin/247f8e0f19ffaa97ec4990a7f00f7871 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import Files // marathon:https://github.com/JohnSundell/Files.git | |
import Unbox // marathon:https://github.com/johnsundell/unbox.git | |
import Commander // marathon:https://github.com/kylef/Commander.git | |
public func convertToBase64(_ str: String) -> String { | |
if let data = str.data(using: String.Encoding.utf8) { | |
return data.base64EncodedString() | |
} | |
else { | |
return "" | |
} | |
} | |
let userAgent = "Marathon" | |
func writeScriptFile(exportFlag: Bool, sessionID: String, userAgent: String, presenceChannel: String, url: String, email: String) throws { | |
if exportFlag { | |
let currentFolder = Folder.current | |
let scriptFile = try currentFolder.createFileIfNeeded(withName: "kayako-env-vars.sh") | |
let scriptData = "export KAYAKO_SESSION=\(sessionID)\n export KAYAKO_USER_AGENT=\(userAgent)\n export PRESENCE_CHANNEL=\(presenceChannel)\n export KAYAKO_URL=\(url)\n export KAYAKO_EMAIL=\(email)" | |
print(scriptData) | |
try scriptFile.write(string: scriptData) | |
} | |
} | |
try Group { | |
let loginCommand = command( | |
Option("email", default: "", flag: nil, description: "Your Kayako Email", validator: nil), | |
Option("password", default: "", flag: nil, description: "Your password", validator: nil), | |
Option("url", default: "", flag: nil, description: "Your Kayako URL", validator: nil), | |
Flag.init("export", default: false, flag: "g", disabledName: nil, disabledFlag: nil, description: "automatically generates a script with export values") | |
) { email, password, url, exportFlag in | |
let folder = Folder.home | |
let currentTimeStamp = Date().timeIntervalSinceReferenceDate | |
let sessionsFolder = try folder.createSubfolderIfNeeded(withName: ".kayako-session") | |
if let lastRunFile = try? sessionsFolder.file(named: ".lastRun") { | |
let lastRunTimestamp = try TimeInterval(lastRunFile.readAsInt()) | |
let threeHourInterval: TimeInterval = 60 * 60 * 3 | |
let delta = currentTimeStamp - lastRunTimestamp | |
if delta < threeHourInterval { | |
let sessionFile = try sessionsFolder.file(named: "sessionID.txt") | |
let fileData = try sessionFile.readAsString() | |
print(fileData) | |
exit(0) | |
} | |
} | |
let sem = DispatchSemaphore.init(value: 0) | |
var request = URLRequest(url: URL(string: "https://\(url)/api/v1/session?include=user")!) | |
request.httpMethod = "GET" | |
request.addValue("Basic \(convertToBase64("\(email):\(password)"))", forHTTPHeaderField: "Authorization") | |
request.addValue("false", forHTTPHeaderField: "X-CSRF") | |
request.addValue("Marathon", forHTTPHeaderField: "User-Agent") | |
URLSession.shared.dataTask(with: request) { (data, response, error) in | |
if let data = data { | |
do { | |
let unboxer = try Unboxer.init(data: data) | |
let sessionID: String = try unboxer.unbox(key: "session_id") | |
let presenceChannel: String = try unboxer.unbox(keyPath: "data.user.presence_channel") | |
let fileString = "\(sessionID)" | |
let sessionFile = try sessionsFolder.createFile(named: "sessionID.txt") | |
try sessionFile.write(string: fileString) | |
let lastRunFile = try sessionsFolder.createFile(named: ".lastRun") | |
try lastRunFile.write(string: String(Int(currentTimeStamp))) | |
try writeScriptFile(exportFlag: exportFlag, sessionID: sessionID, userAgent: userAgent, presenceChannel: presenceChannel, url: url, email: email) | |
} catch { | |
print("💥 Invalid response. Printing JSON down below 👇") | |
let json = try! JSONSerialization.jsonObject(with: data, options: []) | |
let prettyJson = try! JSONSerialization.data(withJSONObject: json, options:JSONSerialization.WritingOptions.prettyPrinted ) | |
if let prettyString = String(data: prettyJson, encoding: String.Encoding.utf8) { | |
print(prettyString) | |
} | |
} | |
} | |
if let error = error { | |
print("💥") | |
print("error: \(error)") | |
} | |
sem.signal() | |
}.resume() | |
sem.wait() | |
} | |
$0.addCommand("login", loginCommand) | |
$0.command("clear") { | |
print("Clearing Data...") | |
let sessionFolder = try Folder.home.subfolder(named: ".kayako-session") | |
try sessionFolder.delete() | |
print("Cleared 🗑") | |
} | |
}.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment