diff --git a/tweak/AlienBlue.h b/tweak/AlienBlue.h index 00c1ef5..bf9c101 100644 --- a/tweak/AlienBlue.h +++ b/tweak/AlienBlue.h @@ -29,7 +29,7 @@ @end @interface CommentsViewController --(void) respondToStyleChange; +- (void)respondToStyleChange; @end @interface CommentPostHeaderNode @@ -47,15 +47,15 @@ @property(assign, nonatomic) BOOL isPostHeader; @property(strong, nonatomic) id delegate; @property(strong, nonatomic) id node; --(void) addButton:(id) arg1; +- (void)addButton:(id)arg1; @end /* -- Other Interfaces -- */ @interface MarkupEngine -+(id) markDownHTML:(id) arg1 forSubreddit:(id) arg2; ++ (id)markDownHTML:(id)arg1 forSubreddit:(id)arg2; @end @interface Resources -+(BOOL) isNight; ++ (BOOL)isNight; @end diff --git a/tweak/AlienBlue.xm b/tweak/AlienBlue.xm index df2348e..943842e 100644 --- a/tweak/AlienBlue.xm +++ b/tweak/AlienBlue.xm @@ -3,6 +3,7 @@ #import "assets/TFHelper.h" #import "assets/MMMarkdown/MMMarkdown.h" +static BOOL isEnabled; static BOOL isAlienBlueEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -11,99 +12,99 @@ static CGFloat pushshiftRequestTimeoutValue; %hook CommentOptionsDrawerView --(id) initWithNode:(id) arg1 { +- (id)initWithNode:(id)arg1 { id orig = %orig; - + NSString *body; - + if ([self isPostHeader]) { body = [[arg1 post] selftext]; } else { body = [[(CommentNode *)arg1 comment] body]; - } - + } + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:body isDeletedOnly:isTFDeletedOnly]){ - + CGSize refSize = [[self buttons][0] frame].size; UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; [undeleteButton setFrame:CGRectMake(0, 0, refSize.width, refSize.height)]; - + if ([self isPostHeader]){ [undeleteButton addTarget:self action:@selector(didTapPostUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; } else { [undeleteButton addTarget:self action:@selector(didTapCommentUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; } - + if ([%c(Resources) isNight]) { [undeleteButton setImage:[UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"] forState:UIControlStateNormal]; } else { [undeleteButton setImage:[UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160light.png"] forState:UIControlStateNormal]; } - + undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit; undeleteButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10); - + [self addButton:undeleteButton]; } - + return orig; } -%new --(void) didTapCommentUndeleteButton:(id) sender { - +%new +- (void)didTapCommentUndeleteButton:(id)sender { + [sender setEnabled:NO]; - + id comment = [[self node] comment]; - + [%c(TFHelper) getUndeleteDataWithID:[comment ident] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } -%new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +%new +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + id comment = [[self node] comment]; - + NSString *body = data[@"body"]; - + NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]; - + [comment setAuthor:data[@"author"]]; [comment setBody:body]; [comment setBodyHTML:bodyHTML]; - + [[self delegate] respondToStyleChange]; - + [data[@"sender"] setEnabled:YES]; } -%new --(void) didTapPostUndeleteButton:(id) sender { - +%new +- (void)didTapPostUndeleteButton:(id)sender { + [sender setEnabled:NO]; - + id post = [[self node] post]; - + [%c(TFHelper) getUndeleteDataWithID:[post ident] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + id post = [[self node] post]; id postComment = [[self node] comment]; //Don't know why he used a comment to store info about a post, but it exists - + NSString *body = data[@"body"]; - + NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]; - + [post setAuthor:data[@"author"]]; [post setSelftext:body]; [postComment setBodyHTML:bodyHTML]; - + [[self delegate] respondToStyleChange]; - + [data[@"sender"] setEnabled:YES]; } @@ -114,32 +115,18 @@ static CGFloat pushshiftRequestTimeoutValue; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isAlienBlueEnabled"] != nil){ - isAlienBlueEnabled = [[prefs objectForKey:@"isAlienBlueEnabled"] boolValue]; - } else { - isAlienBlueEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil){ - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isAlienBlueEnabled = [prefs objectForKey:@"isAlienBlueEnabled"] ? [[prefs objectForKey:@"isAlienBlueEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isAlienBlueEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -149,14 +136,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName isEqualToString:@"AlienBlue"]){ - if (isAlienBlueEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if ([processName isEqualToString:@"AlienBlue"]){ + if (isAlienBlueEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(AlienBlue); } } diff --git a/tweak/Antenna.h b/tweak/Antenna.h index c65ce82..3709d93 100644 --- a/tweak/Antenna.h +++ b/tweak/Antenna.h @@ -18,24 +18,24 @@ @interface RCCommentCell : NSObject @property(strong, nonatomic) id comment; --(void) updateWithModelObject:(id) arg1; +- (void)updateWithModelObject:(id)arg1; @end @interface RCPostCommentsController @property(strong, nonatomic) id postCommentsCollector; @property(strong, nonatomic) id delegate; @property(strong, nonatomic) NSMutableDictionary *commentHeightCache; --(void) controllerWillChangeContent:(id) arg1; --(void) controllerDidChangeContent:(id) arg1; --(void) controller:(id) arg1 didChange:(id) arg2 at:(id) arg3 for:(long long) arg4 newIndexPath:(id) arg5; +- (void)controllerWillChangeContent:(id)arg1; +- (void)controllerDidChangeContent:(id)arg1; +- (void)controller:(id)arg1 didChange:(id)arg2 at:(id)arg3 for:(long long)arg4 newIndexPath:(id)arg5; //custom elements --(void)handleUndeleteCommentAction; +- (void)handleUndeleteCommentAction; @end @interface AHKActionSheet @property(strong, nonatomic) NSMutableArray *items; --(void) addButtonWithTitle:(id) arg1 image:(id) arg2 type:(long long) arg3 handler:(id) arg4; +- (void)addButtonWithTitle:(id)arg1 image:(id)arg2 type:(long long)arg3 handler:(id)arg4; @end @interface AHKActionSheetItem @@ -49,7 +49,7 @@ @property(strong, nonatomic) NSNumber *isSelf; @property(strong, nonatomic) NSString *itemId; @property(strong, nonatomic) id selfCommentText; --(BOOL) isSelfPost; +- (BOOL)isSelfPost; @end @interface RCPostActionsSectionHeader : UIView @@ -73,8 +73,8 @@ @interface RCPostHeaderCellController : NSObject @property(strong, nonatomic) id post; @property(strong, nonatomic) UITableView *tableView; --(void) loadView; +- (void)loadView; //custom elements --(void) handleUndeletePostAction:(id) arg1; +- (void)handleUndeletePostAction:(id)arg1; @end diff --git a/tweak/Antenna.xm b/tweak/Antenna.xm index 08c1f1a..93c2f2d 100644 --- a/tweak/Antenna.xm +++ b/tweak/Antenna.xm @@ -3,6 +3,7 @@ #import "assets/TFHelper.h" #import "assets/MMMarkdown/MMMarkdown.h" +static BOOL isEnabled; static BOOL isAntennaEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -22,7 +23,7 @@ id tfAntennaCommentCell; %hook RCCommentSwift --(BOOL) isCommentDeleted{ +- (BOOL)isCommentDeleted{ return NO; } @@ -31,44 +32,44 @@ id tfAntennaCommentCell; %hook RCPostCommentsController --(void) didLongPressCell:(id) arg1 gesture:(id) arg2 { - +- (void)didLongPressCell:(id)arg1 gesture:(id)arg2 { + NSString *commentBody = [[[arg1 comment] commentText] body]; - + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ tfAntennaController = self; tfAntennaCommentCell = arg1; shouldHaveAntennaUndeleteAction = YES; } - + %orig; - + shouldHaveAntennaUndeleteAction = NO; } %new --(void) handleUndeleteCommentAction{ - +- (void)handleUndeleteCommentAction{ + [%c(TFHelper) getUndeleteDataWithID:[[tfAntennaCommentCell comment] itemId] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + id comment = [tfAntennaCommentCell comment]; id commentText = [comment commentText]; - + NSString *body = data[@"body"]; - + [comment setAuthor:data[@"author"]]; [commentText setBody:body]; [commentText setBodyHTML:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]]; - + [commentText setBodyAttributedString:nil]; [commentText setBodyAttributedStringForPreview:nil]; [commentText setTextHeightCache:nil]; [self setCommentHeightCache:nil]; - + [tfAntennaCommentCell updateWithModelObject:comment]; [[[self delegate] tableView] reloadData]; } @@ -76,25 +77,25 @@ id tfAntennaCommentCell; %end -%hook AHKActionSheet +%hook AHKActionSheet + +- (void)show { + + if (shouldHaveAntennaUndeleteAction) { --(void)show{ - - if (shouldHaveAntennaUndeleteAction){ - UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; - + AHKActionSheetItem *actionItem = [self items][0]; CGSize actionItemImageSize = [[actionItem image] size]; CGSize newUndeleteImageSize = CGSizeMake(actionItemImageSize.width * 2, actionItemImageSize.height * 2); - + UIGraphicsBeginImageContext(newUndeleteImageSize); [undeleteImage drawInRect:CGRectMake(0, 0, newUndeleteImageSize.width, newUndeleteImageSize.height)]; - undeleteImage = UIGraphicsGetImageFromCurrentImageContext(); + undeleteImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); - + undeleteImage = [[UIImage alloc] initWithCGImage:[undeleteImage CGImage] scale:2 orientation:UIImageOrientationUp]; - + [self addButtonWithTitle:@"TF did that say?" image:undeleteImage type:0 handler:^{[tfAntennaController handleUndeleteCommentAction];}]; } @@ -107,43 +108,43 @@ id tfAntennaCommentCell; %hook RCPostActionsSectionHeader %property(strong, nonatomic) UIButton *undeleteButton; --(void) layoutSubviews{ - +- (void)layoutSubviews { + BOOL isAbleToUndeletePost = NO; - + id post = [[self delegate] postInternal]; NSString *postBody = [[post selfCommentText] body]; - + if ([post isSelfPost]){ if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ isAbleToUndeletePost = YES; - + NSMutableArray *barButtons = [self defaultHeaderButtons]; - + if ([barButtons count] <= 5){ UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; - + [barButtons addObject:tempView]; } - + %orig; - + if (![self undeleteButton]){ UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; [undeleteButton addTarget:[[self delegate] headerCellController] action:@selector(handleUndeletePostAction:) forControlEvents:UIControlEventTouchUpInside]; - + [undeleteButton setImage:[[UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit; undeleteButton.tintColor = [barButtons[4] defaultColor]; - + [self addSubview:undeleteButton]; [self setUndeleteButton:undeleteButton]; } - + [[self undeleteButton] setFrame:[barButtons[[barButtons count] - 1] frame]]; } } - + if (!isAbleToUndeletePost){ %orig; } @@ -155,32 +156,32 @@ id tfAntennaCommentCell; %hook RCPostHeaderCellController %new --(void) handleUndeletePostAction:(id) sender{ - +- (void)handleUndeletePostAction:(id)sender { + [sender setEnabled:NO]; - + [%c(TFHelper) getUndeleteDataWithID:[[self post] itemId] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + id post = [self post]; id postText = [post selfCommentText]; - + NSString *body = data[@"body"]; - + [post setAuthor:data[@"author"]]; [postText setBody:body]; [postText setBodyHTML:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]]; - + [postText setBodyAttributedString:nil]; [postText setBodyAttributedStringForPreview:nil]; [postText setTextHeightCache:nil]; - + [self loadView]; [[self tableView] reloadData]; - + [data[@"sender"] setEnabled:YES]; } @@ -191,32 +192,18 @@ id tfAntennaCommentCell; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isAntennaEnabled"] != nil){ - isAntennaEnabled = [[prefs objectForKey:@"isAntennaEnabled"] boolValue]; - } else { - isAntennaEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil){ - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isAntennaEnabled = [prefs objectForKey:@"isAntennaEnabled"] ? [[prefs objectForKey:@"isAntennaEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isAntennaEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -226,14 +213,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor{ loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; if ([processName isEqualToString:@"amrc"]){ - if (isAntennaEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if (isAntennaEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(Antenna, RCCommentSwift = objc_getClass("amrc.RCCommentSwift"), RCPostSwift = objc_getClass("amrc.RCPostSwift"), RCCommentTextSwift = objc_getClass("amrc.RCCommentTextSwift")); } } diff --git a/tweak/Apollo.h b/tweak/Apollo.h index 161ed73..155073d 100644 --- a/tweak/Apollo.h +++ b/tweak/Apollo.h @@ -17,14 +17,14 @@ @interface CommentCellNode @property(assign,nonatomic)id view; --(BOOL) isSelected; --(void) _layoutSublayouts; --(void) didLoad; --(void) calculatedLayoutDidChange; +- (BOOL)isSelected; +- (void)_layoutSublayouts; +- (void)didLoad; +- (void)calculatedLayoutDidChange; //custom elements @property(strong,nonatomic) UIButton *undeleteButton; --(void) undeleteCellWasSelected; +- (void)undeleteCellWasSelected; @end /* -- Post Interfaces -- */ @@ -33,7 +33,7 @@ @property(assign,nonatomic) NSString *selfText; @property(assign,nonatomic) NSString *author; @property(assign,nonatomic) NSString *fullName; --(BOOL) isSelfPost; +- (BOOL)isSelfPost; //custom elements @property(strong, nonatomic) NSString *undeleteAuthor; @@ -43,7 +43,7 @@ @property(assign,nonatomic) NSString *selfText; @property(assign,nonatomic) NSString *author; @property(assign,nonatomic) NSString *fullName; --(BOOL) isSelfPost; +- (BOOL)isSelfPost; //custom elements @property(strong, nonatomic) NSString *undeleteAuthor; @@ -58,18 +58,18 @@ //custom elements @property(strong, nonatomic) id headerCellNode; --(void) undeleteCellWasSelected; +- (void)undeleteCellWasSelected; @end /* -- Other Interfaces -- */ @interface MarkdownRenderer -+(id) attributedStringFromMarkdown:(id) arg1 withAttributes:(id) arg2; ++ (id)attributedStringFromMarkdown:(id)arg1 withAttributes:(id)arg2; @end @interface ActionController --(id) tableView:(id) arg1 cellForRowAtIndexPath:(NSIndexPath *)arg2; --(NSInteger) tableView:(id) arg1 numberOfRowsInSection:(NSInteger) arg2; +- (id)tableView:(id)arg1 cellForRowAtIndexPath:(NSIndexPath *)arg2; +- (NSInteger)tableView:(id)arg1 numberOfRowsInSection:(NSInteger)arg2; @end @interface UIImage (ios13) @@ -88,7 +88,7 @@ @property(assign,nonatomic)id image; @property(assign,nonatomic) CGRect frame; @property(assign,nonatomic) id view; --(CGRect)_frameInWindow; +- (CGRect)_frameInWindow; @end @interface ASTextNode @@ -99,6 +99,6 @@ @interface ApolloButtonNode @property(assign,nonatomic) ASTextNode *titleNode; --(void) setAttributedTitle:(id) arg1 forState:(NSInteger) arg2; --(id) attributedTitleForState:(NSInteger) arg1; +- (void) setAttributedTitle:(id)arg1 forState:(NSInteger)arg2; +- (id) attributedTitleForState:(NSInteger)arg1; @end diff --git a/tweak/Apollo.xm b/tweak/Apollo.xm index 19c8f2f..930d141 100644 --- a/tweak/Apollo.xm +++ b/tweak/Apollo.xm @@ -2,8 +2,9 @@ #import "Apollo.h" #import "assets/TFHelper.h" -static BOOL isTFDeletedOnly; +static BOOL isEnabled; static BOOL isApolloEnabled; +static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; static BOOL shouldApolloHaveButton; @@ -69,10 +70,10 @@ id apolloCommentController; %hook MarkdownRenderer -+(id) attributedStringFromHTML:(id)arg1 attributes:(id) arg2 compact:(BOOL) arg3{ ++ (id)attributedStringFromHTML:(id)arg1 attributes:(id)arg2 compact:(BOOL)arg3 { apolloBodyAttributes = [arg2 copy]; - + return %orig; } @@ -81,72 +82,80 @@ id apolloCommentController; %hook ActionController --(id) tableView:(id) arg1 cellForRowAtIndexPath:(NSIndexPath *) arg2{ - - if (shouldAddUndeleteCell){ +- (id) tableView:(id)arg1 cellForRowAtIndexPath:(NSIndexPath *)arg2 { + + if (shouldAddUndeleteCell) { if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){ - + id undeleteCell = [arg1 dequeueReusableCellWithIdentifier:@"IconActionCell" forIndexPath:arg2]; id prevCell = [arg1 dequeueReusableCellWithIdentifier:@"IconActionCell"]; - + UIImageView *prevCellImageView = MSHookIvar(prevCell, "iconImageView"); CGSize prevImageSize = [[prevCellImageView image] size]; - - UIImage *undeleteImage; - - if (@available(iOS 13.0, *)){ - + + UIImage *undeleteImage; + + //if (@available(iOS 13.0, *)){ + if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"13.0")) { + undeleteImage = [UIImage systemImageNamed:@"eye"]; - + if (!undeleteImage){ undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; + } else { + CGSize squareSize = CGSizeMake(undeleteImage.size.width, undeleteImage.size.width); + + UIGraphicsBeginImageContextWithOptions(squareSize, NO, 0); + [undeleteImage drawInRect:CGRectMake(0, (squareSize.height - undeleteImage.size.height) / 2, squareSize.width, undeleteImage.size.height)]; + undeleteImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); } } else { undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; } - + CGFloat undeleteImageSizeValue = prevImageSize.width > prevImageSize.height ? prevImageSize.width : prevImageSize.height; - - if (undeleteImageSizeValue == 0){ + + if (undeleteImageSizeValue == 0) { undeleteImageSizeValue = 25; } - + UIGraphicsBeginImageContextWithOptions(CGSizeMake(undeleteImageSizeValue, undeleteImageSizeValue), NO, 0); [undeleteImage drawInRect:CGRectMake(0, 0, undeleteImageSizeValue, undeleteImageSizeValue)]; undeleteImage = [UIGraphicsGetImageFromCurrentImageContext() imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIGraphicsEndImageContext(); - + UILabel *undeleteLabel = MSHookIvar(undeleteCell, "actionTitleLabel"); UIImageView *undeleteImageView = MSHookIvar(undeleteCell, "iconImageView"); - + undeleteLabel.text = @"TF Did That Say?"; undeleteImageView.image = undeleteImage; - + return undeleteCell; } } - - return %orig; + + return %orig; } --(void) tableView:(id) arg1 didSelectRowAtIndexPath:(NSIndexPath *)arg2{ - - if (shouldAddUndeleteCell){ +- (void)tableView:(id)arg1 didSelectRowAtIndexPath:(NSIndexPath *)arg2 { + + if (shouldAddUndeleteCell) { if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){ - if (apolloCommentCell){ + if (apolloCommentCell) { [apolloCommentCell undeleteCellWasSelected]; } else { [apolloCommentController undeleteCellWasSelected]; } } - } - + } + %orig; } --(NSInteger) tableView:(id) arg1 numberOfRowsInSection:(NSInteger) arg2{ - +- (NSInteger) tableView:(id)arg1 numberOfRowsInSection:(NSInteger)arg2 { + if (shouldAddUndeleteCell){ return %orig + 1; } else { @@ -154,10 +163,10 @@ id apolloCommentController; } } --(id) animationControllerForDismissedController:(id) arg1{ - +- (id) animationControllerForDismissedController:(id)arg1 { + shouldAddUndeleteCell = NO; - + return %orig; } @@ -167,53 +176,53 @@ id apolloCommentController; %hook CommentCellNode %property(strong,nonatomic) UIButton *undeleteButton; --(void) moreOptionsTappedWithSender:(id) arg1{ - - if (!shouldApolloHaveButton){ - - NSString *commentBody = [MSHookIvar(self, "comment") body]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ - shouldAddUndeleteCell = YES; - apolloCommentCell = self; - apolloCommentController = nil; - } - } - - %orig; -} +- (void)moreOptionsTappedWithSender:(id)arg1 { --(void) longPressedWithGestureRecognizer:(id) arg1{ - if (!shouldApolloHaveButton){ - + NSString *commentBody = [MSHookIvar(self, "comment") body]; - + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ shouldAddUndeleteCell = YES; apolloCommentCell = self; apolloCommentController = nil; } } - + %orig; } --(void) didLoad { - %orig; - - if (shouldApolloHaveButton){ - +- (void)longPressedWithGestureRecognizer:(id)arg1 { + + if (!shouldApolloHaveButton){ + NSString *commentBody = [MSHookIvar(self, "comment") body]; - + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ - + shouldAddUndeleteCell = YES; + apolloCommentCell = self; + apolloCommentController = nil; + } + } + + %orig; +} + +- (void)didLoad { + %orig; + + if (shouldApolloHaveButton){ + + NSString *commentBody = [MSHookIvar(self, "comment") body]; + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ + CGFloat imageSize = 20.0f; UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; [undeleteButton addTarget:self action:@selector(didTapUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; undeleteButton.frame = CGRectMake(0, 0, imageSize, imageSize); - + UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; [undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; @@ -223,12 +232,12 @@ id apolloCommentController; } } --(void) _layoutSublayouts{ +- (void)_layoutSublayouts { %orig; - + if (shouldApolloHaveButton){ if ([self undeleteButton]){ - + CGFloat imageSize = 20.0f; id moreNode = MSHookIvar(self, "moreOptionsNode"); @@ -244,43 +253,43 @@ id apolloCommentController; } %new --(void) didTapUndeleteButton:(id) sender{ - +- (void)didTapUndeleteButton:(id)sender { + [sender setEnabled:NO]; id comment = MSHookIvar(self, "comment"); - + [%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) undeleteCellWasSelected{ +- (void)undeleteCellWasSelected { RKComment *comment = MSHookIvar(self, "comment"); - + [%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + RKComment *comment = MSHookIvar(self, "comment"); id bodyNode = MSHookIvar(self, "bodyNode"); id authorNode = MSHookIvar(self, "authorNode"); - + NSString *author = data[@"author"]; NSString *body = data[@"body"]; - + [comment setAuthor:author]; [comment setBody:body]; - + NSAttributedString *prevAuthorAttributedString = [authorNode attributedTitleForState:UIControlStateNormal]; NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])]; NSAttributedString *newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes]; [authorNode setAttributedTitle:newAuthorAttributedString forState:UIControlStateNormal]; [bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; - + if ([data objectForKey:@"sender"]) { [data[@"sender"] setEnabled:YES]; } @@ -290,13 +299,13 @@ id apolloCommentController; %hook CommentsViewController -%property(strong, nonatomic) id headerCellNode; +%property(strong, nonatomic) id headerCellNode; + +- (void)moreOptionsBarButtonItemTappedWithSender:(id)arg1 { --(void) moreOptionsBarButtonItemTappedWithSender:(id) arg1{ - RKLink *post = MSHookIvar(self, "link"); NSString *postBody = [post selfText]; - + if ([post isSelfPost]){ if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ shouldAddUndeleteCell = YES; @@ -304,35 +313,35 @@ id apolloCommentController; apolloCommentController = self; } } - + %orig; } %new --(void) undeleteCellWasSelected{ - +- (void)undeleteCellWasSelected { + RKLink *post = MSHookIvar(self, "link"); - + [%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + RKLink *post = MSHookIvar(self, "link"); - + id headerCellNode = [self headerCellNode]; id bodyNode = MSHookIvar(headerCellNode, "bodyNode"); id postInfoNode = MSHookIvar(headerCellNode, "postInfoNode"); id authorNode = MSHookIvar(postInfoNode, "authorButtonNode"); - + NSString *author = data[@"author"]; NSString *authorTextString = [NSString stringWithFormat:@"by %@", author]; NSString *body = data[@"body"]; - + [post setUndeleteAuthor:author]; [post setSelfText:body]; - + NSAttributedString *prevAuthorAttributedString = [authorNode attributedTitleForState:UIControlStateNormal]; NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])]; NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:authorTextString attributes:authorStringAttributes]; @@ -346,31 +355,31 @@ id apolloCommentController; %hook CommentsHeaderCellNode --(void) didLoad{ +- (void)didLoad { %orig; - + [[self closestViewController] setHeaderCellNode:self]; } --(void) _layoutSublayouts{ +- (void)_layoutSublayouts { %orig; - + [[self closestViewController] setHeaderCellNode:self]; } --(void) longPressedWithGestureRecognizer:(id) arg1{ - +- (void)longPressedWithGestureRecognizer:(id)arg1 { + RKLink *post = MSHookIvar(self, "link"); NSString *postBody = [post selfText]; - - if ([post isSelfPost]){ + + if ([post isSelfPost]) { if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ shouldAddUndeleteCell = YES; apolloCommentCell = nil; apolloCommentController = self; } } - + %orig; } @@ -381,39 +390,20 @@ id apolloCommentController; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - - if (prefs){ - - if ([prefs objectForKey:@"isApolloEnabled"] != nil) { - isApolloEnabled = [[prefs objectForKey:@"isApolloEnabled"] boolValue]; - } else { - isApolloEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil) { - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - - if ([prefs objectForKey:@"shouldApolloHaveButton"] != nil){ - shouldApolloHaveButton = [[prefs objectForKey:@"shouldApolloHaveButton"] boolValue]; - } else { - shouldApolloHaveButton = NO; - } + if (prefs){ + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isApolloEnabled = [prefs objectForKey:@"isApolloEnabled"] ? [[prefs objectForKey:@"isApolloEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; + shouldApolloHaveButton = [prefs objectForKey:@"shouldApolloHaveButton"] ? [[prefs objectForKey:@"shouldApolloHaveButton"] boolValue] : NO; } else { + isEnabled = YES; isApolloEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; shouldApolloHaveButton = NO; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -423,14 +413,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - + if ([processName isEqualToString:@"Apollo"]){ - if (isApolloEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if (isApolloEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(Apollo, CommentsHeaderCellNode = objc_getClass("Apollo.CommentsHeaderCellNode"), CommentCellNode = objc_getClass("Apollo.CommentCellNode"), ApolloButtonNode = objc_getClass("Apollo.ApolloButtonNode"), ActionController = objc_getClass("Apollo.ActionController"), IconActionTableViewCell = objc_getClass("Apollo.IconActionTableViewCell"), CommentsViewController = objc_getClass("Apollo.CommentsViewController")); } } diff --git a/tweak/BaconReader.h b/tweak/BaconReader.h index d30a3db..90deb58 100644 --- a/tweak/BaconReader.h +++ b/tweak/BaconReader.h @@ -1,7 +1,7 @@ /* -- Votable Interfaces -- */ -@interface BRVotable +@interface BRVotable @property(strong, nonatomic) NSString *serverID; @property(strong, nonatomic) NSAttributedString *attributedDescriptionString; @property(assign, nonatomic) CGSize cellSize; @@ -39,7 +39,7 @@ @interface StoryDetailView @property(strong, nonatomic) UITableView *tableView; --(void) refreshTouched; +- (void)refreshTouched; @end @interface StoryDetailViewController @@ -47,13 +47,13 @@ @property(strong, nonatomic) id detailPage; //custom elements --(void) handleUndeleteCommentAction; --(void) handleUndeletePostAction; +- (void)handleUndeleteCommentAction; +- (void)handleUndeletePostAction; @end /* -- Other Interfaces -- */ @interface BRUtils -+(id) attributedDescriptionForComment:(id) arg1; -+(id) createAttributedStringFromHTML:(id) arg1 options:(id) arg2; ++ (id)attributedDescriptionForComment:(id)arg1; ++ (id)createAttributedStringFromHTML:(id)arg1 options:(id)arg2; @end diff --git a/tweak/BaconReader.xm b/tweak/BaconReader.xm index 04d4f07..e396877 100644 --- a/tweak/BaconReader.xm +++ b/tweak/BaconReader.xm @@ -3,6 +3,7 @@ #import "assets/TFHelper.h" #import "assets/MMMarkdown/MMMarkdown.h" +static BOOL isEnabled; static BOOL isBaconReaderEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -28,19 +29,19 @@ id tfStoryController; %hook BRComment --(BOOL) contains_htmlValue{ - return YES; -} - --(BOOL) primitiveContains_htmlValue{ +- (BOOL)contains_htmlValue { return YES; } --(BOOL) is_deletedValue{ +- (BOOL)primitiveContains_htmlValue { + return YES; +} + +- (BOOL)is_deletedValue { return NO; } --(BOOL) primitiveIs_deletedValue{ +- (BOOL)primitiveIs_deletedValue { return NO; } @@ -49,16 +50,16 @@ id tfStoryController; %hook BRStory -+(id) storyWithDictionary:(id) arg1 inContext:(id) arg2 { ++ (id)storyWithDictionary:(id)arg1 inContext:(id)arg2 { id orig = %orig; - - if (tfPostSelftext){ + + if (tfPostSelftext) { [orig setSelftext_html:tfPostSelftext]; [orig setAuthor:tfPostAuthor]; tfPostSelftext = nil; tfPostAuthor = nil; } - + return orig; } @@ -67,21 +68,21 @@ id tfStoryController; %hook UIViewController --(void) presentViewController:(id) arg1 animated:(BOOL) arg2 completion:(id) arg3 { - - if ([arg1 isKindOfClass:[UIAlertController class]] && shouldHaveBRUndeleteAction){ - +- (void)presentViewController:(id)arg1 animated:(BOOL)arg2 completion:(id)arg3 { + + if ([arg1 isKindOfClass:[UIAlertController class]] && shouldHaveBRUndeleteAction) { + UIAlertAction *undeleteAction; - - if (tfCommentCellView){ + + if (tfCommentCellView) { undeleteAction = [UIAlertAction actionWithTitle:@"TF Did That Say?" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){[tfStoryController handleUndeleteCommentAction];}]; } else { undeleteAction = [UIAlertAction actionWithTitle:@"TF Did That Say?" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){[tfStoryController handleUndeletePostAction];}]; } - + [arg1 addAction:undeleteAction]; } - + %orig; } @@ -90,76 +91,76 @@ id tfStoryController; %hook StoryDetailViewController --(void) showMoreCommentActions:(id) arg1 showAll:(BOOL) arg2 { - +- (void)showMoreCommentActions:(id)arg1 showAll:(BOOL)arg2 { + NSString *commentBody = [[arg1 comment] body]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]) { shouldHaveBRUndeleteAction = YES; tfCommentCellView = arg1; tfStoryController = self; tfPostSelftext = nil; } - + %orig; - + shouldHaveBRUndeleteAction = NO; } --(void) menuTouchedWithSender:(id) arg1 { - - if ([[self story] is_selfValue]){ +- (void)menuTouchedWithSender:(id)arg1 { + + if ([[self story] is_selfValue]) { NSString *postBody = [[self story] selftext]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { shouldHaveBRUndeleteAction = YES; tfCommentCellView = nil; tfStoryController = self; tfPostSelftext = nil; } } - + %orig; - + shouldHaveBRUndeleteAction = NO; } %new --(void) handleUndeleteCommentAction{ - +- (void)handleUndeleteCommentAction { + [%c(TFHelper) getUndeleteDataWithID:[[tfCommentCellView comment] serverID] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + id comment = [tfCommentCellView comment]; - + NSString *body = data[@"body"]; - + [comment setAuthor:data[@"author"]]; [comment setBody:body]; [comment setBody_html:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]]; [comment setAttributedDescriptionString:nil]; - + NSAttributedString *commentAttrString = [%c(BRUtils) attributedDescriptionForComment:comment]; [comment setAttributedDescriptionString:commentAttrString]; - + [[[self detailPage] tableView] reloadData]; } %new --(void) handleUndeletePostAction{ - +- (void)handleUndeletePostAction { + [%c(TFHelper) getUndeleteDataWithID:[[self story] serverID] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + tfPostAuthor = data[@"author"]; tfPostSelftext = [%c(MMMarkdown) HTMLStringWithMarkdown:data[@"body"] extensions:MMMarkdownExtensionsGitHubFlavored error:nil]; - + [[self detailPage] refreshTouched]; } @@ -170,32 +171,18 @@ id tfStoryController; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isBaconReaderEnabled"] != nil){ - isBaconReaderEnabled = [[prefs objectForKey:@"isBaconReaderEnabled"] boolValue]; - } else { - isBaconReaderEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil) { - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isBaconReaderEnabled = [prefs objectForKey:@"isBaconReaderEnabled"] ? [[prefs objectForKey:@"isBaconReaderEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isBaconReaderEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -205,15 +192,15 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName isEqualToString:@"BaconReader"]){ - if (isBaconReaderEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if ([processName isEqualToString:@"BaconReader"]){ + if (isBaconReaderEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(BaconReader, StoryDetailView = objc_getClass("BaconReader.StoryDetailView"), StoryDetailViewController = objc_getClass("BaconReader.StoryDetailViewController"), CommentCellView = objc_getClass("BaconReader.CommentCellView"), CommentCell = objc_getClass("BaconReader.CommentCell")); } } -} \ No newline at end of file +} diff --git a/tweak/Beam.h b/tweak/Beam.h index dd9551b..f0b5631 100644 --- a/tweak/Beam.h +++ b/tweak/Beam.h @@ -14,7 +14,7 @@ @property(strong, nonatomic) id authorButton; @property(assign, nonatomic) BOOL isCollapsed; @property(assign, nonatomic) BOOL commentDidChange; --(void) reloadContents; +- (void)reloadContents; //custom elements @property(strong, nonatomic) UIButton *undeleteButton; @@ -48,7 +48,7 @@ @end @interface PostSelfTextPartCell --(id) _viewControllerForAncestor; +- (id)_viewControllerForAncestor; @end @interface PostMetadataView diff --git a/tweak/Beam.xm b/tweak/Beam.xm index ac29be5..6521643 100644 --- a/tweak/Beam.xm +++ b/tweak/Beam.xm @@ -2,6 +2,7 @@ #import "Beam.h" #import "assets/TFHelper.h" +static BOOL isEnabled; static BOOL isBeamEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -11,34 +12,34 @@ static CGFloat pushshiftRequestTimeoutValue; %hook CommentCell %property(strong, nonatomic) UIButton *undeleteButton; --(void) layoutSubviews{ +- (void)layoutSubviews { %orig; - + UIButton *undeleteButton = [self undeleteButton]; - - if (undeleteButton){ - if ([self isCollapsed]){ + + if (undeleteButton) { + if ([self isCollapsed]) { [undeleteButton setHidden:YES]; } else { [undeleteButton setHidden:NO]; } } else { - + NSString *commentBody = [[self comment] content]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ - + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]) { + CGFloat authorTextHeight = [[self authorButton] frame].size.height; - + undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; [undeleteButton addTarget:self action:@selector(handleUndeleteCommentAction:) forControlEvents:UIControlEventTouchUpInside]; - + [undeleteButton setImage:[UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"] forState:UIControlStateNormal]; undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit; undeleteButton.imageEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5); - + undeleteButton.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - authorTextHeight - 5, 5, authorTextHeight, authorTextHeight); - + [[self commentContentView] addSubview:undeleteButton]; [self setUndeleteButton:undeleteButton]; } @@ -46,26 +47,26 @@ static CGFloat pushshiftRequestTimeoutValue; } %new --(void) handleUndeleteCommentAction:(id) sender{ - +- (void)handleUndeleteCommentAction:(id)sender { + [sender setEnabled:NO]; - + [%c(TFHelper) getUndeleteDataWithID:[[self comment] identifier] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + id comment = [self comment]; - + [comment setAuthor:data[@"author"]]; [comment setContent:data[@"body"]]; [comment setMarkdownString:nil]; - + [self setCommentDidChange:YES]; [self reloadContents]; [[MSHookIvar(self, "delegate") tableView] reloadData]; - + [data[@"sender"] setEnabled:YES]; } @@ -74,13 +75,13 @@ static CGFloat pushshiftRequestTimeoutValue; %hook PostSelfTextPartCell --(void) setSelected:(BOOL) arg1 animated:(BOOL) arg2{ +- (void)setSelected:(BOOL)arg1 animated:(BOOL)arg2{ %orig; - + id postViewController = [self _viewControllerForAncestor]; - - if ([postViewController isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]){ - + + if ([postViewController isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]) { + [postViewController setSelfTextView:self]; [postViewController setPost:[self post]]; } @@ -91,12 +92,12 @@ static CGFloat pushshiftRequestTimeoutValue; %hook PostMetadataView --(void) layoutSubviews{ +- (void)layoutSubviews { %orig; - + id postViewController = MSHookIvar(self, "delegate"); - - if ([postViewController isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]){ + + if ([postViewController isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]) { [postViewController setMetadataView:self]; } } @@ -107,28 +108,28 @@ static CGFloat pushshiftRequestTimeoutValue; %hook PostToolbarView %property(strong, nonatomic) UIButton *undeleteButton; --(void) layoutSubviews{ +- (void)layoutSubviews { %orig; - - if (![self undeleteButton] && [[[self post] isSelfText] boolValue] && [MSHookIvar(self, "delegate") isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]){ - + + if (![self undeleteButton] && [[[self post] isSelfText] boolValue] && [MSHookIvar(self, "delegate") isMemberOfClass:objc_getClass("beam.PostDetailEmbeddedViewController")]) { + NSString *postBody = [[self post] content]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ - + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { + id moreButton = MSHookIvar(self, "moreButton"); - + CGFloat buttonHeight = [moreButton frame].size.height; - + UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; [undeleteButton addTarget:MSHookIvar(self, "delegate") action:@selector(handleUndeletePostAction:) forControlEvents:UIControlEventTouchUpInside]; - + [undeleteButton setImage:[UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"] forState:UIControlStateNormal]; undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit; undeleteButton.imageEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5); - + undeleteButton.frame = CGRectMake([moreButton frame].origin.x - buttonHeight, 1, buttonHeight, buttonHeight); - + [self addSubview:undeleteButton]; [self setUndeleteButton:undeleteButton]; } @@ -143,37 +144,37 @@ static CGFloat pushshiftRequestTimeoutValue; %property(strong, nonatomic) id post; %new --(void) handleUndeletePostAction:(id) sender{ - +- (void)handleUndeletePostAction:(id)sender { + [sender setEnabled:NO]; - + id post = [self post]; - + if (post){ - + [%c(TFHelper) getUndeleteDataWithID:[post identifier] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + id post = [self post]; - + [post setAuthor:data[@"author"]]; [post setContent:data[@"body"]]; [post setMarkdownString:nil]; - - if ([self selfTextView]){ + + if ([self selfTextView]) { [[self selfTextView] reloadContents]; } - - if ([self metadataView]){ + + if ([self metadataView]) { [[self metadataView] setPost:post]; } - + [[self tableView] reloadData]; - + [data[@"sender"] setEnabled:YES]; } @@ -184,32 +185,18 @@ static CGFloat pushshiftRequestTimeoutValue; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isBeamEnabled"] != nil){ - isBeamEnabled = [[prefs objectForKey:@"isBeamEnabled"] boolValue]; - } else { - isBeamEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil) { - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isBeamEnabled = [prefs objectForKey:@"isBeamEnabled"] ? [[prefs objectForKey:@"isBeamEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isBeamEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -219,14 +206,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor{ loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName isEqualToString:@"beam"]){ - if (isBeamEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if ([processName isEqualToString:@"beam"]){ + if (isBeamEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(Beam, CommentCell = objc_getClass("beam.CommentCell"), PostDetailEmbeddedViewController = objc_getClass("beam.PostDetailEmbeddedViewController"), PostToolbarView = objc_getClass("beam.PostToolbarView"), PostSelfTextPartCell = objc_getClass("beam.PostSelfTextPartCell"), PostMetadataView = objc_getClass("beam.PostMetadataView")); } } diff --git a/tweak/Narwhal.h b/tweak/Narwhal.h index 6dbe6d3..58f1b11 100644 --- a/tweak/Narwhal.h +++ b/tweak/Narwhal.h @@ -7,13 +7,13 @@ @property(assign,nonatomic) NSString* body; @property(assign,nonatomic) NSString* fullName; --(BOOL) isSaved; +- (BOOL)isSaved; @end @interface NRTCommentsManager @property(assign,nonatomic) NSMutableArray* comments; --(void) updateComment:(id) arg1 fromEdited:(id) arg2; +- (void)updateComment:(id)arg1 fromEdited:(id)arg2; @end /* -- Post Interfaces -- */ @@ -24,14 +24,14 @@ @property(assign,nonatomic) NSString* fullName; @end -@interface NRTLinkTitleCell --(void) configureCellForLink:(id) arg1; +@interface NRTLinkTitleCell +- (void)configureCellForLink:(id)arg1; @end @interface NRTLinkTextCell @property(assign,nonatomic) id bodyLabel; --(void) configureCellForText:(id) arg1 links:(id) arg2; +- (void)configureCellForText:(id)arg1 links:(id)arg2; @end /* -- Other Interfaces -- */ @@ -39,11 +39,11 @@ @interface NRTAuthManager @property(assign,nonatomic) NSString* currentUsername; -+(id) sharedManager; ++ (id)sharedManager; @end @interface NRTMarkdownManager -+(id) attributedStringFromMarkdown:(id) arg1 type:(id) arg2; ++ (id)attributedStringFromMarkdown:(id)arg1 type:(id)arg2; @end @interface NRTAttributedLabel @@ -62,70 +62,58 @@ @property(assign,nonatomic) id linkText; @property(assign,nonatomic) id tableView; --(void) _handleActionSheetCopyCommentText:(id) arg1; --(void) _handleActionSheetDeleteComment:(id) arg1; --(void) _handleActionSheetDeletePost; --(void) _handleActionSheetEditComment:(id) arg1; --(void) _handleActionSheetEditPost; --(void) _handleActionSheetOpenChrome; --(void) _handleActionSheetOpenSafari; --(void) _handleActionSheetPrivateMessage:(id) arg1; --(void) _handleActionSheetRefreshComments; --(void) _handleActionSheetRefreshPost; --(void) _handleActionSheetReportComment:(id) arg1; --(void) _handleActionSheetReportPost; --(void) _handleActionSheetSaveComment:(id) arg1 index:(NSUInteger) arg2; --(void) _handleActionSheetShareComment:(id) arg1; --(void) _handleActionSheetShareLink; --(void) _handleActionSheetSharePost; --(void) _handleActionSheetSortComments; --(void) _handleActionSheetUnsaveComment:(id) arg1 index:(NSUInteger) arg2; --(void) _handleActionSheetViewParent:(id) arg1; --(void) _handleActionSheetViewProfile:(id) arg1; +- (void)_handleActionSheetCopyCommentText:(id)arg1; +- (void)_handleActionSheetDeleteComment:(id)arg1; +- (void)_handleActionSheetDeletePost; +- (void)_handleActionSheetEditComment:(id)arg1; +- (void)_handleActionSheetEditPost; +- (void)_handleActionSheetOpenChrome; +- (void)_handleActionSheetOpenSafari; +- (void)_handleActionSheetPrivateMessage:(id)arg1; +- (void)_handleActionSheetRefreshComments; +- (void)_handleActionSheetRefreshPost; +- (void)_handleActionSheetReportComment:(id)arg1; +- (void)_handleActionSheetReportPost; +- (void)_handleActionSheetSaveComment:(id)arg1 index:(NSUInteger)arg2; +- (void)_handleActionSheetShareComment:(id)arg1; +- (void)_handleActionSheetShareLink; +- (void)_handleActionSheetSharePost; +- (void)_handleActionSheetSortComments; +- (void)_handleActionSheetUnsaveComment:(id)arg1 index:(NSUInteger)arg2; +- (void)_handleActionSheetViewParent:(id)arg1; +- (void)_handleActionSheetViewProfile:(id)arg1; //custom elements --(void) handleUndeleteAction:(id) arg1; --(void) handleUndeletePostAction; --(void) mainThreadTest:(id) arg1; +- (void) handleUndeleteAction:(id)arg1; +- (void) handleUndeletePostAction; +- (void) mainThreadTest:(id)arg1; @end @interface NRTMediaTableViewDataSource @property(assign,nonatomic) id commentsManager; @property(assign,nonatomic) id parentController; --(void) _handleActionSheetCopyCommentText:(id) arg1; --(void) _handleActionSheetDeleteComment:(id) arg1; --(void) _handleActionSheetDeletePost; --(void) _handleActionSheetEditComment:(id) arg1; --(void) _handleActionSheetEditPost; --(void) _handleActionSheetOpenChrome; --(void) _handleActionSheetOpenSafari; --(void) _handleActionSheetPrivateMessage:(id) arg1; --(void) _handleActionSheetRefreshComments; --(void) _handleActionSheetRefreshPost; --(void) _handleActionSheetReportComment:(id) arg1; --(void) _handleActionSheetReportPost; --(void) _handleActionSheetSaveComment:(id) arg1 index:(NSUInteger) arg2; --(void) _handleActionSheetShareComment:(id) arg1; --(void) _handleActionSheetShareLink; --(void) _handleActionSheetSharePost; --(void) _handleActionSheetSortComments; --(void) _handleActionSheetUnsaveComment:(id) arg1 index:(NSUInteger) arg2; --(void) _handleActionSheetViewParent:(id) arg1; --(void) _handleActionSheetViewProfile:(id) arg1; +- (void)_handleActionSheetCopyCommentText:(id)arg1; +- (void)_handleActionSheetDeleteComment:(id)arg1; +- (void)_handleActionSheetDeletePost; +- (void)_handleActionSheetEditComment:(id)arg1; +- (void)_handleActionSheetEditPost; +- (void)_handleActionSheetOpenChrome; +- (void)_handleActionSheetOpenSafari; +- (void)_handleActionSheetPrivateMessage:(id)arg1; +- (void)_handleActionSheetRefreshComments; +- (void)_handleActionSheetRefreshPost; +- (void)_handleActionSheetReportComment:(id)arg1; +- (void)_handleActionSheetReportPost; +- (void)_handleActionSheetSaveComment:(id)arg1 index:(NSUInteger)arg2; +- (void)_handleActionSheetShareComment:(id)arg1; +- (void)_handleActionSheetShareLink; +- (void)_handleActionSheetSharePost; +- (void)_handleActionSheetSortComments; +- (void)_handleActionSheetUnsaveComment:(id)arg1 index:(NSUInteger)arg2; +- (void)_handleActionSheetViewParent:(id)arg1; +- (void)_handleActionSheetViewProfile:(id)arg1; //custom elements --(void) handleUndeleteCommentAction:(id) comment; +- (void)handleUndeleteCommentAction:(id)comment; @end - - - - - - - - - - - - diff --git a/tweak/Narwhal.xm b/tweak/Narwhal.xm index 8277db6..0d72085 100644 --- a/tweak/Narwhal.xm +++ b/tweak/Narwhal.xm @@ -2,6 +2,7 @@ #import "Narwhal.h" #import "assets/TFHelper.h" +static BOOL isEnabled; static BOOL isNarwhalEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -12,28 +13,28 @@ BOOL shouldHaveUndeleteAction = NO; id tfComment; id tfController; -void getUndeleteCommentData(id controller, id comment){ +void getUndeleteCommentData(id controller, id comment){ [%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"comment" : comment} completionTarget:controller completionSelector:@selector(completeUndeleteCommentAction:)]; } %hook UIViewController --(void) presentViewController:(id) arg1 animated:(BOOL) arg2 completion:(id) arg3{ - - if ([arg1 isKindOfClass:[UIAlertController class]] && shouldHaveUndeleteAction){ - +- (void)presentViewController:(id)arg1 animated:(BOOL)arg2 completion:(id)arg3 { + + if ([arg1 isKindOfClass:[UIAlertController class]] && shouldHaveUndeleteAction) { + UIAlertAction* undeleteAction; - - if (tfComment){ + + if (tfComment) { undeleteAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){getUndeleteCommentData(tfController, tfComment);}]; } else { undeleteAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){[tfController handleUndeletePostAction];}]; } - + [arg1 addAction:undeleteAction]; } - + %orig; } @@ -42,75 +43,75 @@ void getUndeleteCommentData(id controller, id comment){ %hook NRTLinkViewController --(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ +- (void)swipeCell:(id)arg1 didEndDragWithState:(NSUInteger)arg2 { - if (arg2 == 2){ + if (arg2 == 2) { if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { - + NSString *commentBody = MSHookIvar([arg1 comment], "_body"); - + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ tfComment = [arg1 comment]; tfController = self; shouldHaveUndeleteAction = YES; } - } - } - + } + } + %orig; - + shouldHaveUndeleteAction = NO; } --(void) _dotsButtonTouched:(id) arg1{ - - if ([self linkTextOffscreenCell]){ - +- (void)_dotsButtonTouched:(id)arg1 { + + if ([self linkTextOffscreenCell]) { + NSString *postBody = [[self link] selfText]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { tfController = self; tfComment = nil; shouldHaveUndeleteAction = YES; } } - + %orig; - + shouldHaveUndeleteAction = NO; } %new --(void) handleUndeletePostAction{ - +- (void)handleUndeletePostAction { + id post = [self link]; - + [%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"post" : post} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } -%new --(void) completeUndeletePostAction:(NSDictionary *) data{ +%new +- (void)completeUndeletePostAction:(NSDictionary *)data { id post = data[@"post"]; MSHookIvar(post, "_author") = data[@"author"]; - + NSAttributedString* postBodyAttributedString = [%c(NRTMarkdownManager) attributedStringFromMarkdown:data[@"body"] type:0]; [self setLinkText:postBodyAttributedString]; - + [[self tableView] reloadData]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ +- (void)completeUndeleteCommentAction:(NSDictionary *)data { id comment = data[@"comment"]; - if (comment){ + if (comment) { MSHookIvar(comment, "_author") = data[@"author"]; MSHookIvar(comment, "_body") = data[@"body"]; - + [[self commentsManager] updateComment:comment fromEdited:comment]; } } @@ -120,36 +121,36 @@ void getUndeleteCommentData(id controller, id comment){ %hook NRTMediaTableViewDataSource --(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ +- (void)swipeCell:(id)arg1 didEndDragWithState:(NSUInteger)arg2 { - if (arg2 == 2){ + if (arg2 == 2) { if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { - + NSString *commentBody = MSHookIvar([arg1 comment], "_body"); - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]) { tfComment = [arg1 comment]; tfController = self; shouldHaveUndeleteAction = YES; } - } - } - + } + } + %orig; - + shouldHaveUndeleteAction = NO; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ +- (void)completeUndeleteCommentAction:(NSDictionary *)data { id comment = data[@"comment"]; - if (comment){ + if (comment) { MSHookIvar(comment, "_author") = data[@"author"]; MSHookIvar(comment, "_body") = data[@"body"]; - + [[self commentsManager] updateComment:comment fromEdited:comment]; } } @@ -161,32 +162,18 @@ void getUndeleteCommentData(id controller, id comment){ static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isNarwhalEnabled"] != nil){ - isNarwhalEnabled = [[prefs objectForKey:@"isNarwhalEnabled"] boolValue]; - } else { - isNarwhalEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil) { - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isNarwhalEnabled = [prefs objectForKey:@"isNarwhalEnabled"] ? [[prefs objectForKey:@"isNarwhalEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isNarwhalEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -196,14 +183,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName isEqualToString:@"narwhal"]){ - if (isNarwhalEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if ([processName isEqualToString:@"narwhal"]){ + if (isNarwhalEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(Narwhal); } } diff --git a/tweak/Reddit.h b/tweak/Reddit.h index 78808eb..09a47ed 100644 --- a/tweak/Reddit.h +++ b/tweak/Reddit.h @@ -3,7 +3,7 @@ /* -- Comment Interfaces -- */ @interface Comment -//v4 +//v4 @property(strong,nonatomic) id pk; @property(strong, nonatomic) NSString *bodyText; @property(strong, nonatomic) NSString *author; @@ -16,22 +16,22 @@ @interface CommentsViewController : NSObject @property(strong,nonatomic) id postData; --(void) reloadCommentsWithNewCommentsHighlight:(BOOL) arg1 autoScroll:(BOOL) arg2 animated:(BOOL) arg3; --(void) reloadCommentsSection:(BOOL) arg1; --(void) reloadPostSection:(BOOL) arg1; --(void) feedPostViewDidUpdatePost:(id) arg1 shouldReloadFeed:(BOOL) arg2; --(void) updateFloatingViews; +- (void)reloadCommentsWithNewCommentsHighlight:(BOOL)arg1 autoScroll:(BOOL)arg2 animated:(BOOL)arg3; +- (void)reloadCommentsSection:(BOOL)arg1; +- (void)reloadPostSection:(BOOL)arg1; +- (void)feedPostViewDidUpdatePost:(id)arg1 shouldReloadFeed:(BOOL)arg2; +- (void)updateFloatingViews; //custom elements --(void) updateComments; --(void) updatePostText; +- (void)updateComments; +- (void)updatePostText; @end @interface CommentActionSheetViewController : UIViewController @property(strong,nonatomic) Comment *comment; @property(strong,nonatomic) id commentTreeNode; @property(strong,nonatomic) CommentsViewController *commentActionSheetDelegate; --(id)animationControllerForDismissedController:(id) arg1; +- (id)animationControllerForDismissedController:(id)arg1; @end @@ -54,7 +54,7 @@ @interface CommentTreeHeaderNode @property(strong,nonatomic) id commentTreeNode; --(void) updateContentViewsForData:(id)arg1; +- (void)updateContentViewsForData:(id)arg1; @end @interface CommentTreeCommandBarNode @@ -68,7 +68,7 @@ @interface CommentTreeHeaderView @property(strong,nonatomic) id commentTreeNode; --(void) updateContentViewsForData:(id) arg1; +- (void)updateContentViewsForData:(id)arg1; @end /* -- Post Interfaces -- */ @@ -85,7 +85,7 @@ @interface PostDetailViewController @property(strong,nonatomic) id selfTextNode; --(void) configureSelfTextNode; +- (void)configureSelfTextNode; //custom elements @property(strong,nonatomic) id feedPostTextWithThumbnailNode; @@ -111,7 +111,7 @@ @interface FeedPostTitleNode @property(strong,nonatomic) id delegate; --(void) configureNodes; +- (void)configureNodes; @end @interface FeedPostDetailDelegator @@ -119,7 +119,7 @@ @end @interface FeedPostContentNode --(void) configureSelfTextNode; +- (void)configureSelfTextNode; @end /* -- Other Interfaces -- */ @@ -130,14 +130,14 @@ @interface RUIActionSheetItem : NSObject @property(strong,nonatomic) id leftIconImage; --(id) initWithLeftIconImage:(id) arg1 text:(id) arg2 identifier:(id) arg3 context:(id) arg4; +- (id)initWithLeftIconImage:(id)arg1 text:(id)arg2 identifier:(id)arg3 context:(id)arg4; @end @interface ActionSheetItem : NSObject // <= 4.17 @property(strong,nonatomic) id leftIconImage; --(id) initWithLeftIconImage:(id) arg1 text:(id) arg2 identifier:(id) arg3 context:(id) arg4; +- (id) initWithLeftIconImage:(id)arg1 text:(id)arg2 identifier:(id)arg3 context:(id)arg4; @end @interface RUITheme @@ -145,65 +145,66 @@ @end @interface NSAttributedStringMarkdownParser -+(id) currentConfig; -+(id) attributedStringUsingCurrentConfig:(id) arg1; --(id) attributedStringFromMarkdownString:(id) arg1; --(id) initWithConfig:(id) arg1; ++ (id)currentConfig; ++ (id)attributedStringUsingCurrentConfig:(id)arg1; +- (id)attributedStringFromMarkdownString:(id)arg1; +- (id)initWithConfig:(id)arg1; @end @interface ThemeManager -+(id) sharedManager; ++ (id)sharedManager; // >= 4.45.0 @property(strong,nonatomic) id darkTheme; @property(strong,nonatomic) id lightTheme; --(id) initWithAppSettings:(id) arg1; +- (id)initWithAppSettings:(id)arg1; // < 4.45.0 @property(strong,nonatomic) id dayTheme; @property(strong,nonatomic) id nightTheme; --(id) initWithTraitCollection:(id) arg1 appSettings:(id) arg2; +- (id)initWithTraitCollection:(id)arg1 appSettings:(id)arg2; @end @interface AppSettings -+(id) sharedSettings; ++ (id)sharedSettings; @end @interface AccountManager @property(assign,nonatomic) id defaults; -+(id) sharedManager; ++ (id)sharedManager; @end + /* ---- Reddit v3 ---- */ /* -- Comment Interfaces -- */ @interface CommentCell : UIView --(id) delegate; --(id) comment; --(id) commentView; +- (id)delegate; +- (id)comment; +- (id)commentView; @end @interface CommentView --(void) configureSubviews; --(void) layoutSubviews; --(id) commandView; --(id) comment; --(id) delegate; +- (void)configureSubviews; +- (void)layoutSubviews; +- (id)commandView; +- (id)comment; +- (id)delegate; @end @interface CommentCommandView @property (strong, nonatomic) id undeleteButton; --(id)overflowButton; --(id) comment; --(id) delegate; +- (id)overflowButton; +- (id)comment; +- (id)delegate; @end /* -- Other Interfaces -- */ @interface MarkDownParser -+(id)attributedStringFromMarkdownString:(id)arg1; ++ (id)attributedStringFromMarkdownString:(id)arg1; @end diff --git a/tweak/Reddit.xm b/tweak/Reddit.xm index 2d1b97a..5b2a61a 100644 --- a/tweak/Reddit.xm +++ b/tweak/Reddit.xm @@ -2,6 +2,7 @@ #import "Reddit.h" #import "assets/TFHelper.h" +static BOOL isEnabled; static BOOL isRedditEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -18,9 +19,9 @@ int secondVersionPart = 0; %hook CommentTreeHeaderView --(void) layoutSubviews{ +- (void)layoutSubviews { %orig; - + [[self commentTreeNode] setCommentTreeHeaderNode:self]; } @@ -28,9 +29,9 @@ int secondVersionPart = 0; %hook CommentTreeHeaderNode --(void) didLoad{ +- (void)didLoad { %orig; - + [[self commentTreeNode] setCommentTreeHeaderNode:self]; } %end @@ -38,7 +39,7 @@ int secondVersionPart = 0; %hook CommentTreeCommandBarNode --(void) didLoad{ +- (void)didLoad { %orig; [[self commentTreeNode] setCommentTreeCommandBarNode:self]; @@ -48,11 +49,11 @@ int secondVersionPart = 0; %hook CommentActionSheetViewController --(void) setItems:(id) arg1{ - - NSString *commentBody = [[self comment] bodyText]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ +- (void)setItems:(id)arg1 { + + NSString *commentAuthor = [[self comment] author]; + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentAuthor isDeletedOnly:isTFDeletedOnly]) { UIImage* origImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; @@ -64,105 +65,105 @@ int secondVersionPart = 0; id undeleteItem = [[%c(RUIActionSheetItem) alloc] initWithLeftIconImage:newImage text:@"TF did that say?" identifier:@"undeleteItemIdentifier" context:[self comment]]; arg1 = [arg1 arrayByAddingObject:undeleteItem]; - + [undeleteItem release]; } - + %orig; } --(void) handleDidSelectActionSheetItem:(id) arg1{ +- (void)handleDidSelectActionSheetItem:(id)arg1 { %orig; - - if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - - [self dismissViewControllerAnimated:YES completion:nil]; - + + if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]) { + + [self dismissViewControllerAnimated:YES completion:nil]; + id commentTreeNode = [self commentTreeNode]; Comment *comment = [commentTreeNode comment]; - + [%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } } -%new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +%new +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + id commentTreeNode = [self commentTreeNode]; Comment *comment = [commentTreeNode comment]; - + NSString *author = data[@"author"]; NSString *body = data[@"body"]; - + NSMutableAttributedString *bodyMutableAttributedText; - + id themeManager; id isNightMode; id textColor; - - if (firstVersionPart == 2020){ + + if (firstVersionPart == 2020) { themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager darkTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager lightTheme] bodyTextColor]; } - + [themeManager release]; } else { - - if (secondVersionPart >= 45){ + + if (secondVersionPart >= 45) { themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager darkTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager lightTheme] bodyTextColor]; } - + [themeManager release]; - - } else if (secondVersionPart >= 37){ + + } else if (secondVersionPart >= 37) { themeManager = [[%c(ThemeManager) alloc] initWithTraitCollection:nil appSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager nightTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager dayTheme] bodyTextColor]; } - + [themeManager release]; - + } else { themeManager = [%c(ThemeManager) sharedManager]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager nightTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager dayTheme] bodyTextColor]; } } } - + bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]]; [bodyMutableAttributedText beginEditing]; [bodyMutableAttributedText enumerateAttribute:NSForegroundColorAttributeName inRange:NSMakeRange(0, bodyMutableAttributedText.length) options:0 usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) { - [bodyMutableAttributedText removeAttribute:NSForegroundColorAttributeName range:range]; + [bodyMutableAttributedText removeAttribute:NSForegroundColorAttributeName range:range]; [bodyMutableAttributedText addAttribute:NSForegroundColorAttributeName value:textColor range:range]; }]; [bodyMutableAttributedText endEditing]; - + [comment setAuthor:author]; [comment setBodyText:body]; [comment setBodyRichTextAttributed:bodyMutableAttributedText]; [comment setBodyAttributedText:bodyMutableAttributedText]; - + [[commentTreeNode commentTreeHeaderNode] updateContentViewsForData:comment]; [bodyMutableAttributedText release]; @@ -178,22 +179,22 @@ int secondVersionPart = 0; %hook FeedPostDetailCellNode --(void) didLoad{ +- (void)didLoad { %orig; - + [[[self delegate] viewController] setFeedPostDetailCellNode:self]; } %end %hook PostActionSheetViewController --(void) setItems:(id) arg1{ - +- (void)setItems:(id)arg1 { + Post *post = [self post]; NSString *postBody = [post selfText]; - - if ([post isSelfPost]){ - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ + + if ([post isSelfPost]) { + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { UIImage* origImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; @@ -205,96 +206,96 @@ int secondVersionPart = 0; id undeleteItem = [[%c(RUIActionSheetItem) alloc] initWithLeftIconImage:newImage text:@"TF did that say?" identifier:@"undeleteItemIdentifier" context:[self post]]; arg1 = [arg1 arrayByAddingObject:undeleteItem]; - + [undeleteItem release]; } } - + %orig; } --(void) handleDidSelectActionSheetItem:(id) arg1{ +- (void)handleDidSelectActionSheetItem:(id)arg1 { %orig; - - if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - + + if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]) { + [self dismissViewControllerAnimated:YES completion:nil]; - + Post *post = [self post]; - + if ([post isSelfPost]){ - + [%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; - } + } } } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ +- (void)completeUndeletePostAction:(NSDictionary *)data { Post *post = [self post]; - + NSString *author = data[@"author"]; NSString *body = data[@"body"]; - + id themeManager; id isNightMode; id textColor; - - if (firstVersionPart == 2020){ + + if (firstVersionPart == 2020) { themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager darkTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager lightTheme] bodyTextColor]; } - + [themeManager release]; } else { - - if (secondVersionPart >= 45){ + + if (secondVersionPart >= 45) { themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager darkTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager lightTheme] bodyTextColor]; } - + [themeManager release]; - - } else if (secondVersionPart >= 37){ + + } else if (secondVersionPart >= 37) { themeManager = [[%c(ThemeManager) alloc] initWithTraitCollection:nil appSettings:[%c(AppSettings) sharedSettings]]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager nightTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager dayTheme] bodyTextColor]; } - + [themeManager release]; - + } else { themeManager = [%c(ThemeManager) sharedManager]; isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"]; - + if (isNightMode) { textColor = [[themeManager nightTheme] bodyTextColor]; - } else{ + } else { textColor = [[themeManager dayTheme] bodyTextColor]; } - } + } } - + NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]]; [bodyMutableAttributedText beginEditing]; [bodyMutableAttributedText enumerateAttribute:NSForegroundColorAttributeName inRange:NSMakeRange(0, bodyMutableAttributedText.length) options:0 usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) { - [bodyMutableAttributedText removeAttribute:NSForegroundColorAttributeName range:range]; + [bodyMutableAttributedText removeAttribute:NSForegroundColorAttributeName range:range]; [bodyMutableAttributedText addAttribute:NSForegroundColorAttributeName value:textColor range:range]; }]; [bodyMutableAttributedText endEditing]; @@ -303,11 +304,11 @@ int secondVersionPart = 0; [post setAuthor:author]; [post setSelfPostRichTextAttributed:bodyMutableAttributedText]; [post setPreviewFeedPostTextString:bodyMutableAttributedText]; - - if (firstVersionPart == 2020){ + + if (firstVersionPart == 2020) { [[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] contentNode] configureSelfTextNode]; } else { - if (secondVersionPart >= 44){ + if (secondVersionPart >= 44) { [[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] contentNode] configureSelfTextNode]; } else if (secondVersionPart >= 38) { [[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] configureSelfTextNode]; @@ -316,7 +317,7 @@ int secondVersionPart = 0; [[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] titleNode] configureNodes]; } } - + [bodyMutableAttributedText release]; } @@ -329,30 +330,30 @@ int secondVersionPart = 0; %hook CommentsViewController -%new --(void) updateComments{ +%new +- (void)updateComments { [self reloadCommentsWithNewCommentsHighlight:NO autoScroll:NO animated:NO]; } -%new --(void) updatePostText{ - +%new +- (void)updatePostText { + if (secondVersionPart >= 2){ [self reloadPostSection:YES]; } else { [self feedPostViewDidUpdatePost:[self postData] shouldReloadFeed:NO]; - } + } } %end %hook CommentActionSheetViewController --(void) setItems:(id) arg1{ - - NSString *commentBody = [[self comment] bodyText]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ +- (void)setItems:(id)arg1 { + + NSString *commentAuthor = [[self comment] author]; + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentAuthor isDeletedOnly:isTFDeletedOnly]) { UIImage* origImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; @@ -360,9 +361,9 @@ int secondVersionPart = 0; CGFloat scale = origImage.size.width / existingImageSize.width; UIImage *newImage = [UIImage imageWithCGImage:[origImage CGImage] scale:scale orientation:origImage.imageOrientation]; - + id undeleteItem; - + if (secondVersionPart >= 18) { undeleteItem = [[%c(RUIActionSheetItem) alloc] initWithLeftIconImage:newImage text:@"TF did that say?" identifier:@"undeleteItemIdentifier" context:[self comment]]; } else { @@ -370,50 +371,50 @@ int secondVersionPart = 0; } arg1 = [arg1 arrayByAddingObject:undeleteItem]; - + [undeleteItem release]; } - + %orig; } // >= 4.21 --(void) handleDidSelectActionSheetItem:(id) arg1{ +- (void)handleDidSelectActionSheetItem:(id)arg1 { %orig; - - if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - - [self dismissViewControllerAnimated:YES completion:nil]; - + + if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]) { + + [self dismissViewControllerAnimated:YES completion:nil]; + Comment *comment = [self comment]; - + [%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } } // <= 4.20 --(void) actionSheetViewController:(id) arg1 didSelectItem:(id) arg2{ +- (void)actionSheetViewController:(id)arg1 didSelectItem:(id)arg2 { %orig; - + if ([[arg2 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - - [self dismissViewControllerAnimated:YES completion:nil]; - + + [self dismissViewControllerAnimated:YES completion:nil]; + Comment *comment = [self comment]; - + [%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } } -%new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +%new +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + Comment *comment = [self comment]; - + NSString *body = data[@"body"]; - + NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]]; - + [comment setAuthor:data[@"author"]]; [comment setBodyText:body]; [comment setBodyAttributedText:bodyMutableAttributedText]; @@ -431,13 +432,13 @@ int secondVersionPart = 0; %hook PostActionSheetViewController --(void) setItems:(id) arg1{ - +- (void)setItems:(id)arg1{ + Post *post = [self post]; NSString *postBody = [post selfText]; - - if ([post isSelfPost]){ - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ + + if ([post isSelfPost]) { + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { UIImage* origImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; @@ -445,9 +446,9 @@ int secondVersionPart = 0; CGFloat scale = origImage.size.width / existingImageSize.width; UIImage *newImage = [UIImage imageWithCGImage:[origImage CGImage] scale:scale orientation:origImage.imageOrientation]; - + id undeleteItem; - + if (secondVersionPart >= 18) { undeleteItem = [[%c(RUIActionSheetItem) alloc] initWithLeftIconImage:newImage text:@"TF did that say?" identifier:@"undeleteItemIdentifier" context:[self post]]; } else { @@ -455,71 +456,70 @@ int secondVersionPart = 0; } arg1 = [arg1 arrayByAddingObject:undeleteItem]; - + [undeleteItem release]; } } - + %orig; } // >= 4.21 --(void) handleDidSelectActionSheetItem:(id) arg1{ +- (void)handleDidSelectActionSheetItem:(id)arg1 { %orig; - - if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - + + if ([[arg1 identifier] isEqualToString:@"undeleteItemIdentifier"]) { + [self dismissViewControllerAnimated:YES completion:nil]; - + Post *post = [self post]; - - if ([post isSelfPost]){ - + + if ([post isSelfPost]) { [%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; - } + } } } // <= 4.20 --(void) actionSheetViewController:(id) arg1 didSelectItem:(id) arg2{ +- (void)actionSheetViewController:(id)arg1 didSelectItem:(id)arg2 { %orig; - - if ([[arg2 identifier] isEqualToString:@"undeleteItemIdentifier"]){ - + + if ([[arg2 identifier] isEqualToString:@"undeleteItemIdentifier"]) { + [self dismissViewControllerAnimated:YES completion:nil]; - + Post *post = [self post]; - + if ([post isSelfPost]){ - + [%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; - } + } } } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + Post *post = [self post]; - + NSString *body = data[@"body"]; - + NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]]; - + [post setAuthor:data[@"author"]]; [post setSelfText:body]; [post setSelfTextAttributed:bodyMutableAttributedText]; - + if (secondVersionPart >= 8) { [post setSelfPostRichTextAttributed:bodyMutableAttributedText]; } - + if (secondVersionPart >= 15) { [post setPreviewFeedPostTextString:bodyMutableAttributedText]; - } - + } + [[self postActionSheetDelegate] updatePostText]; - + [bodyMutableAttributedText release]; } @@ -528,7 +528,7 @@ int secondVersionPart = 0; %end -//outdated and unchanged from first version of this tweak... +//outdated and unchanged from first version of this tweak... //TODO: move button to menu, add post support, make async requests once I feel like doing it %group Reddit_v3 @@ -552,16 +552,16 @@ int secondVersionPart = 0; NSString *body = @"[body]"; if (data != nil && error == nil){ - + id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; - + author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"]; body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"]; - + if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){ body = @"[comment was unable to be archived]"; } - + } else if (error != nil || data == nil){ body = @"[an error occured]"; } @@ -583,7 +583,7 @@ int secondVersionPart = 0; [undeleteButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; - + [undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; [commandView setUndeleteButton:undeleteButton]; @@ -613,28 +613,14 @@ int secondVersionPart = 0; static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isRedditEnabled"] != nil){ - isRedditEnabled = [[prefs objectForKey:@"isRedditEnabled"] boolValue]; - } else { - isRedditEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil) { - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isRedditEnabled = [prefs objectForKey:@"isRedditEnabled"] ? [[prefs objectForKey:@"isRedditEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; } else { + isEnabled = YES; isRedditEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; @@ -648,31 +634,31 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor{ loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; - - @try{ + + @try { NSArray *redditVersion = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"] componentsSeparatedByString:@"."]; - + firstVersionPart = [redditVersion[0] intValue]; secondVersionPart = [redditVersion[1] intValue]; } - @catch (NSException *exc){ + @catch (NSException *exc) { firstVersionPart = 2020; secondVersionPart = 0; } if ([processName isEqualToString:@"Reddit"]){ - if (isRedditEnabled) { + if (isRedditEnabled && isEnabled) { - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - - if (firstVersionPart == 4 || firstVersionPart == 2020){ - if (secondVersionPart <= 32 && firstVersionPart != 2020){ + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + + if (firstVersionPart == 4 || firstVersionPart == 2020) { + if (secondVersionPart <= 32 && firstVersionPart != 2020) { %init(Reddit_v4_ios10); } else{ %init(Reddit_v4_current); - } + } } else if (firstVersionPart == 3) { %init(Reddit_v3); } diff --git a/tweak/Slide.h b/tweak/Slide.h index 2d9c579..46af68c 100644 --- a/tweak/Slide.h +++ b/tweak/Slide.h @@ -9,10 +9,10 @@ @end @interface CommentDepthCell --(void) showMenu:(id) arg1; +- (void)showMenu:(id)arg1; //custom elements --(void) addUndeleteButtonToMenu; +- (void)addUndeleteButtonToMenu; @end /* -- Post Interfaces -- */ @@ -22,38 +22,38 @@ @end @interface CommentViewController : UIViewController --(void) refresh:(id) arg1; +- (void)refresh:(id)arg1; //custom elements @property(strong, nonatomic) UIButton *undeleteButton; --(void) addUndeleteButtonToToolbar; --(BOOL) shouldAddUndeleteButtonToToolbar; +- (void)addUndeleteButtonToToolbar; +- (BOOL)shouldAddUndeleteButtonToToolbar; @end /* -- Utility Interfaces -- */ @interface UIColor () -+(UIColor *) colorWithHex:(NSString *) arg1; --(NSString *) hexString; ++ (UIColor *)colorWithHex:(NSString *)arg1; +- (NSString *)hexString; @end @interface NSAttributedString () --(void) yy_setTextHighlightRange:(NSRange) range color:(UIColor *) color backgroundColor:(UIColor *) backgroundColor userInfo:(NSDictionary *) userInfo; +- (void)yy_setTextHighlightRange:(NSRange)range color:(UIColor *)color backgroundColor:(UIColor *)backgroundColor userInfo:(NSDictionary *)userInfo; @end @interface ColorUtil : NSObject -+(UIColor *) accentColorForSub:(NSString *) arg1; -+(UIColor *) fontColorForTheme:(NSString *) arg1; -+(UIColor *) backgroundColorForTheme:(NSString *) arg1; ++ (UIColor *)accentColorForSub:(NSString *)arg1; ++ (UIColor *)fontColorForTheme:(NSString *)arg1; ++ (UIColor *)backgroundColorForTheme:(NSString *)arg1; @end @interface DTHTMLAttributedStringBuilder --(id) initWithHTML:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary * __autoreleasing*)docAttributes; --(NSAttributedString *) generatedAttributedString; +- (id) initWithHTML:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary * __autoreleasing*)docAttributes; +- (NSAttributedString *)generatedAttributedString; @end @interface FontGenerator : NSObject -+(UIFont *) fontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3; -+(UIFont *) boldFontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3; -+(UIFont *) italicFontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3; -@end \ No newline at end of file ++ (UIFont *)fontOfSize:(CGFloat)arg1 submission:(BOOL)arg2 willOffset:(BOOL)arg3; ++ (UIFont *)boldFontOfSize:(CGFloat)arg1 submission:(BOOL)arg2 willOffset:(BOOL)arg3; ++ (UIFont *)italicFontOfSize:(CGFloat)arg1 submission:(BOOL)arg2 willOffset:(BOOL)arg3; +@end diff --git a/tweak/Slide.xm b/tweak/Slide.xm index efd2435..c08cefc 100644 --- a/tweak/Slide.xm +++ b/tweak/Slide.xm @@ -3,6 +3,7 @@ #import "assets/TFHelper.h" #import "assets/MMMarkdown/MMMarkdown.h" +static BOOL isEnabled; static BOOL isSlideEnabled; static BOOL isTFDeletedOnly; static CGFloat pushshiftRequestTimeoutValue; @@ -15,43 +16,43 @@ NSString *slidePostOverrideBodyHtml; @implementation FontGenerator -+(UIFont *) fontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset{ ++ (UIFont *)fontOfSize:(CGFloat)size submission:(BOOL)isSubmission willOffset:(BOOL)willOffset { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - + NSString *fontName; CGFloat fontSize = size; - - if (willOffset){ + + if (willOffset) { if (isSubmission){ fontSize += ([userDefaults objectForKey:@"POST_FONT_SIZE"] == nil) ? 0 : [userDefaults integerForKey:@"POST_FONT_SIZE"]; } else { fontSize += ([userDefaults objectForKey:@"COMMENT_FONT_SIZE"] == nil) ? -2 : [userDefaults integerForKey:@"COMMENT_FONT_SIZE"]; - } + } } - - if ([userDefaults stringForKey:(isSubmission ? @"postfont" : @"commentfont")] == nil){ + + if ([userDefaults stringForKey:(isSubmission ? @"postfont" : @"commentfont")] == nil) { fontName = isSubmission ? @"AvenirNext-DemiBold" : @"AvenirNext-Medium"; } else { fontName = [userDefaults stringForKey:(isSubmission ? @"postfont" : @"commentfont")]; } - - UIFont *font = [UIFont fontWithName:fontName size:fontSize]; - - if (!font){ + + UIFont *font = [UIFont fontWithName:fontName size:fontSize]; + + if (!font) { font = [UIFont systemFontOfSize:fontSize]; } - + return font; } - -+(UIFont *) boldFontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset { + ++ (UIFont *)boldFontOfSize:(CGFloat)size submission:(BOOL)isSubmission willOffset:(BOOL)willOffset { UIFont *font = [self fontOfSize:size submission:isSubmission willOffset:willOffset]; - + if ([font.fontName isEqualToString:[UIFont systemFontOfSize:10].fontName]){ return [UIFont boldSystemFontOfSize:font.pointSize]; } else { UIFontDescriptor *desc = [font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; - + if (desc == nil){ return font; } else { @@ -60,15 +61,15 @@ NSString *slidePostOverrideBodyHtml; } } -+(UIFont *) italicFontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset { ++ (UIFont *)italicFontOfSize:(CGFloat)size submission:(BOOL)isSubmission willOffset:(BOOL)willOffset { UIFont *font = [self fontOfSize:size submission:isSubmission willOffset:willOffset]; - - if ([font.fontName isEqualToString:[UIFont systemFontOfSize:10].fontName]){ + + if ([font.fontName isEqualToString:[UIFont systemFontOfSize:10].fontName]) { return [UIFont italicSystemFontOfSize:font.pointSize]; } else { UIFontDescriptor *desc = [font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; - - if (desc == nil){ + + if (desc == nil) { return font; } else { return [UIFont fontWithDescriptor:desc size: 0]; @@ -79,9 +80,9 @@ NSString *slidePostOverrideBodyHtml; @end -@implementation ColorUtil +@implementation ColorUtil -+(UIColor *) accentColorForSub:(NSString *) subreddit{ ++ (UIColor *)accentColorForSub:(NSString *)subreddit { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSData *colorData = [userDefaults dataForKey:[NSString stringWithFormat:@"accent+%@", subreddit]]; UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData]; @@ -89,8 +90,8 @@ NSString *slidePostOverrideBodyHtml; return color; } else { UIColor *baseAccentColor = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults dataForKey:@"accentcolor"]]; - - if (baseAccentColor){ + + if (baseAccentColor) { return baseAccentColor; } else { return [UIColor colorWithRed:0.161 green:0.475 blue:1.0 alpha:1.0]; @@ -98,10 +99,10 @@ NSString *slidePostOverrideBodyHtml; } } -+(UIColor *) fontColorForTheme:(NSString *)theme{ ++ (UIColor *)fontColorForTheme:(NSString *)theme { UIColor *fontColor; NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - + //if only switch blocks worked with strings... if ([theme isEqualToString:@"light"]) { fontColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.87]; @@ -112,9 +113,9 @@ NSString *slidePostOverrideBodyHtml; } else if ([theme isEqualToString:@"blue"]) { fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87]; } else if ([theme isEqualToString:@"sepia"]) { - fontColor = [UIColor colorWithRed:0.243 green:.239 blue:.212 alpha:0.87]; + fontColor = [UIColor colorWithRed:0.243 green:.239 blue:.212 alpha:0.87]; } else if ([theme isEqualToString:@"red"]) { - fontColor = [UIColor colorWithRed:1.0 green:0.969 blue:0.929 alpha:0.87]; + fontColor = [UIColor colorWithRed:1.0 green:0.969 blue:0.929 alpha:0.87]; } else if ([theme isEqualToString:@"deep"]) { fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87]; } else if ([theme isEqualToString:@"mint"]) { @@ -133,16 +134,16 @@ NSString *slidePostOverrideBodyHtml; NSString *customThemeString = [[userDefaults stringForKey:[NSString stringWithFormat:@"Theme+%@", theme]] stringByRemovingPercentEncoding]; if (customThemeString) { NSString *customFontColorHex = [customThemeString componentsSeparatedByString:@"#"][4]; - fontColor = [UIColor colorWithHex:customFontColorHex]; + fontColor = [UIColor colorWithHex:customFontColorHex]; } else { fontColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.87]; } } - + return fontColor; } -+(UIColor *) backgroundColorForTheme:(NSString *) theme{ ++ (UIColor *)backgroundColorForTheme:(NSString *)theme { UIColor *backgroundColor; NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; @@ -155,9 +156,9 @@ NSString *slidePostOverrideBodyHtml; } else if ([theme isEqualToString:@"blue"]) { backgroundColor = [UIColor colorWithRed:0.071 green:0.094 blue:0.106 alpha:1.0]; } else if ([theme isEqualToString:@"sepia"]) { - backgroundColor = [UIColor colorWithRed:0.310 green:0.302 blue:0.267 alpha:1.0]; + backgroundColor = [UIColor colorWithRed:0.310 green:0.302 blue:0.267 alpha:1.0]; } else if ([theme isEqualToString:@"red"]) { - backgroundColor = [UIColor colorWithRed:0.075 green:0.055 blue:0.051 alpha:1.0]; + backgroundColor = [UIColor colorWithRed:0.075 green:0.055 blue:0.051 alpha:1.0]; } else if ([theme isEqualToString:@"deep"]) { backgroundColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.043 alpha:1.0]; } else if ([theme isEqualToString:@"mint"]) { @@ -176,12 +177,12 @@ NSString *slidePostOverrideBodyHtml; NSString *customThemeString = [[userDefaults stringForKey:[NSString stringWithFormat:@"Theme+%@", theme]] stringByRemovingPercentEncoding]; if (customThemeString) { NSString *customFontColorHex = [customThemeString componentsSeparatedByString:@"#"][3]; - backgroundColor = [UIColor colorWithHex:customFontColorHex]; + backgroundColor = [UIColor colorWithHex:customFontColorHex]; } else { backgroundColor = [UIColor colorWithRed:0.352 green:0.352 blue:0.352 alpha:1.0]; } - } - + } + return backgroundColor; } @@ -189,15 +190,15 @@ NSString *slidePostOverrideBodyHtml; static UIButton *createUndeleteButton(){ - - UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; + + UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160white.png"]; - + UIGraphicsBeginImageContextWithOptions(CGSizeMake(20, 20), NO, 0); [undeleteImage drawInRect:CGRectMake(0, 0, 20, 20)]; undeleteImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); - + UIGraphicsBeginImageContextWithOptions(CGSizeMake(35, 35), NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); @@ -208,7 +209,7 @@ static UIButton *createUndeleteButton(){ [undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit; - + return undeleteButton; } @@ -216,25 +217,25 @@ static UIButton *createUndeleteButton(){ %hook UIColor %new -+(UIColor *) colorWithHex:(NSString *) arg1 { ++ (UIColor *)colorWithHex:(NSString *)arg1 { if (!arg1){ NSString *firstChar = [arg1 substringToIndex:1]; if ([firstChar isEqualToString:@"#"]){ arg1 = [arg1 substringWithRange:NSMakeRange(1, [arg1 length]-1)]; } - + unsigned rgbValue = 0; NSScanner *scanner = [NSScanner scannerWithString:arg1]; [scanner scanHexInt:&rgbValue]; - + return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:0.87]; } else { return nil; } } -%new --(NSString *) hexString { +%new +- (NSString *)hexString { const CGFloat *components = CGColorGetComponents(self.CGColor); CGFloat r = components[0]; @@ -249,35 +250,35 @@ static UIButton *createUndeleteButton(){ %hook CommentDepthCell --(void) doShortClick{ +- (void)doShortClick { %orig; - + [self addUndeleteButtonToMenu]; } --(void) doLongClick { +- (void)doLongClick { %orig; - + [self addUndeleteButtonToMenu]; } -%new --(void) addUndeleteButtonToMenu{ - +%new +- (void)addUndeleteButtonToMenu { + NSString *commentBody = [MSHookIvar(self, "comment") body]; - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ - + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]) { + id controller = MSHookIvar(self, "parent"); - - if (MSHookIvar(controller, "menuCell")){ - + + if (MSHookIvar(controller, "menuCell")) { + UIStackView *menu = MSHookIvar(self, "menu"); - - if (![[[[menu arrangedSubviews] lastObject] actionsForTarget:self forControlEvent:UIControlEventTouchUpInside] containsObject:@"handleUndeleteComment:"]){ + + if (![[[[menu arrangedSubviews] lastObject] actionsForTarget:self forControlEvent:UIControlEventTouchUpInside] containsObject:@"handleUndeleteComment:"]) { UIButton *undeleteButton = createUndeleteButton(); [undeleteButton addTarget:self action:@selector(handleUndeleteComment:) forControlEvents:UIControlEventTouchUpInside]; - + [menu addArrangedSubview:undeleteButton]; } } @@ -285,114 +286,114 @@ static UIButton *createUndeleteButton(){ } %new --(void) handleUndeleteComment:(id) sender{ - +- (void)handleUndeleteComment:(id)sender { + [sender setEnabled:NO]; id comment = MSHookIvar(self, "comment"); - + [%c(TFHelper) getUndeleteDataWithID:[[comment id] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; } %new --(void) completeUndeleteCommentAction:(NSDictionary *) data{ - +- (void)completeUndeleteCommentAction:(NSDictionary *)data { + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; id textStackDisplayView = MSHookIvar(self, "commentBody"); id comment = MSHookIvar(self, "comment"); - + NSString *author = data[@"author"]; NSString *body = data[@"body"]; - - //Attributed string generation rewrote from Slide_for_Reddit.TextDisplayStackView.createAttributedChunk(...) - + + //Attributed string generation rewrote from Slide_for_Reddit.TextDisplayStackView.createAttributedChunk(...) + UIFont *font = [%c(FontGenerator) fontOfSize:MSHookIvar(textStackDisplayView, "fontSize") submission:NO willOffset:YES]; - + NSString *themeName = [userDefaults stringForKey:@"theme"]; UIColor *fontColor = [%c(ColorUtil) fontColorForTheme:themeName]; UIColor *accentColor = [%c(ColorUtil) accentColorForSub:[comment subreddit]]; - + NSString *html = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]; html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""]; html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""]; html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""]; html = [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - + DTHTMLAttributedStringBuilder *dthtmlBuilder = [[%c(DTHTMLAttributedStringBuilder) alloc] initWithHTML:[html dataUsingEncoding:NSUTF8StringEncoding] options:@{@"DTUseiOS6Attributes": @YES, @"DTDefaultTextColor": fontColor, @"DTDefaultFontSize": @([font pointSize])} documentAttributes:nil]; - + NSMutableAttributedString *htmlAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:[dthtmlBuilder generatedAttributedString]]; NSRange htmlStringRange = NSMakeRange(0, [htmlAttributedString length]); - + [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t•\t" withString:@" • " options:0 range: htmlStringRange]; [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t◦\t" withString:@"  ◦ " options:0 range: htmlStringRange]; [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t▪\t" withString:@" ▪ " options:0 range: htmlStringRange]; - + [htmlAttributedString removeAttribute:@"CTForegroundColorFromContext" range:htmlStringRange]; - + [htmlAttributedString enumerateAttributesInRange:htmlStringRange options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attributes, NSRange range, BOOL *stop) { - for (NSString *key in attributes){ - - if ([(UIColor *) attributes[key] isKindOfClass:[UIColor class]]){ + for (NSString *key in attributes) { + + if ([(UIColor *) attributes[key] isKindOfClass:[UIColor class]]) { UIColor *attrColor = (UIColor *) attributes[key]; - if ([[attrColor hexString] isEqualToString:@"#0000FF"]){ + if ([[attrColor hexString] isEqualToString:@"#0000FF"]) { UIFont *tempFont = [UIFont fontWithName:@"Courier" size:font.pointSize]; - + [htmlAttributedString setAttributes:@{NSForegroundColorAttributeName: accentColor, NSBackgroundColorAttributeName: [%c(ColorUtil) backgroundColorForTheme:themeName], NSFontAttributeName: (tempFont ? tempFont : font)} range:range]; } else if ([[attrColor hexString] isEqualToString:@"#008000"]) { [htmlAttributedString setAttributes:@{NSForegroundColorAttributeName: fontColor, NSFontAttributeName:font} range:range]; } - } else if ([(NSURL *) attributes[key] isKindOfClass:[NSURL class]]){ + } else if ([(NSURL *) attributes[key] isKindOfClass:[NSURL class]]) { NSURL *attrUrl = (NSURL *)attributes[key]; - if (([userDefaults objectForKey:@"ENLARGE_LINKS"] == nil) ? YES : [userDefaults boolForKey:@"ENLARGE_LINKS"]){ + if (([userDefaults objectForKey:@"ENLARGE_LINKS"] == nil) ? YES : [userDefaults boolForKey:@"ENLARGE_LINKS"]) { [htmlAttributedString addAttribute:NSFontAttributeName value:[%c(FontGenerator) boldFontOfSize:18 submission:NO willOffset:YES] range:range]; } - - [htmlAttributedString addAttribute:NSForegroundColorAttributeName value:accentColor range:range]; + + [htmlAttributedString addAttribute:NSForegroundColorAttributeName value:accentColor range:range]; [htmlAttributedString addAttribute:NSUnderlineColorAttributeName value:[UIColor clearColor] range:range]; - + //skipping showLinkContentType b/c not necessary and spoilers b/c MMMarkdown doesn't support them [htmlAttributedString yy_setTextHighlightRange:range color: accentColor backgroundColor:nil userInfo:@{@"url": attrUrl}]; - break; - } + break; + } } }]; - + [htmlAttributedString beginEditing]; - [htmlAttributedString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, [htmlAttributedString length]) options:0 usingBlock:^(id value, NSRange range, BOOL *stop){ - + [htmlAttributedString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, [htmlAttributedString length]) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + UIFont *attrFont = (UIFont *)value; - + BOOL isBold = (attrFont.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) != 0; BOOL isItalic = (attrFont.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) != 0; - + UIFont *newFont = font; - + if (isBold){ newFont = [%c(FontGenerator) boldFontOfSize:attrFont.pointSize submission:NO willOffset:NO]; } else if (isItalic){ newFont = [%c(FontGenerator) italicFontOfSize:attrFont.pointSize submission:NO willOffset:NO]; } - + [htmlAttributedString removeAttribute:NSFontAttributeName range:range]; - [htmlAttributedString addAttribute:NSFontAttributeName value:newFont range:range]; - + [htmlAttributedString addAttribute:NSFontAttributeName value:newFont range:range]; + }]; [htmlAttributedString endEditing]; - + NSMutableAttributedString *newCommentText = [MSHookIvar(self, "cellContent") initWithAttributedString:htmlAttributedString]; NSAttributedString *tempAttributedString = [[NSAttributedString alloc] initWithString:@""]; [newCommentText appendAttributedString:tempAttributedString]; //to keep the compiler happy - + [comment setAuthor:author]; - [comment setBody:body]; - + [comment setBody:body]; + id controller = MSHookIvar(self, "parent"); - + [self showMenu:nil]; [MSHookIvar(controller, "tableView") reloadData]; - + [data[@"sender"] setEnabled:YES]; } @@ -401,7 +402,7 @@ static UIButton *createUndeleteButton(){ %hook RSubmission --(id) author{ +- (id)author { if (shouldSlideOverridePostInfo){ return slidePostOverrideAuthor; } else { @@ -409,7 +410,7 @@ static UIButton *createUndeleteButton(){ } } --(id) htmlBody{ +- (id)htmlBody { if (shouldSlideOverridePostInfo){ return slidePostOverrideBodyHtml; } @@ -424,32 +425,32 @@ static UIButton *createUndeleteButton(){ %hook CommentViewController %property(strong, nonatomic) UIButton *undeleteButton; --(void) viewDidLoad { +- (void)viewDidLoad { %orig; - + shouldSlideOverridePostInfo = NO; slidePostOverrideAuthor = nil; slidePostOverrideBodyHtml = nil; - + UIButton *undeleteButton = createUndeleteButton(); [undeleteButton setImage:[[undeleteButton currentImage] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; [undeleteButton addTarget:self action:@selector(handleUndeletePost:) forControlEvents:UIControlEventTouchUpInside]; [self setUndeleteButton:undeleteButton]; } --(void) viewDidLayoutSubviews{ +- (void)viewDidLayoutSubviews { %orig; - - if ([self undeleteButton]){ - if ([self shouldAddUndeleteButtonToToolbar]){ + + if ([self undeleteButton]) { + if ([self shouldAddUndeleteButtonToToolbar]) { [self addUndeleteButtonToToolbar]; } } } --(void) loadAll:(id) arg1{ +- (void)loadAll:(id)arg1 { %orig; - + if ([self undeleteButton]){ if ([self shouldAddUndeleteButtonToToolbar]){ [self addUndeleteButtonToToolbar]; @@ -458,41 +459,41 @@ static UIButton *createUndeleteButton(){ } %new --(BOOL) shouldAddUndeleteButtonToToolbar{ +- (BOOL)shouldAddUndeleteButtonToToolbar { id post = MSHookIvar(self, "submission"); - - if ([post isSelf]){ - + + if ([post isSelf]) { + NSString *postBody = [post body]; - - if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ + + if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]) { return YES; } } - + return NO; } %new --(void) addUndeleteButtonToToolbar{ +- (void)addUndeleteButtonToToolbar { UIToolbar *toolbar = [[self navigationController] toolbar]; NSMutableArray *toolbarItems = [[toolbar items] mutableCopy]; UIView *firstView = [toolbarItems[0] customView]; - - if (firstView){ + + if (firstView) { UIColor *tintColor = [toolbar tintColor]; - + UIButton *undeleteButton = [self undeleteButton]; [undeleteButton setTintColor:tintColor]; - - if ([firstView isMemberOfClass:[UIView class]]){ + + if ([firstView isMemberOfClass:[UIView class]]) { if (![undeleteButton isDescendantOfView:firstView]){ [firstView addSubview:undeleteButton]; [undeleteButton setFrame:firstView.bounds]; } - } else if ([firstView isMemberOfClass:[UIButton class]] && undeleteButton != firstView){ + } else if ([firstView isMemberOfClass:[UIButton class]] && undeleteButton != firstView) { UIBarButtonItem *undeleteItem = [[UIBarButtonItem alloc] initWithCustomView:undeleteButton]; - + [toolbarItems insertObject:toolbarItems[1] atIndex:0]; [toolbarItems insertObject:undeleteItem atIndex:0]; [toolbar setItems:toolbarItems animated:NO]; @@ -501,22 +502,22 @@ static UIButton *createUndeleteButton(){ } %new --(void) handleUndeletePost:(id) sender{ +- (void)handleUndeletePost:(id)sender { shouldSlideOverridePostInfo = YES; - + [sender setEnabled:NO]; - - [%c(TFHelper) getUndeleteDataWithID:[MSHookIvar(self, "submission") name] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; + + [%c(TFHelper) getUndeleteDataWithID:[MSHookIvar(self, "submission") name] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; } %new --(void) completeUndeletePostAction:(NSDictionary *) data{ - +- (void)completeUndeletePostAction:(NSDictionary *)data { + slidePostOverrideAuthor = data[@"author"]; slidePostOverrideBodyHtml = [%c(MMMarkdown) HTMLStringWithMarkdown:data[@"body"] extensions:MMMarkdownExtensionsGitHubFlavored error:nil]; - + [self refresh:nil]; - + [data[@"sender"] setEnabled:YES]; } @@ -527,32 +528,19 @@ static UIButton *createUndeleteButton(){ static void loadPrefs(){ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"]; - + if (prefs){ - - if ([prefs objectForKey:@"isSlideEnabled"] != nil){ - isSlideEnabled = [[prefs objectForKey:@"isSlideEnabled"] boolValue]; - } else { - isSlideEnabled = YES; - } - - if ([prefs objectForKey:@"isTFDeletedOnly"] != nil){ - isTFDeletedOnly = [[prefs objectForKey:@"isTFDeletedOnly"] boolValue]; - } else { - isTFDeletedOnly = YES; - } - - if ([prefs objectForKey:@"requestTimeoutValue"] != nil){ - pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue]; - } else { - pushshiftRequestTimeoutValue = 10; - } - + isEnabled = [prefs objectForKey:@"isEnabled"] ? [[prefs objectForKey:@"isEnabled"] boolValue] : YES; + isSlideEnabled = [prefs objectForKey:@"isSlideEnabled"] ? [[prefs objectForKey:@"isSlideEnabled"] boolValue] : YES; + isTFDeletedOnly = [prefs objectForKey:@"isTFDeletedOnly"] ? [[prefs objectForKey:@"isTFDeletedOnly"] boolValue] : YES; + pushshiftRequestTimeoutValue = [prefs objectForKey:@"requestTimeoutValue"] ? [[prefs objectForKey:@"requestTimeoutValue"] doubleValue] : 10; + } else { + isEnabled = YES; isSlideEnabled = YES; isTFDeletedOnly = YES; pushshiftRequestTimeoutValue = 10; - } + } } static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { @@ -562,14 +550,14 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { loadPrefs(); - + NSString* processName = [[NSProcessInfo processInfo] processName]; if ([processName isEqualToString:@"Slide for Reddit"]){ - if (isSlideEnabled){ - - CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); - + if (isSlideEnabled && isEnabled){ + + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorCoalesce); + %init(Slide, CommentDepthCell = objc_getClass("Slide_for_Reddit.CommentDepthCell"), RSubmission = objc_getClass("Slide_for_Reddit.RSubmission"), CommentViewController = objc_getClass("Slide_for_Reddit.CommentViewController")); } } diff --git a/tweak/assets/TFHelper.h b/tweak/assets/TFHelper.h index 1b597dd..d37ca68 100644 --- a/tweak/assets/TFHelper.h +++ b/tweak/assets/TFHelper.h @@ -1,7 +1,9 @@ +#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) + @interface TFHelper : NSObject -+(void) getUndeleteDataWithID:(NSString *) ident isComment:(BOOL) isComment timeout:(CGFloat) timeout extraData:(NSDictionary *) extra completionTarget:(id) target completionSelector:(SEL) sel; -+(BOOL) shouldShowUndeleteButtonWithInfo:(NSString *) content isDeletedOnly:(BOOL) isDeletedOnly; ++ (void)getUndeleteDataWithID:(NSString *)ident isComment:(BOOL)isComment timeout:(CGFloat)timeout extraData:(NSDictionary *)extra completionTarget:(id)target completionSelector:(SEL)sel; ++ (BOOL)shouldShowUndeleteButtonWithInfo:(NSString *)content isDeletedOnly:(BOOL)isDeletedOnly; @end diff --git a/tweak/assets/TFHelper.m b/tweak/assets/TFHelper.m index fc2a51e..32942c5 100644 --- a/tweak/assets/TFHelper.m +++ b/tweak/assets/TFHelper.m @@ -3,22 +3,22 @@ @implementation TFHelper -+(void) getUndeleteDataWithID:(NSString *) ident isComment:(BOOL) isComment timeout:(CGFloat) timeout extraData:(NSDictionary *) extra completionTarget:(id) target completionSelector:(SEL) sel{ ++ (void)getUndeleteDataWithID:(NSString *)ident isComment:(BOOL)isComment timeout:(CGFloat)timeout extraData:(NSDictionary *)extra completionTarget:(id)target completionSelector:(SEL)sel { NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; - + if (isComment){ [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body", ident]]]; } else { [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext", ident]]]; } - + [request setHTTPMethod:@"GET"]; [request setTimeoutInterval:timeout]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { - + NSString *author = @"[author]"; NSString *body = @"[body]"; @@ -36,19 +36,19 @@ } else if (error != nil || data == nil){ body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]]; } - + NSMutableDictionary *result = [@{@"author" : author, @"body" : body} mutableCopy]; - + if (extra){ [result addEntriesFromDictionary:extra]; } - + [target performSelectorOnMainThread:sel withObject:result waitUntilDone:NO]; }]; } +(BOOL) shouldShowUndeleteButtonWithInfo:(NSString *) content isDeletedOnly:(BOOL) isDeletedOnly{ - + if (!isDeletedOnly){ return YES; } else { @@ -58,7 +58,7 @@ return YES; } } - + return NO; }