Beispiel #1
0
def update_fallback(config: CommonConfig):
    if not is_windows():
        return

    try:
        # 到这里一般是无法访问github,这时候试试gitee的方案
        latest_version = get_version_from_gitee()
        ui = UpdateInfo()
        ui.latest_version = latest_version
        ui.netdisk_link = config.netdisk_link
        ui.netdisk_passcode = "fzls"
        ui.update_message = "当前无法访问github,暂时无法获取更新内容,若欲知更新内容,请浏览gitee主页进行查看哦~\n\nhttps://gitee.com/fzls/djc_helper/blob/master/CHANGELOG.MD"

        try_manaual_update(ui)
    except Exception as err:
        logger.error(
            f"手动检查版本更新失败(这个跟自动更新没有任何关系),大概率是访问不了github和gitee导致的,可自行前往网盘查看是否有更新, 错误为{err}"
            + color("bold_green") + f"\n(无法理解上面这段话的话,就当没看见这段话,对正常功能没有任何影响)")

        # 如果一直连不上github,则尝试判断距离上次更新的时间是否已经很长
        time_since_last_update = datetime.now() - datetime.strptime(
            ver_time, "%Y.%m.%d")
        if time_since_last_update.days >= 7:
            msg = f"无法访问github确认是否有新版本,而当前版本更新于{ver_time},距今已有{time_since_last_update},很可能已经有新的版本,建议打开目录中的[网盘链接]看看是否有新版本,或者购买自动更新DLC省去手动更新的操作\n\n(如果已购买自动更新DLC,就无视这句话)"
            logger.info(color("bold_green") + msg)
            if is_first_run(
                    f"notify_manual_update_if_can_not_connect_github_v{now_version}"
            ):
                win32api.MessageBox(0, msg, "更新提示",
                                    win32con.MB_ICONINFORMATION)
                webbrowser.open(config.netdisk_link)
Beispiel #2
0
def _get_update_info(changelog_page: str, readme_page: str) -> UpdateInfo:
    logger.info(f"尝试使用 {changelog_page} 来查询更新信息")

    update_info = UpdateInfo()

    # 获取github本项目的readme页面内容和changelog页面内容
    timeout = 3  # 由于国内网络不太好,加个超时
    changelog_html_text = requests.get(changelog_page, timeout=timeout).text
    readme_html_text = requests.get(readme_page, timeout=timeout).text

    # 从更新日志中提取所有版本信息
    versions = re.findall(r"(?<=[vV])[0-9.]+(?=\s+\d+\.\d+\.\d+)",
                          changelog_html_text)
    # 找出其中最新的那个版本号
    update_info.latest_version = version_int_list_to_version(
        max(version_to_version_int_list(ver) for ver in versions))

    # 从readme中提取最新网盘信息
    netdisk_address_matches = re.findall(
        r'链接: <a[\s\S]+?rel="nofollow">(?P<link>.+?)<\/a> 提取码: (?P<passcode>[a-zA-Z0-9]+)',
        readme_html_text, re.MULTILINE)
    # 先选取首个网盘链接作为默认值
    update_info.netdisk_link = netdisk_address_matches[0][0]
    update_info.netdisk_passcode = netdisk_address_matches[0][1]
    # 然后随机从仍有效的网盘链接中随机一个作为最终结果
    random.seed(datetime.now())
    random.shuffle(netdisk_address_matches)
    for match in netdisk_address_matches:
        if not is_shared_content_blocked(match[0]):
            update_info.netdisk_link = match[0]
            update_info.netdisk_passcode = match[1]
            break

    # 尝试提取更新信息
    update_message_list_match_groupdict_matches = re.search(
        r"(?<=更新公告</h1>)\s*<ol.+?>(?P<update_message_list>(\s|\S)+?)</ol>",
        changelog_html_text, re.MULTILINE)
    if update_message_list_match_groupdict_matches is not None:
        update_message_list_match_groupdict = update_message_list_match_groupdict_matches.groupdict(
        )
        if "update_message_list" in update_message_list_match_groupdict:
            update_message_list_str = update_message_list_match_groupdict[
                "update_message_list"]
            update_messages = re.findall("<li>(?P<update_message>.+?)</li>",
                                         update_message_list_str, re.MULTILINE)
            update_info.update_message = "\n".join(
                f"{idx + 1}. {message}"
                for idx, message in enumerate(update_messages))
    else:
        async_message_box("走到这里说明提取更新信息的正则表达式不符合最新的网页了,请到群里@我反馈,多谢0-0",
                          "检查更新出错了",
                          show_once_daily=True)

    logger.info(
        f"netdisk_address_matches={netdisk_address_matches}, selected=({update_info.netdisk_link}, {update_info.netdisk_passcode})"
    )

    return update_info
Beispiel #3
0
def get_update_info(config) -> UpdateInfo:
    update_info = UpdateInfo()

    # 获取github本项目的readme页面内容和changelog页面内容
    timeout = 3  # 由于国内网络不太好,加个超时
    changelog_html_text = requests.get(config.changelog_page,
                                       timeout=timeout).text
    readme_html_text = requests.get(config.readme_page, timeout=timeout).text

    # 从更新日志中提取所有版本信息
    versions = re.findall("(?<=[vV])[0-9.]+(?=\s+\d+\.\d+\.\d+)",
                          changelog_html_text)
    # 找出其中最新的那个版本号
    update_info.latest_version = version_int_list_to_version(
        max(version_to_version_int_list(ver) for ver in versions))

    # 从readme中提取最新网盘信息
    netdisk_address_matches = re.findall(
        '链接: <a[\s\S]+?rel="nofollow">(?P<link>.+?)<\/a> 提取码: (?P<passcode>[a-zA-Z0-9]+)',
        readme_html_text, re.MULTILINE)
    # 先选取首个网盘链接作为默认值
    netdisk_link = netdisk_address_matches[0][0]
    netdisk_passcode = netdisk_address_matches[0][1]
    # 然后随机从仍有效的网盘链接中随机一个作为最终结果
    random.seed(datetime.now())
    random.shuffle(netdisk_address_matches)
    for match in netdisk_address_matches:
        if not is_shared_content_blocked(match[0]):
            update_info.netdisk_link = match[0]
            update_info.netdisk_passcode = match[1]
            break

    # 尝试提取更新信息
    update_message_list_match_groupdict = re.search(
        "(?<=更新公告</h1>)\s*<ol>(?P<update_message_list>(\s|\S)+?)</ol>",
        changelog_html_text, re.MULTILINE).groupdict()
    if "update_message_list" in update_message_list_match_groupdict:
        update_message_list_str = update_message_list_match_groupdict[
            "update_message_list"]
        update_messages = re.findall("<li>(?P<update_message>.+?)</li>",
                                     update_message_list_str, re.MULTILINE)
        update_info.update_message = "\n".join(
            "{}. {}".format(idx + 1, message)
            for idx, message in enumerate(update_messages))

    logger.info("netdisk_address_matches={}, selected=({}, {})".format(
        netdisk_address_matches, update_info.netdisk_link,
        update_info.netdisk_passcode))

    return update_info
Beispiel #4
0
def update_fallback(config: CommonConfig):
    if not is_windows():
        return

    try:
        # 到这里一般是无法访问github,这时候试试gitee的方案
        latest_version = get_version_from_gitee()
        ui = UpdateInfo()
        ui.latest_version = latest_version
        ui.netdisk_link = config.netdisk_link
        ui.netdisk_passcode = "fzls"
        ui.update_message = "当前无法访问github,暂时无法获取更新内容,若欲知更新内容,请浏览gitee主页进行查看哦~\n\nhttps://gitee.com/fzls/djc_helper/blob/master/CHANGELOG.MD"

        try_manaual_update(ui)
    except Exception as err:
        logger.error(
            f"手动检查版本更新失败(这个跟自动更新没有任何关系),大概率是访问不了github和gitee导致的,可自行前往网盘查看是否有更新, 错误为{err}"
            + color("bold_green")
            + "\n(无法理解上面这段话的话,就当没看见这段话,对正常功能没有任何影响)"
        )