diff --git a/common/check.py b/common/check.py index 179840f..75612bc 100644 --- a/common/check.py +++ b/common/check.py @@ -16,13 +16,15 @@ async def check_github_api_rate_limit(headers, session): reset_time = rate_limit.get('reset', 0) reset_time_formatted = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(reset_time)) - log.info(f' 🔄 剩余请求次数: {remaining_requests}') + log.info(f'🔄 剩余请求次数: {remaining_requests}') if remaining_requests == 0: - log.warning(f'⚠ GitHub API 请求数已用尽,将在 {reset_time_formatted} 重置,建议生成一个填在配置文件里') + log.warning(f'⚠ GitHub API 请求数已用尽, 将在 {reset_time_formatted} 重置,建议生成一个填在配置文件里') else: - log.error('⚠ Github请求数检查失败,网络错误') + log.error('⚠ Github请求数检查失败, 网络错误') + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except ClientError as e: log.error(f'⚠ 检查Github API 请求数失败,{stack_error(e)}') except ConnectionTimeoutError as e: diff --git a/common/checkcn.py b/common/checkcn.py index 10b6810..546fbe8 100644 --- a/common/checkcn.py +++ b/common/checkcn.py @@ -10,13 +10,15 @@ def checkcn(): body = req.json() scn = bool(body['flag']) if not scn: - log.info(f"您在非中国大陆地区({body['country']})上使用了项目, 已自动切换回Github官方下载CDN") + log.info(f"❌ 您在非中国大陆地区({body['country']})上使用了项目, 已自动切换回Github官方下载CDN") os.environ['IS_CN'] = 'no' return False else: os.environ['IS_CN'] = 'yes' return True + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except requests.RequestException as e: os.environ['IS_CN'] = 'yes' log.warning('❗ 检查服务器位置失败,已忽略,自动认为你在中国大陆') diff --git a/common/config.py b/common/config.py index d69acd9..67b38b5 100644 --- a/common/config.py +++ b/common/config.py @@ -19,6 +19,8 @@ async def gen_config_file(): await f.write(json.dumps(DEFAULT_CONFIG, indent=2, ensure_ascii=False, escape_forward_slashes=False)) log.info('🖱️ 程序可能为第一次启动或配置重置,请填写配置文件后重新启动程序') + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f'❌ 配置文件生成失败,{stack_error(e)}') @@ -32,6 +34,8 @@ async def load_config(): async with aiofiles.open("./config.json", mode="r", encoding="utf-8") as f: config = json.loads(await f.read()) return config + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f"配置文件加载失败,原因: {stack_error(e)},重置配置文件中...") os.remove("./config.json") diff --git a/common/dkey_merge.py b/common/dkey_merge.py index b4214a9..eddc8c1 100644 --- a/common/dkey_merge.py +++ b/common/dkey_merge.py @@ -9,7 +9,7 @@ lock = asyncio.Lock() async def depotkey_merge(config_path: Path, depots_config: dict) -> bool: if not config_path.exists(): async with lock: - log.error('👋 Steam默认配置不存在,可能是没有登录账号') + log.error('👋 Steam默认配置不存在, 可能是没有登录账号') return False try: @@ -21,7 +21,7 @@ async def depotkey_merge(config_path: Path, depots_config: dict) -> bool: config.get('InstallConfigStore', {}).get('Software', {}).get('valve') if steam is None: - log.error('⚠ 找不到Steam配置,请检查配置文件') + log.error('⚠ 找不到Steam配置, 请检查配置文件') return False depots = steam.setdefault('depots', {}) @@ -34,7 +34,9 @@ async def depotkey_merge(config_path: Path, depots_config: dict) -> bool: log.info('✅ 成功合并') return True + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: async with lock: - log.error(f'❌ 合并失败,原因: {e}') + log.error(f'❌ 合并失败, 原因: {e}') return False diff --git a/common/get_manifest_info.py b/common/get_manifest_info.py index e97b251..7708f85 100644 --- a/common/get_manifest_info.py +++ b/common/get_manifest_info.py @@ -36,6 +36,8 @@ async def get_manifest(sha: str, path: str, steam_path: Path, repo: str, session for depot_id, depot_info in depots_config['depots'].items() ] + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f'❌ 处理失败: {path} - {stack_error(e)}') raise diff --git a/common/get_steam_path.py b/common/get_steam_path.py index bfe113e..9271421 100644 --- a/common/get_steam_path.py +++ b/common/get_steam_path.py @@ -12,6 +12,8 @@ def get_steam_path() -> Path: custom_steam_path = config.get("Custom_Steam_Path", "").strip() return Path(custom_steam_path) if custom_steam_path else steam_path + except KeyboardInterrupt: + log.info("👋 程序已退出") except Exception as e: log.error(f'❌ Steam路径获取失败, {stack_error(e)}, 请检查是否正确安装Steam') os.system('pause') diff --git a/common/init_text.py b/common/init_text.py index 5dc42e6..5c380b1 100644 --- a/common/init_text.py +++ b/common/init_text.py @@ -16,10 +16,10 @@ def init(): for line in banner_lines: print(line) - log.info('作者:ikun0014') - log.info('本项目采用GNU General Public License v3开源许可证') - log.info('版本:1.2.6') - log.info('项目仓库:https://github.com/ikunshare/Onekey') - log.info('官网:ikunshare.com') - log.warning('本项目完全开源免费,如果你在淘宝,QQ群内通过购买方式获得,赶紧回去骂商家死全家\n交流群组:\nhttps://qm.qq.com/q/d7sWovfAGI\nhttps://t.me/ikunshare_qun') - log.warning('如果本项目中的Emoji(即表情包)无法正常显示,请使用支持Emoji的终端(例如Windows Terminal)') + log.info(f'作者: {Fore.RED}{Back.BLACK}{Style.BRIGHT}ikun0014{Style.RESET_ALL}') + log.info(f'{Fore.RED}{Back.BLACK}{Style.BRIGHT}本项目采用GNU General Public License v3开源许可证,请勿用于商业用途{Style.RESET_ALL}') + log.info('版本: 1.2.9') + log.info(f'{Fore.RED}{Back.BLACK}{Style.BRIGHT}项目Github仓库: https://github.com/ikunshare/Onekey{Style.RESET_ALL}') + log.info('官网: ikunshare.com') + log.warning('本项目完全开源免费, 如果你在淘宝, QQ群内通过购买方式获得, 赶紧回去骂商家死全家\n交流群组:\n https://t.me/ikunshare_qun') + log.warning('如果本项目中的Emoji(即表情包)无法正常显示, 请使用支持Emoji的终端(例如Windows Terminal)') diff --git a/common/main_func.py b/common/main_func.py index c0118d6..fa6dba4 100644 --- a/common/main_func.py +++ b/common/main_func.py @@ -20,6 +20,8 @@ async def fetch_branch_info(session, url, headers): try: async with session.get(url, headers=headers, ssl=False) as response: return await response.json() + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f'⚠ 获取信息失败: {stack_error(e)}') return None diff --git a/common/manifest_down.py b/common/manifest_down.py index 0b29081..2b60795 100644 --- a/common/manifest_down.py +++ b/common/manifest_down.py @@ -34,6 +34,8 @@ async def get(sha: str, path: str, repo: str, session, chunk_size: int = 1024) - return content else: log.error(f'🔄 获取失败: {path} - 状态码: {response.status}') + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except ClientError as e: log.error(f'🔄 获取失败: {path} - 连接错误: {str(e)}') except ConnectionTimeoutError as e: diff --git a/common/migration.py b/common/migration.py index 2df82e6..cf1fb81 100644 --- a/common/migration.py +++ b/common/migration.py @@ -29,6 +29,8 @@ async def download_setup_file(session) -> None: log.info('✅ 安装程序下载完成') else: log.error('⚠ 网络错误,无法下载安装程序') + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f'⚠ 下载失败: {e}') except ConnectionTimeoutError as e: diff --git a/common/st_unlock.py b/common/st_unlock.py index 9f59587..5238a90 100644 --- a/common/st_unlock.py +++ b/common/st_unlock.py @@ -32,6 +32,8 @@ async def stool_add(depot_data: list, app_id: str) -> bool: return False log.info('✅ 处理完成') + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except Exception as e: log.error(f'❌ 处理过程出现错误: {e}') return False diff --git a/main.py b/main.py index 5cb8514..9a79ecb 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,6 @@ import sys import asyncio import re -import platform from colorama import Fore, Back, Style from colorama import init as cinit @@ -21,38 +20,21 @@ repos = [ 'tymolu233/ManifestAutoUpdate', ] -def check_system_msg(): - os_type = platform.system() - try: - if os_type != 'Windows': - log.error(f'❌ 请使用Windows系统!当前系统:{os_type}') - sys.exit() - except Exception as e: - log.error(f'❌ 获取系统类型失败:{stack_error(e)}') - sys.exit() - - try: - os_version = platform.version().split('.')[0] - if int(os_version) < 10: - log.error(f'❌ 请使用Windows 10或更高版本!当前版本:Windows {os_version}') - sys.exit() - except Exception as e: - log.error(f'❌ 获取系统版本失败:{stack_error(e)}') - sys.exit() - def prompt_app_id(): while True: - app_id = input(f"{Fore.CYAN}{Back.BLACK}{Style.BRIGHT}🤔 请输入游戏AppID:{Style.RESET_ALL}").strip() + app_id = input(f"{Fore.CYAN}{Back.BLACK}{Style.BRIGHT}🤔 请输入游戏AppID: {Style.RESET_ALL}").strip() if re.match(r'^\d+$', app_id): return app_id else: - print(f"{Fore.RED}⚠ 无效的AppID,请输入数字!{Style.RESET_ALL}") + print(f"{Fore.RED}⚠ 无效的AppID, 请输入数字!{Style.RESET_ALL}") async def main_loop(): while True: try: app_id = prompt_app_id() await main(app_id, repos) + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except EOFError: break @@ -61,14 +43,15 @@ async def run(): log.info('❗ App ID可以在SteamDB或Steam商店链接页面查看') await main_loop() except KeyboardInterrupt: - log.info("👋 程序已退出") + log.info("\n👋 程序已退出") except Exception as e: - log.error(f' ⚠ 发生错误: {stack_error(e)},将在5秒后退出') + log.error(f'⚠ 发生错误: {stack_error(e)}, 将在5秒后退出') await asyncio.sleep(5) if __name__ == '__main__': try: - check_system_msg() asyncio.run(run()) + except KeyboardInterrupt: + log.info("\n👋 程序已退出") except SystemExit: sys.exit()