Files
RyukGram/src/Features/General/HideMetaAI.xm
T

572 lines
17 KiB
Plaintext

#import "../../Utils.h"
#import "../../InstagramHeaders.h"
// Direct
// Meta AI button functionality on direct search bar
%hook IGDirectInboxViewController
- (void)searchBarMetaAIButtonTappedOnSearchBar:(id)arg1 {
if ([SCIUtils getBoolPref:@"hide_meta_ai"])
{
NSLog(@"[SCInsta] Hiding meta ai: direct search bar functionality");
return;
}
return %orig;
}
%end
// AI agents in direct new message view
%hook IGDirectRecipientGenAIBotsResult
- (id)initWithGenAIBots:(id)arg1 lastFetchedTimestamp:(id)arg2 {
if ([SCIUtils getBoolPref:@"hide_meta_ai"])
{
NSLog(@"[SCInsta] Hiding meta ai: direct recipient ai agents");
return nil;
}
return %orig;
}
%end
// Meta AI in message composer
%hook IGDirectCommandSystemListViewController
- (id)objectsForListAdapter:(id)arg1 {
NSArray *originalObjs = %orig();
NSMutableArray *filteredObjs = [NSMutableArray arrayWithCapacity:[originalObjs count]];
for (id obj in originalObjs) {
BOOL shouldHide = NO;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
if ([obj isKindOfClass:%c(IGDirectCommandSystemViewModel)]) {
IGDirectCommandSystemViewModel *typedObj = (IGDirectCommandSystemViewModel *)obj;
IGDirectCommandSystemRow *cmdSystemRow = (IGDirectCommandSystemRow *)[typedObj row];
IGDirectCommandSystemResult *_commandResult_command = MSHookIvar<IGDirectCommandSystemResult *>(cmdSystemRow, "_commandResult_command");
if (_commandResult_command != nil) {
// Meta AI
if ([[_commandResult_command title] isEqualToString:@"Meta AI"]) {
NSLog(@"[SCInsta] Hiding meta ai: direct message composer suggestion");
shouldHide = YES;
}
// Meta AI (Imagine)
else if ([[_commandResult_command commandString] hasPrefix:@"/imagine"]) {
NSLog(@"[SCInsta] Hiding meta ai: direct message composer /imagine suggestion");
shouldHide = YES;
}
}
}
}
// Populate new objs array
if (!shouldHide) {
[filteredObjs addObject:obj];
}
}
return [filteredObjs copy];
}
%end
// Suggested AI chats in direct inbox header
%hook IGDirectInboxNavigationHeaderView
- (id)initWithFrame:(CGRect)arg1
title:(id)arg2
titleView:(id)arg3
directInboxConfig:(IGDirectInboxConfig *)config
userSession:(id)arg5
loggingDelegate:(id)arg6
{
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: suggested ai chats in direct inbox header");
@try {
[config setValue:0 forKey:@"shouldShowAIChatsEntrypointButton"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
}
return %orig(arg1, arg2, arg3, [config copy], arg5, arg6);
}
%end
// Meta AI "imagine" in media picker
%hook IGDirectMediaPickerViewController
- (id)initWithUserSession:(id)arg1
config:(IGDirectMediaPickerConfig *)config
capabilities:(id)arg3
threadMetadata:(id)arg4
messageSender:(id)arg5
threadAnalyticsLogger:(id)arg6
multimodalPerfLogger:(id)arg7
localSendSpeedLogger:(id)arg8
sendAttributionFactory:(id)arg9
{
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: imagine tile in media picker");
@try {
IGDirectMediaPickerGalleryConfig *galleryConfig = [config valueForKey:@"galleryConfig"];
[galleryConfig setValue:0 forKey:@"isImagineEntryPointEnabled"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
}
return %orig(arg1, [config copy], arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
%end
// Write with meta ai in message composer
%hook IGDirectComposer
- (id)initWithLayoutSpecProvider:(id)arg1
userLauncherSetProviding:(id)arg2
config:(IGDirectComposerConfig *)config
style:(id)arg4
text:(id)arg5
{
return %orig(arg1, arg2, [self patchConfig:config], arg4, arg5);
}
- (id)initWithLayoutSpecProvider:(id)arg1
userLauncherSetProviding:(id)arg2
config:(IGDirectComposerConfig *)config
style:(id)arg4
text:(id)arg5
shouldUpdateModeLater:(BOOL)arg6
{
return %orig(arg1, arg2, [self patchConfig:config], arg4, arg5, arg6);
}
- (void)setConfig:(IGDirectComposerConfig *)config {
%orig([self patchConfig:config]);
return;
}
%new - (IGDirectComposerConfig *)patchConfig:(IGDirectComposerConfig *)config {
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: reconfiguring direct composer");
// writeWithAIEnabled
@try {
[config setValue:0 forKey:@"writeWithAIEnabled"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
}
return [config copy];
}
%end
// Direct sticker tray picker view
%hook IGStickerTrayListAdapterDataSource
- (id)objectsForListAdapter:(id)arg1 {
NSArray *originalObjs = %orig();
NSMutableArray *filteredObjs = [NSMutableArray arrayWithCapacity:[originalObjs count]];
for (id obj in originalObjs) {
BOOL shouldHide = NO;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
if ([obj isKindOfClass:%c(IGDirectUnifiedComposerAIStickerModel)]) {
NSLog(@"[SCInsta] Hiding meta ai: AI stickers option in sticker view");
shouldHide = YES;
}
}
// Populate new objs array
if (!shouldHide) {
[filteredObjs addObject:obj];
}
}
return [filteredObjs copy];
}
%end
// Long press menu on messages
// Demangled name: IGDirectMessageMenuConfiguration.IGDirectMessageMenuConfiguration
%hook _TtC32IGDirectMessageMenuConfiguration32IGDirectMessageMenuConfiguration
+ (id)menuConfigurationWithEligibleOptions:(id)options
messageViewModel:(id)arg2
contentType:(id)arg3
isSticker:(_Bool)arg4
isMusicSticker:(_Bool)arg5
directNuxManager:(id)arg6
sessionUserDefaults:(id)arg7
launcherSet:(id)arg8
userSession:(id)arg9
tapHandler:(id)arg10
{
// 31: Restyle
// 41: Make AI image
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", @[ @(31), @(41) ]];
NSArray *newOptions = [options filteredArrayUsingPredicate:predicate];
return %orig([newOptions copy], arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
}
%end
// Expanded in-chat photo UI
// Demangled name: IGDirectAggregatedMediaViewerComponentsSwift.IGDirectAggregatedMediaViewerViewControllerTitleViewModelObject
%hook _TtC44IGDirectAggregatedMediaViewerComponentsSwift63IGDirectAggregatedMediaViewerViewControllerTitleViewModelObject
- (id)initWithAuthorProfileImage:(id)arg1
authorUsername:(id)arg2
canForward:(_Bool)arg3
canSave:(_Bool)arg4
canAddToStory:(_Bool)arg5
canShowAIRestyle:(_Bool)arg6
canUnsend:(_Bool)arg7
canReport:(_Bool)arg8
displayConfig:(id)arg9
isPending:(_Bool)arg10
isMoreMenuListStyle:(_Bool)arg11
senderIsCurrentUser:(_Bool)arg12
shouldHideInfoViews:(_Bool)arg13
subtitle:(id)arg14
entryPoint:(long long)arg15
canTapAuthor:(_Bool)arg16
{
BOOL showAiRestyle = [SCIUtils getBoolPref:@"hide_meta_ai"] ? false : arg6;
return %orig(arg1, arg2, arg3, arg4, arg5, showAiRestyle, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16);
}
%end
// AI generated DM channel themes
%hook IGDirectThreadThemePickerViewController
- (id)objectsForListAdapter:(id)arg1 {
NSArray *originalObjs = %orig();
NSMutableArray *filteredObjs = [NSMutableArray arrayWithCapacity:[originalObjs count]];
for (id obj in originalObjs) {
BOOL shouldHide = NO;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
if (
[obj isKindOfClass:%c(IGDirectThreadThemePickerOption)]
&& [[obj valueForKey:@"themeId"] isEqualToString:@"direct_ai_theme_creation"]
) {
NSLog(@"[SCInsta] Hiding meta ai: AI generated DM channel themes");
shouldHide = YES;
}
}
// Populate new objs array
if (!shouldHide) {
[filteredObjs addObject:obj];
}
}
return [filteredObjs copy];
}
%end
// "Click to summarize" pill under DM navigation bar
%hook IGDirectThreadViewMetaAISummaryFeatureController
- (id)initWithUserSession:(id)arg1 mutableStateProvider:(id)arg2 threadViewControllerFeatureDelegate:(id)arg3 presentingViewController:(id)arg4 {
return nil;
}
%end
/////////////////////////////////////////////////////////////////////////////
// Explore
// Meta AI explore search summary
%hook IGDiscoveryListKitGQLDataSource
- (id)objectsForListAdapter:(id)arg1 {
NSArray *originalObjs = %orig();
NSMutableArray *filteredObjs = [NSMutableArray arrayWithCapacity:[originalObjs count]];
for (id obj in originalObjs) {
BOOL shouldHide = NO;
// Meta AI summary
if ([obj isKindOfClass:%c(IGSearchMetaAIHCMModel)]) {
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding explore meta ai search summary");
shouldHide = YES;
}
}
// Populate new objs array
if (!shouldHide) {
[filteredObjs addObject:obj];
}
}
return [filteredObjs copy];
}
%end
// Meta AI search bar ring button
%hook IGSearchBarDonutButton
- (void)didMoveToWindow {
%orig;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
[self removeFromSuperview];
}
}
%end
/////////////////////////////////////////////////////////////////////////////
// Reels/Sundial
// Suggested AI searches in comment section
%hook IGCommentThreadAICarousel
- (id)initWithLauncherSet:(id)arg1 hasSearchPrefix:(BOOL)arg2 {
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: suggested ai searches comment carousel");
return nil;
}
return %orig;
}
%end
%hook _TtC34IGCommentThreadAICarouselPillSwift30IGCommentThreadAICarouselSwift
- (id)initWithLauncherSet:(id)arg1 hasSearchPrefix:(BOOL)arg2 {
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: suggested ai searches comment carousel");
return nil;
}
return %orig;
}
%end
/////////////////////////////////////////////////////////////////////////////
// Story
// AI images "add to story" suggestion
// Demangled name: IGGalleryDestinationToolbar.IGGalleryDestinationToolbarView
%hook _TtC27IGGalleryDestinationToolbar31IGGalleryDestinationToolbarView
- (void)setTools:(id)tools {
NSArray *newTools = [tools copy];
NSLog(@"[SCInsta] Hiding meta ai: ai images add to story suggestion");
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", @[ @(10), @(11) ]];
newTools = [tools filteredArrayUsingPredicate:predicate];
}
%orig(newTools);
return;
}
%end
// AI generated fonts in text entry
%hook IGCreationTextToolView
- (id)initWithMenuConfiguration:(unsigned long long)configuration userSession:(id)session creationEntryPoint:(long long)point isAIFontsEnabled:(_Bool)enabled genAINuxManager:(id)manager showFontBadge:(_Bool)badge {
return %orig(configuration, session, point, [SCIUtils getBoolPref:@"hide_meta_ai"] ? false : enabled, manager, badge);
}
%end
// Text rewrite in text entry
%hook IGStoryTextMentionLocationPickerView
- (id)initWithIsTextRewriteEnabled:(_Bool)arg1
isImageRewriteEnabled:(_Bool)arg2
isStackedToolSelectorEnabled:(_Bool)arg3
isMentionLocationVisible:(_Bool)arg4
isEnabledForFeedCaption:(_Bool)arg5
isFeedEntryPoint:(_Bool)arg6
{
_Bool isTextRewriteEnabled = [SCIUtils getBoolPref:@"hide_meta_ai"] ? false : arg1;
_Bool isImageRewriteEnabled = [SCIUtils getBoolPref:@"hide_meta_ai"] ? false : arg2;
return %orig(isTextRewriteEnabled, isImageRewriteEnabled, arg3, arg4, arg5, arg6);
}
%end
// "Imagine background" in story editor vertical action bar
%hook _TtC17IGCreationOSSwift19IGCreationHeaderBar
- (void)setButtons:(id)buttons maxItems:(NSInteger)max {
NSArray *filteredObjs = buttons;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
filteredObjs = [filteredObjs filteredArrayUsingPredicate:
[NSPredicate predicateWithBlock:^BOOL(IGCreationActionBarLabeledButton *obj, NSDictionary *bindings) {
return !(
obj.button
&& [((IGCreationActionBarButton *)obj.button).accessibilityIdentifier isEqualToString:@"contextual-background"]
);
}]
];
}
%orig(filteredObjs, max);
}
%end
/////////////////////////////////////////////////////////////////////////////
// Other
// Meta AI-branded search bars
%hook IGSearchBar
- (id)initWithConfig:(IGSearchBarConfig *)config {
return %orig([self sanitizePlaceholderForConfig:config]);
}
- (id)initWithConfig:(IGSearchBarConfig *)config userSession:(id)arg2 {
return %orig([self sanitizePlaceholderForConfig:config], arg2);
}
- (void)setConfig:(IGSearchBarConfig *)config {
%orig([self sanitizePlaceholderForConfig:config]);
return;
}
%new - (IGSearchBarConfig *)sanitizePlaceholderForConfig:(IGSearchBarConfig *)config {
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: reconfiguring search bar");
NSString *placeholder = [config valueForKey:@"placeholder"];
if ([placeholder containsString:@"Meta AI"]) {
// placeholder
@try {
[config setValue:@"Search" forKey:@"placeholder"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
// shouldAnimatePlaceholder
@try {
[config setValue:0 forKey:@"shouldAnimatePlaceholder"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
NSLog(@"[SCInsta] Changed search bar placeholder from: \"%@\" to \"%@\"", placeholder, [config valueForKey:@"placeholder"]);
// leftIconStyle
@try {
[config setValue:0 forKey:@"leftIconStyle"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
// rightButtonStyle
@try {
[config setValue:0 forKey:@"rightButtonStyle"];
}
@catch (NSException *exception) {
NSLog(@"[SCInsta] WARNING: %@\n\nFull object: %@", exception.reason, config);
}
}
}
return [config copy];
}
%end
// Themed in-app buttons
%hook IGTapButton
- (void)didMoveToWindow {
%orig;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
// Hide buttons that are associated with meta ai
if ([self.accessibilityIdentifier containsString:@"meta_ai"]) {
NSLog(@"[SCInsta] Hiding meta ai: meta ai associated button");
[self removeFromSuperview];
}
}
}
%end
// Home feed meta ai button
%hook IGFloatingActionButton.IGFloatingActionButton
- (void)didMoveToSuperview {
%orig;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
[self removeFromSuperview];
NSLog(@"[SCInsta] Hiding meta ai: home feed meta ai button");
}
}
%end
// Share menu recipients
%hook IGDirectRecipientListViewController
- (id)objectsForListAdapter:(id)arg1 {
NSArray *originalObjs = %orig();
NSMutableArray *filteredObjs = [NSMutableArray arrayWithCapacity:[originalObjs count]];
for (id obj in originalObjs) {
BOOL shouldHide = NO;
if ([SCIUtils getBoolPref:@"hide_meta_ai"]) {
if ([obj isKindOfClass:%c(IGDirectRecipientCellViewModel)]) {
// Meta AI (catch-all)
if ([[[obj recipient] threadName] isEqualToString:@"Meta AI"]) {
NSLog(@"[SCInsta] Hiding meta ai suggested as recipient (share menu)");
shouldHide = YES;
}
}
}
// Populate new objs array
if (!shouldHide) {
[filteredObjs addObject:obj];
}
}
return [filteredObjs copy];
}
%end