diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index aefc71c..2871e50 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -68,12 +68,14 @@ DE6332F22A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */; }; DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA502A82580400713683 /* MenubarViewModel.swift */; }; DE77BA562A82637900713683 /* StateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA552A82637900713683 /* StateManager.swift */; }; + DE77BBB32A9DED25006CC98B /* WebViewFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BBB22A9DED25006CC98B /* WebViewFileManager.swift */; }; + DE77BBBA2A9DEE1B006CC98B /* ExcuteScripts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BBB82A9DEE1B006CC98B /* ExcuteScripts.swift */; }; + DE77BBBB2A9DEE1B006CC98B /* ScriptsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BBB92A9DEE1B006CC98B /* ScriptsController.swift */; }; DE7886012A9C71BE00FE21DD /* IconsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886002A9C71BE00FE21DD /* IconsViewController.swift */; }; DE7886042A9C71CB00FE21DD /* IconsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886032A9C71CB00FE21DD /* IconsView.swift */; }; DE78860C2A9C770300FE21DD /* IconsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78860B2A9C770300FE21DD /* IconsViewModel.swift */; }; DE7886102A9C773300FE21DD /* IconsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78860F2A9C773300FE21DD /* IconsModel.swift */; }; DE7886172A9CCB3B00FE21DD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7886162A9CCB3B00FE21DD /* UserProfile.swift */; }; - DE78861C2A9CE7D700FE21DD /* IconChanged+WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */; }; DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */; }; DE7F9D462A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */; }; DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */; }; @@ -160,12 +162,14 @@ DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotScriptsLogicController.swift; sourceTree = ""; }; DE77BA502A82580400713683 /* MenubarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarViewModel.swift; sourceTree = ""; }; DE77BA552A82637900713683 /* StateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateManager.swift; sourceTree = ""; }; + DE77BBB22A9DED25006CC98B /* WebViewFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewFileManager.swift; sourceTree = ""; }; + DE77BBB82A9DEE1B006CC98B /* ExcuteScripts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExcuteScripts.swift; sourceTree = ""; }; + DE77BBB92A9DEE1B006CC98B /* ScriptsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptsController.swift; sourceTree = ""; }; DE7886002A9C71BE00FE21DD /* IconsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsViewController.swift; sourceTree = ""; }; DE7886032A9C71CB00FE21DD /* IconsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsView.swift; sourceTree = ""; }; DE78860B2A9C770300FE21DD /* IconsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsViewModel.swift; sourceTree = ""; }; DE78860F2A9C773300FE21DD /* IconsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsModel.swift; sourceTree = ""; }; DE7886162A9CCB3B00FE21DD /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = ""; }; - DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IconChanged+WebView.swift"; sourceTree = ""; }; DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; DE7F9D432A9B7A4700F8ACAE /* QuickSlotButtonViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonViewItem.swift; sourceTree = ""; }; DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QuickSlotButtonViewItem.xib; sourceTree = ""; }; @@ -223,7 +227,6 @@ DE018BB12A5099F900FF0AA3 /* Box42 */ = { isa = PBXGroup; children = ( - DE7885FF2A9C717E00FE21DD /* Icon */, DE77BA542A82636500713683 /* Shared */, DEF749302A85655E00D987C8 /* Extensions */, DE018C0E2A509C0C00FF0AA3 /* Menubar */, @@ -261,6 +264,7 @@ DE018BE92A509B2100FF0AA3 /* WebViewModel.swift */, DE018BE62A509B1E00FF0AA3 /* WebViewController.swift */, DE0A91772A8F014F00D1D6F1 /* WebView.swift */, + DE77BBB22A9DED25006CC98B /* WebViewFileManager.swift */, ); path = WebView; sourceTree = ""; @@ -403,20 +407,21 @@ path = Shared; sourceTree = ""; }; - DE7885FD2A9C60C300FE21DD /* Controller */ = { + DE77BBB72A9DEE0B006CC98B /* Controller */ = { isa = PBXGroup; children = ( - DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */, + DE77BBB82A9DEE1B006CC98B /* ExcuteScripts.swift */, + DE77BBB92A9DEE1B006CC98B /* ScriptsController.swift */, ); path = Controller; sourceTree = ""; }; - DE7885FF2A9C717E00FE21DD /* Icon */ = { + DE7885FD2A9C60C300FE21DD /* Controller */ = { isa = PBXGroup; children = ( - DE78861B2A9CE7D700FE21DD /* IconChanged+WebView.swift */, + DE0A91972A8F977F00D1D6F1 /* ToolbarViewController.swift */, ); - path = Icon; + path = Controller; sourceTree = ""; }; DE7886082A9C741700FE21DD /* View */ = { @@ -541,6 +546,7 @@ DEB862D22A8511D600278FCD /* Scripts */ = { isa = PBXGroup; children = ( + DE77BBB72A9DEE0B006CC98B /* Controller */, DE78860E2A9C771A00FE21DD /* Model */, DE78860A2A9C76F600FE21DD /* ViewModel */, DE7886082A9C741700FE21DD /* View */, @@ -702,7 +708,6 @@ DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */, DE77BA562A82637900713683 /* StateManager.swift in Sources */, DE1F1A1C2A8B50C500A88DD8 /* BoxBaseContainerViewController.swift in Sources */, - DE78861C2A9CE7D700FE21DD /* IconChanged+WebView.swift in Sources */, DEE0FA962A9A554F00085A65 /* FunctionButtonUI.swift in Sources */, DE018BE72A509B1E00FF0AA3 /* WebViewController.swift in Sources */, DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */, @@ -716,7 +721,9 @@ DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */, DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */, DE97CA7C2A9A7199001073DE /* QuickSlotGroupView.swift in Sources */, + DE77BBB32A9DED25006CC98B /* WebViewFileManager.swift in Sources */, DE018BE42A509B1700FF0AA3 /* CPU.swift in Sources */, + DE77BBBB2A9DEE1B006CC98B /* ScriptsController.swift in Sources */, DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */, DE0A91862A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift in Sources */, DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */, @@ -737,6 +744,7 @@ DE3FF3772A978AB8009C88EF /* WindowMinimizeButton.swift in Sources */, DE4408022A923EB60091937A /* PinButtonView.swift in Sources */, DE0A91672A8E6CA700D1D6F1 /* WebViewManager.swift in Sources */, + DE77BBBA2A9DEE1B006CC98B /* ExcuteScripts.swift in Sources */, DE97CA7F2A9A73A9001073DE /* QuickSlotUI.swift in Sources */, DE4408152A92750D0091937A /* keyDown+BoxBaseContainerViewController.swift in Sources */, DE018BED2A509B2600FF0AA3 /* URLModel.swift in Sources */, diff --git a/Box42/Icon/IconChanged+WebView.swift b/Box42/Icon/IconChanged+WebView.swift deleted file mode 100644 index c3c5c7d..0000000 --- a/Box42/Icon/IconChanged+WebView.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// IconChangedByWebView.swift -// Box42 -// -// Created by Chanhee Kim on 8/28/23. -// - -import WebKit - -// MARK: - WKWebView의 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)로 Icon을 제어합니다. -extension DisplayURLInToolbar { - func IconChangedByWebView(_ webView: WKWebView) { - if webView === WebViewManager.shared.hostingWebView { - var validate = webView.url?.description.split(separator: "/").map{String($0)} - if validate?.count ?? 0 < 2 { return } - let endpoint = validate?.popLast() - let delimiter = validate?.popLast() - if delimiter != "board" { return } - - icon.menubarStopRunning() - icon.buttonImageChange(endpoint ?? "fox") - icon.menubarStartRunning() - - print("Icon changed", endpoint) - } - } -} diff --git a/Box42/Menubar/MenubarViewController.swift b/Box42/Menubar/MenubarViewController.swift index c62e462..56f60e5 100644 --- a/Box42/Menubar/MenubarViewController.swift +++ b/Box42/Menubar/MenubarViewController.swift @@ -13,7 +13,7 @@ class MenubarViewController: NSViewController { var statusBarVM = StatusBarViewModel() lazy var eventMonitor: EventMonitor = self.setupEventMonitor() var boxWindowController: BoxWindowController? - + func menubarViewControllerInit() { self.buttonInit() } @@ -47,7 +47,9 @@ class MenubarViewController: NSViewController { } func buttonImageChange(_ img: String) { + self.menubarStopRunning() statusBarVM.changeStatusBarIcon(img) + self.menubarStartRunning() } func buttonActionInit() { @@ -122,7 +124,7 @@ extension MenubarViewController: MenubarViewControllerDelegate { } window.level = .floating } - boxWindowController?.showWindow(sender) + boxWindowController?.showWindow(sender) } } } diff --git a/Box42/Preferences/PreferencesViewController.swift b/Box42/Preferences/PreferencesViewController.swift index 5a6c36d..e132672 100644 --- a/Box42/Preferences/PreferencesViewController.swift +++ b/Box42/Preferences/PreferencesViewController.swift @@ -48,10 +48,6 @@ class PreferencesViewController: NSViewController { var stackBox: [NSView] = [] - let icons = iconModel().icon - icons.forEach { (icon) in - stackBox.append(NSButton(title: "Change \(icon) Icon", target: self, action: #selector(changeIconButtonPressed))) - } let scripts = Scripts().info scripts.forEach { (script) in diff --git a/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift b/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift index 1ec54a0..f6b942a 100644 --- a/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift +++ b/Box42/Toolbar/View/DisplayURL/DisplayURLInToolbar.swift @@ -12,7 +12,6 @@ import SnapKit class DisplayURLInToolbar: NSView { var URLTextfield: DisplayURLTextfield = DisplayURLTextfield() var originalString: String = "" - var icon = MenubarViewController() override init(frame frameRect: NSRect) { super.init(frame: .zero) @@ -97,10 +96,5 @@ extension DisplayURLInToolbar { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("Navigation finished") updateURL() - if originalString == "https://42box.kr/auth" || originalString == "https://42box.kr/" { - WebViewManager.shared.getCookie() - } - - IconChangedByWebView(webView) } } diff --git a/Box42/WebView/WebView.swift b/Box42/WebView/WebView.swift index e12930e..d60e458 100644 --- a/Box42/WebView/WebView.swift +++ b/Box42/WebView/WebView.swift @@ -7,31 +7,28 @@ import WebKit -class WebView: WKWebView, WKScriptMessageHandler, WKUIDelegate { - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - print("userContentController") - } - +class WebView: WKWebView, WKScriptMessageHandler { + var icon = MenubarViewController() init() { let preferences = WKPreferences() preferences.javaScriptEnabled = true preferences.javaScriptCanOpenWindowsAutomatically = true - + let contentController = WKUserContentController() let configuration = WKWebViewConfiguration() configuration.preferences = preferences configuration.userContentController = contentController - super.init(frame: .zero, configuration: configuration) - - contentController.add(self, name: "box") - + + contentController.add(self, name: "download") + contentController.add(self, name: "icon") + contentController.add(self, name: "userProfile") + self.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true self.configuration.preferences.javaScriptEnabled = true self.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") - self.uiDelegate = self self.becomeFirstResponder() } @@ -39,3 +36,32 @@ class WebView: WKWebView, WKScriptMessageHandler, WKUIDelegate { fatalError("init(coder:) has not been implemented") } } + +extension WebView { + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + // 스크립트 다운로드 + if message.name == "download", let downloadURLString = message.body as? String { + WebViewFileManager.downloadFile(from: downloadURLString) + } + // 아이콘 정보 PUT: + if message.name == "icon", let imgIconString = message.body as? String { + icon.buttonImageChange(imgIconString) + } + // 유저 정보 (Front)GET: https://api.42box.site/user-service/users/me + if message.name == "userProfile", let userProfileString = message.body as? String { + let userProfileJson = userProfileString.data(using: .utf8) + + do { + let decoder = JSONDecoder() + let userProfile = try decoder.decode(UserProfile.self, from: userProfileJson!) + print(userProfile) + + DispatchQueue.main.sync { + self.icon.buttonImageChange(userProfile.icon) + } + } catch { + print("JSON decoding failed: \(error)") + } + } + } +} diff --git a/Box42/WebView/WebViewController.swift b/Box42/WebView/WebViewController.swift index e0d1f02..cb4b4c9 100644 --- a/Box42/WebView/WebViewController.swift +++ b/Box42/WebView/WebViewController.swift @@ -62,10 +62,6 @@ class WebViewController: NSViewController { super.viewDidLoad() } - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - print(message.name) - } - func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if let url = navigationAction.request.url { webView.load(URLRequest(url: url)) diff --git a/Box42/WebView/WebViewManager.swift b/Box42/WebView/WebViewManager.swift index c1d1dd2..4cf6b99 100644 --- a/Box42/WebView/WebViewManager.swift +++ b/Box42/WebView/WebViewManager.swift @@ -51,49 +51,6 @@ extension WebViewManager: WKNavigationDelegate { print("Did start navigation") } - func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { - if webView === _getCookieWebKit { - webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in - - let cookieStorage = HTTPCookieStorage.shared - - for cookie in cookies { - print("\(cookie.name) = \(cookie.value)") - cookieStorage.setCookie(cookie) - } - - var request = URLRequest(url: URL(string: "https://api.42box.site/user-service/users/me")!) - request.httpShouldHandleCookies = true - let task = URLSession.shared.dataTask(with: request) { (data, response, error) in - if let error = error { - print("Error: \(error)") - return - } - - guard let data = data else { - print("No data received.") - return - } - - do { - let userProfile = try JSONDecoder().decode(UserProfile.self, from: data) - print(userProfile) - - DispatchQueue.main.sync { - self.icon.menubarStopRunning() - self.icon.buttonImageChange(userProfile.icon) - self.icon.menubarStartRunning() - } - - } catch let jsonError { - print("JSON Parsing Error: \(jsonError)") - } - } - task.resume() - } - } - } - func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { print("Did fail navigation with error: \(error.localizedDescription)") } @@ -101,24 +58,4 @@ extension WebViewManager: WKNavigationDelegate { func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) { print("Did receive server redirect") } - - func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { - if let url = navigationAction.request.url, url.absoluteString.contains("https://api.42box.site/user-service/users/me") { - // Handle your own request here and get the response - print(url) - } - decisionHandler(.allow) - } -} - -extension WebViewManager: WKScriptMessageHandler { - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - if message.name == "didFinishLoading", let messageBody = message.body as? String { - print("Received message from JS: \(messageBody)") - if let url = URL(string: "https://naver.com") { - let request = URLRequest(url: url) - hostingWebView?.load(request) - } - } - } }