GLEGram 12.5 — Initial public release

Based on Swiftgram 12.5 (Telegram iOS 12.5).
All GLEGram features ported and organized in GLEGram/ folder.

Features: Ghost Mode, Saved Deleted Messages, Content Protection Bypass,
Font Replacement, Fake Profile, Chat Export, Plugin System, and more.

See CHANGELOG_12.5.md for full details.
This commit is contained in:
Leeksov
2026-04-06 09:48:12 +03:00
commit 4647310322
39685 changed files with 11052678 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
objc_library(
name = "ContactsHelper",
enable_modules = True,
module_name = "ContactsHelper",
srcs = glob([
"Sources/**/*.m",
"Sources/**/*.h",
], allow_empty = True),
hdrs = glob([
"PublicHeaders/**/*.h",
]),
includes = [
"PublicHeaders",
],
sdk_frameworks = [
"Foundation",
],
visibility = [
"//visibility:public",
],
)
@@ -0,0 +1,30 @@
#ifndef ContactsHelper_h
#define ContactsHelper_h
#import <Foundation/Foundation.h>
#import <Contacts/Contacts.h>
NS_ASSUME_NONNULL_BEGIN
@interface ContactsEnumerateChangeResult : NSObject
@property (nonatomic, strong) NSData * _Nullable stateToken;
- (instancetype)initWithStateToken:(NSData *)stateToken;
@end
@interface ContactsEnumerateResult : NSObject
@property (nonatomic, strong) NSData * _Nullable stateToken;
- (instancetype)initWithStateToken:(NSData *)stateToken;
@end
ContactsEnumerateChangeResult * _Nullable ContactsEnumerateChangeRequest(CNContactStore *store, CNChangeHistoryFetchRequest *fetchRequest, id<CNChangeHistoryEventVisitor> visitor);
ContactsEnumerateResult * _Nullable ContactsEnumerateRequest(CNContactStore *store, CNContactFetchRequest *fetchRequest, void (^onContact)(CNContact *));
NS_ASSUME_NONNULL_END
#endif /* ContactsHelper_h */
+46
View File
@@ -0,0 +1,46 @@
#import <ContactsHelper/ContactsHelper.h>
@implementation ContactsEnumerateChangeResult
- (instancetype)initWithStateToken:(NSData *)stateToken {
self = [super init];
if (self != nil) {
_stateToken = stateToken;
}
return self;
}
@end
@implementation ContactsEnumerateResult
- (instancetype)initWithStateToken:(NSData *)stateToken {
self = [super init];
if (self != nil) {
_stateToken = stateToken;
}
return self;
}
@end
ContactsEnumerateChangeResult * _Nullable ContactsEnumerateChangeRequest(CNContactStore *store, CNChangeHistoryFetchRequest *fetchRequest, id<CNChangeHistoryEventVisitor> visitor) {
NSError *error = nil;
CNFetchResult<NSEnumerator<CNChangeHistoryEvent *> *> *fetchResult = [store enumeratorForChangeHistoryFetchRequest:fetchRequest error:&error];
for (CNChangeHistoryEvent *event in fetchResult.value) {
[event acceptEventVisitor:visitor];
}
return [[ContactsEnumerateChangeResult alloc] initWithStateToken:fetchResult.currentHistoryToken];
}
ContactsEnumerateResult * _Nullable ContactsEnumerateRequest(CNContactStore *store, CNContactFetchRequest *fetchRequest, void (^onContact)(CNContact *)) {
NSError *error = nil;
CNFetchResult<NSEnumerator<CNContact *> *> *fetchResult = [store enumeratorForContactFetchRequest:fetchRequest error:&error];
for (CNContact *contact in fetchResult.value) {
onContact(contact);
}
return [[ContactsEnumerateResult alloc] initWithStateToken:fetchResult.currentHistoryToken];
}