From f72f76816afb2a519d7537de88beb25595d27d4d Mon Sep 17 00:00:00 2001 From: tk <1049893361@qq.com> Date: Wed, 9 Aug 2017 22:01:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=BF=9C=E7=A8=8B=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=A8=A1=E5=9D=97=20&&=20=E5=BE=AE=E4=BF=A1=E5=A4=9A?= =?UTF-8?q?=E5=BC=80=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WeChatPlugin.xcodeproj/project.pbxproj | 211 ++++++++++---- .../UserInterfaceState.xcuserstate | Bin 27212 -> 33435 bytes WeChatPlugin/Category/WeChat+hook.m | 199 ------------- .../{ => Sources}/Category/WeChat+hook.h | 0 WeChatPlugin/Sources/Category/WeChat+hook.m | 275 ++++++++++++++++++ .../Config/TKWeChatPluginConfig.h | 6 +- .../Config/TKWeChatPluginConfig.m | 34 +++ .../Controllers/TKRemoteControlController.h | 16 + .../Controllers/TKRemoteControlController.m | 58 ++++ .../Sources/Models/TKRemoteControlModel.h | 21 ++ .../Sources/Models/TKRemoteControlModel.m | 31 ++ .../{Util => Sources/Utils}/TKHelper.h | 0 .../{Util => Sources/Utils}/TKHelper.m | 0 .../{Util => Sources/Utils}/XMLReader.h | 0 .../{Util => Sources/Utils}/XMLReader.m | 0 .../Sources/Views/TKRemoteControlCell.h | 15 + .../Sources/Views/TKRemoteControlCell.m | 73 +++++ .../TKAutoReplyWindowController.h | 0 .../TKAutoReplyWindowController.m | 0 .../TKAutoReplyWindowController.xib | 6 +- .../TKRemoteControlWindowController.h | 13 + .../TKRemoteControlWindowController.m | 94 ++++++ .../TKRemoteControlWindowController.xib | 90 ++++++ WeChatPlugin/TKRemoteControlCommands.plist | 182 ++++++++++++ WeChatPlugin/TKRemoteControlScript.scpt | Bin 0 -> 11826 bytes WeChatPlugin/WeChatPlugin.h | 11 +- 26 files changed, 1071 insertions(+), 264 deletions(-) delete mode 100644 WeChatPlugin/Category/WeChat+hook.m rename WeChatPlugin/{ => Sources}/Category/WeChat+hook.h (100%) create mode 100644 WeChatPlugin/Sources/Category/WeChat+hook.m rename WeChatPlugin/{ => Sources}/Config/TKWeChatPluginConfig.h (83%) rename WeChatPlugin/{ => Sources}/Config/TKWeChatPluginConfig.m (57%) create mode 100644 WeChatPlugin/Sources/Controllers/TKRemoteControlController.h create mode 100644 WeChatPlugin/Sources/Controllers/TKRemoteControlController.m create mode 100644 WeChatPlugin/Sources/Models/TKRemoteControlModel.h create mode 100644 WeChatPlugin/Sources/Models/TKRemoteControlModel.m rename WeChatPlugin/{Util => Sources/Utils}/TKHelper.h (100%) rename WeChatPlugin/{Util => Sources/Utils}/TKHelper.m (100%) rename WeChatPlugin/{Util => Sources/Utils}/XMLReader.h (100%) rename WeChatPlugin/{Util => Sources/Utils}/XMLReader.m (100%) create mode 100644 WeChatPlugin/Sources/Views/TKRemoteControlCell.h create mode 100644 WeChatPlugin/Sources/Views/TKRemoteControlCell.m rename WeChatPlugin/{WindowController => Sources/WindowControllers/AutoReplyWindowController}/TKAutoReplyWindowController.h (100%) rename WeChatPlugin/{WindowController => Sources/WindowControllers/AutoReplyWindowController}/TKAutoReplyWindowController.m (100%) rename WeChatPlugin/{WindowController => Sources/WindowControllers/AutoReplyWindowController}/TKAutoReplyWindowController.xib (96%) create mode 100644 WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.h create mode 100644 WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.m create mode 100644 WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.xib create mode 100644 WeChatPlugin/TKRemoteControlCommands.plist create mode 100644 WeChatPlugin/TKRemoteControlScript.scpt diff --git a/WeChatPlugin.xcodeproj/project.pbxproj b/WeChatPlugin.xcodeproj/project.pbxproj index cae14601..92a82882 100644 --- a/WeChatPlugin.xcodeproj/project.pbxproj +++ b/WeChatPlugin.xcodeproj/project.pbxproj @@ -8,36 +8,58 @@ /* Begin PBXBuildFile section */ 528B4F971EA7383800BC6A89 /* WeChatPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4F951EA7383800BC6A89 /* WeChatPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 528B4FAB1EA7386D00BC6A89 /* WeChat+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4F9E1EA7386D00BC6A89 /* WeChat+hook.h */; }; - 528B4FAC1EA7386D00BC6A89 /* WeChat+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 528B4F9F1EA7386D00BC6A89 /* WeChat+hook.m */; }; - 528B4FAD1EA7386D00BC6A89 /* TKWeChatPluginConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4FA11EA7386D00BC6A89 /* TKWeChatPluginConfig.h */; }; - 528B4FAE1EA7386D00BC6A89 /* TKWeChatPluginConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FA21EA7386D00BC6A89 /* TKWeChatPluginConfig.m */; }; - 528B4FAF1EA7386D00BC6A89 /* TKHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4FA41EA7386D00BC6A89 /* TKHelper.h */; }; - 528B4FB01EA7386D00BC6A89 /* TKHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FA51EA7386D00BC6A89 /* TKHelper.m */; }; - 528B4FB11EA7386D00BC6A89 /* TKAutoReplyWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4FA71EA7386D00BC6A89 /* TKAutoReplyWindowController.h */; }; - 528B4FB21EA7386D00BC6A89 /* TKAutoReplyWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FA81EA7386D00BC6A89 /* TKAutoReplyWindowController.m */; }; - 528B4FB31EA7386D00BC6A89 /* TKAutoReplyWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 528B4FA91EA7386D00BC6A89 /* TKAutoReplyWindowController.xib */; }; 528B4FB41EA7386D00BC6A89 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FAA1EA7386D00BC6A89 /* main.mm */; }; - 528B4FE51EA8695B00BC6A89 /* XMLReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4FE31EA8695B00BC6A89 /* XMLReader.h */; }; - 528B4FE61EA8695B00BC6A89 /* XMLReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FE41EA8695B00BC6A89 /* XMLReader.m */; }; + 52B5CEF21F3B4623000D9DD9 /* TKRemoteControlCommands.plist in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */; }; + 52B5CEF31F3B4623000D9DD9 /* TKRemoteControlScript.scpt in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */; }; + 52B5CF121F3B4631000D9DD9 /* WeChat+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEF61F3B4631000D9DD9 /* WeChat+hook.h */; }; + 52B5CF131F3B4631000D9DD9 /* WeChat+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CEF71F3B4631000D9DD9 /* WeChat+hook.m */; }; + 52B5CF141F3B4631000D9DD9 /* TKWeChatPluginConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */; }; + 52B5CF151F3B4631000D9DD9 /* TKWeChatPluginConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */; }; + 52B5CF161F3B4631000D9DD9 /* TKRemoteControlController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEFC1F3B4631000D9DD9 /* TKRemoteControlController.h */; }; + 52B5CF171F3B4631000D9DD9 /* TKRemoteControlController.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CEFD1F3B4631000D9DD9 /* TKRemoteControlController.m */; }; + 52B5CF181F3B4631000D9DD9 /* TKRemoteControlModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */; }; + 52B5CF191F3B4631000D9DD9 /* TKRemoteControlModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */; }; + 52B5CF1A1F3B4631000D9DD9 /* TKHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF021F3B4631000D9DD9 /* TKHelper.h */; }; + 52B5CF1B1F3B4631000D9DD9 /* TKHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF031F3B4631000D9DD9 /* TKHelper.m */; }; + 52B5CF1C1F3B4631000D9DD9 /* XMLReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF041F3B4631000D9DD9 /* XMLReader.h */; }; + 52B5CF1D1F3B4631000D9DD9 /* XMLReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF051F3B4631000D9DD9 /* XMLReader.m */; }; + 52B5CF1E1F3B4631000D9DD9 /* TKRemoteControlCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF071F3B4631000D9DD9 /* TKRemoteControlCell.h */; }; + 52B5CF1F1F3B4631000D9DD9 /* TKRemoteControlCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF081F3B4631000D9DD9 /* TKRemoteControlCell.m */; }; + 52B5CF201F3B4631000D9DD9 /* TKAutoReplyWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF0B1F3B4631000D9DD9 /* TKAutoReplyWindowController.h */; }; + 52B5CF211F3B4631000D9DD9 /* TKAutoReplyWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF0C1F3B4631000D9DD9 /* TKAutoReplyWindowController.m */; }; + 52B5CF221F3B4631000D9DD9 /* TKAutoReplyWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CF0D1F3B4631000D9DD9 /* TKAutoReplyWindowController.xib */; }; + 52B5CF231F3B4631000D9DD9 /* TKRemoteControlWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF0F1F3B4631000D9DD9 /* TKRemoteControlWindowController.h */; }; + 52B5CF241F3B4631000D9DD9 /* TKRemoteControlWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF101F3B4631000D9DD9 /* TKRemoteControlWindowController.m */; }; + 52B5CF251F3B4631000D9DD9 /* TKRemoteControlWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CF111F3B4631000D9DD9 /* TKRemoteControlWindowController.xib */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 528B4F921EA7383800BC6A89 /* WeChatPlugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WeChatPlugin.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 528B4F951EA7383800BC6A89 /* WeChatPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeChatPlugin.h; sourceTree = ""; }; 528B4F961EA7383800BC6A89 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 528B4F9E1EA7386D00BC6A89 /* WeChat+hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WeChat+hook.h"; sourceTree = ""; }; - 528B4F9F1EA7386D00BC6A89 /* WeChat+hook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WeChat+hook.m"; sourceTree = ""; }; - 528B4FA11EA7386D00BC6A89 /* TKWeChatPluginConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKWeChatPluginConfig.h; sourceTree = ""; }; - 528B4FA21EA7386D00BC6A89 /* TKWeChatPluginConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKWeChatPluginConfig.m; sourceTree = ""; }; - 528B4FA41EA7386D00BC6A89 /* TKHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKHelper.h; sourceTree = ""; }; - 528B4FA51EA7386D00BC6A89 /* TKHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKHelper.m; sourceTree = ""; }; - 528B4FA71EA7386D00BC6A89 /* TKAutoReplyWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyWindowController.h; sourceTree = ""; }; - 528B4FA81EA7386D00BC6A89 /* TKAutoReplyWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyWindowController.m; sourceTree = ""; }; - 528B4FA91EA7386D00BC6A89 /* TKAutoReplyWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TKAutoReplyWindowController.xib; sourceTree = ""; }; 528B4FAA1EA7386D00BC6A89 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 528B4FE31EA8695B00BC6A89 /* XMLReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLReader.h; sourceTree = ""; }; - 528B4FE41EA8695B00BC6A89 /* XMLReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLReader.m; sourceTree = ""; }; + 52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = TKRemoteControlCommands.plist; sourceTree = ""; }; + 52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */ = {isa = PBXFileReference; lastKnownFileType = file; path = TKRemoteControlScript.scpt; sourceTree = ""; }; + 52B5CEF61F3B4631000D9DD9 /* WeChat+hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WeChat+hook.h"; sourceTree = ""; }; + 52B5CEF71F3B4631000D9DD9 /* WeChat+hook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WeChat+hook.m"; sourceTree = ""; }; + 52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKWeChatPluginConfig.h; sourceTree = ""; }; + 52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKWeChatPluginConfig.m; sourceTree = ""; }; + 52B5CEFC1F3B4631000D9DD9 /* TKRemoteControlController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlController.h; sourceTree = ""; }; + 52B5CEFD1F3B4631000D9DD9 /* TKRemoteControlController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlController.m; sourceTree = ""; }; + 52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlModel.h; sourceTree = ""; }; + 52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlModel.m; sourceTree = ""; }; + 52B5CF021F3B4631000D9DD9 /* TKHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKHelper.h; sourceTree = ""; }; + 52B5CF031F3B4631000D9DD9 /* TKHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKHelper.m; sourceTree = ""; }; + 52B5CF041F3B4631000D9DD9 /* XMLReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLReader.h; sourceTree = ""; }; + 52B5CF051F3B4631000D9DD9 /* XMLReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLReader.m; sourceTree = ""; }; + 52B5CF071F3B4631000D9DD9 /* TKRemoteControlCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlCell.h; sourceTree = ""; }; + 52B5CF081F3B4631000D9DD9 /* TKRemoteControlCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlCell.m; sourceTree = ""; }; + 52B5CF0B1F3B4631000D9DD9 /* TKAutoReplyWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyWindowController.h; sourceTree = ""; }; + 52B5CF0C1F3B4631000D9DD9 /* TKAutoReplyWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyWindowController.m; sourceTree = ""; }; + 52B5CF0D1F3B4631000D9DD9 /* TKAutoReplyWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TKAutoReplyWindowController.xib; sourceTree = ""; }; + 52B5CF0F1F3B4631000D9DD9 /* TKRemoteControlWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlWindowController.h; sourceTree = ""; }; + 52B5CF101F3B4631000D9DD9 /* TKRemoteControlWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlWindowController.m; sourceTree = ""; }; + 52B5CF111F3B4631000D9DD9 /* TKRemoteControlWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TKRemoteControlWindowController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -70,54 +92,121 @@ 528B4F941EA7383800BC6A89 /* WeChatPlugin */ = { isa = PBXGroup; children = ( - 528B4F9D1EA7386D00BC6A89 /* Category */, - 528B4FA01EA7386D00BC6A89 /* Config */, - 528B4FA31EA7386D00BC6A89 /* Util */, - 528B4FA61EA7386D00BC6A89 /* WindowController */, + 52B5CEF41F3B4631000D9DD9 /* Sources */, + 52B5CEEF1F3B45ED000D9DD9 /* Supporting Files */, + ); + path = WeChatPlugin; + sourceTree = ""; + }; + 52B5CEEF1F3B45ED000D9DD9 /* Supporting Files */ = { + isa = PBXGroup; + children = ( 528B4FAA1EA7386D00BC6A89 /* main.mm */, 528B4F951EA7383800BC6A89 /* WeChatPlugin.h */, 528B4F961EA7383800BC6A89 /* Info.plist */, + 52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */, + 52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */, ); - path = WeChatPlugin; + name = "Supporting Files"; sourceTree = ""; }; - 528B4F9D1EA7386D00BC6A89 /* Category */ = { + 52B5CEF41F3B4631000D9DD9 /* Sources */ = { isa = PBXGroup; children = ( - 528B4F9E1EA7386D00BC6A89 /* WeChat+hook.h */, - 528B4F9F1EA7386D00BC6A89 /* WeChat+hook.m */, + 52B5CEF51F3B4631000D9DD9 /* Category */, + 52B5CEF81F3B4631000D9DD9 /* Config */, + 52B5CEFB1F3B4631000D9DD9 /* Controllers */, + 52B5CEFE1F3B4631000D9DD9 /* Models */, + 52B5CF011F3B4631000D9DD9 /* Utils */, + 52B5CF061F3B4631000D9DD9 /* Views */, + 52B5CF091F3B4631000D9DD9 /* WindowControllers */, + ); + path = Sources; + sourceTree = ""; + }; + 52B5CEF51F3B4631000D9DD9 /* Category */ = { + isa = PBXGroup; + children = ( + 52B5CEF61F3B4631000D9DD9 /* WeChat+hook.h */, + 52B5CEF71F3B4631000D9DD9 /* WeChat+hook.m */, ); path = Category; sourceTree = ""; }; - 528B4FA01EA7386D00BC6A89 /* Config */ = { + 52B5CEF81F3B4631000D9DD9 /* Config */ = { isa = PBXGroup; children = ( - 528B4FA11EA7386D00BC6A89 /* TKWeChatPluginConfig.h */, - 528B4FA21EA7386D00BC6A89 /* TKWeChatPluginConfig.m */, + 52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */, + 52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */, ); path = Config; sourceTree = ""; }; - 528B4FA31EA7386D00BC6A89 /* Util */ = { + 52B5CEFB1F3B4631000D9DD9 /* Controllers */ = { + isa = PBXGroup; + children = ( + 52B5CEFC1F3B4631000D9DD9 /* TKRemoteControlController.h */, + 52B5CEFD1F3B4631000D9DD9 /* TKRemoteControlController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + 52B5CEFE1F3B4631000D9DD9 /* Models */ = { + isa = PBXGroup; + children = ( + 52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */, + 52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */, + ); + path = Models; + sourceTree = ""; + }; + 52B5CF011F3B4631000D9DD9 /* Utils */ = { + isa = PBXGroup; + children = ( + 52B5CF021F3B4631000D9DD9 /* TKHelper.h */, + 52B5CF031F3B4631000D9DD9 /* TKHelper.m */, + 52B5CF041F3B4631000D9DD9 /* XMLReader.h */, + 52B5CF051F3B4631000D9DD9 /* XMLReader.m */, + ); + path = Utils; + sourceTree = ""; + }; + 52B5CF061F3B4631000D9DD9 /* Views */ = { isa = PBXGroup; children = ( - 528B4FE31EA8695B00BC6A89 /* XMLReader.h */, - 528B4FE41EA8695B00BC6A89 /* XMLReader.m */, - 528B4FA41EA7386D00BC6A89 /* TKHelper.h */, - 528B4FA51EA7386D00BC6A89 /* TKHelper.m */, + 52B5CF071F3B4631000D9DD9 /* TKRemoteControlCell.h */, + 52B5CF081F3B4631000D9DD9 /* TKRemoteControlCell.m */, ); - path = Util; + path = Views; sourceTree = ""; }; - 528B4FA61EA7386D00BC6A89 /* WindowController */ = { + 52B5CF091F3B4631000D9DD9 /* WindowControllers */ = { isa = PBXGroup; children = ( - 528B4FA71EA7386D00BC6A89 /* TKAutoReplyWindowController.h */, - 528B4FA81EA7386D00BC6A89 /* TKAutoReplyWindowController.m */, - 528B4FA91EA7386D00BC6A89 /* TKAutoReplyWindowController.xib */, + 52B5CF0A1F3B4631000D9DD9 /* AutoReplyWindowController */, + 52B5CF0E1F3B4631000D9DD9 /* RemoteControlWindowController */, ); - path = WindowController; + path = WindowControllers; + sourceTree = ""; + }; + 52B5CF0A1F3B4631000D9DD9 /* AutoReplyWindowController */ = { + isa = PBXGroup; + children = ( + 52B5CF0B1F3B4631000D9DD9 /* TKAutoReplyWindowController.h */, + 52B5CF0C1F3B4631000D9DD9 /* TKAutoReplyWindowController.m */, + 52B5CF0D1F3B4631000D9DD9 /* TKAutoReplyWindowController.xib */, + ); + path = AutoReplyWindowController; + sourceTree = ""; + }; + 52B5CF0E1F3B4631000D9DD9 /* RemoteControlWindowController */ = { + isa = PBXGroup; + children = ( + 52B5CF0F1F3B4631000D9DD9 /* TKRemoteControlWindowController.h */, + 52B5CF101F3B4631000D9DD9 /* TKRemoteControlWindowController.m */, + 52B5CF111F3B4631000D9DD9 /* TKRemoteControlWindowController.xib */, + ); + path = RemoteControlWindowController; sourceTree = ""; }; /* End PBXGroup section */ @@ -127,12 +216,16 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 528B4FB11EA7386D00BC6A89 /* TKAutoReplyWindowController.h in Headers */, - 528B4FE51EA8695B00BC6A89 /* XMLReader.h in Headers */, 528B4F971EA7383800BC6A89 /* WeChatPlugin.h in Headers */, - 528B4FAB1EA7386D00BC6A89 /* WeChat+hook.h in Headers */, - 528B4FAD1EA7386D00BC6A89 /* TKWeChatPluginConfig.h in Headers */, - 528B4FAF1EA7386D00BC6A89 /* TKHelper.h in Headers */, + 52B5CF1A1F3B4631000D9DD9 /* TKHelper.h in Headers */, + 52B5CF1C1F3B4631000D9DD9 /* XMLReader.h in Headers */, + 52B5CF161F3B4631000D9DD9 /* TKRemoteControlController.h in Headers */, + 52B5CF121F3B4631000D9DD9 /* WeChat+hook.h in Headers */, + 52B5CF231F3B4631000D9DD9 /* TKRemoteControlWindowController.h in Headers */, + 52B5CF181F3B4631000D9DD9 /* TKRemoteControlModel.h in Headers */, + 52B5CF201F3B4631000D9DD9 /* TKAutoReplyWindowController.h in Headers */, + 52B5CF141F3B4631000D9DD9 /* TKWeChatPluginConfig.h in Headers */, + 52B5CF1E1F3B4631000D9DD9 /* TKRemoteControlCell.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -195,7 +288,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 528B4FB31EA7386D00BC6A89 /* TKAutoReplyWindowController.xib in Resources */, + 52B5CF251F3B4631000D9DD9 /* TKRemoteControlWindowController.xib in Resources */, + 52B5CEF21F3B4623000D9DD9 /* TKRemoteControlCommands.plist in Resources */, + 52B5CF221F3B4631000D9DD9 /* TKAutoReplyWindowController.xib in Resources */, + 52B5CEF31F3B4623000D9DD9 /* TKRemoteControlScript.scpt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -222,12 +318,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 528B4FB21EA7386D00BC6A89 /* TKAutoReplyWindowController.m in Sources */, - 528B4FAC1EA7386D00BC6A89 /* WeChat+hook.m in Sources */, - 528B4FAE1EA7386D00BC6A89 /* TKWeChatPluginConfig.m in Sources */, - 528B4FB01EA7386D00BC6A89 /* TKHelper.m in Sources */, - 528B4FE61EA8695B00BC6A89 /* XMLReader.m in Sources */, + 52B5CF241F3B4631000D9DD9 /* TKRemoteControlWindowController.m in Sources */, + 52B5CF211F3B4631000D9DD9 /* TKAutoReplyWindowController.m in Sources */, + 52B5CF151F3B4631000D9DD9 /* TKWeChatPluginConfig.m in Sources */, + 52B5CF131F3B4631000D9DD9 /* WeChat+hook.m in Sources */, + 52B5CF1B1F3B4631000D9DD9 /* TKHelper.m in Sources */, + 52B5CF171F3B4631000D9DD9 /* TKRemoteControlController.m in Sources */, + 52B5CF1F1F3B4631000D9DD9 /* TKRemoteControlCell.m in Sources */, + 52B5CF191F3B4631000D9DD9 /* TKRemoteControlModel.m in Sources */, 528B4FB41EA7386D00BC6A89 /* main.mm in Sources */, + 52B5CF1D1F3B4631000D9DD9 /* XMLReader.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -384,6 +484,7 @@ 528B4F9C1EA7383800BC6A89 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/WeChatPlugin.xcodeproj/project.xcworkspace/xcuserdata/TK.xcuserdatad/UserInterfaceState.xcuserstate b/WeChatPlugin.xcodeproj/project.xcworkspace/xcuserdata/TK.xcuserdatad/UserInterfaceState.xcuserstate index 1f0f926f8407640e36ac18e2d81dc6bc1f1f26d3..541989737ac7d69e121a3a88bec048537ceed6b1 100644 GIT binary patch literal 33435 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 F{~wiO`mz83 literal 27212 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 1) { - [helpIMenu removeItemAtIndex:helpIMenu.itemArray.count - 1]; - } - - [self hook_onLogOut]; -} - -/** - hook 用户登录 - - */ -- (void)hook_onAuthOK { - NSMenu *helpIMenu = [NSApplication sharedApplication].helpMenu; - if (helpIMenu.itemArray.count == 1) { - NSMenuItem *preventRevokeItem = [[NSMenuItem alloc] initWithTitle:@"开启消息防撤回" action:@selector(onPreventRevoke:) keyEquivalent:@"t"]; - preventRevokeItem.state = [[TKWeChatPluginConfig sharedConfig] preventRevokeEnable]; - NSMenuItem *autoReplyItem = [[NSMenuItem alloc] initWithTitle:@"开启自动回复" action:@selector(onAutoReply:) keyEquivalent:@"k"]; - autoReplyItem.state = [[TKWeChatPluginConfig sharedConfig] autoReplyEnable]; - - [helpIMenu addItem:[NSMenuItem separatorItem]]; - [helpIMenu addItem:preventRevokeItem]; - [helpIMenu addItem:autoReplyItem]; - } - - [self hook_onAuthOK]; -} - -/** - hook 微信撤回消息 - - */ -- (void)hook_onRevokeMsg:(id)msg { - if (msg && [[TKWeChatPluginConfig sharedConfig] preventRevokeEnable]) { - // 转换群聊的 msg - NSString *msgContent = [msg substringFromIndex:[msg rangeOfString:@" 180) { // 若是3分钟前的消息,则不进行自动回复与远程控制。 + return; + } + + if ([addMsg.fromUserName.string containsString:@"@chatroom"]) { // 过滤群聊消息 + return ; + } + + ContactStorage *contactStorage = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("ContactStorage")]; + WCContactData *selfContact = [contactStorage GetSelfContact]; + + if ([addMsg.fromUserName.string isEqualToString:selfContact.m_nsUsrName]) { + if ([addMsg.toUserName.string isEqualToString:selfContact.m_nsUsrName]) { + [self remoteControlWithMsg:addMsg]; + } + } else { + [self autoReplyWithMsg:addMsg]; + } + }]; +} + +#pragma mark - Other +/** + 自动回复 + + @param msg 接收的消息 + */ +- (void)autoReplyWithMsg:(AddMsg *)msg { + if( ![[TKWeChatPluginConfig sharedConfig] autoReplyEnable]) return; + + if (msg.msgType == 1 || msg.msgType == 3) { + MessageService *service = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MessageService")]; + // NSString *content = addMsg.content.string; + // if ([addMsg.fromUserName.string containsString:@"@chatroom"]) { + // NSRange range = [addMsg.content.string rangeOfString:@":\n"]; + // if (range.length != 0) { + // content = [addMsg.content.string substringFromIndex:range.location + range.length]; + // } + // } + ContactStorage *contactStorage = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("ContactStorage")]; + WCContactData *selfContact = [contactStorage GetSelfContact]; + + NSString *keyword = [[TKWeChatPluginConfig sharedConfig] autoReplyKeyword]; + if ([keyword isEqualToString:@""] || [msg.content.string isEqualToString:keyword]) { + [service SendTextMessage:selfContact.m_nsUsrName toUsrName:msg.fromUserName.string msgText:[[TKWeChatPluginConfig sharedConfig] autoReplyText] atUserList:nil]; + } + } +} + +/** + 远程控制 + + @param msg 接收的消息 + */ +- (void)remoteControlWithMsg:(AddMsg *)msg { + + if (msg.msgType == 1 || msg.msgType == 3) { + [TKRemoteControlController executeRemoteControlCommandWithMsg:msg.content.string]; + } +} + +@end diff --git a/WeChatPlugin/Config/TKWeChatPluginConfig.h b/WeChatPlugin/Sources/Config/TKWeChatPluginConfig.h similarity index 83% rename from WeChatPlugin/Config/TKWeChatPluginConfig.h rename to WeChatPlugin/Sources/Config/TKWeChatPluginConfig.h index f6a1d991..ce57150e 100644 --- a/WeChatPlugin/Config/TKWeChatPluginConfig.h +++ b/WeChatPlugin/Sources/Config/TKWeChatPluginConfig.h @@ -10,11 +10,13 @@ @interface TKWeChatPluginConfig : NSObject -+ (instancetype)sharedConfig; - @property (nonatomic, assign) BOOL preventRevokeEnable; /**< 是否开启防撤回 */ @property (nonatomic, assign) BOOL autoReplyEnable; /**< 是否开启自动回复 */ @property (nonatomic, copy) NSString *autoReplyKeyword; /**< 自动回复关键字 */ @property (nonatomic, copy) NSString *autoReplyText; /**< 自动回复的内容 */ +@property (nonatomic, copy) NSArray *remoteControlModels; /**< 远程控制的数组 */ + +- (void)saveRemoteControlModels; ++ (instancetype)sharedConfig; @end diff --git a/WeChatPlugin/Config/TKWeChatPluginConfig.m b/WeChatPlugin/Sources/Config/TKWeChatPluginConfig.m similarity index 57% rename from WeChatPlugin/Config/TKWeChatPluginConfig.m rename to WeChatPlugin/Sources/Config/TKWeChatPluginConfig.m index 2a1912ca..dde5a409 100644 --- a/WeChatPlugin/Config/TKWeChatPluginConfig.m +++ b/WeChatPlugin/Sources/Config/TKWeChatPluginConfig.m @@ -7,11 +7,13 @@ // #import "TKWeChatPluginConfig.h" +#import "TKRemoteControlModel.h" static NSString * const kTKPreventRevokeEnableKey = @"kTKPreventRevokeEnableKey"; static NSString * const kTKAutoReplyEnableKey = @"kTKAutoReplyEnableKey"; static NSString * const kTKAutoReplyKeywordKey = @"kTKAutoReplyKeywordKey"; static NSString * const kTKAutoReplyTextKey = @"kTKAutoReplyTextKey"; +static NSString * const kTKRemoteControlModelsFilePath = @"/Applications/WeChat.app/Contents/MacOS/WeChatPlugin.framework/Resources/TKRemoteControlCommands.plist"; @implementation TKWeChatPluginConfig @@ -60,4 +62,36 @@ - (void)setAutoReplyText:(NSString *)autoReplyText { [[NSUserDefaults standardUserDefaults] synchronize]; } +- (NSArray *)remoteControlModels { + if (!_remoteControlModels) { + _remoteControlModels = ({ + NSArray *originModels = [NSArray arrayWithContentsOfFile:kTKRemoteControlModelsFilePath]; + NSMutableArray *newRemoteControlModels = [NSMutableArray array]; + [originModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger idx, BOOL * _Nonnull stop) { + NSMutableArray *newSubModels = [NSMutableArray array]; + [subModels enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + TKRemoteControlModel *model = [[TKRemoteControlModel alloc] initWithDict:obj]; + [newSubModels addObject:model]; + }]; + [newRemoteControlModels addObject:newSubModels]; + }]; + + newRemoteControlModels; + }); + } + return _remoteControlModels; +} + +- (void)saveRemoteControlModels { + NSMutableArray *needSaveModels = [NSMutableArray array]; + [_remoteControlModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger idx, BOOL * _Nonnull stop) { + NSMutableArray *newSubModels = [NSMutableArray array]; + [subModels enumerateObjectsUsingBlock:^(TKRemoteControlModel *obj, NSUInteger idx, BOOL * _Nonnull stop) { + [newSubModels addObject:obj.dictionary]; + }]; + [needSaveModels addObject:newSubModels]; + }]; + [needSaveModels writeToFile:kTKRemoteControlModelsFilePath atomically:YES]; +} + @end diff --git a/WeChatPlugin/Sources/Controllers/TKRemoteControlController.h b/WeChatPlugin/Sources/Controllers/TKRemoteControlController.h new file mode 100644 index 00000000..b1a21f1b --- /dev/null +++ b/WeChatPlugin/Sources/Controllers/TKRemoteControlController.h @@ -0,0 +1,16 @@ +// +// TKRemoteControlController.h +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import + +@interface TKRemoteControlController : NSObject + ++ (void)executeRemoteControlCommandWithMsg:(NSString *)msg; ++ (void)executeShellCommand:(NSString *)msg; + +@end diff --git a/WeChatPlugin/Sources/Controllers/TKRemoteControlController.m b/WeChatPlugin/Sources/Controllers/TKRemoteControlController.m new file mode 100644 index 00000000..4c5337f9 --- /dev/null +++ b/WeChatPlugin/Sources/Controllers/TKRemoteControlController.m @@ -0,0 +1,58 @@ +// +// TKRemoteControlController.m +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import "TKRemoteControlController.h" +#import "TKWeChatPluginConfig.h" +#import "TKRemoteControlModel.h" + +// 执行 AppleScript +static NSString * const kRemoteControlAppleScript = @"osascript /Applications/WeChat.app/Contents/MacOS/WeChatPlugin.framework/Resources/TKRemoteControlScript.scpt"; + +@implementation TKRemoteControlController + ++ (void)executeRemoteControlCommandWithMsg:(NSString *)msg { + NSArray *remoteControlModels = [TKWeChatPluginConfig sharedConfig].remoteControlModels; + [remoteControlModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger index, BOOL * _Nonnull stop) { + [subModels enumerateObjectsUsingBlock:^(TKRemoteControlModel *model, NSUInteger idx, BOOL * _Nonnull stop) { + if (model.enable && ![model.keyword isEqualToString:@""] && [msg isEqualToString:model.keyword]) { + if ([model.function isEqualToString:@"屏幕保护"]) { + // 屏幕保护通过 Shell 命令来执行即可 + [self executeShellCommand:model.executeCommand]; + } else if ([model.function isEqualToString:@"锁屏"]) { + // 屏幕保护通过 Shell 命令来执行即可 + [self executeShellCommand:model.executeCommand]; + } else { + // 拼接相关参数,执行 AppleScript + NSString *command = [NSString stringWithFormat:@"%@ %@",kRemoteControlAppleScript, model.executeCommand]; + [self executeShellCommand:command]; + // bug: 有些程序在第一次时会无法关闭,需要再次关闭 + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if ([model.function isEqualToString:@"退出所有程序"]) { + NSString *command = [NSString stringWithFormat:@"%@ %@",kRemoteControlAppleScript, model.executeCommand]; + [self executeShellCommand:command]; + } + }); + } + } + }]; + }]; +} + +/** + 通过 NSTask 执行 Shell 命令 + + @param cmd Terminal命令 + */ ++ (void)executeShellCommand:(NSString *)cmd { + NSTask *task = [[NSTask alloc] init]; + [task setLaunchPath:@"/bin/bash"]; + [task setArguments:@[@"-c", cmd]]; + [task launch]; +} + +@end diff --git a/WeChatPlugin/Sources/Models/TKRemoteControlModel.h b/WeChatPlugin/Sources/Models/TKRemoteControlModel.h new file mode 100644 index 00000000..0b3a5ee2 --- /dev/null +++ b/WeChatPlugin/Sources/Models/TKRemoteControlModel.h @@ -0,0 +1,21 @@ +// +// TKRemoteControlModel.h +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import + +@interface TKRemoteControlModel : NSObject + +@property (nonatomic, assign) BOOL enable; +@property (nonatomic, copy) NSString *keyword; +@property (nonatomic, copy) NSString *function; +@property (nonatomic, copy) NSString *executeCommand; + +- (instancetype)initWithDict:(NSDictionary *)dict; +- (NSDictionary *)dictionary; + +@end diff --git a/WeChatPlugin/Sources/Models/TKRemoteControlModel.m b/WeChatPlugin/Sources/Models/TKRemoteControlModel.m new file mode 100644 index 00000000..27d1943c --- /dev/null +++ b/WeChatPlugin/Sources/Models/TKRemoteControlModel.m @@ -0,0 +1,31 @@ +// +// TKRemoteControlModel.m +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import "TKRemoteControlModel.h" + +@implementation TKRemoteControlModel + +- (instancetype)initWithDict:(NSDictionary *)dict { + self = [super init]; + if (self) { + self.enable = [dict[@"enable"] boolValue]; + self.keyword = dict[@"keyword"]; + self.function = dict[@"function"]; + self.executeCommand = dict[@"executeCommand"]; + } + return self; +} + +- (NSDictionary *)dictionary { + return @{@"enable": @(self.enable), + @"keyword": self.keyword, + @"function": self.function, + @"executeCommand": self.executeCommand}; +} + +@end diff --git a/WeChatPlugin/Util/TKHelper.h b/WeChatPlugin/Sources/Utils/TKHelper.h similarity index 100% rename from WeChatPlugin/Util/TKHelper.h rename to WeChatPlugin/Sources/Utils/TKHelper.h diff --git a/WeChatPlugin/Util/TKHelper.m b/WeChatPlugin/Sources/Utils/TKHelper.m similarity index 100% rename from WeChatPlugin/Util/TKHelper.m rename to WeChatPlugin/Sources/Utils/TKHelper.m diff --git a/WeChatPlugin/Util/XMLReader.h b/WeChatPlugin/Sources/Utils/XMLReader.h similarity index 100% rename from WeChatPlugin/Util/XMLReader.h rename to WeChatPlugin/Sources/Utils/XMLReader.h diff --git a/WeChatPlugin/Util/XMLReader.m b/WeChatPlugin/Sources/Utils/XMLReader.m similarity index 100% rename from WeChatPlugin/Util/XMLReader.m rename to WeChatPlugin/Sources/Utils/XMLReader.m diff --git a/WeChatPlugin/Sources/Views/TKRemoteControlCell.h b/WeChatPlugin/Sources/Views/TKRemoteControlCell.h new file mode 100644 index 00000000..c7d5fe27 --- /dev/null +++ b/WeChatPlugin/Sources/Views/TKRemoteControlCell.h @@ -0,0 +1,15 @@ +// +// TKRemoteControlCell.h +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import + +@interface TKRemoteControlCell : NSView + +- (void)setupWithData:(id)data; + +@end diff --git a/WeChatPlugin/Sources/Views/TKRemoteControlCell.m b/WeChatPlugin/Sources/Views/TKRemoteControlCell.m new file mode 100644 index 00000000..cd0240dc --- /dev/null +++ b/WeChatPlugin/Sources/Views/TKRemoteControlCell.m @@ -0,0 +1,73 @@ +// +// TKRemoteControlCell.m +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import "TKRemoteControlCell.h" +#import "TKRemoteControlModel.h" + +@interface TKRemoteControlCell () + +@property (nonatomic, strong) NSButton *selectBtn; +@property (nonatomic, strong) NSTextField *textField; +@property (nonatomic, strong) TKRemoteControlModel *model; + +@end + +@implementation TKRemoteControlCell + +- (instancetype)init { + self = [super init]; + if (self) { + [self initSubviews]; + } + return self; +} + +- (void)initSubviews { + self.selectBtn = ({ + NSButton *btn = [NSButton checkboxWithTitle:@"" target:self action:@selector(clickSelectBtn:)]; + btn.frame = NSMakeRect(50, 10, 150, 30); + + btn; + }); + + self.textField = ({ + NSTextField *v = [[NSTextField alloc] init]; + v.frame = NSMakeRect(200, 10, 250, 30); + v.placeholderString = @"请输入匹配的关键词"; + v.layer.cornerRadius = 10; + v.layer.masksToBounds = YES; + [v.layer setNeedsDisplay]; + v.editable = YES; + v.delegate = self; + + v; + }); + + [self addSubview:self.selectBtn]; + [self addSubview:self.textField]; +} + +- (void)clickSelectBtn:(NSButton *)btn { + self.model.enable = btn.state; +} + +- (void)setupWithData:(id)data { + TKRemoteControlModel *model = data; + self.model = model; + self.selectBtn.title = model.function; + self.selectBtn.state = model.enable; + self.textField.stringValue = model.keyword; +} + +- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor { + NSString *string = control.stringValue; + self.model.keyword = string; + return YES; +} + +@end diff --git a/WeChatPlugin/WindowController/TKAutoReplyWindowController.h b/WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.h similarity index 100% rename from WeChatPlugin/WindowController/TKAutoReplyWindowController.h rename to WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.h diff --git a/WeChatPlugin/WindowController/TKAutoReplyWindowController.m b/WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.m similarity index 100% rename from WeChatPlugin/WindowController/TKAutoReplyWindowController.m rename to WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.m diff --git a/WeChatPlugin/WindowController/TKAutoReplyWindowController.xib b/WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.xib similarity index 96% rename from WeChatPlugin/WindowController/TKAutoReplyWindowController.xib rename to WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.xib index 9229929f..d7656911 100644 --- a/WeChatPlugin/WindowController/TKAutoReplyWindowController.xib +++ b/WeChatPlugin/Sources/WindowControllers/AutoReplyWindowController/TKAutoReplyWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -17,7 +17,7 @@ - + diff --git a/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.h b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.h new file mode 100644 index 00000000..6be7f71a --- /dev/null +++ b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.h @@ -0,0 +1,13 @@ +// +// TKRemoteControlWindowController.h +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import + +@interface TKRemoteControlWindowController : NSWindowController + +@end diff --git a/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.m b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.m new file mode 100644 index 00000000..fb916852 --- /dev/null +++ b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.m @@ -0,0 +1,94 @@ +// +// TKRemoteControlWindowController.m +// WeChatPlugin +// +// Created by TK on 2017/8/8. +// Copyright © 2017年 tk. All rights reserved. +// + +#import "TKRemoteControlWindowController.h" +#import "TKRemoteControlModel.h" +#import "TKWeChatPluginConfig.h" +#import "TKRemoteControlCell.h" + +@interface TKRemoteControlWindowController () + +@property (weak) IBOutlet NSTabView *tabView; +@property (nonatomic, strong) NSTableView *tableView; +@property (nonatomic, strong) NSArray *remoteControlModels; + +@end + +@implementation TKRemoteControlWindowController + +- (void)windowDidLoad { + [super windowDidLoad]; + + [self setup]; + [self initSubviews]; +} + +- (void)initSubviews { + + CGFloat tabViewWidth = self.tabView.frame.size.width; + CGFloat tabViewHeight = self.tabView.frame.size.height; + + self.tableView = ({ + NSTableView *tableView = [[NSTableView alloc] init]; + tableView.frame = NSMakeRect(50, 50, tabViewWidth, tabViewHeight); + tableView.delegate = self; + tableView.dataSource = self; + NSTableColumn *column = [[NSTableColumn alloc] init]; + column.width = tabViewWidth - 100; + [tableView addTableColumn:column]; + tableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleNone; + tableView.backgroundColor = [NSColor clearColor]; + + tableView; + }); + + [self.tabView addSubview:self.tableView]; +} + +- (void)setup { + self.window.contentView.layer.backgroundColor = [NSColor whiteColor].CGColor; + [self.window.contentView.layer setNeedsDisplay]; + self.remoteControlModels = [[TKWeChatPluginConfig sharedConfig] remoteControlModels][0]; +} + +/** + 关闭窗口时间 + + */ +- (BOOL)windowShouldClose:(id)sender { + [[TKWeChatPluginConfig sharedConfig] saveRemoteControlModels]; + return YES; +} + +#pragma mark - NSTableViewDataSource && NSTableViewDelegate + +- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{ + return self.remoteControlModels.count; +} + +- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{ + TKRemoteControlCell *cell = [[TKRemoteControlCell alloc] init]; + cell.frame = NSMakeRect(0, 0, self.tabView.frame.size.width, 40); + [cell setupWithData:self.remoteControlModels[row]]; + + return cell; +} + +- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row{ + return 50; +} + +#pragma mark - NSTabViewDelegate + +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem { + NSInteger selectTabIndex = [tabViewItem.identifier integerValue]; + self.remoteControlModels = [[TKWeChatPluginConfig sharedConfig] remoteControlModels][selectTabIndex]; + [self.tableView reloadData]; +} + +@end diff --git a/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.xib b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.xib new file mode 100644 index 00000000..50017c37 --- /dev/null +++ b/WeChatPlugin/Sources/WindowControllers/RemoteControlWindowController/TKRemoteControlWindowController.xib @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WeChatPlugin/TKRemoteControlCommands.plist b/WeChatPlugin/TKRemoteControlCommands.plist new file mode 100644 index 00000000..6d82ded1 --- /dev/null +++ b/WeChatPlugin/TKRemoteControlCommands.plist @@ -0,0 +1,182 @@ + + + + + + + executeCommand + open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app + keyword + TK-PMBH + function + 屏幕保护 + enable + + + + executeCommand + /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend + keyword + TK-SP + function + 锁屏 + enable + + + + executeCommand + sleep + keyword + TK-XM + function + 休眠 + enable + + + + executeCommand + shutdown + keyword + TK-GJ + function + 关机 + enable + + + + executeCommand + restart + keyword + TK-CQ + function + 重启 + enable + + + + executeCommand + empty + keyword + TK-QK + function + 清空废纸篓 + enable + + + + + + executeCommand + killQQ + keyword + TK-QQ + function + 退出 QQ + enable + + + + executeCommand + killWeChat + keyword + TK-WeChat + function + 退出 WeChat + enable + + + + executeCommand + killChrome + keyword + TK-Chrome + function + 退出 Chrome + enable + + + + executeCommand + killSafari + keyword + TK-Safari + function + 退出 Safari + enable + + + + executeCommand + killAll + keyword + TK-All + function + 退出所有程序 + enable + + + + + + executeCommand + musicPlay + keyword + TK-Play + function + 播放 + enable + + + + executeCommand + musicPause + keyword + TK-Pause + function + 暂停 + enable + + + + executeCommand + musicPrevious + keyword + TK-Previous + function + 上一首 + enable + + + + executeCommand + musicNext + keyword + TK-Next + function + 下一首 + enable + + + + executeCommand + musicLike + keyword + TK-Like + function + 喜欢歌曲 + enable + + + + executeCommand + musicUnLike + keyword + TK-Unlike + function + 取消喜欢 + enable + + + + + diff --git a/WeChatPlugin/TKRemoteControlScript.scpt b/WeChatPlugin/TKRemoteControlScript.scpt new file mode 100644 index 0000000000000000000000000000000000000000..9aa6870b27c072e72ec9ae34d099602f87ce58e6 GIT binary patch literal 11826 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 literal 0 HcmV?d00001 diff --git a/WeChatPlugin/WeChatPlugin.h b/WeChatPlugin/WeChatPlugin.h index 13c4705e..317f1261 100644 --- a/WeChatPlugin/WeChatPlugin.h +++ b/WeChatPlugin/WeChatPlugin.h @@ -13,10 +13,6 @@ FOUNDATION_EXPORT double WeChatPluginVersionNumber; FOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[]; -#define SCREEN_WIDTH ([NSScreen mainScreen].frame.size.width) -#define SCREEN_HEIGHT ([NSScreen mainScreen].frame.size.height) - - #pragma mark - 微信原始的部分类与方法 @interface MMMainWindowController : NSObject @@ -46,6 +42,7 @@ FOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[]; @property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName; // @synthesize fromUserName; @property(nonatomic, setter=SetMsgType:) int msgType; // @synthesize msgType; @property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName; // @synthesize toUserName; +@property (nonatomic, assign) unsigned int createTime; @end @interface WeChat : NSObject @@ -63,10 +60,14 @@ FOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[]; @interface MessageData : NSObject - (id)initWithMsgType:(long long)arg1; @property(retain, nonatomic) NSString *fromUsrName; -@property(retain, nonatomic) NSString *toUsrName; +@property(retain, nonatomic) NSString *toUsrName; @property(retain, nonatomic) NSString *msgContent; @property(retain, nonatomic) NSString *msgPushContent; @property(nonatomic) int msgStatus; @property(nonatomic) int msgCreateTime; @property(nonatomic) int mesLocalID; @end + +@interface CUtility : NSObject ++ (BOOL)HasWechatInstance; +@end