mirror of
https://github.com/lint/TFDidThatSay
synced 2025-07-01 23:46:47 +00:00
Create helper class to avoid duplicated code
This commit is contained in:
2
Makefile
2
Makefile
@ -3,7 +3,7 @@ ARCHS = armv7 armv7s arm64 arm64e
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
TWEAK_NAME = tfdidthatsay
|
||||
tfdidthatsay_FILES = $(wildcard tweak/*.xm tweak/assets/*.m)
|
||||
tfdidthatsay_FILES = $(wildcard tweak/*.xm tweak/assets/*.m tweak/assets/MMMarkdown/*.m)
|
||||
tfdidthatsay_CFLAGS = -fobjc-arc
|
||||
tweak/Reddit.xm_CFLAGS = -fno-objc-arc
|
||||
tweak/Apollo.xm_CFLAGS = -fno-objc-arc
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
#import "AlienBlue.h"
|
||||
#import "assets/MMMarkdown.h"
|
||||
#import "assets/TFHelper.h"
|
||||
#import "assets/MMMarkdown/MMMarkdown.h"
|
||||
|
||||
static BOOL isAlienBlueEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -56,43 +57,25 @@ static CGFloat pushshiftRequestTimeoutValue;
|
||||
|
||||
id comment = [[self node] comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[comment ident] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[comment ident]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
id comment = [[self node] comment];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
|
||||
NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
[comment setAuthor:data[@"author"]];
|
||||
[comment setBody:body];
|
||||
[comment setBodyHTML:bodyHTML];
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBody:body];
|
||||
[comment setBodyHTML:bodyHTML];
|
||||
[[self delegate] respondToStyleChange];
|
||||
|
||||
[[self delegate] performSelectorOnMainThread:@selector(respondToStyleChange) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%new
|
||||
@ -100,46 +83,28 @@ static CGFloat pushshiftRequestTimeoutValue;
|
||||
|
||||
[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{
|
||||
|
||||
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
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[post ident]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
[post setAuthor:data[@"author"]];
|
||||
[post setSelftext:body];
|
||||
[postComment setBodyHTML:bodyHTML];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
[[self delegate] respondToStyleChange];
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSString *bodyHTML = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
|
||||
[post setAuthor:author];
|
||||
[post setSelftext:body];
|
||||
[postComment setBodyHTML:bodyHTML];
|
||||
|
||||
[[self delegate] performSelectorOnMainThread:@selector(respondToStyleChange) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
@ -196,4 +161,3 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
107
tweak/Antenna.xm
107
tweak/Antenna.xm
@ -1,6 +1,7 @@
|
||||
|
||||
#import "Antenna.h"
|
||||
#import "assets/MMMarkdown.h"
|
||||
#import "assets/TFHelper.h"
|
||||
#import "assets/MMMarkdown/MMMarkdown.h"
|
||||
|
||||
static BOOL isAntennaEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -48,48 +49,28 @@ id tfAntennaCommentCell;
|
||||
%new
|
||||
-(void) handleUndeleteCommentAction{
|
||||
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[tfAntennaCommentCell comment] itemId] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
id comment = [tfAntennaCommentCell comment];
|
||||
id commentText = [comment commentText];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[comment itemId]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
[comment setAuthor:data[@"author"]];
|
||||
[commentText setBody:body];
|
||||
[commentText setBodyHTML:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
[commentText setBodyAttributedString:nil];
|
||||
[commentText setBodyAttributedStringForPreview:nil];
|
||||
[commentText setTextHeightCache:nil];
|
||||
[self setCommentHeightCache:nil];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[comment setAuthor: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 performSelectorOnMainThread:@selector(updateWithModelObject:) withObject:comment waitUntilDone:YES];
|
||||
[[[self delegate] tableView] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
|
||||
}];
|
||||
[tfAntennaCommentCell updateWithModelObject:comment];
|
||||
[[[self delegate] tableView] reloadData];
|
||||
}
|
||||
|
||||
%end
|
||||
@ -178,49 +159,29 @@ id tfAntennaCommentCell;
|
||||
|
||||
[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{
|
||||
|
||||
id post = [self post];
|
||||
id postText = [post selfCommentText];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[post itemId]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
[post setAuthor:data[@"author"]];
|
||||
[postText setBody:body];
|
||||
[postText setBodyHTML:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
[postText setBodyAttributedString:nil];
|
||||
[postText setBodyAttributedStringForPreview:nil];
|
||||
[postText setTextHeightCache:nil];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
[self loadView];
|
||||
[[self tableView] reloadData];
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[post setAuthor:author];
|
||||
[postText setBody:body];
|
||||
[postText setBodyHTML:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]];
|
||||
|
||||
[postText setBodyAttributedString:nil];
|
||||
[postText setBodyAttributedStringForPreview:nil];
|
||||
[postText setTextHeightCache:nil];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
|
||||
[[self tableView] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
|
181
tweak/Apollo.xm
181
tweak/Apollo.xm
@ -1,5 +1,6 @@
|
||||
|
||||
#import "Apollo.h"
|
||||
#import "assets/TFHelper.h"
|
||||
|
||||
static BOOL isTFDeletedOnly;
|
||||
static BOOL isApolloEnabled;
|
||||
@ -38,59 +39,6 @@ NSDictionary* apolloBodyAttributes = nil;
|
||||
%hook ApolloCommentCellNode
|
||||
%property(strong,nonatomic) id undeleteButton;
|
||||
|
||||
%new
|
||||
-(void) didTapUndeleteButton:(id) sender{
|
||||
|
||||
[sender setEnabled:NO];
|
||||
|
||||
id bodyNode = MSHookIvar<id>(self, "bodyNode");
|
||||
id authorNode = MSHookIvar<id>(self, "authorNode");
|
||||
id authorTextNode = [authorNode subnodes][0];
|
||||
id comment = MSHookIvar<id>(self, "comment");
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment fullName] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
id prevAuthorAttributedString = [authorTextNode attributedString];
|
||||
NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])];
|
||||
NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes];
|
||||
|
||||
[authorTextNode setAttributedText:newAuthorAttributedString];
|
||||
[authorTextNode setAttributedString:newAuthorAttributedString];
|
||||
|
||||
[comment setAuthor:author];
|
||||
|
||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
-(void) didLoad {
|
||||
%orig;
|
||||
|
||||
@ -128,71 +76,49 @@ NSDictionary* apolloBodyAttributes = nil;
|
||||
CGFloat nodeSpacing =[ageNode frame].origin.x - nodeFrame.origin.x - nodeFrame.size.width;
|
||||
|
||||
[[self undeleteButton] setFrame:CGRectMake(nodeFrame.origin.x - imageSize - nodeSpacing, centerHeight - (imageSize / 2), imageSize, imageSize)];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) didTapUndeleteButton:(id) sender{
|
||||
|
||||
[sender setEnabled:NO];
|
||||
|
||||
id comment = MSHookIvar<id>(self, "comment");
|
||||
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
id comment = MSHookIvar<id>(self, "comment");
|
||||
id bodyNode = MSHookIvar<id>(self, "bodyNode");
|
||||
id authorNode = MSHookIvar<id>(self, "authorNode");
|
||||
id authorTextNode = [authorNode subnodes][0];
|
||||
|
||||
NSString *author = data[@"author"];
|
||||
|
||||
id prevAuthorAttributedString = [authorTextNode attributedString];
|
||||
NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])];
|
||||
NSAttributedString *newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes];
|
||||
|
||||
[authorTextNode setAttributedText:newAuthorAttributedString];
|
||||
[authorTextNode setAttributedString:newAuthorAttributedString];
|
||||
|
||||
[comment setAuthor:author];
|
||||
|
||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:data[@"body"] withAttributes:apolloBodyAttributes]];
|
||||
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
|
||||
%hook ApolloCommentsHeaderCellNode
|
||||
%property(strong, nonatomic) id undeleteButton;
|
||||
|
||||
%new
|
||||
-(void) didTapUndeleteButton:(id) sender{
|
||||
|
||||
[sender setEnabled:NO];
|
||||
|
||||
id bodyNode = MSHookIvar<id>(self, "bodyNode");
|
||||
id postInfoNode = MSHookIvar<id>(self, "postInfoNode");
|
||||
id authorNode = MSHookIvar<id>(postInfoNode, "authorButtonNode");
|
||||
id authorTextNode = [authorNode subnodes][0];
|
||||
id post = MSHookIvar<id>(self, "link");
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[[post fullName] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
//MSHookIvar<NSString*>(post, "_author") = author; //Crashes when clicking on author name. You will have to search the author name to go find the profile.
|
||||
|
||||
author = [NSString stringWithFormat:@"by %@", author];
|
||||
|
||||
id prevAuthorAttributedString = [authorTextNode attributedString];
|
||||
NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])];
|
||||
NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes];
|
||||
|
||||
[authorTextNode setAttributedText:newAuthorAttributedString];
|
||||
[authorTextNode setAttributedString:newAuthorAttributedString];
|
||||
|
||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
}
|
||||
|
||||
-(void) didLoad{
|
||||
%orig;
|
||||
|
||||
@ -234,6 +160,43 @@ NSDictionary* apolloBodyAttributes = nil;
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) didTapUndeleteButton:(id) sender{
|
||||
|
||||
[sender setEnabled:NO];
|
||||
|
||||
id post = MSHookIvar<id>(self, "link");
|
||||
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeletePostAction:(NSDictionary *) data{
|
||||
|
||||
id bodyNode = MSHookIvar<id>(self, "bodyNode");
|
||||
id postInfoNode = MSHookIvar<id>(self, "postInfoNode");
|
||||
id authorNode = MSHookIvar<id>(postInfoNode, "authorButtonNode");
|
||||
id authorTextNode = [authorNode subnodes][0];
|
||||
|
||||
NSString *author = data[@"author"];
|
||||
|
||||
//id post = MSHookIvar<id>(self, "link");
|
||||
//MSHookIvar<NSString*>(post, "_author") = author; //Crashes when clicking on author name. You will have to search the author name to go find the profile.
|
||||
|
||||
author = [NSString stringWithFormat:@"by %@", author];
|
||||
|
||||
id prevAuthorAttributedString = [authorTextNode attributedString];
|
||||
NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])];
|
||||
NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes];
|
||||
|
||||
[authorTextNode setAttributedText:newAuthorAttributedString];
|
||||
[authorTextNode setAttributedString:newAuthorAttributedString];
|
||||
|
||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:data[@"body"] withAttributes:apolloBodyAttributes]];
|
||||
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%end
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
#import "BaconReader.h"
|
||||
#import "assets/MMMarkdown.h"
|
||||
#import "assets/TFHelper.h"
|
||||
#import "assets/MMMarkdown/MMMarkdown.h"
|
||||
|
||||
static BOOL isBaconReaderEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -126,85 +127,40 @@ id tfStoryController;
|
||||
%new
|
||||
-(void) handleUndeleteCommentAction{
|
||||
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[tfCommentCellView comment] serverID] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
id comment = [tfCommentCellView comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body", [comment serverID]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
[comment setAuthor:data[@"author"]];
|
||||
[comment setBody:body];
|
||||
[comment setBody_html:[%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil]];
|
||||
[comment setAttributedDescriptionString:nil];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
NSAttributedString *commentAttrString = [%c(BRUtils) attributedDescriptionForComment:comment];
|
||||
[comment setAttributedDescriptionString:commentAttrString];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[comment setAuthor: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] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
|
||||
}];
|
||||
[[[self detailPage] tableView] reloadData];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) handleUndeletePostAction{
|
||||
|
||||
id post = [self story];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[self story] serverID] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
%new
|
||||
-(void) completeUndeletePostAction:(NSDictionary *) data{
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext", [post serverID]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
tfPostAuthor = data[@"author"];
|
||||
tfPostSelftext = [%c(MMMarkdown) HTMLStringWithMarkdown:data[@"body"] extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
tfPostAuthor = author;
|
||||
tfPostSelftext = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
|
||||
[[self detailPage] performSelectorOnMainThread:@selector(refreshTouched) withObject:nil waitUntilDone:NO];
|
||||
|
||||
}];
|
||||
[[self detailPage] refreshTouched];
|
||||
}
|
||||
|
||||
%end
|
||||
|
118
tweak/Beam.xm
118
tweak/Beam.xm
@ -1,5 +1,6 @@
|
||||
|
||||
#import "Beam.h"
|
||||
#import "assets/TFHelper.h"
|
||||
|
||||
static BOOL isBeamEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -25,8 +26,6 @@ static CGFloat pushshiftRequestTimeoutValue;
|
||||
|
||||
NSString *commentBody = [[self comment] content];
|
||||
|
||||
HBLogDebug(@"body: %@", commentBody);
|
||||
|
||||
if ((isTFDeletedOnly && ([commentBody isEqualToString:@"[deleted]"] || [commentBody isEqualToString:@"[removed]"])) || !isTFDeletedOnly){
|
||||
|
||||
CGFloat authorTextHeight = [[self authorButton] frame].size.height;
|
||||
@ -51,45 +50,23 @@ static CGFloat pushshiftRequestTimeoutValue;
|
||||
|
||||
[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{
|
||||
|
||||
id comment = [self comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
[comment setAuthor:data[@"author"]];
|
||||
[comment setContent:data[@"body"]];
|
||||
[comment setMarkdownString:nil];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body", [comment identifier]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
[self setCommentDidChange:YES];
|
||||
[self reloadContents];
|
||||
[[MSHookIvar<id>(self, "delegate") tableView] reloadData];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setContent:body];
|
||||
[comment setMarkdownString:nil];
|
||||
|
||||
[self setCommentDidChange:YES];
|
||||
[self performSelectorOnMainThread:@selector(reloadContents) withObject:nil waitUntilDone:YES];
|
||||
[[MSHookIvar<id>(self, "delegate") tableView] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
@ -174,52 +151,32 @@ static CGFloat pushshiftRequestTimeoutValue;
|
||||
|
||||
if (post){
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext", [post identifier]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[post setAuthor:author];
|
||||
[post setContent:body];
|
||||
[post setMarkdownString:nil];
|
||||
|
||||
if ([self selfTextView]){
|
||||
[[self selfTextView] performSelectorOnMainThread:@selector(reloadContents) withObject:nil waitUntilDone:YES];
|
||||
}
|
||||
|
||||
if ([self metadataView]){
|
||||
[[self metadataView] performSelectorOnMainThread:@selector(setPost:) withObject:post waitUntilDone:YES];
|
||||
}
|
||||
|
||||
[[self tableView] performSelectorOnMainThread:@selector(reloadData) withObject:post waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[post identifier] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeletePostAction:(NSDictionary *) data{
|
||||
|
||||
id post = [self post];
|
||||
|
||||
[post setAuthor:data[@"author"]];
|
||||
[post setContent:data[@"body"]];
|
||||
[post setMarkdownString:nil];
|
||||
|
||||
if ([self selfTextView]){
|
||||
[[self selfTextView] reloadContents];
|
||||
}
|
||||
|
||||
if ([self metadataView]){
|
||||
[[self metadataView] setPost:post];
|
||||
}
|
||||
|
||||
[[self tableView] reloadData];
|
||||
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%end
|
||||
@ -274,4 +231,3 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
139
tweak/Narwhal.xm
139
tweak/Narwhal.xm
@ -1,5 +1,6 @@
|
||||
|
||||
#import "Narwhal.h"
|
||||
#import "assets/TFHelper.h"
|
||||
|
||||
static BOOL isNarwhalEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -12,37 +13,7 @@ id tfComment;
|
||||
id tfController;
|
||||
|
||||
void getUndeleteCommentData(id controller, id comment){
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment fullName] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[controller performSelectorOnMainThread:@selector(completeUndeleteComment:) withObject:@{@"body":body, @"author":author, @"comment":comment} waitUntilDone:NO];
|
||||
}];
|
||||
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"comment" : comment} completionTarget:controller completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
|
||||
|
||||
@ -61,7 +32,6 @@ void getUndeleteCommentData(id controller, id comment){
|
||||
}
|
||||
|
||||
[arg1 addAction:undeleteAction];
|
||||
|
||||
}
|
||||
|
||||
%orig;
|
||||
@ -72,70 +42,6 @@ void getUndeleteCommentData(id controller, id comment){
|
||||
|
||||
%hook NRTLinkViewController
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteComment:(id) data{
|
||||
|
||||
id comment = data[@"comment"];
|
||||
|
||||
if (comment){
|
||||
|
||||
MSHookIvar<NSString*>(comment, "_author") = data[@"author"];
|
||||
MSHookIvar<NSString*>(comment, "_body") = data[@"body"];
|
||||
|
||||
[[self commentsManager] updateComment:comment fromEdited:comment];
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeletePost:(id) data{
|
||||
|
||||
id post = data[@"post"];
|
||||
|
||||
MSHookIvar<NSString*>(post, "_author") = data[@"author"];
|
||||
|
||||
NSAttributedString* postBodyAttributedString = [%c(NRTMarkdownManager) attributedStringFromMarkdown:data[@"body"] type:0];
|
||||
[self setLinkText:postBodyAttributedString];
|
||||
|
||||
[[self tableView] reloadData];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) handleUndeletePostAction{
|
||||
|
||||
id post = [self link];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[[post fullName] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
[self performSelectorOnMainThread:@selector(completeUndeletePost:) withObject:@{@"body":body, @"author":author, @"post":post} waitUntilDone:NO];
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
-(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{
|
||||
|
||||
if (arg2 == 2){
|
||||
@ -174,13 +80,29 @@ void getUndeleteCommentData(id controller, id comment){
|
||||
shouldHaveUndeleteAction = NO;
|
||||
}
|
||||
|
||||
%end
|
||||
%new
|
||||
-(void) handleUndeletePostAction{
|
||||
|
||||
id post = [self link];
|
||||
|
||||
%hook NRTMediaTableViewDataSource
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"post" : post} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteComment:(id) data{
|
||||
-(void) completeUndeletePostAction:(NSDictionary *) data{
|
||||
|
||||
id post = data[@"post"];
|
||||
|
||||
MSHookIvar<NSString*>(post, "_author") = data[@"author"];
|
||||
|
||||
NSAttributedString* postBodyAttributedString = [%c(NRTMarkdownManager) attributedStringFromMarkdown:data[@"body"] type:0];
|
||||
[self setLinkText:postBodyAttributedString];
|
||||
|
||||
[[self tableView] reloadData];
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
id comment = data[@"comment"];
|
||||
|
||||
@ -193,6 +115,11 @@ void getUndeleteCommentData(id controller, id comment){
|
||||
}
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
|
||||
%hook NRTMediaTableViewDataSource
|
||||
|
||||
-(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{
|
||||
|
||||
if (arg2 == 2){
|
||||
@ -213,6 +140,20 @@ void getUndeleteCommentData(id controller, id comment){
|
||||
shouldHaveUndeleteAction = NO;
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeleteCommentAction:(NSDictionary *) data{
|
||||
|
||||
id comment = data[@"comment"];
|
||||
|
||||
if (comment){
|
||||
|
||||
MSHookIvar<NSString*>(comment, "_author") = data[@"author"];
|
||||
MSHookIvar<NSString*>(comment, "_body") = data[@"body"];
|
||||
|
||||
[[self commentsManager] updateComment:comment fromEdited:comment];
|
||||
}
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%end
|
||||
|
@ -21,6 +21,10 @@
|
||||
-(void) reloadPostSection:(BOOL) arg1;
|
||||
-(void) feedPostViewDidUpdatePost:(id) arg1 shouldReloadFeed:(BOOL) arg2;
|
||||
-(void) updateFloatingViews;
|
||||
|
||||
//custom elements
|
||||
-(void) updateComments;
|
||||
-(void) updatePostText;
|
||||
@end
|
||||
|
||||
@interface CommentActionSheetViewController : UIViewController
|
||||
|
551
tweak/Reddit.xm
551
tweak/Reddit.xm
@ -1,5 +1,6 @@
|
||||
|
||||
#import "Reddit.h"
|
||||
#import "assets/TFHelper.h"
|
||||
|
||||
static BOOL isRedditEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -94,97 +95,79 @@ int getRedditVersionPart(int index){
|
||||
id commentTreeNode = [self commentTreeNode];
|
||||
Comment *comment = [commentTreeNode comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSMutableAttributedString *bodyMutableAttributedText;
|
||||
|
||||
id themeManager;
|
||||
id isNightMode;
|
||||
id textColor;
|
||||
|
||||
if (getRedditVersionPart(1) >= 45){
|
||||
themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]];
|
||||
isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"];
|
||||
|
||||
if (isNightMode) {
|
||||
textColor = [[themeManager darkTheme] bodyTextColor];
|
||||
} else{
|
||||
textColor = [[themeManager lightTheme] bodyTextColor];
|
||||
}
|
||||
|
||||
[themeManager release];
|
||||
|
||||
} else if (getRedditVersionPart(1) >= 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{
|
||||
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{
|
||||
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 addAttribute:NSForegroundColorAttributeName value:textColor range:range];
|
||||
}];
|
||||
[bodyMutableAttributedText endEditing];
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBodyText:body];
|
||||
[comment setBodyRichTextAttributed:bodyMutableAttributedText];
|
||||
[comment setBodyAttributedText:bodyMutableAttributedText];
|
||||
|
||||
[[commentTreeNode commentTreeHeaderNode] performSelectorOnMainThread:@selector(updateContentViewsForData:) withObject:comment waitUntilDone:NO];
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
}
|
||||
|
||||
%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 (getRedditVersionPart(1) >= 45){
|
||||
themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]];
|
||||
isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"];
|
||||
|
||||
if (isNightMode) {
|
||||
textColor = [[themeManager darkTheme] bodyTextColor];
|
||||
} else{
|
||||
textColor = [[themeManager lightTheme] bodyTextColor];
|
||||
}
|
||||
|
||||
[themeManager release];
|
||||
|
||||
} else if (getRedditVersionPart(1) >= 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{
|
||||
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{
|
||||
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 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];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
|
||||
@ -242,102 +225,83 @@ int getRedditVersionPart(int index){
|
||||
|
||||
if ([post isSelfPost]){
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[[post pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
id themeManager;
|
||||
id isNightMode;
|
||||
id textColor;
|
||||
|
||||
if (getRedditVersionPart(1) >= 45){
|
||||
themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]];
|
||||
isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"];
|
||||
|
||||
if (isNightMode) {
|
||||
textColor = [[themeManager darkTheme] bodyTextColor];
|
||||
} else{
|
||||
textColor = [[themeManager lightTheme] bodyTextColor];
|
||||
}
|
||||
|
||||
[themeManager release];
|
||||
|
||||
} else if (getRedditVersionPart(1) >= 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{
|
||||
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{
|
||||
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 addAttribute:NSForegroundColorAttributeName value:textColor range:range];
|
||||
}];
|
||||
[bodyMutableAttributedText endEditing];
|
||||
|
||||
[post setSelfText:body];
|
||||
[post setAuthor:author];
|
||||
[post setSelfPostRichTextAttributed:bodyMutableAttributedText];
|
||||
[post setPreviewFeedPostTextString:bodyMutableAttributedText];
|
||||
|
||||
if (getRedditVersionPart(1) >= 44){
|
||||
[[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] contentNode] configureSelfTextNode];
|
||||
} else if (getRedditVersionPart(1) >= 38) {
|
||||
[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] configureSelfTextNode];
|
||||
} else {
|
||||
[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] configureSelfTextNode];
|
||||
[[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] titleNode] configureNodes];
|
||||
}
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(void) completeUndeletePostAction:(NSDictionary *) data{
|
||||
Post *post = [self post];
|
||||
|
||||
NSString *author = data[@"author"];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
id themeManager;
|
||||
id isNightMode;
|
||||
id textColor;
|
||||
|
||||
if (getRedditVersionPart(1) >= 45){
|
||||
themeManager = [[%c(ThemeManager) alloc] initWithAppSettings:[%c(AppSettings) sharedSettings]];
|
||||
isNightMode = [[[%c(AccountManager) sharedManager] defaults] objectForKey:@"kUseNightKey"];
|
||||
|
||||
if (isNightMode) {
|
||||
textColor = [[themeManager darkTheme] bodyTextColor];
|
||||
} else{
|
||||
textColor = [[themeManager lightTheme] bodyTextColor];
|
||||
}
|
||||
|
||||
[themeManager release];
|
||||
|
||||
} else if (getRedditVersionPart(1) >= 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{
|
||||
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{
|
||||
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 addAttribute:NSForegroundColorAttributeName value:textColor range:range];
|
||||
}];
|
||||
[bodyMutableAttributedText endEditing];
|
||||
|
||||
[post setSelfText:body];
|
||||
[post setAuthor:author];
|
||||
[post setSelfPostRichTextAttributed:bodyMutableAttributedText];
|
||||
[post setPreviewFeedPostTextString:bodyMutableAttributedText];
|
||||
|
||||
if (getRedditVersionPart(1) >= 44){
|
||||
[[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] contentNode] configureSelfTextNode];
|
||||
} else if (getRedditVersionPart(1) >= 38) {
|
||||
[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] configureSelfTextNode];
|
||||
} else {
|
||||
[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] configureSelfTextNode];
|
||||
[[[[[self postActionSheetDelegate] controller] feedPostDetailCellNode] titleNode] configureNodes];
|
||||
}
|
||||
|
||||
[bodyMutableAttributedText release];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%end
|
||||
@ -405,46 +369,7 @@ int getRedditVersionPart(int index){
|
||||
|
||||
Comment *comment = [self comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]];
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBodyText:body];
|
||||
[comment setBodyRichTextAttributed:bodyMutableAttributedText];
|
||||
[comment setBodyAttributedText:bodyMutableAttributedText];
|
||||
|
||||
[[self commentActionSheetDelegate] performSelectorOnMainThread:@selector(updateComments) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
}
|
||||
|
||||
@ -458,51 +383,31 @@ int getRedditVersionPart(int index){
|
||||
|
||||
Comment *comment = [self comment];
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]];
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBodyText:body];
|
||||
[comment setBodyAttributedText:bodyMutableAttributedText];
|
||||
|
||||
if (getRedditVersionPart(1) >= 12) {
|
||||
[comment setBodyRichTextAttributed:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
[[self commentActionSheetDelegate] performSelectorOnMainThread:@selector(updateComments) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[comment pk] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)];
|
||||
}
|
||||
}
|
||||
|
||||
%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];
|
||||
|
||||
if (getRedditVersionPart(1) >= 12) {
|
||||
[comment setBodyRichTextAttributed:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
[[self commentActionSheetDelegate] updateComments];
|
||||
|
||||
[bodyMutableAttributedText release];
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
@ -552,46 +457,7 @@ int getRedditVersionPart(int index){
|
||||
|
||||
if ([post isSelfPost]){
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[[post pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]];
|
||||
|
||||
[post setSelfText:body];
|
||||
[post setAuthor:author];
|
||||
[post setSelfPostRichTextAttributed:bodyMutableAttributedText];
|
||||
[post setPreviewFeedPostTextString:bodyMutableAttributedText];
|
||||
|
||||
[[self postActionSheetDelegate] performSelectorOnMainThread:@selector(updatePostText) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -608,56 +474,37 @@ int getRedditVersionPart(int index){
|
||||
|
||||
if ([post isSelfPost]){
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/submission/?ids=%@&fields=author,selftext",[[post pk] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
|
||||
NSMutableAttributedString *bodyMutableAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:[%c(NSAttributedStringMarkdownParser) attributedStringUsingCurrentConfig:body]];
|
||||
|
||||
[post setAuthor:author];
|
||||
[post setSelfText:body];
|
||||
[post setSelfTextAttributed:bodyMutableAttributedText];
|
||||
|
||||
if (getRedditVersionPart(1) >= 8) {
|
||||
[post setSelfPostRichTextAttributed:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
if (getRedditVersionPart(1) >= 15) {
|
||||
[post setPreviewFeedPostTextString:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
[[self postActionSheetDelegate] performSelectorOnMainThread:@selector(updatePostText) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[request release];
|
||||
[queue release];
|
||||
[bodyMutableAttributedText release];
|
||||
}];
|
||||
[%c(TFHelper) getUndeleteDataWithID:[[post pk] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%new
|
||||
-(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 (getRedditVersionPart(1) >= 8) {
|
||||
[post setSelfPostRichTextAttributed:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
if (getRedditVersionPart(1) >= 15) {
|
||||
[post setPreviewFeedPostTextString:bodyMutableAttributedText];
|
||||
}
|
||||
|
||||
[[self postActionSheetDelegate] updatePostText];
|
||||
|
||||
[bodyMutableAttributedText release];
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%end
|
||||
|
202
tweak/Slide.xm
202
tweak/Slide.xm
@ -1,6 +1,7 @@
|
||||
|
||||
#import "Slide.h"
|
||||
#import "assets/MMMarkdown.h"
|
||||
#import "assets/TFHelper.h"
|
||||
#import "assets/MMMarkdown/MMMarkdown.h"
|
||||
|
||||
static BOOL isSlideEnabled;
|
||||
static BOOL isTFDeletedOnly;
|
||||
@ -289,128 +290,111 @@ static UIButton * createUndeleteButton(){
|
||||
|
||||
[sender setEnabled:NO];
|
||||
|
||||
id comment = MSHookIvar<id>(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{
|
||||
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
id textStackDisplayView = MSHookIvar<id>(self, "commentBody");
|
||||
id comment = MSHookIvar<id>(self, "comment");
|
||||
|
||||
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
|
||||
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
|
||||
NSString *author = data[@"author"];
|
||||
NSString *body = data[@"body"];
|
||||
|
||||
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment id] componentsSeparatedByString:@"_"][1]]]];
|
||||
[request setHTTPMethod:@"GET"];
|
||||
[request setTimeoutInterval:pushshiftRequestTimeoutValue];
|
||||
//Attributed string generation rewrote from Slide_for_Reddit.TextDisplayStackView.createAttributedChunk(...)
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
|
||||
UIFont *font = [%c(FontGenerator) fontOfSize:MSHookIvar<CGFloat>(textStackDisplayView, "fontSize") submission:NO willOffset:YES];
|
||||
|
||||
NSString *author = @"[author]";
|
||||
NSString *body = @"[body]";
|
||||
NSString *themeName = [userDefaults stringForKey:@"theme"];
|
||||
UIColor *fontColor = [%c(ColorUtil) fontColorForTheme:themeName];
|
||||
UIColor *accentColor = [%c(ColorUtil) accentColorForSub:[comment subreddit]];
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
|
||||
if ([[jsonData objectForKey:@"data"] count] != 0){
|
||||
author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
|
||||
body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
NSString *html = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
|
||||
html = [[html stringByReplacingOccurrencesOfString:@"<sup>" withString:@"<font size=\"1\">"] stringByReplacingOccurrencesOfString:@"</sup>" withString:@"</font>"];
|
||||
html = [[html stringByReplacingOccurrencesOfString:@"<del>" withString:@"<font color=\"green\">"] stringByReplacingOccurrencesOfString:@"</del>" withString:@"</font>"];
|
||||
html = [[html stringByReplacingOccurrencesOfString:@"<code>" withString:@"<font color=\"blue\">"] stringByReplacingOccurrencesOfString:@"</code>" withString:@"</font>"];
|
||||
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]]){
|
||||
UIColor *attrColor = (UIColor *) attributes[key];
|
||||
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 {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
} else if ([(NSURL *) attributes[key] isKindOfClass:[NSURL class]]){
|
||||
NSURL *attrUrl = (NSURL *)attributes[key];
|
||||
|
||||
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: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;
|
||||
}
|
||||
} else if (error != nil || data == nil){
|
||||
body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
|
||||
}
|
||||
}];
|
||||
|
||||
[htmlAttributedString beginEditing];
|
||||
[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];
|
||||
}
|
||||
|
||||
//Attributed string generation rewrote from Slide_for_Reddit.TextDisplayStackView.createAttributedChunk(...)
|
||||
[htmlAttributedString removeAttribute:NSFontAttributeName range:range];
|
||||
[htmlAttributedString addAttribute:NSFontAttributeName value:newFont range:range];
|
||||
|
||||
UIFont *font = [%c(FontGenerator) fontOfSize:MSHookIvar<CGFloat>(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:@"<sup>" withString:@"<font size=\"1\">"] stringByReplacingOccurrencesOfString:@"</sup>" withString:@"</font>"];
|
||||
html = [[html stringByReplacingOccurrencesOfString:@"<del>" withString:@"<font color=\"green\">"] stringByReplacingOccurrencesOfString:@"</del>" withString:@"</font>"];
|
||||
html = [[html stringByReplacingOccurrencesOfString:@"<code>" withString:@"<font color=\"blue\">"] stringByReplacingOccurrencesOfString:@"</code>" withString:@"</font>"];
|
||||
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]]){
|
||||
UIColor *attrColor = (UIColor *) attributes[key];
|
||||
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]]){
|
||||
NSURL *attrUrl = (NSURL *)attributes[key];
|
||||
|
||||
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: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;
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
||||
[htmlAttributedString beginEditing];
|
||||
[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 endEditing];
|
||||
|
||||
NSMutableAttributedString *newCommentText = [MSHookIvar<NSMutableAttributedString *>(self, "cellContent") initWithAttributedString:htmlAttributedString];
|
||||
NSAttributedString *tempAttributedString = [[NSAttributedString alloc] initWithString:@""];
|
||||
[newCommentText appendAttributedString:tempAttributedString]; //to keep the compiler happy
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBody:body];
|
||||
|
||||
id controller = MSHookIvar<id>(self, "parent");
|
||||
|
||||
[self performSelectorOnMainThread:@selector(showMenu:) withObject:nil waitUntilDone:YES];
|
||||
[MSHookIvar<id>(controller, "tableView") performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
|
||||
|
||||
[sender setEnabled:YES];
|
||||
}];
|
||||
[htmlAttributedString endEditing];
|
||||
|
||||
NSMutableAttributedString *newCommentText = [MSHookIvar<NSMutableAttributedString *>(self, "cellContent") initWithAttributedString:htmlAttributedString];
|
||||
NSAttributedString *tempAttributedString = [[NSAttributedString alloc] initWithString:@""];
|
||||
[newCommentText appendAttributedString:tempAttributedString]; //to keep the compiler happy
|
||||
|
||||
[comment setAuthor:author];
|
||||
[comment setBody:body];
|
||||
|
||||
id controller = MSHookIvar<id>(self, "parent");
|
||||
|
||||
[self showMenu:nil];
|
||||
[MSHookIvar<id>(controller, "tableView") reloadData];
|
||||
|
||||
[data[@"sender"] setEnabled:YES];
|
||||
}
|
||||
|
||||
%end
|
||||
|
6
tweak/assets/TFHelper.h
Normal file
6
tweak/assets/TFHelper.h
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
@interface TFHelper : NSObject
|
||||
|
||||
+(void) getUndeleteDataWithID:(NSString *) ident isComment:(BOOL) isComment timeout:(CGFloat) timeout extraData:(NSDictionary *) extra completionTarget:(id) target completionSelector:(SEL) sel;
|
||||
|
||||
@end
|
50
tweak/assets/TFHelper.m
Normal file
50
tweak/assets/TFHelper.m
Normal file
@ -0,0 +1,50 @@
|
||||
|
||||
#import "TFHelper.h"
|
||||
|
||||
@implementation TFHelper
|
||||
|
||||
+(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]";
|
||||
|
||||
if (data != nil && error == nil){
|
||||
id jsonData = [[NSJSONSerialization JSONObjectWithData:data options:0 error:&error] objectForKey:@"data"];
|
||||
if ([jsonData count] != 0){
|
||||
author = [jsonData[0] objectForKey:@"author"];
|
||||
body = isComment ? [jsonData[0] objectForKey:@"body"] : [jsonData[0] objectForKey:@"selftext"];
|
||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
|
||||
body = @"[pushshift was unable to archive this]";
|
||||
}
|
||||
} else {
|
||||
body = @"[pushshift has not archived this yet]";
|
||||
}
|
||||
} 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];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
Reference in New Issue
Block a user