From 56bf48317067fb42e63c1876aee0dff807e44701 Mon Sep 17 00:00:00 2001 From: Alex Mazanov Date: Sat, 12 Feb 2022 07:01:46 -0800 Subject: [PATCH] Improve URL Scheme consistency #280 --- README.md | 12 ++++++----- SwiftBar/AppDelegate.swift | 25 +++++++++++++---------- SwiftBar/Plugin/PluginManger.swift | 32 +++++++++--------------------- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 72efe68..346b3f0 100644 --- a/README.md +++ b/README.md @@ -265,13 +265,15 @@ You can mark a plugin as streamable with a special metadata property ` Plugin? { + guard let identifier = url.queryParameters?["plugin"] ?? url.queryParameters?["name"] else { return nil } + return pluginManager.getPluginByNameOrID(identifier: identifier) + } + func application(_: NSApplication, open urls: [URL]) { for url in urls { switch url.host?.lowercased() { case "refreshallplugins": pluginManager.refreshAllPlugins() case "refreshplugin": - if let name = url.queryParameters?["name"] { - pluginManager.refreshPlugin(named: name) + if let plugin = getPluginFromURL(url: url) { + plugin.refresh() return } if let indexStr = url.queryParameters?["index"], let index = Int(indexStr) { @@ -118,25 +123,25 @@ class AppDelegate: NSObject, NSApplicationDelegate, SPUStandardUserDriverDelegat return } case "disableplugin": - if let name = url.queryParameters?["name"] { - pluginManager.disablePlugin(named: name) + if let plugin = getPluginFromURL(url: url) { + pluginManager.disablePlugin(plugin: plugin) } case "enableplugin": - if let name = url.queryParameters?["name"] { - pluginManager.enablePlugin(named: name) + if let plugin = getPluginFromURL(url: url) { + pluginManager.enablePlugin(plugin: plugin) } case "toggleplugin": - if let name = url.queryParameters?["name"] { - pluginManager.togglePlugin(named: name) + if let plugin = getPluginFromURL(url: url) { + pluginManager.togglePlugin(plugin: plugin) } case "addplugin": if let src = url.queryParameters?["src"], let url = URL(string: src) { pluginManager.importPlugin(from: url) } case "notify": - guard let pluginID = url.queryParameters?["plugin"] else { return } + guard let plugin = getPluginFromURL(url: url) else { return } let paramsString = url.queryParameters?.map { "\($0.key)=\($0.value.escaped())" }.joined(separator: " ") ?? "" - pluginManager.showNotification(pluginID: pluginID, + pluginManager.showNotification(plugin: plugin, title: url.queryParameters?["title"], subtitle: url.queryParameters?["subtitle"], body: url.queryParameters?["body"], diff --git a/SwiftBar/Plugin/PluginManger.swift b/SwiftBar/Plugin/PluginManger.swift index afa97e6..c470081 100644 --- a/SwiftBar/Plugin/PluginManger.swift +++ b/SwiftBar/Plugin/PluginManger.swift @@ -75,28 +75,22 @@ class PluginManager: ObservableObject { enabledPlugins.isEmpty && !prefs.stealthMode ? barItem.show() : barItem.hide() } + func getPluginByNameOrID(identifier: String) -> Plugin? { + plugins.first(where: { $0.id.lowercased() == identifier.lowercased() }) ?? + plugins.first(where: { $0.name.lowercased() == identifier.lowercased() }) + } + func disablePlugin(plugin: Plugin) { os_log("Disabling plugin \n%{public}@", log: Log.plugin, plugin.description) plugin.disable() } - func disablePlugin(named name: String) { - guard let plugin = plugins.first(where: { $0.name.lowercased() == name.lowercased() }) else { return } - disablePlugin(plugin: plugin) - } - func enablePlugin(plugin: Plugin) { os_log("Enabling plugin \n%{public}@", log: Log.plugin, plugin.description) plugin.enable() } - func enablePlugin(named name: String) { - guard let plugin = plugins.first(where: { $0.name.lowercased() == name.lowercased() }) else { return } - enablePlugin(plugin: plugin) - } - - func togglePlugin(named name: String) { - guard let plugin = plugins.first(where: { $0.name.lowercased() == name.lowercased() }) else { return } + func togglePlugin(plugin: Plugin) { plugin.enabled ? disablePlugin(plugin: plugin) : enablePlugin(plugin: plugin) } @@ -209,11 +203,6 @@ class PluginManager: ObservableObject { menuBarItems.values.forEach { $0.updateMenu(content: $0.plugin?.content) } } - func refreshPlugin(named name: String) { - guard let plugin = plugins.first(where: { $0.name.lowercased() == name.lowercased() }) else { return } - plugin.refresh() - } - func refreshPlugin(with index: Int) { guard plugins.indices.contains(index) else { return } plugins[index].refresh() @@ -262,18 +251,15 @@ class PluginManager: ObservableObject { } extension PluginManager { - func showNotification(pluginID: PluginID, title: String?, subtitle: String?, body: String?, href: String?, commandParams: String?, silent: Bool = false) { - guard let plugin = plugins.first(where: { $0.id == pluginID }), - plugin.enabled else { return } - + func showNotification(plugin: Plugin, title: String?, subtitle: String?, body: String?, href: String?, commandParams: String?, silent: Bool = false) { let content = UNMutableNotificationContent() content.title = title ?? "" content.subtitle = subtitle ?? "" content.body = body ?? "" content.sound = silent ? nil : .default - content.threadIdentifier = pluginID + content.threadIdentifier = plugin.id - content.userInfo[SystemNotificationName.pluginID] = pluginID + content.userInfo[SystemNotificationName.pluginID] = plugin.id if let urlString = href, let url = URL(string: urlString), url.host != nil, url.scheme != nil