diff --git a/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/en.lproj/Localizable.strings
index f4a6cc1..f25f6a1 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/zh-Hans.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings
index 3e88c1f..e93eff2 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-Hant.lproj/Localizable.strings b/WeChatTweak.framework/Versions/A/Resources/zh-Hant.lproj/Localizable.strings
index 34b7bfe..38008bf 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/WeChatTweak b/WeChatTweak.framework/Versions/A/WeChatTweak
index bee887c..099ac01 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 69a9f32..32b89c9 100644
--- a/WeChatTweak/Supporting Files/WeChatTweakHeaders.h
+++ b/WeChatTweak/Supporting Files/WeChatTweakHeaders.h
@@ -17,7 +17,8 @@ typedef NS_ENUM(unsigned int, MessageDataType) {
MessageDataTypeVoice = 34,
MessageDataTypeVideo = 43,
MessageDataTypeSticker = 47,
- MessageDataTypeLink = 49,
+ MessageDataTypeAppUrl = 49,
+ MessageDataTypePrompt = 10000
};
@interface NSString (MD5)
@@ -151,3 +152,16 @@ typedef NS_ENUM(unsigned int, MessageDataType) {
- (id)initWithViewControllers:(NSArray *)arg1;
@end
+
+@interface MMMessageTableItem : NSObject
+
+@property(retain, nonatomic) MessageData *message;
+
+@end
+
+@interface MMMessageCellView : NSTableCellView
+
+@property(retain, nonatomic) NSView *avatarImgView;
+@property(retain, nonatomic) MMMessageTableItem *messageTableItem;
+
+@end
diff --git a/WeChatTweak/Supporting Files/en.lproj/Localizable.strings b/WeChatTweak/Supporting Files/en.lproj/Localizable.strings
index 7e8c745..e93627b 100644
--- a/WeChatTweak/Supporting Files/en.lproj/Localizable.strings
+++ b/WeChatTweak/Supporting Files/en.lproj/Localizable.strings
@@ -16,3 +16,5 @@
"Tweak.Message.Sticker" = "Sticker";
"Tweak.Message.Link" = "Link";
"Tweak.Message.AMessage" = "a message";
+"Tweak.MessageMenuItem.CopyLink" = "Copy Link";
+"Tweak.MessageMenuItem.OpenInBrowser" = "Open In Browser";
diff --git a/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings b/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings
index b03046e..f319f2e 100644
--- a/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings
+++ b/WeChatTweak/Supporting Files/zh-Hans.lproj/Localizable.strings
@@ -16,3 +16,5 @@
"Tweak.Message.Sticker" = "表情";
"Tweak.Message.Link" = "链接";
"Tweak.Message.AMessage" = "一条消息";
+"Tweak.MessageMenuItem.CopyLink" = "复制链接";
+"Tweak.MessageMenuItem.OpenInBrowser" = "使用浏览器打开";
diff --git a/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings b/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings
index 9dcf40c..1660343 100644
--- a/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings
+++ b/WeChatTweak/Supporting Files/zh-Hant.lproj/Localizable.strings
@@ -16,3 +16,5 @@
"Tweak.Message.Sticker" = "表情";
"Tweak.Message.Link" = "链接";
"Tweak.Message.AMessage" = "一条消息";
+"Tweak.MessageMenuItem.CopyLink" = "複製鏈接";
+"Tweak.MessageMenuItem.OpenInBrowser" = "使用瀏覽器打開";
diff --git a/WeChatTweak/WeChatTweak.m b/WeChatTweak/WeChatTweak.m
index f14d69e..1a52a7b 100755
--- a/WeChatTweak/WeChatTweak.m
+++ b/WeChatTweak/WeChatTweak.m
@@ -63,6 +63,7 @@ static void __attribute__((constructor)) tweak(void) {
[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];
[objc_getClass("MASPreferencesWindowController") jr_swizzleMethod:NSSelectorFromString(@"initWithViewControllers:") withMethod:@selector(tweak_initWithViewControllers:) error:nil];
+ [objc_getClass("MMMessageCellView") jr_swizzleMethod:NSSelectorFromString(@"contextMenu") withMethod:@selector(tweak_contextMenu) error:nil];
objc_property_attribute_t type = { "T", "@\"NSString\"" }; // NSString
objc_property_attribute_t atom = { "N", "" }; // nonatomic
@@ -121,7 +122,7 @@ static void __attribute__((constructor)) tweak(void) {
[msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Video"]]; break;
case MessageDataTypeSticker:
[msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Sticker"]]; break;
- case MessageDataTypeLink:
+ case MessageDataTypeAppUrl:
[msgContent appendFormat:@"<%@>", [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.Link"]]; break;
default:
[msgContent appendString:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.AMessage"]]; break;
@@ -171,6 +172,38 @@ static void __attribute__((constructor)) tweak(void) {
});
}
+#pragma mark - AppUrlMessageMenu
+
+- (id)tweak_contextMenu {
+ MMMessageCellView *view = (MMMessageCellView *)self;
+ NSMenu *menu = (NSMenu *)[self tweak_contextMenu];
+ if (view.messageTableItem.message.messageType == MessageDataTypeAppUrl) {
+ [menu addItem:[NSMenuItem separatorItem]];
+ [menu addItem:({
+ NSMenuItem *copyUrlItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.CopyLink"] action:@selector(tweakCopyUrl:) keyEquivalent:@""];
+ copyUrlItem;
+ })];
+ [menu addItem:({
+ NSMenuItem *openUrlItem = [[NSMenuItem alloc] initWithTitle:[NSBundle.tweakBundle localizedStringForKey:@"Tweak.MessageMenuItem.OpenInBrowser"] action:@selector(tweakOpenUrlItem:) keyEquivalent:@""];
+ openUrlItem;
+ })];
+ }
+ return menu;
+}
+
+- (void)tweakCopyUrl:(id)sender {
+ MMMessageCellView *cell = (MMMessageCellView *)self;
+ NSString *url = [cell.messageTableItem.message.msgContent tweak_subStringFrom:@"" to:@""];
+ [[NSPasteboard generalPasteboard] clearContents];
+ [[NSPasteboard generalPasteboard] setString:url forType:NSStringPboardType];
+}
+
+- (void)tweakOpenUrlItem:(id)sender {
+ MMMessageCellView *cell = (MMMessageCellView *)self;
+ NSString *url = [cell.messageTableItem.message.msgContent tweak_subStringFrom:@"" to:@""];
+ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
+}
+
#pragma mark - Mutiple Instance
+ (BOOL)tweak_HasWechatInstance {