175 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
import os.path
 | 
						||
import re
 | 
						||
 | 
						||
from scripts.context import Context
 | 
						||
from scripts.task import Task
 | 
						||
from utils.logger_utils import app_logger
 | 
						||
 | 
						||
 | 
						||
def update_gradle_variable(content, variable_name, new_value):
 | 
						||
    """
 | 
						||
    更新 Gradle 文件中的 final def 变量值
 | 
						||
 | 
						||
    :param content: Gradle 文件内容
 | 
						||
    :param variable_name: 变量名 (如 "releaseName")
 | 
						||
    :param new_value: 新值 (字符串或数字)
 | 
						||
    :return: 更新后的内容
 | 
						||
    """
 | 
						||
    # 处理字符串值(带引号)
 | 
						||
    if isinstance(new_value, str):
 | 
						||
        # 匹配带引号的字符串赋值
 | 
						||
        pattern = rf'(final\s+def\s+{re.escape(variable_name)}\s*=\s*["\'])(.*?)(["\'])'
 | 
						||
        replacement = rf'\g<1>{new_value}\g<3>'
 | 
						||
    else:
 | 
						||
        # 匹配数字值(不带引号)
 | 
						||
        pattern = rf'(final\s+def\s+{re.escape(variable_name)}\s*=\s*)(\d+)'
 | 
						||
        replacement = rf'\g<1>{new_value}'
 | 
						||
 | 
						||
    updated_content = re.sub(pattern, replacement, content)
 | 
						||
    return updated_content
 | 
						||
 | 
						||
 | 
						||
def modify_text_with_regex(original_text, key, new_value):
 | 
						||
    """
 | 
						||
    使用正则表达式修改文本中指定key的值,支持带引号和数字类型
 | 
						||
 | 
						||
    参数:
 | 
						||
    original_text -- 原始文本内容
 | 
						||
    key -- 要修改的键名
 | 
						||
    new_value -- 新的值
 | 
						||
 | 
						||
    返回:
 | 
						||
    修改后的文本内容
 | 
						||
    """
 | 
						||
    # 改进的正则模式:更精确地匹配带引号的值和数字值
 | 
						||
    # 匹配带引号的值(单引号或双引号)或数字值
 | 
						||
    pattern = re.compile(
 | 
						||
        r'(final def ' + re.escape(key) + r' = )'  # 前缀部分
 | 
						||
                                          r'(?:'  # 非捕获组,用于分组不同情况
 | 
						||
                                          r'([\'"])(.*?)\2'  # 带引号的值(单引号或双引号)
 | 
						||
                                          r'|'  # 或者
 | 
						||
                                          r'(\d+)'  # 数字值(整数)
 | 
						||
                                          r')'
 | 
						||
    )
 | 
						||
 | 
						||
    # 查找匹配
 | 
						||
    match = pattern.search(original_text)
 | 
						||
 | 
						||
    if not match:
 | 
						||
        print(f"未找到键: {key}")
 | 
						||
        return original_text
 | 
						||
 | 
						||
    # 检查是带引号的情况还是数字情况
 | 
						||
    quote_type = match.group(2)  # 引号类型(单引号或双引号)
 | 
						||
    is_number = match.group(4) is not None  # 是否是数字类型
 | 
						||
 | 
						||
    # 构造替换字符串
 | 
						||
    if quote_type:
 | 
						||
        # 有引号的情况,保持原有引号类型
 | 
						||
        replacement = f'\g<1>{quote_type}{new_value}{quote_type}'
 | 
						||
    elif is_number:
 | 
						||
        # 数字类型,直接替换数字
 | 
						||
        replacement = f'\g<1>{new_value}'
 | 
						||
    else:
 | 
						||
        # 其他情况,保持原样替换
 | 
						||
        replacement = f'\g<1>{new_value}'
 | 
						||
 | 
						||
    # 执行替换,只替换第一个匹配项
 | 
						||
    modified_text = pattern.sub(replacement, original_text, count=1)
 | 
						||
    return modified_text
 | 
						||
 | 
						||
 | 
						||
def update_gradle_property(content, key, new_value):
 | 
						||
    # 匹配两种格式:
 | 
						||
    # 1. resValue "string", "key", "value"
 | 
						||
    # 2. resValue("string", "key", "value")
 | 
						||
    pattern = rf'(resValue\s*\(?\s*["\']string["\']\s*,\s*["\']{re.escape(key)}["\']\s*,\s*["\'])(.*?)(["\']\s*\)?)'
 | 
						||
 | 
						||
    # 替换为新值
 | 
						||
    updated_content = re.sub(pattern, rf'\g<1>{new_value}\g<3>', content)
 | 
						||
 | 
						||
    return updated_content
 | 
						||
 | 
						||
 | 
						||
GAME_ACTIVITY_PATH_2 = f"LauncherCode/src/com/launchercode/activity/GameActivity.kt".replace("/", os.sep)
 | 
						||
STRING_PATH = f"launcher-game/res/values/strings.xml".replace("/", os.sep)
 | 
						||
 | 
						||
 | 
						||
class ProjectUpdate(Task):
 | 
						||
 | 
						||
    def __init__(self, context: Context):
 | 
						||
        super().__init__(context)
 | 
						||
        self.build_gradle_path = None
 | 
						||
 | 
						||
    def update_package_name(self):
 | 
						||
        if not self.context.update_config:
 | 
						||
            app_logger().info("配置文件没有变动,package不需要更新")
 | 
						||
            return
 | 
						||
        """
 | 
						||
        更新包名
 | 
						||
        :return:
 | 
						||
        """
 | 
						||
 | 
						||
        build_gradle_path = os.path.join(self.context.temp_project_path, "ad.gradle")
 | 
						||
        text = open(build_gradle_path, "r", encoding="utf-8").read()
 | 
						||
 | 
						||
        text = text.replace(self.context.original_package, self.context.package_name)
 | 
						||
        open(build_gradle_path, "w", encoding="utf-8").write(text)
 | 
						||
 | 
						||
        xml_path = os.path.join(self.context.temp_project_path, "lawnchair/res/xml")
 | 
						||
 | 
						||
        for root, dirs, files in os.walk(xml_path):
 | 
						||
            for file in files:
 | 
						||
                temp_xml_path = os.path.join(root, file)
 | 
						||
                text = open(temp_xml_path, "r", encoding="utf-8").read()
 | 
						||
                text = text.replace(self.context.original_package, self.context.package_name)
 | 
						||
                open(temp_xml_path, "w", encoding="utf-8").write(text)
 | 
						||
                pass
 | 
						||
        pass
 | 
						||
 | 
						||
    def update_gradle_config(self):
 | 
						||
        """
 | 
						||
        更新gradle里面的版本号
 | 
						||
        :return:
 | 
						||
        """
 | 
						||
 | 
						||
        build_gradle_path = os.path.join(self.context.temp_project_path, "ad.gradle")
 | 
						||
 | 
						||
        text = open(build_gradle_path, "r", encoding="UTF-8").read()
 | 
						||
 | 
						||
        text = modify_text_with_regex(text, "admob_app_id", self.context.admob_app_id)
 | 
						||
        text = modify_text_with_regex(text, "game_services_project_id", self.context.game_services_project_id)
 | 
						||
        text = modify_text_with_regex(text, "facebook_app_id", self.context.facebook_app_id)
 | 
						||
        text = modify_text_with_regex(text, "facebook_client_token", self.context.facebook_client_token)
 | 
						||
        text = modify_text_with_regex(text, "appName", self.context.get_app_name())
 | 
						||
        text = modify_text_with_regex(text, "appVersionName", self.context.version_display_name)
 | 
						||
        text = modify_text_with_regex(text, "appVersionCode", self.context.version_code)
 | 
						||
        open(build_gradle_path, "w", encoding="UTF-8").write(text)
 | 
						||
        pass
 | 
						||
 | 
						||
    def update_string(self):
 | 
						||
        if not self.context.update_config:
 | 
						||
            app_logger().info("配置文件没有变动,string不需要更新")
 | 
						||
            return
 | 
						||
        privacy = self.context.get_config("TkA_Url_Privacy")
 | 
						||
        if not privacy or privacy == "":
 | 
						||
            raise Exception("配置文件中没有配置 TkA_Url_Privacy")
 | 
						||
 | 
						||
        tkg_custom = self.context.get_config("tkg_custom")
 | 
						||
        if not tkg_custom or tkg_custom == "":
 | 
						||
            raise Exception("配置文件中没有配置 tkg_custom")
 | 
						||
 | 
						||
        text = open(os.path.join(self.context.temp_project_path, STRING_PATH), "r", encoding="utf-8").read()
 | 
						||
        text = text.replace("https://doanvanquy.com/privacy.html", privacy)
 | 
						||
        text = text.replace("https://doanvanquy.com/TermsOfUse.html",
 | 
						||
                            privacy.replace("privacy.html", "TermsOfUse.html"))
 | 
						||
        open(os.path.join(self.context.temp_project_path, STRING_PATH), "w", encoding="utf-8").write(text)
 | 
						||
        pass
 | 
						||
 | 
						||
    def execute(self):
 | 
						||
        self.build_gradle_path = os.path.join(self.context.temp_project_path, "build.gradle")
 | 
						||
        self.update_package_name()
 | 
						||
        self.update_gradle_config()
 | 
						||
        self.update_string()
 | 
						||
        pass
 |