127 lines
4.0 KiB
Swift
127 lines
4.0 KiB
Swift
//
|
|
// KeyManager.swift
|
|
// Moonlight-ZWM
|
|
//
|
|
// Created by ZWM on 2024/7/23.
|
|
// Copyright © 2024 Moonlight Game Streaming Project. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
@objc public class KeyManager: NSObject {
|
|
@objc public static let shared = KeyManager()
|
|
|
|
private var strings: [String] = []
|
|
private let keyMappings: [String: UInt16] = [
|
|
"CTRL": 0x11,
|
|
"ALT": 0x12,
|
|
"DEL": 0x2E,
|
|
"F1": 0x70,
|
|
"F2": 0x71
|
|
]
|
|
|
|
private weak var viewController: KeyManagerViewController?
|
|
|
|
private override init() {
|
|
super.init()
|
|
loadStrings()
|
|
}
|
|
|
|
@objc public func createTestKeyMappings() -> [String: UInt16] {
|
|
return keyMappings
|
|
}
|
|
|
|
@objc public func extractKeyStrings(from input: String) -> [String]? {
|
|
let keys = keyMappings.keys.joined(separator: "|")
|
|
let pattern = "^((?:\(keys))(?:\\+\(keys))*)$"
|
|
|
|
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
|
|
return nil
|
|
}
|
|
|
|
let range = NSRange(location: 0, length: input.utf16.count)
|
|
guard let match = regex.firstMatch(in: input, options: [], range: range) else {
|
|
return nil
|
|
}
|
|
|
|
let matchedString = (input as NSString).substring(with: match.range(at: 1))
|
|
let keyStrings = matchedString.split(separator: "+").map { String($0) }
|
|
return keyStrings
|
|
}
|
|
|
|
@objc public func addString(_ string: String) {
|
|
/* guard isValidString(string) else {
|
|
return
|
|
} */
|
|
strings.append(string)
|
|
saveStrings()
|
|
viewController?.reloadTableView()
|
|
}
|
|
|
|
@objc public func deleteString(at index: Int) {
|
|
guard index >= 0 && index < strings.count else {
|
|
return
|
|
}
|
|
strings.remove(at: index)
|
|
saveStrings()
|
|
viewController?.reloadTableView()
|
|
}
|
|
|
|
@objc public func getAllStrings() -> [String] {
|
|
return strings
|
|
}
|
|
|
|
private func isValidString(_ string: String) -> Bool {
|
|
let keys = keyMappings.keys.joined(separator: "|")
|
|
let pattern = "^((?:\(keys))(?:\\+\(keys))*)$"
|
|
|
|
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
|
|
return false
|
|
}
|
|
|
|
let range = NSRange(location: 0, length: string.utf16.count)
|
|
return regex.firstMatch(in: string, options: [], range: range) != nil
|
|
}
|
|
|
|
private func loadStrings() {
|
|
if let savedStrings = UserDefaults.standard.array(forKey: "savedStrings") as? [String] {
|
|
strings = savedStrings
|
|
}
|
|
}
|
|
|
|
private func saveStrings() {
|
|
UserDefaults.standard.set(strings, forKey: "savedStrings")
|
|
}
|
|
|
|
@objc public func setupViewController(_ viewController: KeyManagerViewController) {
|
|
self.viewController = viewController
|
|
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(promptForNewString))
|
|
viewController.navigationItem.rightBarButtonItem = addButton
|
|
viewController.navigationItem.title = "Manage Strings"
|
|
|
|
|
|
viewController.tableView.delegate = viewController
|
|
viewController.tableView.dataSource = viewController
|
|
//viewController.tableView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
|
|
|
|
}
|
|
|
|
@objc private func promptForNewString() {
|
|
guard let topController = UIApplication.shared.keyWindow?.rootViewController else {
|
|
return
|
|
}
|
|
|
|
let alert = UIAlertController(title: "New String", message: "Enter a new string", preferredStyle: .alert)
|
|
alert.addTextField()
|
|
|
|
let submitAction = UIAlertAction(title: "Add", style: .default) { [unowned alert] _ in
|
|
let newString = alert.textFields![0].text ?? ""
|
|
self.addString(newString)
|
|
}
|
|
|
|
alert.addAction(submitAction)
|
|
topController.present(alert, animated: true)
|
|
}
|
|
}
|