mirror of
https://github.com/Sunnyyoung/WeChatTweak-macOS.git
synced 2025-05-23 14:56:08 +08:00
Sticker Message Menu Add Export Sticker Item
This commit is contained in:
parent
7b39eeaccf
commit
08d3368523
|
@ -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
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@
|
|||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BuildMachineOSBuild</key>
|
||||
<string>19C57</string>
|
||||
<string>18G95</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
@ -27,17 +27,17 @@
|
|||
<key>DTCompiler</key>
|
||||
<string>com.apple.compilers.llvm.clang.1_0</string>
|
||||
<key>DTPlatformBuild</key>
|
||||
<string>11C29</string>
|
||||
<string>11A420a</string>
|
||||
<key>DTPlatformVersion</key>
|
||||
<string>GM</string>
|
||||
<key>DTSDKBuild</key>
|
||||
<string>19B90</string>
|
||||
<string>19A547</string>
|
||||
<key>DTSDKName</key>
|
||||
<string>macosx10.15</string>
|
||||
<key>DTXcode</key>
|
||||
<string>1130</string>
|
||||
<string>1100</string>
|
||||
<key>DTXcodeBuild</key>
|
||||
<string>11C29</string>
|
||||
<string>11A420a</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.10</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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";
|
Binary file not shown.
Binary file not shown.
|
@ -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" = "经典";
|
Binary file not shown.
Binary file not shown.
|
@ -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" = "經典";
|
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -20,3 +20,4 @@
|
|||
"Tweak.MessageMenuItem.OpenInBrowser" = "使用浏览器打开";
|
||||
"Tweak.MessageMenuItem.IdentifyQRCode" = "识别二维码";
|
||||
"Tweak.MessageMenuItem.IdentifyQRCodeNotification" = "识别结果已复制到粘贴板";
|
||||
"Tweak.MessageMenuItem.ExportSticker" = "导出表情";
|
||||
|
|
|
@ -20,3 +20,4 @@
|
|||
"Tweak.MessageMenuItem.OpenInBrowser" = "使用瀏覽器打開";
|
||||
"Tweak.MessageMenuItem.IdentifyQRCode" = "識別QRCode";
|
||||
"Tweak.MessageMenuItem.IdentifyQRCodeNotification" = "識別結果已復製到粘貼板";
|
||||
"Tweak.MessageMenuItem.ExportSticker" = "導出貼圖";
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user