diff --git a/Makefile b/Makefile index e3df975..4f42f65 100644 --- a/Makefile +++ b/Makefile @@ -28,10 +28,12 @@ install:: @if [ -d "${APP_PATH}/${FRAMEWORK_PATH}" ]; then\ rm -rf ${APP_PATH}/${FRAMEWORK_PATH};\ cp -R ${FRAMEWORK_PATH} ${APP_PATH};\ + chmod -R 755 ${APP_PATH}/${FRAMEWORK_PATH};\ echo "Framework found! Replace with new framework successfully!";\ else \ cp ${APP_PATH}/${APP_NAME} ${APP_PATH}/${BACKUP_NAME};\ cp -R ${FRAMEWORK_PATH} ${APP_PATH};\ + chmod -R 755 ${APP_PATH}/${FRAMEWORK_PATH};\ ./insert_dylib @executable_path/${FRAMEWORK_PATH}/${FRAMEWORK_NAME} ${APP_PATH}/${APP_NAME} ${APP_PATH}/${APP_NAME} --all-yes;\ echo "Install successfully!";\ fi diff --git a/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib b/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib index 999ac62..2754c25 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib and b/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib differ diff --git a/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings index 11c44db..6545767 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings and b/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings differ diff --git a/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.nib b/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.nib new file mode 100644 index 0000000..1142864 Binary files /dev/null and b/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.nib differ diff --git a/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.strings b/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.strings deleted file mode 100644 index 0059bf3..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "Enabled"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "Need to restart"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "Enabled"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "Disabled"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "Message recalled notification:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "Auto login:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "Disabled"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "Disabled"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "All"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "Inherited"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON compressing:"; diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings index 238168f..ba3c05a 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings and b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings differ diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.nib b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.nib new file mode 100644 index 0000000..df8eb28 Binary files /dev/null and b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.nib differ diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.strings deleted file mode 100644 index 0c7eff4..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "开启"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "需重启客户端"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "开启"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "关闭"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "消息撤回通知:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "免认证登录:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "关闭"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "关闭"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "全部接收"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "跟随聊天设置"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON 压缩:"; diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/Localizable.strings index ca7c411..c200344 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/Localizable.strings and b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/Localizable.strings differ diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.nib b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.nib new file mode 100644 index 0000000..daa9494 Binary files /dev/null and b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.nib differ diff --git a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.strings deleted file mode 100644 index 9649c05..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "開啟"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "需重啟客戶端"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "開啟"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "關閉"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "消息撤回通知:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "免認證登錄:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "關閉"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "關閉"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "全部接收"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "跟隨聊天設置"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON 壓縮:"; diff --git a/WeChatTweak.framework/Versions/A/WeChatTweak b/WeChatTweak.framework/Versions/A/WeChatTweak index c54abb1..6b2cc79 100755 Binary files a/WeChatTweak.framework/Versions/A/WeChatTweak and b/WeChatTweak.framework/Versions/A/WeChatTweak differ diff --git a/WeChatTweak.xcodeproj/project.pbxproj b/WeChatTweak.xcodeproj/project.pbxproj index ad6ba49..41a9111 100644 --- a/WeChatTweak.xcodeproj/project.pbxproj +++ b/WeChatTweak.xcodeproj/project.pbxproj @@ -35,9 +35,6 @@ 7D14E5A21F6447DB00D75132 /* AlfredManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlfredManager.h; sourceTree = ""; }; 7D14E5A31F6447DB00D75132 /* AlfredManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AlfredManager.m; sourceTree = ""; }; 7D54A05F20E74E4600CB5306 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TweakPreferencesController.xib; sourceTree = ""; }; - 7D54A06320E74E5A00CB5306 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/TweakPreferencesController.strings; sourceTree = ""; }; - 7D54A06520E74E8200CB5306 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/TweakPreferencesController.strings"; sourceTree = ""; }; - 7D54A06720E74E8E00CB5306 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/TweakPreferencesController.strings"; sourceTree = ""; }; 7D54A07020E74FFD00CB5306 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 7D54A07120E7535F00CB5306 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 7D54A07220E7536300CB5306 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; @@ -49,6 +46,9 @@ 7DB8AFBD206211D900E683AE /* WTConfigManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WTConfigManager.m; sourceTree = ""; }; 7DBA4465231812AB004CE2DB /* RecallCacheManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecallCacheManager.h; sourceTree = ""; }; 7DBA4466231812AB004CE2DB /* RecallCacheManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecallCacheManager.m; sourceTree = ""; }; + 7DF7065D23A8B69000DEA8F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/TweakPreferencesController.xib; sourceTree = ""; }; + 7DF7065E23A8B69A00DEA8F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/TweakPreferencesController.xib"; sourceTree = ""; }; + 7DF7065F23A8B6A400DEA8F6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hant"; path = "zh-Hant.lproj/TweakPreferencesController.xib"; sourceTree = ""; }; 7DF842271F40583F00D42D79 /* WeChatTweak.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WeChatTweak.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7DF8422A1F40583F00D42D79 /* WeChatTweak.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeChatTweak.h; sourceTree = ""; }; 7DF8422B1F40583F00D42D79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -248,7 +248,6 @@ developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, "zh-Hans", @@ -339,9 +338,9 @@ isa = PBXVariantGroup; children = ( 7D54A05F20E74E4600CB5306 /* Base */, - 7D54A06320E74E5A00CB5306 /* en */, - 7D54A06520E74E8200CB5306 /* zh-Hans */, - 7D54A06720E74E8E00CB5306 /* zh-Hant */, + 7DF7065D23A8B69000DEA8F6 /* en */, + 7DF7065E23A8B69A00DEA8F6 /* zh-Hans */, + 7DF7065F23A8B6A400DEA8F6 /* zh-Hant */, ); name = TweakPreferencesController.xib; sourceTree = ""; diff --git a/WeChatTweak.xcodeproj/xcshareddata/xcschemes/WeChatTweak.xcscheme b/WeChatTweak.xcodeproj/xcshareddata/xcschemes/WeChatTweak.xcscheme index b82155e..c915ec3 100644 --- a/WeChatTweak.xcodeproj/xcshareddata/xcschemes/WeChatTweak.xcscheme +++ b/WeChatTweak.xcodeproj/xcshareddata/xcschemes/WeChatTweak.xcscheme @@ -31,7 +31,7 @@ - + - + @@ -11,17 +11,18 @@ + - + - + @@ -29,7 +30,7 @@ - + @@ -37,10 +38,10 @@ - + - + @@ -57,10 +58,10 @@ - + - + @@ -80,18 +81,26 @@ - + + + + + + + + + - + - + @@ -108,36 +117,72 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/WeChatTweak/Controller/TweakPreferencesController.m b/WeChatTweak/Controller/TweakPreferencesController.m index b06b890..e398966 100644 --- a/WeChatTweak/Controller/TweakPreferencesController.m +++ b/WeChatTweak/Controller/TweakPreferencesController.m @@ -15,6 +15,7 @@ @property (weak) IBOutlet NSPopUpButton *autoAuthButton; @property (weak) IBOutlet NSPopUpButton *notificationTypeButton; @property (weak) IBOutlet NSPopUpButton *compressedJSONEnabledButton; +@property (weak) IBOutlet NSPopUpButton *revokedMessageStyleButton; @end @@ -37,6 +38,7 @@ [self.autoAuthButton selectItemAtIndex:enabledAutoAuth ? 1 : 0]; [self.notificationTypeButton selectItemAtIndex:notificationType]; [self.compressedJSONEnabledButton selectItemAtIndex:configManager.compressedJSONEnabled ? 0 : 1]; + [self.revokedMessageStyleButton selectItemAtIndex:configManager.revokedMessageStyle]; } #pragma mark - Event method @@ -57,6 +59,10 @@ WTConfigManager.sharedInstance.compressedJSONEnabled = enabled; } +- (IBAction)switchRevokedMessageStyleButton:(NSPopUpButton *)sender { + WTConfigManager.sharedInstance.revokedMessageStyle = sender.indexOfSelectedItem; +} + #pragma mark - MASPreferencesViewController - (NSString *)identifier { diff --git a/WeChatTweak/Controller/en.lproj/TweakPreferencesController.strings b/WeChatTweak/Controller/en.lproj/TweakPreferencesController.strings deleted file mode 100644 index 0059bf3..0000000 --- a/WeChatTweak/Controller/en.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "Enabled"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "Need to restart"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "Enabled"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "Disabled"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "Message recalled notification:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "Auto login:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "Disabled"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "Disabled"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "All"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "Inherited"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON compressing:"; diff --git a/WeChatTweak/Controller/en.lproj/TweakPreferencesController.xib b/WeChatTweak/Controller/en.lproj/TweakPreferencesController.xib new file mode 100644 index 0000000..c4e7503 --- /dev/null +++ b/WeChatTweak/Controller/en.lproj/TweakPreferencesController.xib @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.strings b/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.strings deleted file mode 100644 index 0c7eff4..0000000 --- a/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "开启"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "需重启客户端"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "开启"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "关闭"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "消息撤回通知:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "免认证登录:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "关闭"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "关闭"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "全部接收"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "跟随聊天设置"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON 压缩:"; diff --git a/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.xib b/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.xib new file mode 100644 index 0000000..9f511e8 --- /dev/null +++ b/WeChatTweak/Controller/zh-Hans.lproj/TweakPreferencesController.xib @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.strings b/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.strings deleted file mode 100644 index 9649c05..0000000 --- a/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,33 +0,0 @@ - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "10G-t9-s4T"; */ -"10G-t9-s4T.title" = "開啟"; - -/* Class = "NSTextFieldCell"; title = "Need to restart"; ObjectID = "2vl-mc-m3L"; */ -"2vl-mc-m3L.title" = "需重啟客戶端"; - -/* Class = "NSMenuItem"; title = "Enabled"; ObjectID = "KQg-jN-y9a"; */ -"KQg-jN-y9a.title" = "開啟"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "MEN-Kg-wfj"; */ -"MEN-Kg-wfj.title" = "關閉"; - -/* Class = "NSTextFieldCell"; title = "Message recalled notification:"; ObjectID = "UKv-CM-nGt"; */ -"UKv-CM-nGt.title" = "消息撤回通知:"; - -/* Class = "NSTextFieldCell"; title = "Auto login:"; ObjectID = "UiV-zj-l6I"; */ -"UiV-zj-l6I.title" = "免認證登錄:"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Uk9-Oc-Jtv"; */ -"Uk9-Oc-Jtv.title" = "關閉"; - -/* Class = "NSMenuItem"; title = "Disabled"; ObjectID = "Vcv-eD-OM9"; */ -"Vcv-eD-OM9.title" = "關閉"; - -/* Class = "NSMenuItem"; title = "All"; ObjectID = "da4-aJ-lEy"; */ -"da4-aJ-lEy.title" = "全部接收"; - -/* Class = "NSMenuItem"; title = "Inherited"; ObjectID = "gec-CY-E1x"; */ -"gec-CY-E1x.title" = "跟隨聊天設置"; - -/* Class = "NSTextFieldCell"; title = "Alfred JSON compressing:"; ObjectID = "jHw-2a-B2t"; */ -"jHw-2a-B2t.title" = "Alfred JSON 壓縮:"; diff --git a/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.xib b/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.xib new file mode 100644 index 0000000..5c42486 --- /dev/null +++ b/WeChatTweak/Controller/zh-Hant.lproj/TweakPreferencesController.xib @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WeChatTweak/Manager/RecallCacheManager.m b/WeChatTweak/Manager/RecallCacheManager.m index 2a9053d..c3ac013 100644 --- a/WeChatTweak/Manager/RecallCacheManager.m +++ b/WeChatTweak/Manager/RecallCacheManager.m @@ -35,12 +35,12 @@ } + (void)insertRevokedMessage:(MessageData *)message { - NSString *identifer = [NSString stringWithFormat:@"%lld-%ud", message.mesSvrID, message.msgCreateTime]; + NSString *identifer = [NSString stringWithFormat:@"%ud-%lld-%ud", message.mesLocalID, message.mesSvrID, message.msgCreateTime]; [RecallCacheManager.sharedInstance.kv setBool:YES forKey:identifer]; } + (BOOL)containsRevokedMessage:(MessageData *)message { - NSString *identifer = [NSString stringWithFormat:@"%lld-%ud", message.mesSvrID, message.msgCreateTime]; + NSString *identifer = [NSString stringWithFormat:@"%ud-%lld-%ud", message.mesLocalID, message.mesSvrID, message.msgCreateTime]; return [RecallCacheManager.sharedInstance.kv containsKey:identifer]; } diff --git a/WeChatTweak/Manager/WTConfigManager.h b/WeChatTweak/Manager/WTConfigManager.h index 2d21970..11e7283 100644 --- a/WeChatTweak/Manager/WTConfigManager.h +++ b/WeChatTweak/Manager/WTConfigManager.h @@ -10,9 +10,15 @@ #import #import +typedef NS_ENUM(NSUInteger, WTRevokedMessageStyle) { + WTRevokedMessageStylePlain = 0, + WTRevokedMessageStyleMask +}; + @interface WTConfigManager : NSObject @property (nonatomic, assign) BOOL compressedJSONEnabled; +@property (nonatomic, assign) WTRevokedMessageStyle revokedMessageStyle; + (instancetype)sharedInstance; diff --git a/WeChatTweak/Manager/WTConfigManager.m b/WeChatTweak/Manager/WTConfigManager.m index 9529c81..9b928a7 100644 --- a/WeChatTweak/Manager/WTConfigManager.m +++ b/WeChatTweak/Manager/WTConfigManager.m @@ -9,6 +9,7 @@ #import "WTConfigManager.h" static NSString * const WeChatTweakCompressedJSONEnabledKey = @"WeChatTweakCompressedJSONEnabledKey"; +static NSString * const WeChatTweakRevokedMessageStyleKey = @"WeChatTweakRevokedMessageStyleKey"; @interface WTConfigManager() @@ -34,6 +35,7 @@ static NSString * const WeChatTweakCompressedJSONEnabledKey = @"WeChatTweakCompr } else { _compressedJSONEnabled = YES; } + _revokedMessageStyle = [userDefaults integerForKey:WeChatTweakRevokedMessageStyleKey]; } return self; } @@ -46,4 +48,10 @@ static NSString * const WeChatTweakCompressedJSONEnabledKey = @"WeChatTweakCompr [NSUserDefaults.standardUserDefaults synchronize]; } +- (void)setRevokedMessageStyle:(WTRevokedMessageStyle)revokedMessageStyle { + _revokedMessageStyle = revokedMessageStyle; + [NSUserDefaults.standardUserDefaults setInteger:revokedMessageStyle forKey:WeChatTweakRevokedMessageStyleKey]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + @end diff --git a/WeChatTweak/Supporting Files/WeChatTweakHeaders.h b/WeChatTweak/Supporting Files/WeChatTweakHeaders.h index e6099bc..44a5964 100644 --- a/WeChatTweak/Supporting Files/WeChatTweakHeaders.h +++ b/WeChatTweak/Supporting Files/WeChatTweakHeaders.h @@ -65,6 +65,7 @@ typedef NS_ENUM(unsigned int, MessageDataType) { - (instancetype)initWithMsgType:(long long)arg1; - (BOOL)isSendFromSelf; - (id)getChatNameForCurMsg; +- (id)savingImageFileNameWithLocalID; @end @@ -173,3 +174,19 @@ typedef NS_ENUM(unsigned int, MessageDataType) { @property(retain, nonatomic) NSImage *displayedImage; @end + +@interface MMService : NSObject + +@end + +@interface EmoticonMgr : MMService + +- (id)getEmotionDataWithMD5:(id)arg1; + +@end + +@interface NSDictionary (XMLDictionary) + ++ (id)dictionaryWithXMLString:(id)arg1; + +@end diff --git a/WeChatTweak/Supporting Files/en.lproj/Localizable.strings b/WeChatTweak/Supporting Files/en.lproj/Localizable.strings index ec65ef0..b4e1c3d 100644 --- a/WeChatTweak/Supporting Files/en.lproj/Localizable.strings +++ b/WeChatTweak/Supporting Files/en.lproj/Localizable.strings @@ -20,3 +20,4 @@ "Tweak.MessageMenuItem.OpenInBrowser" = "Open In Browser"; "Tweak.MessageMenuItem.IdentifyQRCode" = "Identify QRCode"; "Tweak.MessageMenuItem.IdentifyQRCodeNotification" = "The result of the recognition has been copied to the pasteboard"; +"Tweak.MessageMenuItem.ExportSticker" = "Export Sticker"; diff --git a/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings b/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings index cebdb31..ed32b1b 100644 --- a/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings +++ b/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings @@ -20,3 +20,4 @@ "Tweak.MessageMenuItem.OpenInBrowser" = "使用浏览器打开"; "Tweak.MessageMenuItem.IdentifyQRCode" = "识别二维码"; "Tweak.MessageMenuItem.IdentifyQRCodeNotification" = "识别结果已复制到粘贴板"; +"Tweak.MessageMenuItem.ExportSticker" = "导出表情"; diff --git a/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings b/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings index 8f2f53d..92fbb46 100644 --- a/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings +++ b/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings @@ -20,3 +20,4 @@ "Tweak.MessageMenuItem.OpenInBrowser" = "使用瀏覽器打開"; "Tweak.MessageMenuItem.IdentifyQRCode" = "識別QRCode"; "Tweak.MessageMenuItem.IdentifyQRCodeNotification" = "識別結果已復製到粘貼板"; +"Tweak.MessageMenuItem.ExportSticker" = "導出貼圖"; diff --git a/WeChatTweak/WeChatTweak.m b/WeChatTweak/WeChatTweak.m index b4fba42..8a72783 100755 --- a/WeChatTweak/WeChatTweak.m +++ b/WeChatTweak/WeChatTweak.m @@ -62,6 +62,7 @@ static void __attribute__((constructor)) tweak(void) { [objc_getClass("AccountService") jr_swizzleMethod:NSSelectorFromString(@"FFAddSvrMsgImgVCZZ") withMethod:@selector(tweak_ManualLogout) error:nil]; [objc_getClass("MessageService") jr_swizzleMethod:NSSelectorFromString(@"onRevokeMsg:") withMethod:@selector(tweak_onRevokeMsg:) error:nil]; [objc_getClass("MessageService") jr_swizzleMethod:NSSelectorFromString(@"FFToNameFavChatZZ:") withMethod:@selector(tweak_onRevokeMsg:) error:nil]; + [objc_getClass("MessageService") jr_swizzleMethod:NSSelectorFromString(@"FFToNameFavChatZZ:sessionMsgList:") withMethod:@selector(tweak_onRevokeMsg:sessionMessageList:) error:nil]; [objc_getClass("CUtility") jr_swizzleClassMethod:NSSelectorFromString(@"HasWechatInstance") withClassMethod:@selector(tweak_HasWechatInstance) error:nil]; [objc_getClass("CUtility") jr_swizzleClassMethod:NSSelectorFromString(@"FFSvrChatInfoMsgWithImgZZ") withClassMethod:@selector(tweak_HasWechatInstance) error:nil]; [objc_getClass("NSRunningApplication") jr_swizzleClassMethod:NSSelectorFromString(@"runningApplicationsWithBundleIdentifier:") withClassMethod:@selector(tweak_runningApplicationsWithBundleIdentifier:) error:nil]; @@ -71,7 +72,7 @@ static void __attribute__((constructor)) tweak(void) { [objc_getClass("MMMessageCellView") jr_swizzleMethod:NSSelectorFromString(@"initWithFrame:") withMethod:@selector(tweak_initWithFrame:) error:nil]; [objc_getClass("MMMessageCellView") jr_swizzleMethod:NSSelectorFromString(@"populateWithMessage:") withMethod:@selector(tweak_populateWithMessage:) error:nil]; [objc_getClass("MMMessageCellView") jr_swizzleMethod:NSSelectorFromString(@"layout") withMethod:@selector(tweak_layout) error:nil]; - + objc_property_attribute_t type = { "T", "@\"NSString\"" }; // NSString objc_property_attribute_t atom = { "N", "" }; // nonatomic objc_property_attribute_t ownership = { "&", "" }; // C = copy & = strong @@ -139,15 +140,118 @@ static void __attribute__((constructor)) tweak(void) { #pragma mark - No Revoke Message - (void)tweak_onRevokeMsg:(MessageData *)message { + [self tweak_onRevokeMsg:message sessionMessageList:nil]; +} + +- (void)tweak_onRevokeMsg:(MessageData *)message sessionMessageList:(nullable id)sessionMessageList { + switch (WTConfigManager.sharedInstance.revokedMessageStyle) { + case WTRevokedMessageStylePlain: + [self handleRevokedMessageIntoClassicStyle:message]; break; + case WTRevokedMessageStyleMask: + [self handleRevokedMessageIntoMaskStyle:message]; break; + default: + break; + } +} + +- (void)handleRevokedMessageIntoClassicStyle:(MessageData *)message { // Decode message NSString *session = [message.msgContent tweak_subStringFrom:@"" to:@""]; NSUInteger newMessageID = [message.msgContent tweak_subStringFrom:@"" to:@""].longLongValue; NSString *replaceMessage = [message.msgContent tweak_subStringFrom:@""]; - - // Get message data - MessageData *messageData = [((MessageService *)self) GetMsgData:session svrId:newMessageID]; - [RecallCacheManager insertRevokedMessage:messageData]; - + // Prepare message data + MessageData *localMessageData = [((MessageService *)self) GetMsgData:session svrId:newMessageID]; + MessageData *promptMessageData = ({ + MessageData *data = [[objc_getClass("MessageData") alloc] initWithMsgType:10000]; + data.msgStatus = 4; + data.toUsrName = localMessageData.toUsrName; + data.fromUsrName = localMessageData.fromUsrName; + data.mesSvrID = localMessageData.mesSvrID; + data.mesLocalID = localMessageData.mesLocalID; + data.msgCreateTime = localMessageData.msgCreateTime; + if ([localMessageData isSendFromSelf]) { + data.msgContent = replaceMessage; + } else { + NSString *fromUserName = [replaceMessage componentsSeparatedByString:@" "].firstObject; + NSString *userRevoke = [NSString stringWithFormat:@"%@ %@ ", fromUserName, [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Recalled"]]; + NSString *tips = [NSString stringWithFormat:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.InterceptedARecalledMessage"], userRevoke]; + NSMutableString *msgContent = [NSMutableString stringWithString:tips]; + switch (localMessageData.messageType) { + case MessageDataTypeText: { + if (localMessageData.msgContent.length) { + if ([session rangeOfString:@"@chatroom"].location == NSNotFound) { + [msgContent appendFormat:@"\"%@\"", localMessageData.msgContent]; + } else { + [msgContent appendFormat:@"\"%@\"", [localMessageData.msgContent componentsSeparatedByString:@":\n"].lastObject]; + } + } else { + [msgContent appendString:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.AMessage"]]; + } + break; + } + case MessageDataTypeImage: + [msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Image"]]; break; + case MessageDataTypeVoice: + [msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Voice"]]; break; + case MessageDataTypeVideo: + [msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Video"]]; break; + case MessageDataTypeSticker: + [msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Sticker"]]; break; + case MessageDataTypeAppUrl: + [msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Link"]]; break; + default: + [msgContent appendString:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.AMessage"]]; break; + } + data.msgContent = msgContent; + } + data; + }); + // Prepare notification information + MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter]; + NSUserNotification *userNotification = [[NSUserNotification alloc] init]; + BOOL isChatStatusNotifyOpen = YES; + if ([session rangeOfString:@"@chatroom"].location == NSNotFound) { + ContactStorage *contactStorage = [serviceCenter getService:objc_getClass("ContactStorage")]; + WCContactData *contact = [contactStorage GetContact:session]; + isChatStatusNotifyOpen = [contact isChatStatusNotifyOpen]; + userNotification.informativeText = replaceMessage; + } else { + GroupStorage *groupStorage = [serviceCenter getService:objc_getClass("GroupStorage")]; + WCContactData *groupContact = [groupStorage GetGroupContact:session]; + isChatStatusNotifyOpen = [groupContact isChatStatusNotifyOpen]; + NSString *groupName = groupContact.m_nsNickName.length ? groupContact.m_nsNickName : [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Title.Group"]; + userNotification.informativeText = [NSString stringWithFormat:@"%@: %@", groupName, replaceMessage]; + } + // Delete message if it is revoke from myself + if ([localMessageData isSendFromSelf]) { + [((MessageService *)self) DelMsg:session msgList:@[localMessageData] isDelAll:NO isManual:YES]; + [((MessageService *)self) AddLocalMsg:session msgData:promptMessageData]; + } else { + if (localMessageData.messageType == MessageDataTypeText) { + [((MessageService *)self) DelMsg:session msgList:@[localMessageData] isDelAll:NO isManual:YES]; + } + [((MessageService *)self) AddLocalMsg:session msgData:promptMessageData]; + } + // Dispatch notification + dispatch_async(dispatch_get_main_queue(), ^{ + // Deliver notification + if (![localMessageData isSendFromSelf]) { + RevokeNotificationType notificationType = [[NSUserDefaults standardUserDefaults] integerForKey:WeChatTweakPreferenceRevokeNotificationTypeKey]; + if (notificationType == RevokeNotificationTypeReceiveAll || (notificationType == RevokeNotificationTypeFollow && isChatStatusNotifyOpen)) { + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification]; + } + } + }); +} + +- (void)handleRevokedMessageIntoMaskStyle:(MessageData *)message { + // Decode message + NSString *session = [message.msgContent tweak_subStringFrom:@"" to:@""]; + NSUInteger newMessageID = [message.msgContent tweak_subStringFrom:@"" to:@""].longLongValue; + NSString *replaceMessage = [message.msgContent tweak_subStringFrom:@""]; + // Get message data + MessageData *messageData = [((MessageService *)self) GetMsgData:session svrId:newMessageID]; + [RecallCacheManager insertRevokedMessage:messageData]; // Prepare notification information MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter]; NSUserNotification *userNotification = [[NSUserNotification alloc] init]; @@ -164,7 +268,6 @@ static void __attribute__((constructor)) tweak(void) { NSString *groupName = groupContact.m_nsNickName.length ? groupContact.m_nsNickName : [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Title.Group"]; userNotification.informativeText = [NSString stringWithFormat:@"%@: %@", groupName, replaceMessage]; } - if ([messageData isSendFromSelf]) { MessageData *promptMessageData = ({ MessageData *data = [[objc_getClass("MessageData") alloc] initWithMsgType:MessageDataTypePrompt]; @@ -185,7 +288,6 @@ static void __attribute__((constructor)) tweak(void) { [((MessageService *)self) notifyDelMsgOnMainThread:messageData.getChatNameForCurMsg msgData:messageData]; [((MessageService *)self) notifyAddRevokePromptMsgOnMainThread:messageData.getChatNameForCurMsg msgData:messageData]; } - // Dispatch notification dispatch_async(dispatch_get_main_queue(), ^{ // Deliver notification @@ -219,10 +321,47 @@ static void __attribute__((constructor)) tweak(void) { NSMenuItem *qrCodeItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.IdentifyQRCode"] action:@selector(tweakIdentifyQRCode:) keyEquivalent:@""]; qrCodeItem; })]; + } else if (view.messageTableItem.message.messageType == MessageDataTypeSticker) { + [menu addItem:[NSMenuItem separatorItem]]; + [menu addItem:({ + NSMenuItem *exportStickerItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.ExportSticker"] action:@selector(tweakExportSticker:) keyEquivalent:@""]; + exportStickerItem; + })]; } return menu; } +- (void)tweakExportSticker:(id)sender { + MMMessageCellView *cell = (MMMessageCellView *)self; + MessageData *messageData = cell.messageTableItem.message; + NSString *content = messageData.msgContent; + NSString *emoji = [[content tweak_subStringFrom:@"" to:@""] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSDictionary *dictionary = [NSDictionary dictionaryWithXMLString:emoji]; + if (![dictionary objectForKey:@"_md5"]) { + return; + } + NSString *stickerMD5 = dictionary[@"_md5"]; + if (!stickerMD5.length) { + return; + } + NSString *localID = [messageData savingImageFileNameWithLocalID]; + NSSavePanel *panel = [NSSavePanel savePanel]; + [panel setNameFieldStringValue:localID]; + [panel setAllowsOtherFileTypes:YES]; + [panel setAllowedFileTypes:@[@"gif"]]; + [panel setExtensionHidden:NO]; + [panel setCanCreateDirectories:YES]; + [panel beginSheetModalForWindow:cell.window completionHandler:^(NSModalResponse result) { + if (result == NSModalResponseOK) { + NSString *path = panel.URL.path; + MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter]; + EmoticonMgr *emoticonMgr = [serviceCenter getService:objc_getClass("EmoticonMgr")]; + NSData *stickerData = [emoticonMgr getEmotionDataWithMD5:stickerMD5]; + [stickerData writeToFile:path atomically:YES]; + } + }]; +} + - (void)tweakCopyUrl:(id)sender { NSString *url = [self _tweakMessageContentUrl]; if (url.length) {