Skip to content

Instantly share code, notes, and snippets.

@mmuszynski
Created October 15, 2017 22:07
Show Gist options
  • Save mmuszynski/c86d92ee5e67108dc79fbdd5cc5b6402 to your computer and use it in GitHub Desktop.
Save mmuszynski/c86d92ee5e67108dc79fbdd5cc5b6402 to your computer and use it in GitHub Desktop.
//
// ViewController.swift
// RLMessageBlaster
//
// Created by Mike Muszynski on 10/14/17.
// Copyright © 2017 Mike Muszynski. All rights reserved.
//
import Cocoa
enum Chatroom: String {
case local = "t"
case team = "y"
case party = "u"
}
class ViewController: NSViewController {
var currentChatroom = Chatroom.local
var triggerActivationDate = Date.distantPast
var triggerKeycode = Keycode.five
@IBOutlet weak var messageTextField1: NSTextField!
@IBOutlet weak var messageTextField2: NSTextField!
@IBOutlet weak var messageTextField3: NSTextField!
@IBOutlet weak var messageTextField4: NSTextField!
@IBAction func sliderValueChanged(_ sender: Any) {
self.delayTextField.stringValue = String(format: "%.\(2)f sec", delaySlider.doubleValue)
}
@IBOutlet weak var delaySlider: NSSlider!
@IBOutlet weak var delayTextField: NSTextField!
var eventBlock: ((NSEvent) -> ())!
override func viewDidLoad() {
super.viewDidLoad()
eventBlock = { (event) in
guard let keypress = Keycode(keyCode: event.keyCode) else {
return
}
//if the trigger is pressed, record the time and exit
if keypress == self.triggerKeycode {
self.triggerActivationDate = Date()
return
}
//if more than two seconds has passed since the trigger, return
if Date().timeIntervalSince(self.triggerActivationDate) > 2.0 {
return
}
//if we reach here, it can be blasted
self.blastMessage(for: keypress, times: 3, in: self.currentChatroom)
}
NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: eventBlock)
}
var messageTimer: Timer?
var keysToSend: [Keycode]!
var keysSent: Int = 0
func blastMessage(for keypress: Keycode, times: Int, in chatroom: Chatroom = .local) {
keysToSend = [Keycode]()
if messageTimer == nil {
keysSent = 0
}
for _ in 1...times {
let message: String
switch keypress {
case .one:
message = messageTextField1.stringValue
case .two:
message = messageTextField2.stringValue
case .three:
message = messageTextField3.stringValue
case .four:
message = messageTextField4.stringValue
default:
return
}
guard message != "" else {
return
}
//turn the message string into the keycode representation
var keycodes = message.keycodeRepresentation
//get the keycode that starts the message send
let initializer = Keycode(string: chatroom.rawValue)!
keycodes.insert(.rlwait, at: 0)
keycodes.insert(initializer, at: 0)
keycodes.append(Keycode.returnKey)
keysToSend.append(contentsOf: keycodes)
}
if messageTimer == nil {
messageTimer = Timer(timeInterval: delaySlider.doubleValue, repeats: true, block: {
(timer) in
guard self.keysSent < self.keysToSend.count else {
timer.invalidate()
self.messageTimer = nil
return
}
let key = self.keysToSend[self.keysSent]
if key != .rlwait {
key.postEvent()
}
self.keysSent += 1
})
RunLoop.main.add(messageTimer!, forMode: .defaultRunLoopMode)
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment