mirror of
https://github.com/Sunnyyoung/WeChatTweak-macOS.git
synced 2025-05-25 00:16:07 +08:00
parent
72993c63c9
commit
4de5ca9fec
|
@ -75,6 +75,13 @@ static NSString * const WeChatTweakPreferenceRevokeNotificationTypeKey = @"WeCha
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface ReaderWrap : NSObject
|
||||||
|
|
||||||
|
@property(retain, nonatomic) NSString *m_nsTitle;
|
||||||
|
@property(retain, nonatomic) NSString *m_nsUrl;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
@interface WCContactData : NSObject
|
@interface WCContactData : NSObject
|
||||||
|
|
||||||
@property(nonatomic) unsigned int m_uiCertificationFlag;
|
@property(nonatomic) unsigned int m_uiCertificationFlag;
|
||||||
|
@ -185,6 +192,19 @@ static NSString * const WeChatTweakPreferenceRevokeNotificationTypeKey = @"WeCha
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface MMAppSingleReaderMessageCellView : MMMessageCellView
|
||||||
|
|
||||||
|
@property(retain, nonatomic) ReaderWrap *readerData;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MMAppMultipleReaderMessageCellView : MMMessageCellView
|
||||||
|
|
||||||
|
@property(retain, nonatomic) NSArray<ReaderWrap *> *readerMessages;
|
||||||
|
@property(assign, nonatomic) NSUInteger selectedReaderWrapIndex;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
@interface MMService : NSObject
|
@interface MMService : NSObject
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -73,93 +73,94 @@ static void __attribute__((constructor)) tweak(void) {
|
||||||
|
|
||||||
- (id)tweak_contextMenu {
|
- (id)tweak_contextMenu {
|
||||||
NSMenu *menu = (NSMenu *)[self tweak_contextMenu];
|
NSMenu *menu = (NSMenu *)[self tweak_contextMenu];
|
||||||
|
if ([self isKindOfClass:objc_getClass("MMMessageCellView")]) {
|
||||||
switch (((MMMessageCellView *)self).messageTableItem.message.messageType) {
|
switch (((MMMessageCellView *)self).messageTableItem.message.messageType) {
|
||||||
case MessageDataTypeAppUrl:
|
case MessageDataTypeAppUrl: {
|
||||||
|
ReaderWrap *wrap = ({
|
||||||
|
ReaderWrap *wrap = nil;
|
||||||
|
if ([self isKindOfClass:objc_getClass("MMAppSingleReaderMessageCellView")]) {
|
||||||
|
MMAppSingleReaderMessageCellView *cell = (MMAppSingleReaderMessageCellView *)self;
|
||||||
|
wrap = cell.readerData;
|
||||||
|
} else if ([self isKindOfClass:objc_getClass("MMAppMultipleReaderMessageCellView")]) {
|
||||||
|
MMAppMultipleReaderMessageCellView *cell = (MMAppMultipleReaderMessageCellView *)self;
|
||||||
|
wrap = (cell.selectedReaderWrapIndex < cell.readerMessages.count) ? cell.readerMessages[cell.selectedReaderWrapIndex] : nil;
|
||||||
|
} else {
|
||||||
|
wrap = nil;
|
||||||
|
}
|
||||||
|
wrap;
|
||||||
|
});
|
||||||
|
if (wrap) {
|
||||||
[menu addItem:NSMenuItem.separatorItem];
|
[menu addItem:NSMenuItem.separatorItem];
|
||||||
[menu addItem:({
|
[menu addItem:({
|
||||||
NSMenuItem *copyUrlItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.CopyLink"]
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.CopyLink"]
|
||||||
action:@selector(tweakCopyURL:)
|
action:@selector(tweakCopyLink:)
|
||||||
keyEquivalent:@""];
|
keyEquivalent:@"c"];
|
||||||
copyUrlItem;
|
item.target = wrap;
|
||||||
|
item;
|
||||||
})];
|
})];
|
||||||
[menu addItem:({
|
[menu addItem:({
|
||||||
NSMenuItem *openUrlItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.OpenInBrowser"]
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.OpenInBrowser"]
|
||||||
action:@selector(tweakOpenURL:)
|
action:@selector(tweakOpenLink:)
|
||||||
keyEquivalent:@""];
|
keyEquivalent:@"o"];
|
||||||
openUrlItem;
|
item.target = wrap;
|
||||||
|
item;
|
||||||
})];
|
})];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MessageDataTypeImage:
|
}
|
||||||
|
case MessageDataTypeImage: {
|
||||||
[menu addItem:NSMenuItem.separatorItem];
|
[menu addItem:NSMenuItem.separatorItem];
|
||||||
[menu addItem:({
|
[menu addItem:({
|
||||||
NSMenuItem *qrCodeItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.IdentifyQRCode"]
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.IdentifyQRCode"]
|
||||||
action:@selector(tweakIdentifyQRCode:)
|
action:@selector(tweakIdentifyQRCode:)
|
||||||
keyEquivalent:@""];
|
keyEquivalent:@"i"];
|
||||||
qrCodeItem;
|
item.target = self;
|
||||||
|
item;
|
||||||
})];
|
})];
|
||||||
case MessageDataTypeSticker:
|
break;
|
||||||
|
}
|
||||||
|
case MessageDataTypeSticker: {
|
||||||
[menu addItem:NSMenuItem.separatorItem];
|
[menu addItem:NSMenuItem.separatorItem];
|
||||||
[menu addItem:({
|
[menu addItem:({
|
||||||
NSMenuItem *exportStickerItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.ExportSticker"]
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.ExportSticker"]
|
||||||
action:@selector(tweakExportSticker:)
|
action:@selector(tweakExportSticker:)
|
||||||
keyEquivalent:@""];
|
keyEquivalent:@"e"];
|
||||||
exportStickerItem;
|
item.target = self;
|
||||||
|
item;
|
||||||
})];
|
})];
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)tweakExportSticker:(id)sender {
|
- (void)tweakCopyLink:(NSMenuItem *)sender {
|
||||||
MMMessageCellView *cell = (MMMessageCellView *)self;
|
ReaderWrap *wrap = sender.target;
|
||||||
MessageData *messageData = cell.messageTableItem.message;
|
if (!wrap) {
|
||||||
NSString *content = messageData.msgContent;
|
|
||||||
NSString *emoji = [[content tweak_subStringFrom:@"<msg>" to:@"</msg>"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
||||||
NSDictionary *dictionary = [NSDictionary dictionaryWithXMLString:emoji];
|
|
||||||
if (![dictionary objectForKey:@"_md5"]) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSString *stickerMD5 = dictionary[@"_md5"];
|
if (wrap.m_nsUrl) {
|
||||||
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) {
|
|
||||||
[NSPasteboard.generalPasteboard clearContents];
|
[NSPasteboard.generalPasteboard clearContents];
|
||||||
[NSPasteboard.generalPasteboard setString:url forType:NSStringPboardType];
|
[NSPasteboard.generalPasteboard setString:wrap.m_nsUrl forType:NSStringPboardType];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)tweakOpenURL:(id)sender {
|
- (void)tweakOpenLink:(NSMenuItem *)sender {
|
||||||
NSString *url = [self _tweakMessageContentUrl];
|
ReaderWrap *wrap = sender.target;
|
||||||
if (url.length) {
|
if (!wrap) {
|
||||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:url]];
|
return;
|
||||||
|
}
|
||||||
|
if (wrap.m_nsUrl && [NSURL URLWithString:wrap.m_nsUrl]) {
|
||||||
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:wrap.m_nsUrl]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)tweakIdentifyQRCode:(id)sender {
|
- (void)tweakIdentifyQRCode:(NSMenuItem *)sender {
|
||||||
MMImageMessageCellView *cell = (MMImageMessageCellView *)self;
|
NSImage *image = ((MMImageMessageCellView *)self).displayedImage;
|
||||||
NSImage *image = cell.displayedImage;
|
|
||||||
if (image) {
|
if (image) {
|
||||||
NSData *imageData = [image TIFFRepresentation];
|
NSData *imageData = [image TIFFRepresentation];
|
||||||
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
|
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
|
||||||
|
@ -176,23 +177,34 @@ static void __attribute__((constructor)) tweak(void) {
|
||||||
notification.informativeText = [NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.IdentifyQRCodeNotification"];
|
notification.informativeText = [NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.IdentifyQRCodeNotification"];
|
||||||
notification;
|
notification;
|
||||||
})];
|
})];
|
||||||
NSURL *url = [NSURL URLWithString:content];
|
|
||||||
if ([url.scheme containsString:@"http"]) {
|
|
||||||
[[NSWorkspace sharedWorkspace] openURL:url];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)_tweakMessageContentUrl {
|
- (void)tweakExportSticker:(NSMenuItem *)sender {
|
||||||
MMMessageCellView *cell = (MMMessageCellView *)self;
|
MMMessageCellView *cell = (MMMessageCellView *)sender.target;
|
||||||
NSString *content = cell.messageTableItem.message.msgContent;
|
MessageData *messageData = cell.messageTableItem.message;
|
||||||
if ([content containsString:@"<url><![CDATA["]) {
|
NSString *localID = [messageData savingImageFileNameWithLocalID];
|
||||||
return [content tweak_subStringFrom:@"<url><![CDATA[" to:@"]]></url>"];
|
NSString *md5 = [NSDictionary dictionaryWithXMLString:[messageData.msgContent componentsSeparatedByString:@"\n"].lastObject][@"emoji"][@"_md5"];
|
||||||
} else {
|
if (!localID.length || !md5.length) {
|
||||||
return [content tweak_subStringFrom:@"<url>" to:@"</url>"];
|
return;
|
||||||
}
|
}
|
||||||
|
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:md5];
|
||||||
|
[stickerData writeToFile:path atomically:YES];
|
||||||
|
}
|
||||||
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Mutiple Instance
|
#pragma mark - Mutiple Instance
|
||||||
|
|
Loading…
Reference in New Issue
Block a user