diff --git a/Podfile.lock b/Podfile.lock index e98c286..61597d0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -13,7 +13,7 @@ DEPENDENCIES: - YYModel SPEC REPOS: - trunk: + https://github.com/cocoapods/specs.git: - GCDWebServer - JRSwizzle - MMKV @@ -27,4 +27,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: fb1b1e412c5f88813595570bd6f951a741cda575 -COCOAPODS: 1.8.4 +COCOAPODS: 1.7.5 diff --git a/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib b/WeChatTweak.framework/Versions/A/Resources/Base.lproj/TweakPreferencesController.nib index 2754c25..24255e9 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/Info.plist b/WeChatTweak.framework/Versions/A/Resources/Info.plist index a3a2205..440711b 100644 --- a/WeChatTweak.framework/Versions/A/Resources/Info.plist +++ b/WeChatTweak.framework/Versions/A/Resources/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 19C57 + 18G95 CFBundleDevelopmentRegion en CFBundleExecutable @@ -27,17 +27,17 @@ DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 11C29 + 11A420a DTPlatformVersion GM DTSDKBuild - 19B90 + 19A547 DTSDKName macosx10.15 DTXcode - 1130 + 1100 DTXcodeBuild - 11C29 + 11A420a LSMinimumSystemVersion 10.10 NSHumanReadableCopyright 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 index 1142864..7b8b8b4 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.nib 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 370f0e1..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/en.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,45 +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 = "Mask"; ObjectID = "gH0-wV-Bx0"; */ -"gH0-wV-Bx0.title" = "Mask"; - -/* 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:"; - -/* Class = "NSTextFieldCell"; title = "Experimental feature"; ObjectID = "lHs-du-a6F"; */ -"lHs-du-a6F.title" = "Experimental feature"; - -/* Class = "NSTextFieldCell"; title = "Revoked message style:"; ObjectID = "mPT-nA-idf"; */ -"mPT-nA-idf.title" = "Revoked message style:"; - -/* Class = "NSMenuItem"; title = "Classic"; ObjectID = "wRC-UO-k1G"; */ -"wRC-UO-k1G.title" = "Classic"; 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 index e2133dc..fefca14 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.nib 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 67c0505..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,45 +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 = "Mask"; ObjectID = "gH0-wV-Bx0"; */ -"gH0-wV-Bx0.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 压缩:; - -/* Class = "NSTextFieldCell"; title = "Experimental feature"; ObjectID = "lHs-du-a6F"; */ -"lHs-du-a6F.title" = "试验性功能"; - -/* Class = "NSTextFieldCell"; title = "Revoked message style:"; ObjectID = "mPT-nA-idf"; */ -"mPT-nA-idf.title" = "消息撤回样式:"; - -/* Class = "NSMenuItem"; title = "Classic"; ObjectID = "wRC-UO-k1G"; */ -"wRC-UO-k1G.title" = "经典"; 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 index 740b334..7d7a72f 100644 Binary files a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.nib 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 d91f955..0000000 --- a/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/TweakPreferencesController.strings +++ /dev/null @@ -1,45 +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 = "Mask"; ObjectID = "gH0-wV-Bx0"; */ -"gH0-wV-Bx0.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 壓縮:; - -/* Class = "NSTextFieldCell"; title = "Experimental feature"; ObjectID = "lHs-du-a6F"; */ -"lHs-du-a6F.title" = "試驗性功能"; - -/* Class = "NSTextFieldCell"; title = "Revoked message style:"; ObjectID = "mPT-nA-idf"; */ -"mPT-nA-idf.title" = "消息撤回樣式:"; - -/* Class = "NSMenuItem"; title = "Classic"; ObjectID = "wRC-UO-k1G"; */ -"wRC-UO-k1G.title" = "經典"; diff --git a/WeChatTweak.framework/Versions/A/WeChatTweak b/WeChatTweak.framework/Versions/A/WeChatTweak index 116bd2d..366b232 100755 Binary files a/WeChatTweak.framework/Versions/A/WeChatTweak and b/WeChatTweak.framework/Versions/A/WeChatTweak differ diff --git a/WeChatTweak/Supporting Files/WeChatTweakHeaders.h b/WeChatTweak/Supporting Files/WeChatTweakHeaders.h index e6099bc..e11b084 100644 --- a/WeChatTweak/Supporting Files/WeChatTweakHeaders.h +++ b/WeChatTweak/Supporting Files/WeChatTweakHeaders.h @@ -173,3 +173,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 c7c3fb3..fdc3f06 100755 --- a/WeChatTweak/WeChatTweak.m +++ b/WeChatTweak/WeChatTweak.m @@ -70,7 +70,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 @@ -319,10 +319,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; + NSDictionary *dictionary = [NSDictionary dictionaryWithXMLString:content]; + NSDictionary *emojiDictionary = dictionary[@"emoji"]; + if (![emojiDictionary objectForKey:@"_md5"]) { + return; + } + NSString *stickerMD5 = emojiDictionary[@"_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) {