mirror of
https://github.com/Sunnyyoung/WeChatTweak-macOS.git
synced 2026-07-29 06:24:31 +08:00
Add alfred support
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// AlfredManager.h
|
||||
// WeChatTweak
|
||||
//
|
||||
// Created by Sunnyyoung on 2017/9/10.
|
||||
// Copyright © 2017年 Sunnyyoung. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
#import <YYModel/YYModel.h>
|
||||
#import <GCDWebServer/GCDWebServer.h>
|
||||
#import <GCDWebServer/GCDWebServerDataResponse.h>
|
||||
|
||||
@interface AlfredManager : NSObject
|
||||
|
||||
+ (instancetype)sharedInstance;
|
||||
|
||||
- (void)startListener;
|
||||
- (void)stopListener;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,102 @@
|
||||
//
|
||||
// AlfredManager.m
|
||||
// WeChatTweak
|
||||
//
|
||||
// Created by Sunnyyoung on 2017/9/10.
|
||||
// Copyright © 2017年 Sunnyyoung. All rights reserved.
|
||||
//
|
||||
|
||||
#import "AlfredManager.h"
|
||||
#import "WeChatTweakHeaders.h"
|
||||
|
||||
@interface AlfredManager()
|
||||
|
||||
@property (nonatomic, strong, nullable) GCDWebServer *server;
|
||||
|
||||
@end
|
||||
|
||||
@implementation AlfredManager
|
||||
|
||||
+ (instancetype)sharedInstance {
|
||||
static dispatch_once_t onceToken;
|
||||
static AlfredManager *shared;
|
||||
dispatch_once(&onceToken, ^{
|
||||
shared = [[AlfredManager alloc] init];
|
||||
});
|
||||
return shared;
|
||||
}
|
||||
|
||||
- (void)startListener {
|
||||
if (self.server != nil) {
|
||||
return;
|
||||
}
|
||||
self.server = [[GCDWebServer alloc] init];
|
||||
// Search contancts
|
||||
[self.server addHandlerForMethod:@"GET" path:@"/wechat/search" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerRequest * _Nonnull request) {
|
||||
NSString *keyword = [request.query[@"keyword"] lowercaseString] ? : @"";
|
||||
NSArray<WCContactData *> *contacts = ({
|
||||
MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter];
|
||||
ContactStorage *contactStorage = [serviceCenter getService:objc_getClass("ContactStorage")];
|
||||
GroupStorage *groupStorage = [serviceCenter getService:objc_getClass("GroupStorage")];
|
||||
NSMutableArray<WCContactData *> *array = [NSMutableArray array];
|
||||
[array addObjectsFromArray:[contactStorage GetAllFriendContacts]];
|
||||
[array addObjectsFromArray:[groupStorage GetAllGroups]];
|
||||
array;
|
||||
});
|
||||
NSArray<WCContactData *> *results = ({
|
||||
NSMutableArray<WCContactData *> *results = [NSMutableArray array];
|
||||
for (WCContactData *contact in contacts) {
|
||||
BOOL isFriend = contact.m_uiBrandSubscriptionSettings == 0;
|
||||
BOOL containsNickName = [contact.m_nsNickName.lowercaseString containsString:keyword];
|
||||
BOOL containsUsername = [contact.m_nsUsrName.lowercaseString containsString:keyword];
|
||||
BOOL containsAliasName = [contact.m_nsAliasName.lowercaseString containsString:keyword];
|
||||
BOOL containsRemark = [contact.m_nsRemark.lowercaseString containsString:keyword];
|
||||
BOOL containsNickNamePinyin = [contact.m_nsFullPY.lowercaseString containsString:keyword];
|
||||
BOOL containsRemarkPinyin = [contact.m_nsRemarkPYFull.lowercaseString containsString:keyword];
|
||||
BOOL matchRemarkShortPinyin = [contact.m_nsRemarkPYShort.lowercaseString isEqualToString:keyword];
|
||||
if (isFriend && (containsNickName || containsUsername || containsAliasName || containsRemark || containsNickNamePinyin || containsRemarkPinyin || matchRemarkShortPinyin)) {
|
||||
[results addObject:contact];
|
||||
}
|
||||
}
|
||||
results;
|
||||
});
|
||||
return [GCDWebServerDataResponse responseWithJSONObject:[results yy_modelToJSONObject]];
|
||||
}];
|
||||
// Start chat
|
||||
[self.server addHandlerForMethod:@"GET" path:@"/wechat/start" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerRequest * _Nonnull request) {
|
||||
WCContactData *contact = ({
|
||||
NSString *session = request.query[@"session"];
|
||||
WCContactData *contact = nil;
|
||||
if (session != nil) {
|
||||
MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter];
|
||||
if ([session rangeOfString:@"@chatroom"].location == NSNotFound) {
|
||||
ContactStorage *contactStorage = [serviceCenter getService:objc_getClass("ContactStorage")];
|
||||
contact = [contactStorage GetContact:session];
|
||||
} else {
|
||||
GroupStorage *groupStorage = [serviceCenter getService:objc_getClass("GroupStorage")];
|
||||
contact = [groupStorage GetGroupContact:session];
|
||||
}
|
||||
}
|
||||
contact;
|
||||
});
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[[objc_getClass("WeChat") sharedInstance] startANewChatWithContact:contact];
|
||||
[[objc_getClass("WeChat") sharedInstance] showMainWindow];
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps: YES];
|
||||
});
|
||||
return [GCDWebServerResponse responseWithStatusCode:200];
|
||||
}];
|
||||
[self.server startWithOptions:@{GCDWebServerOption_Port: @(48065),
|
||||
GCDWebServerOption_BindToLocalhost: @(YES)} error:nil];
|
||||
}
|
||||
|
||||
- (void)stopListener {
|
||||
if (self.server == nil) {
|
||||
return;
|
||||
}
|
||||
[self.server stop];
|
||||
[self.server removeAllHandlers];
|
||||
self.server = nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -11,6 +11,7 @@
|
||||
#import "NSBundle+WeChatTweak.h"
|
||||
#import "NSString+WeChatTweak.h"
|
||||
#import "TweakPreferecesController.h"
|
||||
#import "AlfredManager.h"
|
||||
|
||||
@implementation NSObject (WeChatTweak)
|
||||
|
||||
@@ -41,12 +42,11 @@ static void __attribute__((constructor)) tweak(void) {
|
||||
data.msgStatus = 4;
|
||||
data.toUsrName = localMessageData.toUsrName;
|
||||
data.fromUsrName = localMessageData.fromUsrName;
|
||||
data.mesLocalID = localMessageData.mesLocalID;
|
||||
data.msgCreateTime = localMessageData.msgCreateTime;
|
||||
if ([localMessageData isSendFromSelf]) {
|
||||
data.mesLocalID = localMessageData.mesLocalID;
|
||||
data.msgContent = replaceMessage;
|
||||
} else {
|
||||
data.mesLocalID = localMessageData.mesLocalID;
|
||||
data.msgContent = [NSString stringWithFormat:@"[已拦截]\n%@", replaceMessage];
|
||||
}
|
||||
data;
|
||||
@@ -77,7 +77,6 @@ static void __attribute__((constructor)) tweak(void) {
|
||||
[((MessageService *)self) AddLocalMsg:session msgData:promptMessageData];
|
||||
} else {
|
||||
[((MessageService *)self) AddLocalMsg:session msgData:promptMessageData];
|
||||
[((MessageService *)self) notifyAddMsgOnMainThread:session msgData:promptMessageData];
|
||||
}
|
||||
// Deliver notification
|
||||
if (![localMessageData isSendFromSelf]) {
|
||||
@@ -125,6 +124,7 @@ static void __attribute__((constructor)) tweak(void) {
|
||||
[accountService AutoAuth];
|
||||
}
|
||||
}
|
||||
[[AlfredManager sharedInstance] startListener];
|
||||
}
|
||||
|
||||
- (NSApplicationTerminateReply)tweak_applicationShouldTerminate:(NSApplication *)sender {
|
||||
|
||||
@@ -9,6 +9,22 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface WeChat : NSObject
|
||||
|
||||
+ (instancetype)sharedInstance;
|
||||
- (void)lock:(id)block;
|
||||
- (void)showMainWindow;
|
||||
- (void)startANewChatWithContact:(id)contact;
|
||||
|
||||
@end
|
||||
|
||||
@interface MMSearchResultItem : NSObject
|
||||
|
||||
@property(nonatomic) unsigned long long type; // 0 is single chat, 1 is group chat
|
||||
@property(readonly, nonatomic) NSString *identifier;
|
||||
|
||||
@end
|
||||
|
||||
@interface MessageData: NSObject
|
||||
|
||||
@property(nonatomic) unsigned int messageType;
|
||||
@@ -25,7 +41,14 @@
|
||||
|
||||
@interface WCContactData : NSObject
|
||||
|
||||
@property(nonatomic) unsigned int m_uiBrandSubscriptionSettings;
|
||||
@property(retain, nonatomic) NSString *m_nsNickName;
|
||||
@property(retain, nonatomic) NSString *m_nsUsrName;
|
||||
@property(retain, nonatomic) NSString *m_nsAliasName;
|
||||
@property(retain, nonatomic) NSString *m_nsRemark;
|
||||
@property(retain, nonatomic) NSString *m_nsFullPY;
|
||||
@property(retain, nonatomic) NSString *m_nsRemarkPYShort;
|
||||
@property(retain, nonatomic) NSString *m_nsRemarkPYFull;
|
||||
|
||||
- (BOOL)isChatStatusNotifyOpen;
|
||||
|
||||
@@ -33,20 +56,22 @@
|
||||
|
||||
@interface ContactStorage : NSObject
|
||||
|
||||
- (id)GetContact:(id)arg1;
|
||||
- (WCContactData *)GetContact:(NSString *)session;
|
||||
- (NSArray<WCContactData *> *)GetAllFriendContacts;
|
||||
|
||||
@end
|
||||
|
||||
@interface GroupStorage: NSObject
|
||||
|
||||
- (id)GetGroupContact:(id)arg1;
|
||||
- (WCContactData *)GetGroupContact:(NSString *)session;
|
||||
- (NSArray<WCContactData *> *)GetAllGroups;
|
||||
|
||||
@end
|
||||
|
||||
@interface MMServiceCenter : NSObject
|
||||
|
||||
+ (id)defaultCenter;
|
||||
- (id)getService:(Class)arg1;
|
||||
- (id)getService:(Class)name;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user