V1.0.5功能新增及bug修复

[v1.0.5]
what's new
* 新增好友关系检测
* 新增自动收取个人红包
* 修复集赞助手自定义评论时可能会发生闪退的BUG
* 支持7.0.15
* 更新越狱包7.0.15
* 更新已注入助手的7.0.15未签名包
* 更新越狱源安装包
This commit is contained in:
DKJone
2020-09-29 13:39:52 +08:00
parent c1f35fec36
commit 6fe71e584e
21 changed files with 776 additions and 81 deletions
@@ -0,0 +1,25 @@
// DKCleanFriendsController.h
// dkhelperDylib
// Created by DKJone on 2020/9/25
// Copyright © 2020 DKJone. All rights reserved.
//
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
//
#import <UIKit/UIKit.h>
#import "DKHelper.h"
@interface DKCleanFriendsController : UIViewController
- (instancetype)initWithContactList:(NSArray *)contactList contactDesc:(NSString *)contactDesc;
@end
@@ -0,0 +1,182 @@
// DKCleanFriendsController.m
// dkhelperDylib
// Created by DKJone on 2020/9/25
// Copyright © 2020 DKJone. All rights reserved.
//
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
//
#import "DKCleanFriendsController.h"
#import <objc/objc-runtime.h>
#import "MMUICommonUtil.h"
#import "DKHelperSettingController.h"
@interface DKCleanFriendsController()<ContactSelectViewDelegate>{
MMUIViewController *helper;
}
@property (strong, nonatomic) ContactSelectView *selectView;
@property (nonatomic,copy)NSString * contactDesc;
@property (strong, nonatomic) NSArray<CContact *> *contactList;
@end
@implementation DKCleanFriendsController
- (instancetype)initWithContactList:(NSArray *)contactList contactDesc:(NSString *)contactDesc{
if (self = [super initWithNibName:nil bundle:nil]) {
_contactList = contactList;
_contactDesc = contactDesc;
helper = [[objc_getClass("MMUIViewController") alloc] init];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [DKHelper backgroundColor];
[self initTitleArea];
[self initSelectView];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
for (CContact *contact in self.contactList) {
[self.selectView addSelect:contact];
}
for (CContact *contact in DKHelper.shared.validFriends) {
[self.selectView removeSelect:contact];
}
[self onSelectContact: nil];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSString *alertTitle = [NSString stringWithFormat:@"已帮您自动选择(%@)的好友",self.contactDesc];
[DKHelper showAlertWithTitle:alertTitle
message:@"双向好友已自动设为不可编辑,您无法取消双向好友的选中状态,删除时也不会删除双向好友!"
btnTitle:@"我知道了" handler:^(UIButton *sender) {}];
}
- (void)initTitleArea {
self.navigationItem.leftBarButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:@"取消" target:self action:@selector(onCancel:) style:0];
self.navigationItem.rightBarButtonItem = [self rightBarButtonWithSelectCount:self.contactList.count];
self.title = @"选择需要删除的好友";
[self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:18.0]}];
}
- (UIBarButtonItem *)rightBarButtonWithSelectCount:(unsigned long)selectCount {
UIBarButtonItem *barButtonItem;
if (selectCount == 0) {
barButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:@"确定" target:self action:@selector(onDone:) style:1];
} else {
NSString *title = [NSString stringWithFormat:@"删除(%lu)", selectCount];
barButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:title target:self action:@selector(onDone:) style:4];
}
return barButtonItem;
}
- (void)onCancel:(UIBarButtonItem *)item {
[self.navigationController popViewControllerAnimated:true];
}
- (void)onDone:(UIBarButtonItem *)item {
NSArray<NSString *> *contactNameList = [[self.selectView.m_dicMultiSelect allKeys] copy];
NSArray<CContact *> *contactList = [[DKHelper allFriends] _filter:^BOOL(CContact* obj) {
return [contactNameList containsObject: obj.m_nsUsrName];
}];
NSArray<NSString*> *nikNames = [contactList _map:^id(CContact* obj) {
return obj.m_nsRemark.length ? obj.m_nsRemark : obj.m_nsNickName;
}];
WS(weakSelf)
[DKHelper showAlertWithTitle:@"删除以下好友" message:[nikNames componentsJoinedByString:@"\n"] btnTitle:@"确定" handler:^(UIButton *sender) {
[weakSelf deleteFriends:contactList];
} btnTitle:@"我再想想" handler:^(UIButton *sender) {}];
}
-(void)deleteFriends:(NSArray *)contactList {
CContactMgr * contactMgr =[[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
MMNewSessionMgr * sm =[[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("MMNewSessionMgr") class]];
for (CContact *contact in contactList) {
[contactMgr deleteContact:contact listType:2];
[contactMgr deleteContactLocal:contact listType:1];
[contactMgr getContactList:1 contactType:0];
unsigned int idx = [sm getSessionIndexOfUser:contact.m_nsUsrName];
if (idx != (unsigned int)(NSNotFound)){
[sm deleteSessionAtIndex:idx forceDelete:false];
}
NSLog(@"删除成功");
}
NSInteger notFriendCount = DKHelper.shared.notFriends.count;
NSInteger invalidFriendCount = DKHelper.shared.invalidFriends.count;
if (notFriendCount != contactList.count &&
invalidFriendCount != contactList.count &&
notFriendCount + invalidFriendCount != contactList.count){
[self.navigationController popViewControllerAnimated:true];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[DKHelper showAlertWithTitle:@"删除成功" message:@"有些人,\n就算分隔千里,\n就算不再联系,\n就算岁月流逝他们渐渐遗忘在我们记忆深处,\n就算不能陪我们走完人生旅途的那些人,\n他们不是过客。\n他们是\n我们最美好的曾经..." btnTitle:@"说的好!领赏去吧" handler:^(UIButton *sender) {
UIViewController *vc = [DKHelper.navigationContrioller topViewController];
if ([vc isKindOfClass:DKHelperSettingController.class]){
[(DKHelperSettingController *)vc payForMe];
}
} btnTitle:@"跟鬼屎一样,不存在的!" handler:^(UIButton *sender) { }];
});
}else{
[DKHelper showAlertWithTitle:@"删除成功"
message:[NSString stringWithFormat: @"已成功删除%d名好友",contactList.count]
btnTitle:@"确定" handler:^(UIButton *sender) { }];
}
}
- (void)initSelectView {
self.selectView = [[objc_getClass("ContactSelectView") alloc] initWithFrame:[DKHelper viewFrame] delegate:self];
NSMutableArray *dic = @{}.mutableCopy;
for (CContact *contact in DKHelper.shared.validFriends) {
[dic setValue:contact forKey:contact.m_nsUsrName];
}
[self.selectView setM_dicExistContact:dic];
self.selectView.m_uiGroupScene = 14;
self.selectView.m_bMultiSelect = YES;
[self.selectView initData:2];
self.selectView.m_bShowHistoryGroup = false;
self.selectView.m_bShowRadarCreateRoom = false;
[self.selectView initView];
[self.view addSubview:self.selectView];
}
#pragma mark - ContactSelectViewDelegate
- (void)onSelectContact:(CContact *)arg1 {
self.navigationItem.rightBarButtonItem = [self rightBarButtonWithSelectCount:[self getTotalSelectCount]];
}
- (unsigned long)getTotalSelectCount {
return (unsigned long)[self.selectView.m_dicMultiSelect count];
}
- (UIViewController *)getViewController{
return self;
}
// 没法设置父类,设置消息转发已调用相关类方法
- (MMUIViewController *) forwardingTargetForSelector:(SEL)aSelector {
if ([helper respondsToSelector:aSelector]) {
return helper;
}
return nil;
}
@end
@@ -10,7 +10,7 @@
NS_ASSUME_NONNULL_BEGIN
@interface DKHelperSettingController : UIViewController
- (void)payForMe;
@end
NS_ASSUME_NONNULL_END
@@ -10,10 +10,12 @@
#import <objc/objc-runtime.h>
#import "DKHelper.h"
#import "DKGroupFilterController.h"
#import "DKCleanFriendsController.h"
#import <NotificationCenter/NotificationCenter.h>
@interface DKHelperSettingController ()<MultiSelectGroupsViewControllerDelegate>{
WCTableViewManager * manager;
MMUIViewController *helper;
MMLoadingView *m_MMLoadingView;
}
@end
@@ -24,8 +26,27 @@
if (self = [super init]) {
helper = [[objc_getClass("MMUIViewController") alloc] init];
}
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(checkFriendsEnd:) name:@"checkFriendsEnd" object:nil];
m_MMLoadingView = [[NSClassFromString(@"MMLoadingView") alloc] init];
return self;
}
- (void)dealloc
{
[NSNotificationCenter.defaultCenter removeObserver:self];
}
- (void)checkFriendsEnd:(NSNotification *)notify{
Boolean isSuccess = notify.userInfo[@"success"];
if (isSuccess){
[m_MMLoadingView stopLoadingAndShowOK];
[self reloadTableData];
CGPoint bottomOffset = CGPointMake(0, manager.tableView.contentSize.height - manager.tableView.bounds.size.height + manager.tableView.contentInset.bottom);
[manager.tableView setContentOffset:bottomOffset animated:YES];
}else{
[m_MMLoadingView stopLoadingAndShowError:@"检测失败"];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
@@ -35,6 +56,8 @@
[manager addTableViewToSuperView:self.view];
manager.tableView.frame = tableFrame;
self.view.backgroundColor = [DKHelper backgroundColor];
[m_MMLoadingView setLabelText:@"正在检测..."];
[self.view addSubview:m_MMLoadingView];
[self reloadTableData];
self.navigationItem.leftBarButtonItem = [DKHelper leftNavigationItem];
@@ -66,6 +89,8 @@
//后台抢红包
WCTableViewCellManager *redEnvelopBackGroundCell = [DKHelper switchCellWithSel:@selector(autoEnveloBackGround:) target:self title:@"锁屏及后台抢红包" switchOn:[DKHelperConfig redEnvelopBackGround]];
[redEnvelopSection addCell:redEnvelopBackGroundCell];
WCTableViewCellManager *personalRedEnvelopEnableCell = [DKHelper switchCellWithSel:@selector(personalRedEnvelopEnableChange:) target:self title:@"接收个人红包" switchOn:[DKHelperConfig personalRedEnvelopEnable]];
[redEnvelopSection addCell:personalRedEnvelopEnableCell];
//延迟抢红包
NSString *delay = @"不延迟";
if ([DKHelperConfig redEnvelopDelay] > 0){
@@ -153,9 +178,37 @@
[commentsCell addUserInfoValue:@2 forKey:@"type"];
}
//MARK: 好友检测
WCTableViewSectionManager *clearFriendsSection = [DKHelper sectionManage];
clearFriendsSection.headerTitle = @"好友关系检测";
[manager addSection:clearFriendsSection];
DKHelperConfig.cleanFriendsEnable = DKHelper.shared.validFriends.count + DKHelper.shared.notFriends.count > 0;
WCTableViewCellManager *cleanFriendCell = [DKHelper switchCellWithSel:@selector(cleanFriends:) target:self title:@"检测好友关系" switchOn:[DKHelperConfig cleanFriendsEnable]];
[clearFriendsSection addCell:cleanFriendCell];
if (DKHelperConfig.cleanFriendsEnable){
NSString * notFriendCount = [NSString stringWithFormat:@"共%lu人",(unsigned long)DKHelper.shared.notFriends.count];
WCTableViewNormalCellManager *notFriendCountCell = [DKHelper cellWithSel:@selector(showSelectContactVC:) target:self title:@"已将你删除" rightValue:notFriendCount accessoryType:1];
[notFriendCountCell addUserInfoValue:@0 forKey:@"type"];
[clearFriendsSection addCell:notFriendCountCell];
NSString * invalidFriendsCount = [NSString stringWithFormat:@"共%lu人",(unsigned long)DKHelper.shared.invalidFriends.count];
WCTableViewNormalCellManager *invalidFriendsCell = [DKHelper cellWithSel:@selector(showSelectContactVC:) target:self title:@"账号被封禁" rightValue:invalidFriendsCount accessoryType:1];
[invalidFriendsCell addUserInfoValue:@1 forKey:@"type"];
[clearFriendsSection addCell:invalidFriendsCell];
}
[manager.tableView reloadData];
}
- (void)showSelectContactVC:(WCTableViewNormalCellManager *)sender{
NSNumber * type = [sender getUserInfoValueForKey:@"type"];
//1:被封账号 , 0:已将你删除
NSArray *contactList = [type isEqual:@1] ? DKHelper.shared.invalidFriends : DKHelper.shared.notFriends;
NSString *contactDesc = [type isEqual:@1] ? @"账号被封" :@"已将你删除";
DKCleanFriendsController *vc = [[DKCleanFriendsController alloc] initWithContactList:contactList contactDesc:contactDesc];
[self.navigationController pushViewController:vc animated:true ];
}
- (void)likeCommentEnable:(UISwitch *)sender{
@@ -168,6 +221,7 @@
handler:^(UIButton *sender) { }];
}
[self reloadTableData];
}
@@ -176,6 +230,27 @@
[self reloadTableData];
}
- (void)personalRedEnvelopEnableChange:(UISwitch *)sender{
DKHelperConfig.personalRedEnvelopEnable = sender.isOn;
[self reloadTableData];
}
- (void)cleanFriends:(UISwitch *)sender{
if (!sender.isOn){
DKHelperConfig.cleanFriendsEnable = false;
return;
}
__block UISwitch *s = sender;
WS(weakSelf)
[DKHelper showAlertWithTitle:@"重要提示" message:@"好友关系检测会新建一个包含您所有好友的群组,检测完成后会帮您自动删除,正常情况下您的好友不会收到任何消息。部分好友可能会收到进群邀请!(会自动帮您撤回该邀请信息)如果你想排除某些好友不做检测,请先将其添加到黑名单,待检测完成再将其从黑名单的移除!" btnTitle:@"开始检测" handler:^(UIButton *sender) {
DKHelperConfig.cleanFriendsEnable = true;
[weakSelf createCheckGroupe];
} btnTitle:@"取消" handler:^(UIButton *sender) {
s.on = false;
}];
}
- (void)revokeIntercept:(UISwitch *)sender{
DKHelperConfig.preventRevoke = sender.isOn;
}
@@ -202,7 +277,7 @@
- (void)showLikeCommentInput:(WCTableViewNormalCellManager *)sender{
NSNumber * type = [sender getUserInfoValueForKey:@"type"];
NSString * str = @[[NSString stringWithFormat:@"%d",DKHelperConfig.likeCount.intValue],
[NSString stringWithFormat:@"%d",DKHelperConfig.comments.intValue],
[NSString stringWithFormat:@"%d",DKHelperConfig.commentCount.intValue],
[NSString stringWithFormat:@"%@",DKHelperConfig.comments]][type.intValue];
NSString * title = @[@"输入点赞数",@"输入评论数",@"输入评论"][type.intValue];
NSString * msg = @[@"实际点赞数最大为您的好友个数",
@@ -351,4 +426,37 @@
}
return nil;
}
- (void)createCheckGroupe{
[m_MMLoadingView startLoading];
BOOL canCreateGroup = [objc_getClass("CGroupMgr") isSupportOpenIMGroup];
if (!canCreateGroup) {
[DKHelper showAlertWithTitle:@"检测失败" message:@"您当前无法创建群聊!" btnTitle:@"确定" handler:^(UIButton *sender) {
NSLog(@"检测失败 - 无法创建群聊");
}];
}else{
CGroupMgr *groupMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CGroupMgr") class]];
DKHelper.shared.checkFriendsEnd = false;
NSMutableArray<GroupMember *> * groupMembers = @[].mutableCopy;
[DKHelper.allFriends enumerateObjectsUsingBlock:^(CContact *obj, NSUInteger idx, BOOL *stop) {
if ([obj.m_nsUsrName containsString:@"@openim"] ){
}else{
GroupMember *gm = [[objc_getClass("GroupMember") alloc] init];
gm.m_nsMemberName = obj.m_nsUsrName;
[groupMembers addObject:gm];
}
}];
[DKHelper.shared setCheckNotify];
[groupMgr CreateGroup:@"DKWechatHelper-friendsCheck" withMemberList:groupMembers];
// 设置超时时间,超过10秒,不在检测
dispatch_after(dispatch_time(DISPATCH_TIME_NOW , 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (!DKHelper.shared.checkFriendsEnd) {
[DKHelper endCheck];
}
});
}
}
@end
File diff suppressed because one or more lines are too long
+60 -9
View File
@@ -1,3 +1,14 @@
// Created by 朱德坤 on 2019/1/22.
// Copyright © 2019 DKJone. All rights reserved.
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
// 更新微信版本删除dkhelper/info.plist 重新运行版本号就会更新
#import <UIKit/UIKit.h>
#import "DKHelper.h"
#import "DKHelperSettingController.h"
@@ -131,6 +142,18 @@
switch(wrap.m_uiMessageType) {
case 49: { // AppNode
CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
BOOL (^isSender)() = ^BOOL() {
return [wrap.m_nsFromUsr isEqualToString:selfContact.m_nsUsrName];
};
if (!DKHelper.shared.checkFriendsEnd && isSender()){
[self RevokeMsg:wrap.m_nsToUsr MsgWrap:wrap Counter:0];
NSMutableArray *validArr = DKHelper.shared.validFriends.mutableCopy;
[validArr addObject:[contactManager getContactByName:wrap.m_nsToUsr]];
DKHelper.shared.validFriends = validArr.copy;
}
/** 是否为红包消息 */
BOOL (^isRedEnvelopMessage)() = ^BOOL() {
@@ -138,13 +161,6 @@
};
if (isRedEnvelopMessage()) { // 红包
CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
BOOL (^isSender)() = ^BOOL() {
return [wrap.m_nsFromUsr isEqualToString:selfContact.m_nsUsrName];
};
/** 是否别人在群聊中发消息 */
BOOL (^isGroupReceiver)() = ^BOOL() {
return [wrap.m_nsFromUsr rangeOfString:@"@chatroom"].location != NSNotFound;
@@ -186,8 +202,9 @@
if (!DKHelperConfig.autoRedEnvelop) { return NO; }
if (isGroupInBlackList()) { return NO; }
if (isContaintKeyWords()) { return NO; }
return isGroupReceiver() || (isGroupSender() && isReceiveSelfRedEnvelop());
return isGroupReceiver() ||
(isGroupSender() && isReceiveSelfRedEnvelop()) ||
(!isGroupReceiver() && DKHelperConfig.personalRedEnvelopEnable);
};
NSDictionary *(^parseNativeUrl)(NSString *nativeUrl) = ^(NSString *nativeUrl) {
@@ -385,5 +402,39 @@
}
%end
%hook CGroupMgr
// 需要验证
- (void)addChatMemberNeedVerifyMsg:(id)arg1 ContactList:(id)arg2{
%orig(arg1,arg2);
if (!DKHelper.shared.checkFriendsEnd){
DKHelper.shared.groupContact = arg1;
DKHelper.shared.notFriends = [arg2 allValues];
dispatch_group_leave(DKHelper.shared.checkFriendGroup);
}
}
- (void)addCreateMsg:(id)arg1 ContactList:(id)arg2{
%orig(arg1,arg2);
if (!DKHelper.shared.checkFriendsEnd){
DKHelper.shared.groupContact = arg1;
NSMutableArray *validArr = DKHelper.shared.validFriends.mutableCopy;
[validArr addObjectsFromArray:arg2];
DKHelper.shared.validFriends = validArr.copy;
dispatch_group_leave(DKHelper.shared.checkFriendGroup);
}
}
%end
%hook CContact
- (BOOL)isEqual:(CContact *)other
{
return [other.m_nsUsrName isEqual: self.m_nsUsrName];
}
%end
+24
View File
@@ -15,11 +15,16 @@
#import "WCUIAlertView.h"
#import "DKHelperConfig.h"
#import <UIKit/UIKit.h>
#import "NSArray+Utils.h"
//MARK: - quick objc finds
#define FUiUtil objc_getClass("UiUtil")
#define FMMUICommonUtil objc_getClass("MMUICommonUtil")
#define FWCTableViewCellManager objc_getClass("WCTableViewNormalCellManager")
#define WK(object) autoreleasepool{} __weak typeof(object) weak##object = object
#define ST(object) autoreleasepool{} __strong typeof(object) object = weak##object
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;
typedef void(^BtnBlock)(UIButton *sender);
@@ -27,6 +32,25 @@ typedef void(^BtnBlock)(UIButton *sender);
@interface DKHelper : NSObject
/// 好友关系是否检测完毕
@property (nonatomic,assign)BOOL checkFriendsEnd;
/// 已将你删除的好友
@property (nonatomic,copy)NSArray<CContact *> *notFriends;
/// 账号被封的好友
@property (nonatomic,copy)NSArray<CContact *> *invalidFriends;
/// 相互好友
@property (nonatomic,copy)NSArray<CContact *> *validFriends;
/// 检测好友状态的群组
@property (nonatomic,strong)CContact *groupContact;
@property (nonatomic,strong)dispatch_group_t checkFriendGroup;
/// 结束好友检测
+ (void)endCheck;
- (void)setCheckNotify;
+ (instancetype)shared ;
/// 所有好友(不包含公众号)
+ (NSArray<CContact*> *)allFriends;
+59 -1
View File
@@ -21,11 +21,69 @@
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
helper = [[DKHelper alloc] init];
helper.checkFriendsEnd = true;
});
return helper;
}
- (void)setCheckNotify{
self.checkFriendGroup = dispatch_group_create();
DKHelper.shared.invalidFriends = @[];
DKHelper.shared.validFriends = @[];
DKHelper.shared.notFriends = @[];
dispatch_group_enter(DKHelper.shared.checkFriendGroup);
dispatch_group_enter(DKHelper.shared.checkFriendGroup);
dispatch_group_notify(self.checkFriendGroup, dispatch_get_main_queue(), ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[DKHelper endCheck];
});
});
}
+ (void)endCheck{
DKHelper.shared.checkFriendsEnd = true;
CContactMgr *contactMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
if (DKHelper.shared.validFriends.count + DKHelper.shared.notFriends.count > 0) {
///检测完成了
DKHelper.shared.notFriends = [DKHelper.shared.notFriends _filter:^BOOL(id obj) {
return ![[[contactMgr getSelfContact] m_nsUsrName] isEqualToString:((CContact*)obj).m_nsUsrName];
}];
NSArray<CContact*> *invalidFriends = DKHelper.allFriends.copy;
NSMutableArray *addSelf = DKHelper.shared.validFriends.mutableCopy;
[addSelf addObject:[contactMgr getSelfContact]];
DKHelper.shared.validFriends = addSelf;
invalidFriends = [invalidFriends _filter:^BOOL(id obj) {
return ![DKHelper.shared.notFriends _contains:^BOOL(id obj2) {
return [((CContact*)obj).m_nsUsrName isEqualToString: ((CContact*)obj2).m_nsUsrName];
}];
}];
invalidFriends = [invalidFriends _filter:^BOOL(id obj) {
return ![DKHelper.shared.validFriends _contains:^BOOL(id obj2) {
return [((CContact*)obj).m_nsUsrName isEqualToString: ((CContact*)obj2).m_nsUsrName];
}];
}];
DKHelper.shared.invalidFriends = invalidFriends;
[NSNotificationCenter.defaultCenter postNotificationName:@"checkFriendsEnd" object:nil userInfo:@{@"success":@YES}];
}else{
/// 检测超时结束
DKHelper.shared.invalidFriends = @[];
DKHelper.shared.validFriends = @[];
DKHelper.shared.notFriends = @[];
[NSNotificationCenter.defaultCenter postNotificationName:@"checkFriendsEnd" object:nil userInfo:@{@"success":@NO}];
}
// 删除群聊
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
MMNewSessionMgr * sm =[[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("MMNewSessionMgr") class]];
unsigned int idx = [sm getSessionIndexOfUser:DKHelper.shared.groupContact.m_nsUsrName];
if (idx != (unsigned int)(NSNotFound)){
[sm deleteSessionAtIndex:idx forceDelete:false];
}
});
}
+ (UINavigationController *)navigationContrioller{
return ((UINavigationController *)([objc_getClass("CAppViewControllerManager") getCurrentNavigationController]));
}
@@ -59,7 +117,7 @@
CContactMgr *contactMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
NSArray* contacts = [contactMgr getContactList:1 contactType:0];
for(CContact* contact in contacts){
if (!contact.isBrandContact && contact.m_uiSex != 0) {
if (!contact.isBrandContact && contact.m_uiSex != 0 && ![contact.m_nsUsrName containsString:@"@openim"]) {
[friends addObject:contact];
}
}
@@ -2,8 +2,15 @@
// DKHelperConfig.h
// testHookDylib
//
// Created by 朱德坤 on 2019/1/22.
// Copyright © 2019 DKJone. All rights reserved.
// Created by 朱德坤 on 2019/1/22.
// Copyright © 2019 DKJone. All rights reserved.
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
#import <Foundation/Foundation.h>
@@ -88,6 +95,13 @@ NS_ASSUME_NONNULL_BEGIN
+(void)setComments:(NSString *)value;
/// 抢个人红包
+(BOOL)personalRedEnvelopEnable;
+(void)setPersonalRedEnvelopEnable:(BOOL)value;
/// 清理好友
+(BOOL)cleanFriendsEnable;
+(void)setCleanFriendsEnable:(BOOL)value;
@end
@@ -52,8 +52,8 @@ NSString* cmdString(SEL sel){
[NSUserDefaults.standardUserDefaults synchronize];
free(value);
}else{
// 存储对象
NSObject *value ;
// 存储对象 使用NSObject* 定义value导致崩溃,默认强引用参数但未retain,方法结束后release,参数被提前回收导致坏内存访问
id __unsafe_unretained value = nil;
[anInvocation getArgument:&value atIndex:2];
[NSUserDefaults.standardUserDefaults setValue:value forKey: cmdString(anInvocation.selector)];
[NSUserDefaults.standardUserDefaults synchronize];
@@ -0,0 +1,27 @@
// NSArray+Utils.h
// dkhelperDylib
// Created by DKJone on 2020/9/27
// Copyright © 2020 DKJone. All rights reserved.
//
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
//
#import <Foundation/Foundation.h>
@interface NSArray (Utils)
- (NSArray *)_map:(id(^)(id))hanlde ;
- (NSArray *)_filter:(BOOL(^)(id obj))handle ;
- (BOOL)_contains:(BOOL(^)(id obj))handle;
@end
@@ -0,0 +1,53 @@
// NSArray+Utils.m
// dkhelperDylib
// Created by DKJone on 2020/9/27
// Copyright © 2020 DKJone. All rights reserved.
//
//
// ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗
// ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝
// ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗
// ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝
// ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗
// ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
//
//
#import "NSArray+Utils.h"
@implementation NSArray (Utils)
- (NSArray *)_map:(id(^)(id))hanlde {
if (!hanlde || !self) return self;
NSMutableArray *arr = NSMutableArray.array;
for (id obj in self) {
id new = hanlde(obj);
[arr addObject:new];
}
return arr.copy;
}
- (NSArray *)_filter:(BOOL(^)(id))handle {
if (!handle || !self) return self;
NSMutableArray *arr = NSMutableArray.array;
for (id obj in self) {
if (handle(obj)) {
[arr addObject:obj];
}
}
return arr.copy;
}
- (BOOL)_contains:(BOOL(^)(id))handle {
if (!handle || !self) return self;
for (id obj in self) {
if (handle(obj)) {
return true;
}
}
return false;
}
@end
@@ -37,7 +37,7 @@
+ (id)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 accessoryType:(long long)arg4;
+ (id)switchCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 on:(BOOL)arg4;
+ (id)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 rightValue:(id)arg4 accessoryType:(long long)arg5;
+ (id)editorCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 margin:(double)arg4 tip:(id)arg5 focus:(_Bool)arg6 text:(id)arg7;
+ (id)editorCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 margin:(double)arg4 tip:(id)arg5 focus:(BOOL)arg6 text:(id)arg7;
+ (id)normalCellForTitle:(id)arg1 rightValue:(id)arg2;
+ (id)urlCellForTitle:(id)arg1 url:(id)arg2;
@property(nonatomic) long long editStyle; // @synthesize editStyle=_editStyle;
@@ -57,7 +57,7 @@
+ (id)loadingCell;
+ (id)ActivityIndicatorCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3;
+ (id)detailDisclosureButtonCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3;
+ (id)switchCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 on:(_Bool)arg4;
+ (id)switchCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 on:(BOOL)arg4;
@end
@@ -161,26 +161,28 @@
@interface MMWebViewController: UIViewController
- (id)initWithURL:(id)arg1 presentModal:(_Bool)arg2 extraInfo:(id)arg3;
- (id)initWithURL:(id)arg1 presentModal:(BOOL)arg2 extraInfo:(id)arg3;
@end
@interface UINavigationController (LogicController)
- (void)PushViewController:(id)arg1 animated:(_Bool)arg2;
- (void)PushViewController:(id)arg1 animated:(BOOL)arg2;
@end
@interface ContactSelectView : UIView
@property(nonatomic) unsigned int m_uiGroupScene; // @synthesize m_uiGroupScene;
@property(nonatomic) _Bool m_bMultiSelect; // @synthesize m_bMultiSelect;
@property(nonatomic) _Bool m_bShowHistoryGroup;
@property(nonatomic) _Bool m_bShowRadarCreateRoom;
@property(nonatomic) BOOL m_bMultiSelect; // @synthesize m_bMultiSelect;
@property(nonatomic) BOOL m_bShowHistoryGroup;
@property(nonatomic) BOOL m_bShowRadarCreateRoom;
@property(retain, nonatomic) NSMutableDictionary *m_dicMultiSelect; // @synthesize m_dicMultiSelect;
- (id)initWithFrame:(struct CGRect)arg1 delegate:(id)arg2;
- (void)initData:(unsigned int)arg1;
- (void)initView;
- (void)addSelect:(id)arg1;
- (void)removeSelect:(id)arg1;
- (void)setM_dicExistContact:(id)arg1;
@end
@interface MMUINavigationController : UINavigationController
@@ -218,6 +220,7 @@
@property (nonatomic, copy) NSString *m_nsNickName; // 用户昵称
@property (nonatomic, copy) NSString *m_nsUsrName; // 微信id
@property (nonatomic, copy) NSString *m_nsMemberName;
@property (nonatomic, copy) NSString *m_nsRemark;
@property(retain, nonatomic) NSString *m_nsHeadImgUrl;
@property(nonatomic) unsigned int m_uiSex;
@@ -236,10 +239,12 @@
- (id)getSelfContact;
- (id)getContactByName:(id)arg1;
- (id)getContactForSearchByName:(id)arg1;
- (_Bool)getContactsFromServer:(id)arg1;
- (_Bool)isInContactList:(id)arg1;
- (_Bool)addLocalContact:(id)arg1 listType:(unsigned int)arg2;
- (BOOL)getContactsFromServer:(id)arg1;
- (BOOL)isInContactList:(id)arg1;
- (BOOL)addLocalContact:(id)arg1 listType:(unsigned int)arg2;
- (NSArray *)getContactList:(unsigned int)arg1 contactType:(unsigned int)arg2;
- (BOOL)deleteContactLocal:(id)arg1 listType:(unsigned int)arg2;
- (BOOL)deleteContact:(id)arg1 listType:(unsigned int)arg2;
@end
@protocol ContactSelectViewDelegate <NSObject>
@@ -266,7 +271,7 @@
@end
@interface ScanQRCodeLogicParams
- (id)initWithCodeType:(int)arg1 fromScene:(unsigned int)arg2 enterScene:(unsigned long long)arg3 bNeedCameraScan:(_Bool)arg4 bShowMyQRCodeBtn:(_Bool)arg5 wrapper:(id)arg6;
- (id)initWithCodeType:(int)arg1 fromScene:(unsigned int)arg2 enterScene:(unsigned long long)arg3 bNeedCameraScan:(BOOL)arg4 bShowMyQRCodeBtn:(BOOL)arg5 wrapper:(id)arg6;
- (id)initWithCodeType:(int)arg1 fromScene:(unsigned int)arg2;
@end
@@ -306,12 +311,13 @@
- (id)GetMsg:(id)arg1 n64SvrID:(long long)arg2;
- (void)onRevokeMsg:(id)msg;
- (void)AddMsg:(id)arg1 MsgWrap:(id)arg2;
- (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2 fixTime:(_Bool)arg3 NewMsgArriveNotify:(_Bool)arg4;
- (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2 fixTime:(BOOL)arg3 NewMsgArriveNotify:(BOOL)arg4;
- (void)AsyncOnSpecialSession:(id)arg1 MsgList:(id)arg2;
- (id)GetHelloUsers:(id)arg1 Limit:(unsigned int)arg2 OnlyUnread:(BOOL)arg3;
- (void)AddEmoticonMsg:(NSString *)msg MsgWrap:(CMessageWrap *)msgWrap;
- (void)DelMsg:(id)arg1 MsgWrap:(id)arg2;
- (void)ResendMsg:(id)arg1 MsgWrap:(id)arg2;
- (_Bool)RevokeMsg:(id)arg1 MsgWrap:(id)arg2 Counter:(unsigned int)arg3;
@end
@@ -335,6 +341,8 @@
@interface MMNewSessionMgr : NSObject
- (unsigned int)GenSendMsgTime;
- (void)deleteSessionAtIndex:(unsigned int)arg1 forceDelete:(_Bool)arg2;
- (unsigned int)getSessionIndexOfUser:(id)arg1;
@end
@interface WCBizUtil : NSObject
@@ -424,7 +432,32 @@
- (void)retryRequetScanResult:(ScanCodeHistoryItem *)arg1 viewController:(id)arg2;
@end
@interface CGroupMgr :NSObject
+ (BOOL)isSupportOpenIMGroup;
- (BOOL)CreateGroup:(id)arg1 withMemberList:(id)arg2;
@end
/// 群组成员
@interface GroupMember : NSObject
@property(retain, nonatomic) NSString *m_nsMemberName;
- (id)init;
@end
@interface MMLoadingView : UIView
- (void)ShowTipView:(id)arg1 Title:(id)arg2 Delay:(double)arg3;
- (void)stopLoadingAndShowOK;
- (void)stopLoadingAndShowError:(id)arg1 withDelay:(double)arg2;
- (void)stopLoadingAndShowError:(id)arg1;
- (void)stopLoadingAndShowOK:(id)arg1 withDelay:(double)arg2;
- (void)stopLoadingAndShowOK:(id)arg1;
- (void)StopLoadingTimerFired:(id)arg1;
- (void)stopLoading;
- (void)startLoadingButAnimatingAfterDelay:(double)arg1;
- (void)startLoading;
- (void)setLabelText:(id)arg1;
- (void)ShowTipView:(id)arg1 Title:(id)arg2 Delay:(double)arg3;
@end
#endif /* WechatHeaders_h */