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
@@ -0,0 +1,84 @@
import Foundation
import PathKit
import ProjectSpec
import TestSupport
import XcodeGenKit
import XcodeProj
import XCTest
class GeneratedPerformanceTests: XCTestCase {
let basePath = Path.temporary + "XcodeGenPeformanceTests"
func testLoading() throws {
let project = try Project.testProject(basePath: basePath)
let specPath = basePath + "project.yaml"
try dumpYamlDictionary(project.toJSONDictionary(), path: specPath)
measure {
let spec = try! SpecFile(path: specPath,
variables: ProcessInfo.processInfo.environment)
_ = spec.resolvedDictionary()
}
}
func testGeneration() throws {
let project = try Project.testProject(basePath: basePath)
measure {
let generator = ProjectGenerator(project: project)
_ = try! generator.generateXcodeProject(userName: "someUser")
}
}
func testWriting() throws {
let project = try Project.testProject(basePath: basePath)
let generator = ProjectGenerator(project: project)
let xcodeProject = try generator.generateXcodeProject(userName: "someUser")
measure {
xcodeProject.pbxproj.invalidateUUIDs()
try! xcodeProject.write(path: project.defaultProjectPath)
}
}
}
let fixturePath = Path(#file).parent().parent() + "Fixtures"
class FixturePerformanceTests: XCTestCase {
let specPath = fixturePath + "TestProject/project.yml"
func testFixtureDecoding() throws {
measure {
_ = try! Project(path: specPath)
}
}
func testCacheFileGeneration() throws {
let specLoader = SpecLoader(version: "1.2")
_ = try specLoader.loadProject(path: specPath)
measure {
_ = try! specLoader.generateCacheFile()
}
}
func testFixtureGeneration() throws {
try skipIfNecessary()
let project = try Project(path: specPath)
measure {
let generator = ProjectGenerator(project: project)
_ = try! generator.generateXcodeProject(userName: "someUser")
}
}
func testFixtureWriting() throws {
try skipIfNecessary()
let project = try Project(path: specPath)
let generator = ProjectGenerator(project: project)
let xcodeProject = try generator.generateXcodeProject(userName: "someUser")
measure {
xcodeProject.pbxproj.invalidateUUIDs()
try! xcodeProject.write(path: project.defaultProjectPath)
}
}
}
@@ -0,0 +1,181 @@
import Foundation
import PathKit
import ProjectSpec
import XcodeProj
extension Project {
static func testProject(basePath: Path, createSources: Bool = true) throws -> Project {
if createSources {
try? basePath.delete()
try basePath.mkpath()
}
var paths: [Path] = []
var targets: [Target] = []
let scheme = TargetScheme(
testTargets: [],
configVariants: ["Test", "Staging", "Prod"],
gatherCoverageData: true,
storeKitConfiguration: "Configuration.storekit",
disableMainThreadChecker: true,
stopOnEveryMainThreadCheckerIssue: false,
commandLineArguments: [
"--command": true,
"--command2": false,
],
environmentVariables: [
XCScheme.EnvironmentVariable(variable: "ENV", value: "HELLO", enabled: true),
XCScheme.EnvironmentVariable(variable: "ENV2", value: "HELLO", enabled: false),
],
preActions: [Scheme.ExecutionAction(name: "run", script: "script")],
postActions: [Scheme.ExecutionAction(name: "run", script: "script")],
management: Scheme.Management(shared: false, orderHint: 1, isShown: true)
)
for platform in Platform.allCases {
let appTarget = Target(
name: "App_\(platform)",
type: .application,
platform: platform,
sources: [TargetSource(path: "App_\(platform)")],
dependencies: [
Dependency(type: .target, reference: "Framework_\(platform)"),
Dependency(type: .target, reference: "Framework2_\(platform)"),
Dependency(type: .carthage(findFrameworks: false, linkType: .dynamic), reference: "Alamofire"),
Dependency(type: .carthage(findFrameworks: false, linkType: .dynamic), reference: "BrightFutures"),
],
scheme: scheme
)
targets.append(appTarget)
if createSources {
paths += try createTargetSources(path: basePath, target: appTarget)
}
let testTarget = Target(
name: "App_Test_\(platform)",
type: .unitTestBundle,
platform: platform,
sources: [TargetSource(path: "App_Test_\(platform)")],
dependencies: [
Dependency(type: .target, reference: "App_\(platform)"),
Dependency(type: .target, reference: "Framework_\(platform)"),
Dependency(type: .target, reference: "Framework2_\(platform)"),
],
scheme: scheme
)
targets.append(testTarget)
if createSources {
paths += try createTargetSources(path: basePath, target: testTarget)
}
let frameworkTarget = Target(
name: "Framework_\(platform)",
type: .framework,
platform: platform,
sources: [
TargetSource(path: "Framework_\(platform)"),
],
dependencies: [
Dependency(type: .carthage(findFrameworks: false, linkType: .dynamic), reference: "Alamofire"),
],
scheme: scheme
)
targets.append(frameworkTarget)
if createSources {
paths += try createTargetSources(path: basePath, target: frameworkTarget)
}
let frameworkTarget2 = Target(
name: "Framework2_\(platform)",
type: .framework,
platform: platform,
sources: [TargetSource(path: "Framework2_\(platform)")],
dependencies: [
Dependency(type: .target, reference: "Framework_\(platform)"),
Dependency(type: .carthage(findFrameworks: false, linkType: .dynamic), reference: "Alamofire"),
Dependency(type: .carthage(findFrameworks: false, linkType: .dynamic), reference: "BrightFutures"),
],
scheme: scheme
)
targets.append(frameworkTarget2)
if createSources {
paths += try createTargetSources(path: basePath, target: frameworkTarget2)
}
}
if createSources {
let files = paths.filter { $0.isFile }
let directories = paths.filter { $0.isDirectory }
print("Generated \(files.count) files and \(directories.count) directories")
}
return Project(
basePath: basePath,
name: "Project",
configs: [
Config(name: "Debug Test", type: .debug),
Config(name: "Release Test", type: .release),
Config(name: "Debug Staging", type: .debug),
Config(name: "Release Staging", type: .release),
Config(name: "Debug Prod", type: .debug),
Config(name: "Release Prod", type: .release),
],
targets: targets,
aggregateTargets: [],
settings: [:],
settingGroups: [:],
schemes: [],
options: SpecOptions(),
fileGroups: [],
configFiles: [:],
attributes: [:]
)
}
fileprivate static func createTargetSources(path: Path, target: Target) throws -> [Path] {
let levels = 3
let directoriesPerLevel = 1
let swiftFilesPerDirectory = 5
let objFilesPerDirectory = 2
let resourcesPerDirectory = 2
var paths: [Path] = []
func createDirectory(_ path: Path, depth: Int = 0) throws {
try path.mkpath()
paths.append(path)
for swiftFile in 1...swiftFilesPerDirectory {
let file = path + "file_\(swiftFile).swift"
try file.write("")
paths.append(file)
}
for resourceFile in 1...resourcesPerDirectory {
let file = path + "file_\(resourceFile).png"
try file.write("")
paths.append(file)
}
for objFile in 1...objFilesPerDirectory {
let header = path + "file_\(objFile).h"
try header.write("")
paths.append(header)
let implementation = path + "file_\(objFile).m"
try implementation.write("")
paths.append(implementation)
}
if depth < levels - 1 {
for directory in 1...directoriesPerLevel {
try createDirectory(path + "directory_\(directory)", depth: depth + 1)
}
}
}
for source in target.sources {
try createDirectory(path + source.path)
}
return paths
}
}