Skip to content

Instantly share code, notes, and snippets.

@codeOfRobin
Last active November 7, 2017 09:11
Show Gist options
  • Save codeOfRobin/247f8e0f19ffaa97ec4990a7f00f7871 to your computer and use it in GitHub Desktop.
Save codeOfRobin/247f8e0f19ffaa97ec4990a7f00f7871 to your computer and use it in GitHub Desktop.
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