From 99ef353500c737d0fcc06d0d07f79e41c328806b Mon Sep 17 00:00:00 2001 From: wowlikon Date: Thu, 28 Aug 2025 11:56:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=B0=D1=82=D1=87=D0=B0=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 1 + patches/application_icon.py | 2 +- patches/color_theme.py | 40 ++++++++++++++--------------- patches/config.json | 34 ++++++++++++++++++++++--- patches/insert_new.py | 22 +++++++++++----- patches/resources/torlook-fs8.png | Bin 4321 -> 0 bytes patches/settings_urls.py | 41 ++++++++++++++++++++++++++++++ 7 files changed, 109 insertions(+), 31 deletions(-) delete mode 100644 patches/resources/torlook-fs8.png create mode 100644 patches/settings_urls.py diff --git a/main.py b/main.py index 556f5fd..2c0bb02 100644 --- a/main.py +++ b/main.py @@ -113,6 +113,7 @@ class Patch: return True except Exception as e: print(f"Ошибка при применении патча {self.name}: {e}") + print(e.args) return False diff --git a/patches/application_icon.py b/patches/application_icon.py index a12b8ab..6b792ae 100644 --- a/patches/application_icon.py +++ b/patches/application_icon.py @@ -3,5 +3,5 @@ import time def apply(config: dict) -> bool: - time.sleep(1) + time.sleep(0.2) return False diff --git a/patches/color_theme.py b/patches/color_theme.py index 06ec150..740cffe 100644 --- a/patches/color_theme.py +++ b/patches/color_theme.py @@ -1,6 +1,6 @@ # Change application theme -import re +from lxml import etree def apply(config: dict) -> bool: @@ -24,34 +24,32 @@ def apply(config: dict) -> bool: for drawable_type in drawable_types: # Application logo gradient colors file_path = f"./decompiled/res/drawable{drawable_type}/$logo__0.xml" - with open(file_path, "r", encoding="utf-8") as file: - content = file.read() - pattern = r'android:startColor="(#[0-9a-fA-F]{8})"\s+android:endColor="(#[0-9a-fA-F]{8})"' + parser = etree.XMLParser(remove_blank_text=True) + tree = etree.parse(file_path, parser) + root = tree.getroot() - def replace_colors(match): - return ( - f'android:startColor="{gradient_from}" android:endColor="{gradient_to}"' - ) + # Change attributes with namespace + root.set(f"{{{config['xml_ns']['android']}}}startColor", gradient_from) + root.set(f"{{{config['xml_ns']['android']}}}endColor", gradient_to) - new_content = re.sub(pattern, replace_colors, content).replace("\n ", "") - - with open(file_path, "w", encoding="utf-8") as file: - file.write(new_content) + # Save back + tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8") # Application logo anim color file_path = f"./decompiled/res/drawable{drawable_type}/$logo_splash_anim__0.xml" - with open(file_path, "r", encoding="utf-8") as file: - content = file.read() - pattern = r'android:name="path" android:fillColor="(#[0-9a-fA-F]{8})"' + parser = etree.XMLParser(remove_blank_text=True) + tree = etree.parse(file_path, parser) + root = tree.getroot() - def replace_colors(match): - return f'android:name="path" android:fillColor="{splash_color}"' + # Finding "path" + for el in root.findall("path", namespaces=config['xml_ns']): + name = el.get(f"{{{config['xml_ns']['android']}}}name") + if name == "path": + el.set(f"{{{config['xml_ns']['android']}}}fillColor", splash_color) - new_content = re.sub(pattern, replace_colors, content).replace("\n ", " ", 1) - - with open(file_path, "w", encoding="utf-8") as file: - file.write(new_content) + # Save back + tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8") return True diff --git a/patches/config.json b/patches/config.json index 283fb11..f1fdd08 100644 --- a/patches/config.json +++ b/patches/config.json @@ -14,9 +14,37 @@ } }, "cleanup": { - "keep_dirs": [ - "META-INF", - "kotlin" + "keep_dirs": ["META-INF", "kotlin"] + }, + "settings_urls": { + "Мы в социальных сетях": [ + { + "title": "wowlikon", + "description": "Разработчик", + "url": "https://t.me/wowlikon", + "icon": "@drawable/ic_custom_telegram", + "icon_space_reserved": "false" + }, + { + "title": "Мы в Telegram", + "description": "Подпишитесь на канал, чтобы быть в курсе последних новостей.", + "url": "https://t.me/wowlikon", + "icon": "@drawable/ic_custom_telegram", + "icon_space_reserved": "false" + } + ], + "Прочее": [ + { + "title": "Поддержать проект", + "description": "После пожертвования вы сможете выбрать в своём профиле любую роль, например «Кошка-девочка», которая будет видна всем пользователям мода.", + "url": "https://t.me/wowlikon", + "icon": "@drawable/ic_custom_crown", + "icon_space_reserved": "false" + } ] + }, + "xml_ns": { + "android": "http://schemas.android.com/apk/res/android", + "app": "http://schemas.android.com/apk/res-auto" } } diff --git a/patches/insert_new.py b/patches/insert_new.py index dbc6621..5252e64 100644 --- a/patches/insert_new.py +++ b/patches/insert_new.py @@ -11,10 +11,9 @@ def apply(config: dict) -> bool: ) # Mod assets - shutil.copy("./patches/resources/wowlikon.png", "./decompiled/assets/wowlikon.png") shutil.copy( - "./patches/resources/ytsans_medium.ttf", - "./decompiled/res/font/ytsans_medium.ttf", + "./patches/resources/wowlikon.png", + "./decompiled/assets/wowlikon.png" ) shutil.copy( "./patches/resources/OpenSans-Regular.ttf", @@ -29,9 +28,20 @@ def apply(config: dict) -> bool: "./decompiled/res/drawable/ic_custom_telegram.xml", ) shutil.copy( - "./patches/resources/torlook-fs8.torlook-fs8.png", - "./decompiled/res/drawable/torlook-fs8.png", + "./patches/resources/ytsans_medium.ttf", + "./decompiled/res/font/ytsans_medium.ttf", + ) + os.remove("./decompiled/res/font/ytsans_medium.otf") + + # IDK + shutil.move( + "./decompiled/res/raw/bundled_cert.crt", + "./decompiled/res/raw/bundled_cert.cer", + ) + shutil.move( + "./decompiled/res/raw/sdkinternalca.crt", + "./decompiled/res/raw/sdkinternalca.cer", ) os.remove("./decompiled/res/font/ytsans_medium.otf") - return False + return True diff --git a/patches/resources/torlook-fs8.png b/patches/resources/torlook-fs8.png deleted file mode 100644 index 5604b9fe21e1c685befd2e2a498f68aed11e61e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4321 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 bool: + file_path = "./decompiled/res/xml/preference_main.xml" + parser = etree.XMLParser(remove_blank_text=True) + tree = etree.parse(file_path, parser) + root = tree.getroot() + + # Insert new PreferenceCategory before the last element + last = root[-1] # last element + pos = root.index(last) + for section, items in config["settings_urls"].items(): + root.insert(pos, make_category(config["xml_ns"], section, items)) + pos += 1 + + # Save back + tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8") + return True