From 5986d8b069ab7ef8cf229e64bc11e2c75de2a60c Mon Sep 17 00:00:00 2001 From: wowlikon Date: Sat, 13 Sep 2025 20:25:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20workflow=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20apk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows /build.yml | 65 +++++++++++++++++++++++++++++ main.py | 81 ++++++++++++++++++++++++------------- 2 files changed, 118 insertions(+), 28 deletions(-) create mode 100644 .gitea/workflows /build.yml diff --git a/.gitea/workflows /build.yml b/.gitea/workflows /build.yml new file mode 100644 index 0000000..989a2a9 --- /dev/null +++ b/.gitea/workflows /build.yml @@ -0,0 +1,65 @@ +name: Сборка мода + +on: + workflow_dispatch: + #schedule: # раз в 36 часов + # - cron: "0 0 */3 * *" # каждые 3 дня в 00:00 + # - cron: "0 12 */3 * *" # каждые 3 дня в 12:00 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Download APK + run: | + curl -L -o app.apk "https://mirror-dl.anixart-app.com/anixart-beta.apk" + + - name: Ensure aapt is installed + run: | + if ! command -v aapt &> /dev/null; then + echo "aapt не найден, устанавливаем..." + sudo apt-get update && sudo apt-get install -y --no-install-recommends android-sdk-build-tools + fi + + - name: Export secrets + env: + KEYSTORE: ${{ secrets.KEYSTORE }} + KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} + run: | + # Export so later steps can reference them + echo "$KEYSTORE" | base64 -d > keystore.jks + echo "$KEYSTORE_PASS" > keystore.pass + + - name: Build APK + id: build + run: | + mkdir original + mv app.apk original/ + python ./main.py -f + + - name: Read title from report.log + id: get_title + run: | + TITLE=$(head -n 1 modified/report.log) + echo "title=${TITLE}" >> $GITHUB_OUTPUT + + - name: Setup go + if: steps.build.outputs.BUILD_EXIT == '0' + uses: actions/setup-go@v4 + with: + go-version: '>=1.20' + + - name: Make release + if: steps.build.outputs.BUILD_EXIT == '0' + uses: https://gitea.com/actions/release-action@main + with: + title: ${{ steps.get_title.outputs.title }} + body_path: modified/report.log + draft: true + api_key: '${{secrets.RELEASE_TOKEN}}' + files: |- + modified/**-mod.apk + modified/report.log diff --git a/main.py b/main.py index 860a72a..4d26a34 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,9 @@ import os import sys import json +import yaml import requests +import argparse import colorama import importlib import traceback @@ -141,6 +143,13 @@ def compile_apk(apk: str): stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, ) + title = "anixart mod " + with open('./decompiled/apktool.yml') as f: + package = yaml.safe_load(f) + title += ' '.join([f'{k}: {v}' for k, v in package['versionInfo'].items()]) + with open("./modified/report.log", "w") as log_file: + log_file.write(title+'\n') + log_file.write("\n".join([f"{patch.name}: {'applied' if patch.applied else 'failed'}" for patch in patches])) except subprocess.CalledProcessError as e: print("Ошибка при выполнении команды:") print(e.stderr) @@ -167,39 +176,55 @@ class Patch: traceback.print_exc() return False +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Автоматический патчер anixart" + ) -conf = init() -apk = select_apk() -patch = decompile_apk(apk) + parser.add_argument("-v", "--verbose", + action="store_true", + help="Выводить подробные сообщения") -patches = [] -for filename in os.listdir("patches/"): - if filename.endswith(".py") and filename != "__init__.py" and not filename.startswith("todo_"): - module_name = filename[:-3] - module = importlib.import_module(f"patches.{module_name}") - patches.append(Patch(module_name, module)) + parser.add_argument("-f", "--force", + action="store_true", + help="Принудительно собрать APK") -patches.sort(key=lambda x: x.package.priority, reverse=True) + args = parser.parse_args() -for patch in tqdm(patches, colour="green", desc="Применение патчей"): - tqdm.write(f"Применение патча: {patch.name}") - patch.apply(conf) + conf = init() + apk = select_apk() + patch = decompile_apk(apk) -statuses = {} -for patch in patches: - statuses[patch.name] = patch.applied - marker = colorama.Fore.GREEN + "✔" if patch.applied else colorama.Fore.RED + "✘" - print(f"{marker}{colorama.Style.RESET_ALL} {patch.name}") + if args.verbose: conf["verbose"] = True -if all(statuses.values()): - print(f"{colorama.Fore.GREEN}Все патчи успешно применены{colorama.Style.RESET_ALL}") - compile_apk(apk) -elif any(statuses.values()): - print(f"{colorama.Fore.YELLOW}⚠{colorama.Style.RESET_ALL} Некоторые патчи не были успешно применены") - if input("Продолжить? (y/n): ").lower() == "y": + patches = [] + for filename in os.listdir("patches/"): + if filename.endswith(".py") and filename != "__init__.py" and not filename.startswith("todo_"): + module_name = filename[:-3] + module = importlib.import_module(f"patches.{module_name}") + patches.append(Patch(module_name, module)) + + patches.sort(key=lambda x: x.package.priority, reverse=True) + + for patch in tqdm(patches, colour="green", desc="Применение патчей"): + tqdm.write(f"Применение патча: {patch.name}") + patch.apply(conf) + + statuses = {} + for patch in patches: + statuses[patch.name] = patch.applied + marker = colorama.Fore.GREEN + "✔" if patch.applied else colorama.Fore.RED + "✘" + print(f"{marker}{colorama.Style.RESET_ALL} {patch.name}") + + if all(statuses.values()): + print(f"{colorama.Fore.GREEN}Все патчи успешно применены{colorama.Style.RESET_ALL}") compile_apk(apk) + elif any(statuses.values()): + print(f"{colorama.Fore.YELLOW}⚠{colorama.Style.RESET_ALL} Некоторые патчи не были успешно применены") + if args.force or input("Продолжить? (y/n): ").lower() == "y": + compile_apk(apk) + else: + print(colorama.Fore.RED + "Операция отменена" + colorama.Style.RESET_ALL) else: - print(colorama.Fore.RED + "Операция отменена" + colorama.Style.RESET_ALL) -else: - print(f"{colorama.Fore.RED}Ни один патч не был успешно применен{colorama.Style.RESET_ALL}") - sys.exit(1) + print(f"{colorama.Fore.RED}Ни один патч не был успешно применен{colorama.Style.RESET_ALL}") + sys.exit(1)