From 3ccce93a7475d26a30c6e62034bb2a4a44b44833 Mon Sep 17 00:00:00 2001 From: alex47exe <17827464+alex47exe@users.noreply.github.com> Date: Mon, 14 Oct 2024 00:24:49 +0100 Subject: [PATCH] fix generate_emu_config login, thanks to Sak32009 replace 'client_id' error with simple 'wrong username and / or password' message, asking for correct username and / or password add pcgw_page script to download PCGamingWiki page (source code only), not yet enabled in main script generate steam_emu.ini for CODEX and RUNE versions, update gse_generate_interfaces --- .../tools/au3/scripts/generate_interfaces.a3x | Bin 49236 -> 49430 bytes .../tools/au3/scripts/generate_interfaces.au3 | 187 +++++++++--------- .../bat/generate_emu_config.py_ini.bat | 2 +- .../bat/generate_emu_config.py_run_anon.bat | 2 +- .../bat/generate_emu_config.py_run_test.bat | 2 +- .../bat/generate_emu_config.py_run_user.bat | 2 +- .../external_components/cdx_gen.py | 11 +- .../external_components/pcgw_page.py | 23 +++ .../external_components/rne_gen.py | 172 ++++++++++++++++ .../external_components/safe_name.py | 6 +- .../generate_emu_config.py | 112 ++++++----- .../bat/generate_emu_config.exe_anon.bat | 2 +- .../bat/generate_emu_config.exe_test.bat | 3 + .../bat/generate_emu_config.exe_user.bat | 2 +- .../generate_emu_config.exe_test.cfg | 167 ++++++++++++++++ .../generate_emu_config.exe_test.exe | Bin 0 -> 83832 bytes tools/generate_emu_config/requirements.txt | 2 +- .../generate_interfaces.cpp | 3 +- 18 files changed, 541 insertions(+), 157 deletions(-) create mode 100644 tools/generate_emu_config/external_components/pcgw_page.py create mode 100644 tools/generate_emu_config/external_components/rne_gen.py create mode 100644 tools/generate_emu_config/post_build/bat/generate_emu_config.exe_test.bat create mode 100644 tools/generate_emu_config/post_build/generate_emu_config.exe_test.cfg create mode 100644 tools/generate_emu_config/post_build/generate_emu_config.exe_test.exe diff --git a/tools/generate_emu_config/_DEFAULT/0/steam_misc/tools/au3/scripts/generate_interfaces.a3x b/tools/generate_emu_config/_DEFAULT/0/steam_misc/tools/au3/scripts/generate_interfaces.a3x index bd7ca33ef4de29f8fd47f7c41e730bccf99db8e5..d54c5e676b4a0075a43f0e1d0eee8e1a125e53c5 100644 GIT binary patch delta 3424 zcmV-m4WIJVfCH9-1CZ1$SPP{+5%BqY+F1X<;jpU<0KA6)0KA6)0EDIh0HGb*0VG~s zg`pkW0VG~sg_8jRoayMiu9|>}UaoH~;|r?gRh@-=w{v z9oqrkDO!c09oqpUUR{N4`}za3k5~E3bhF+8ak77bkgbM&qRekKT_Alrzm0EM zi(*R~w?_oV$6D3>6uuvz9=|oJ7NwJ&OhAA8G6k;!F7EbDLXNzQpyqB;9)8{XfQc6J zhYu%{&;Ai6N!XXL#JyT)^f2M!wF0H^6o!Va16g6GT7PmxuI2Tz3({R)vz+{mJ$*L)wkmnzpKS0gQP}B>N`1fEUI?BovND43ueU~MUrmYR2r!5eqZ^KH|Bv_% ztUGjC)_JO`Dy&iih!N8$l;Y);8+2eq-CfxeJ3@FaXv)cz%tn6( zT6^HcZ|>j5hzHl_o#1~9S3FYD=TbZ+DrI_F`LMd{=$maio=xV3yAqO6$XGaYVnUr` z9+!1y+p5v93Cw@Wb3V}YPaQOknlO#}WrS$cBn<64T{qsLo@4{p3Io9o4K?@AvNi<8 zjwKhR$9^XfR`2}`6|)86yN7&|c81o!+_(TbZ|L#6GozY#LTG=V-{gjm%^xLNP|+A# zi%z-yKHfoTHp$L}M&%_d3LLlznQFx10s|aMOlx1WS&l)1zixf$Ju(@Nt4?`An_Q8G zNZZH6IFS3iyzCg$GYZlbhlUXy<=9&~34aO05goDf1BrokQM%#A6bunCM-uTS!<&wh-QS+LYklUI;~ zavnvad~2iU7L;iM75^|_WZ$@zs~n()%P6%$M7lSC+FFN#RKzig&}^GwWVInqBA?EG z7_zp{!#U)i2odExGLZMF%-~Wt(Mcf>f3~bq-zmksFdlywH#R)KCa2Ha zVTk9LDC~b6|Er;5a+uQV7w_W>#W*TnIfG58ehU!iPgQs*6Be_ixNG8||f=${oiZZu) z{1hO*-X8&wEPxy)LiS%*@v1tFMNZ7#cP2-PQj4pB88Srm$Io~hP=HE%7o0TPES1~P za_@g|fECggn5{BuT%E6}ijo-T*geyS0th9y8YDk3&-$@*<}N+;u(d!k=AFn9gB^vG z@SU-Vv`q!7sqk>s1SuP~ql0STl<`B>D?!!uC^UZHzx?XnTB|CKF1lnWPTrzZU98SZmdSXIKrfE&V% z=oF6lpH&%ZSGv`Z&m*i7^PAk>uXYB4$Ri{U`nIhjJi8RSjaURsb-_Msn#UOYmV7+R z4U$R$-gVE)UiI#G<;G;YjPCnmZr*>;kSIz@Sgn#~a%NwN;Z*86hpk?dAt7q#0dW01 z6Hg&oVKGU_E9gT*sHa$?XRgzMOQKNS$AnFDvCF{wQiA{12)bE*BqEPJe`%D=w2<~^ zn}C)T!gHHZ1K~q5Q8PKdqgRHn=%n`*k=u3(>|n*NT%5Q=ED-Jr?VX9_Je&uSFM?im^qBxNA_5z%{EK!aqW=|6eZK25 zzFE&9{l_bTLNhhT0~)60q-%f0lYYTldJhk8Nv%V2pKPid zigoLwM2bpEkUkI!cVa{U0S)zh_t=1Kr<(I;DxaQLIEjGzkYSL=Pxi6$s5Umhp;kNY z4ZFlIL>=aoUlIB#W~Cg;yt>!n)MOaem!!B$20`;2l zZ*sjuWWEB*DKx?K;Dkr+`7X=Ser z(;6Fh>?_TyfaM5|0xqipNng~$RXna__RKcvj_cvj)4a;acz4*n?Rq^k5~j+I-rT|J zFGZX}KbHLbjx)TqFLa;6|LJ@$iD(5H+HC@y7WGp#b5dn4Xih5B< zWI3s3C2j{wF@T=cv_ft^m0k#G_6A*!3kSRikoo$Xyl;01E{y6=7fg`O1GX6e8Boh7i;l5dw;uwudpH3lM*!u>K0v#f?q3p3iRWl()K`=IG CPlgi! delta 3229 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 None: - if not os.path.exists(os.path.join(base_out_dir, "steam_misc\\extra_cdx")): - os.makedirs(os.path.join(base_out_dir, "steam_misc\\extra_cdx")) + if not os.path.exists(os.path.join(base_out_dir, "steam_misc\\extra_crk\\CODEX")): + os.makedirs(os.path.join(base_out_dir, "steam_misc\\extra_crk\\CODEX")) - codex_ini_path = os.path.join(base_out_dir, "steam_misc\\extra_cdx\\steam_emu.ini") - print(f"[ ] Generating RUNE / CODEX / PLAZA config --- writing 'steam_emu.ini'") + codex_ini_path = os.path.join(base_out_dir, "steam_misc\\extra_crk\\CODEX\\steam_emu.ini") + print(f"[ ] Generating CODEX config --- writing 'steam_emu.ini'") print(f"[ ] __ if to be used, make sure it has the correct interface versions") dlc_list = [f"{d[0]}={d[1]}" for d in dlc] diff --git a/tools/generate_emu_config/external_components/pcgw_page.py b/tools/generate_emu_config/external_components/pcgw_page.py new file mode 100644 index 00000000..2ff905bf --- /dev/null +++ b/tools/generate_emu_config/external_components/pcgw_page.py @@ -0,0 +1,23 @@ +import os +import urllib.request + +# download PCGamingWiki page source code only +# to be parsed for additional game info, e.g. config and saved games files locations, extended developer and publisher info, etc +# not yet implemented in main script +def download_pcgw(base_out_dir : str, appid : int): + + pcgw_link = f"https://www.pcgamingwiki.com/api/appid.php?appid={appid}" + + if not os.path.exists(os.path.join(base_out_dir, 'steam_misc\\app_info')): + os.makedirs(os.path.join(base_out_dir, 'steam_misc\\app_info')) + + with urllib.request.urlopen(pcgw_link) as f: + html = f.read().decode('utf-8') + + file = os.path.join(base_out_dir, f"steam_misc\\app_info\\pcgw.tmp") + with open(file, 'w', encoding='utf-8') as f: + f.write(html) + + if os.path.isfile(os.path.join(base_out_dir, 'steam_misc\\app_info\\pcgw.tmp')): + with open(os.path.join(base_out_dir, 'steam_misc\\app_info\\pcgw.tmp'), 'r', encoding='utf-8') as app_pcgw: + app_pcgw_line = app_pcgw.readlines() diff --git a/tools/generate_emu_config/external_components/rne_gen.py b/tools/generate_emu_config/external_components/rne_gen.py new file mode 100644 index 00000000..7bae7f15 --- /dev/null +++ b/tools/generate_emu_config/external_components/rne_gen.py @@ -0,0 +1,172 @@ +import os +from steam_id_converter.SteamID import ( + SteamID +) + +__rune_ini = r'''### +### \ / +### _ _ _ _ \\__// +### ____ ._/______:_//\//_/____ _ //___ ./_ __//_____:_\\// +### :\ //_/ _ . /_/ / /_/__:_//_/ /\ /\__/_ _ . /\\\ +### \\/// ____/___./ / / / / / / \X_/ //___/ /_\_ +### . \/// _______ _/_ /_/ _/_/ \\/ // /_\_\ /. +### z_/ _/\ _/ // / // / \ /// __// :\// +### | / _ / /\// /__// __//_ _ /\ /X/ /__/ |/\/2 +### --+-_=\__/ / / / \_____:__/ //\____// /\ /\/__:_______=_-+--\4 +### |-\__\- / /________\____.__\/- -\--/_\/_______\--.\________\|___\ +### = dS!\/- -\_______\ =-RUNE- -== \/ ==-\______\-= ======== --\__\ +### +### +### Game data is stored at %SystemDrive%\Users\Public\Documents\Steam\RUNE\{rne_id} +### + +[Settings] +### +### Game identifier (http://store.steampowered.com/app/{rne_id}) +### +AppId={rne_id} +### +### Steam Account ID, set it to 0 to get a random Account ID +### +AccountId={rne_accountid} +### +### Name of the current player +### +UserName={rne_username} +### +### Language that will be used in the game +### +Language={rne_language} +### +### Enable lobby mode +### +LobbyEnabled=1 +### +### Lobby port to listen on +### +#LobbyPort=31183 +### +### Enable/Disable Steam overlay +### +Overlays=1 +### +### Set Steam connection to offline mode +### +Offline=0 +### +BlockConnection=0 +### + +[Interfaces] +### +### Steam Client API interface versions +### +SteamAppDisableUpdate= +SteamAppList= +SteamApps= +SteamAppTicket= +SteamClient= +SteamController= +SteamFriends= +SteamGameCoordinator= +SteamGameServerStats= +SteamGameServer= +SteamGameStats= +SteamHTMLSurface= +SteamHTTP= +SteamInput= +SteamInventory= +SteamMasterServerUpdater= +SteamMatchGameSearch= +SteamMatchMakingServers= +SteamMatchMaking= +SteamMusic= +SteamMusicRemote= +SteamNetworkingMessages= +SteamNetworkingSocketsSerialized= +SteamNetworkingSockets= +SteamNetworkingUtils= +SteamNetworking= +SteamParentalSettings= +SteamParties= +SteamRemotePlay= +SteamRemoteStorage= +SteamScreenshots= +SteamTimeline= +SteamTV= +SteamUGC= +SteamUnifiedMessages= +SteamUserStats= +SteamUser= +SteamUtils= +SteamVideo= +### + +[DLC] +### +### Automatically unlock all DLCs +### +DLCUnlockall=0 +### +### Identifiers for DLCs +### +#ID=Name +{rne_dlc_list} +### + +[Crack] +7f508eddb6d6c0b1=3681a9beddbae875 + +''' + +def generate_rne_ini( + base_out_dir : str, + appid: int, + accountid: int, + username: str, + language: str, + dlc: list[tuple[int, str]], + achs: list[dict]) -> None: + + if not os.path.exists(os.path.join(base_out_dir, "steam_misc\\extra_crk\\RUNE")): + os.makedirs(os.path.join(base_out_dir, "steam_misc\\extra_crk\\RUNE")) + + rune_ini_path = os.path.join(base_out_dir, "steam_misc\\extra_crk\\RUNE\\steam_emu.ini") + print(f"[ ] Generating RUNE config --- writing 'steam_emu.ini'") + print(f"[ ] __ if to be used, make sure it has the correct interface versions") + + dlc_list = [f"{d[0]}={d[1]}" for d in dlc] + achs_list = [] + for ach in achs: + icon = ach.get("icon", None) + if icon: + icon = f"steam_settings\\img\\{icon}" + else: + icon = 'steam_settings\\img\\steam_default_icon_unlocked.jpg' + + icon_gray = ach.get("icon_gray", None) + if icon_gray: + icon_gray = f"steam_settings\\img\\{icon_gray}" + else: + icon_gray = 'steam_settings\\img\\steam_default_icon_locked.jpg' + + icongray = ach.get("icongray", None) + if icongray: + icon_gray = f"steam_settings\\img\\{icongray}" + + achs_list.append(f'{ach["name"]} Achieved={icon}') # unlocked + achs_list.append(f'{ach["name"]} Unachieved={icon_gray}') # locked + + steam_id = SteamID(accountid) + + formatted_ini = __rune_ini.format( + rne_id = appid, + rne_username = username, + rne_accountid = steam_id.get_steam32_id(), + rne_language = language, + rne_dlc_list = "\n".join(dlc_list), + rne_ach_list = "\n".join(achs_list) + ) + + with open(rune_ini_path, "wt", encoding='utf-8') as f: + f.writelines(formatted_ini) diff --git a/tools/generate_emu_config/external_components/safe_name.py b/tools/generate_emu_config/external_components/safe_name.py index 29fafa9b..f47305b9 100644 --- a/tools/generate_emu_config/external_components/safe_name.py +++ b/tools/generate_emu_config/external_components/safe_name.py @@ -7,13 +7,13 @@ ALLOWED_CHARS = set([ '=', '+', '[', '{', ']', '}', ';', '\'', ',', '.', ' ', '\t', - '®', '™', + #'®', '™', ]) def create_safe_name(app_name : str): safe_name = ''.join(c for c in f'{app_name}' if c.isalnum() or c in ALLOWED_CHARS)\ .rstrip()\ .rstrip('.')\ - .replace('\t', ' ') - safe_name = re.sub('\s\s+', ' ', safe_name) + .replace(r'\t', ' ') + safe_name = re.sub(r'\s\s+', ' ', safe_name) return safe_name diff --git a/tools/generate_emu_config/generate_emu_config.py b/tools/generate_emu_config/generate_emu_config.py index e77a8f6a..012017de 100644 --- a/tools/generate_emu_config/generate_emu_config.py +++ b/tools/generate_emu_config/generate_emu_config.py @@ -2,10 +2,11 @@ import pathlib import time from stats_schema_achievement_gen import achievements_gen from external_components import ( - ach_watcher_gen, cdx_gen, app_images, app_details, safe_name, scx_gen, top_own + ach_watcher_gen, cdx_gen, rne_gen, app_images, app_details, safe_name, scx_gen, pcgw_page, top_own ) from controller_config_generator import parse_controller_vdf from steam.client import SteamClient +from steam.webauth import WebAuth from steam.enums.common import EResult from steam.enums.emsg import EMsg from steam.core.msg import MsgProto @@ -580,7 +581,7 @@ def help(): exe_name = os.path.basename(sys.argv[0]) print(f"\nUsage: {exe_name} [Switches] appid appid appid ... ") print(f" Example: {exe_name} 421050 420 480") - print(f" Example: {exe_name} -img -scr -vids_max -scx -cdx -acw -clr 421050 480") + print(f" Example: {exe_name} -img -scr -vids_max -scx -cdx -rne -acw -clr 421050 480") print("\nSwitches:") print(" -img: download art images for each app: Steam generated background, icon, logo, etc...") print(" -scr: download screenshots for each app if they're available") @@ -588,6 +589,7 @@ def help(): print(" -vids_max: download max quality videos for each app if they're available") print(" -scx: download market images for each app: Steam trading cards, badges, backgrounds, etc...") print(" -cdx: generate .ini file for CODEX Steam emu for each app") + print(" -rne: generate .ini file for RUNE Steam emu for each app") print(" -acw: generate schemas of all possible languages for Achievement Watcher") print(" -skip_ach: skip downloading & generating achievements and their images") print(" -skip_con: skip downloading & generating controller configuration files") @@ -611,7 +613,6 @@ def main(): PASSWORD = "" DOWNLOAD_SCREENSHOTS = False - DOWNLOAD_THUMBNAILS = True DOWNLOAD_VIDEOS = False DOWNLOAD_LOW = False DOWNLOAD_MAX = False @@ -619,6 +620,7 @@ def main(): DOWNLOAD_SCX = False SAVE_APP_NAME = False GENERATE_CODEX_INI = False + GENERATE_RUNE_INI = False GENERATE_ACHIEVEMENT_WATCHER_SCHEMAS = False CLEANUP_BEFORE_GENERATING = False ANON_LOGIN = False @@ -628,8 +630,7 @@ def main(): SKIP_INVENTORY = False DEFAULT_PRESET = True DEFAULT_PRESET_NO = 1 - - prompt_for_unavailable = True + if len(sys.argv) < 2: help() @@ -655,6 +656,8 @@ def main(): DOWNLOAD_SCX = True elif f'{appid}'.lower() == '-cdx': GENERATE_CODEX_INI = True + elif f'{appid}'.lower() == '-rne': + GENERATE_RUNE_INI = True elif f'{appid}'.lower() == '-acw': GENERATE_ACHIEVEMENT_WATCHER_SCHEMAS = True elif f'{appid}'.lower() == '-clr': @@ -695,10 +698,10 @@ def main(): sys.exit(1) client = SteamClient() - login_tmp_folder = os.path.join(get_exe_dir(RELATIVE_DIR), "login_temp") - if not os.path.exists(login_tmp_folder): - os.makedirs(login_tmp_folder) - client.set_credential_location(login_tmp_folder) + # login_tmp_folder = os.path.join(get_exe_dir(RELATIVE_DIR), "login_temp") + # if not os.path.exists(login_tmp_folder): + # os.makedirs(login_tmp_folder) + # client.set_credential_location(login_tmp_folder) # first read the 'my_login.txt' file my_login_file = os.path.join(get_exe_dir(RELATIVE_DIR), "my_login.txt") @@ -727,44 +730,14 @@ def main(): time.sleep(1000) result = client.anonymous_login() trials -= 1 - elif (len(USERNAME) == 0 or len(PASSWORD) == 0): - client.cli_login() else: - result = client.login(USERNAME, password=PASSWORD) - auth_code, two_factor_code = None, None - while result in ( - EResult.AccountLogonDenied, EResult.InvalidLoginAuthCode, - EResult.AccountLoginDeniedNeedTwoFactor, EResult.TwoFactorCodeMismatch, - EResult.TryAnotherCM, EResult.ServiceUnavailable, - EResult.InvalidPassword, - ): - - if result == EResult.InvalidPassword: - print("__ Invalid password. The password you set is wrong.") - exit(1) - - elif result in (EResult.AccountLogonDenied, EResult.InvalidLoginAuthCode): - prompt = ("__ Enter email code: " if result == EResult.AccountLogonDenied else - "__ Incorrect code. Enter email code: ") - auth_code, two_factor_code = input(prompt), None - - elif result in (EResult.AccountLoginDeniedNeedTwoFactor, EResult.TwoFactorCodeMismatch): - prompt = ("__ Enter 2FA code: " if result == EResult.AccountLoginDeniedNeedTwoFactor else - "__ Incorrect code. Enter 2FA code: ") - auth_code, two_factor_code = None, input(prompt) - - elif result in (EResult.TryAnotherCM, EResult.ServiceUnavailable): - if prompt_for_unavailable and result == EResult.ServiceUnavailable: - while True: - answer = input("__ Steam is down. Keep retrying? [y/n]: ").lower() - if answer in 'yn': break - - prompt_for_unavailable = False - if answer == 'n': break - - client.reconnect(maxdelay=15) - - result = client.login(USERNAME, PASSWORD, None, auth_code, two_factor_code) + webauth = WebAuth(USERNAME, PASSWORD) + if (len(USERNAME) > 0 and len(PASSWORD) > 0): + webauth.cli_login(USERNAME, PASSWORD) + else: + webauth_prompt_username = input("Enter Steam username: ") + webauth.cli_login(webauth_prompt_username) + client.login(webauth.username, access_token=webauth.refresh_token) # generate 'top_owners_ids.txt' if 'top_owners_ids.html' exists top_own.top_owners() @@ -1345,6 +1318,16 @@ def main(): dlc_config_list, achievements) + if GENERATE_RUNE_INI: + rne_gen.generate_rne_ini( + base_out_dir, + appid, + cfg_user_account_steamid, + cfg_user_account_name, + cfg_user_language, + dlc_config_list, + achievements) + if DOWNLOAD_SCX: scx_gen.download_scx(base_out_dir, appid) @@ -1352,15 +1335,38 @@ def main(): print(f"*** FINISHED config for app id {appid} ***") print(" ") +def _tracebackPrint(_errorValue): + print("Unexpected error:") + print(_errorValue) + print("-----------------------") + for line in traceback.format_exception(_errorValue): + print(line) + print("-----------------------") + if __name__ == "__main__": try: main() except Exception as e: - print("Unexpected error:") - print(e) - print("-----------------------") - for line in traceback.format_exception(e): - print(line) - print("-----------------------") - sys.exit(1) + if 'client_id' in e.args: + print("Wrong Steam username and / or password. Please try again!") + try: + main() + except Exception as e: + if 'client_id' in e.args: + print("Wrong Steam username and / or password. Please try again!") + try: + main() + except Exception as e: + if 'client_id' in e.args: + print("Wrong Steam username and / or password. Please try again!") + sys.exit(1) + else: + _tracebackPrint(e) + sys.exit(1) + else: + _tracebackPrint(e) + sys.exit(1) + else: + _tracebackPrint(e) + sys.exit(1) diff --git a/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_anon.bat b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_anon.bat index 1a899929..0c2d1ef0 100644 --- a/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_anon.bat +++ b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_anon.bat @@ -1,3 +1,3 @@ @echo off set /p arg="Generate Emu Config for Steam AppId: " -generate_emu_config.exe -cdx -acw -clr -anon %arg% \ No newline at end of file +generate_emu_config.exe -cdx -rne -acw -clr -anon %arg% \ No newline at end of file diff --git a/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_test.bat b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_test.bat new file mode 100644 index 00000000..4e049403 --- /dev/null +++ b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_test.bat @@ -0,0 +1,3 @@ +@echo off +set /p arg="Generate Emu Config for Steam AppId: " +generate_emu_config.exe -img -scr -vids_low -vids_max -scx -cdx -rne -acw -clr %arg% \ No newline at end of file diff --git a/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_user.bat b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_user.bat index 4a7156e7..83b2e64b 100644 --- a/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_user.bat +++ b/tools/generate_emu_config/post_build/bat/generate_emu_config.exe_user.bat @@ -1,3 +1,3 @@ @echo off set /p arg="Generate Emu Config for Steam AppId: " -generate_emu_config.exe -cdx -acw -clr %arg% \ No newline at end of file +generate_emu_config.exe -cdx -rne -acw -clr %arg% \ No newline at end of file diff --git a/tools/generate_emu_config/post_build/generate_emu_config.exe_test.cfg b/tools/generate_emu_config/post_build/generate_emu_config.exe_test.cfg new file mode 100644 index 00000000..9aafbcb1 --- /dev/null +++ b/tools/generate_emu_config/post_build/generate_emu_config.exe_test.cfg @@ -0,0 +1,167 @@ +[General] + +# 0 - Show Advanced Run window +# 1 - Skip Advanced Run window +AutoRun=1 + +# + +# 1 - Run .EXE File +# 2 - ShellExecute - Open the specified file, folder or URL with the default program +# 3 - Command Prompt - Execute command or batch file of Windows Command Prompt (.BAT, .CMD) +# 4 - PowerShell Command - Execute the specified PowerShell command +# 5 - PowerShell Script File - Run the specified PowerShell script (.PS1) +RunMode=3 + +# open, edit, explore, print - only for RunMode 2 +ShellExecuteAction=open + +# Program to Run - only for RunMode 1. For RunMode 2, 3, 4, 5 use CommandLine +EXEFilename= + +# Command-line arguments, file to ShellExecute, Command Prompt / PowerShell file to run or Command Prompt / PowerShell command string to execute +# For RunMode 3, DO NOTE that if your .BAT file ends with 'pause' or you add '& pause' at the end of CommandLine, CommandWindowMode 2 will have no effect - CMD window will show 'Press any key to continue . . .' +CommandLine=.\bat\generate_emu_config.exe_test.bat & pause + +# Start Directory - make sure any paths in CommandLine are relative to the start directory +StartDirectory=.\ + +# AdvancedRun process will wait in the background until the process executed by AdvancedRun is terminated, 0 - disabled, 1 -enabled +WaitProcess=1 + +# Process Priority Class: +# 64 - low, 32 - normal, 128 - high, 256 - realtime, 16384 - below normal, 32768 - above normal +PriorityClass=32 + +# Command Window Mode - only for RunMode 3, 4, 5 +# 1 - Leave window opened after executing commands (same as 'CMD /K'), 2 - Close window after executing commands (same as 'CMD /C') - only for RunMode 3, 4, 5 +# For RunMode 3, DO NOTE that if your .BAT file ends with 'pause' or you add '& pause' at the end of CommandLine, CommandWindowMode 2 will have no effect - CMD window will show 'Press any key to continue . . .' +CommandWindowMode=2 + +# Main window state +# 0 - hidden, 1 - normal, 2 - minimized, 3 - maximized +WindowState=1 + +# Main window position +UseWindowPosition=0 +WindowPosition=20,20 + +# Main window size +UseWindowSize=0 +WindowSize=640,400 + +# + +# 1 - Current User - Allow UAC Elevation +# 2 - Current User - Without UAC Elevation +# 3 - Administrator (Force UAC Elevation) +# 4 - SYSTEM User +# 5 - User of the selected process +# 6 - Child of the selected process (Using code injection) +# 7 - Specified username and password +# 8 - TrustedInstaller +# 9 - Another logged-in user +# 10 - Network Service +# 11 - Local Service +RunAs=1 + +# Selected process name - only for RunAs 5, 6 +RunAsProcessName= + +# Specified username - only for RunAs 7, 9 (password can't be set in this .CFG file, so it's better to run with /RunAsUserName "username" /RunAsPassword "password" parameters instead) +RunAsUserName= + +# Specified domain - only for RunAs 7 +RunAsDomain= + +# + +# Run on remote computer with temporary Windows service, 0 - disabled, 1 - enabled +RunFromService=0 + +# Remote computer name - only for RunFromService 1 +ComputerName= + +# + +# Use search path to find the program location if the full path is not specified, 0 - disabled, 1 - enabled +UseSearchPath=0 + +# Parse the environment variables inside the command-line string before passing it to the program +ParseVarCommandLine=0 + +# + +# Use process affinity mask, 0 - disabled, 1 - enabled +UseAffinityMask=0 + +# Set process affinity mask (space-delimited list) - e.g. '0 1 2 3' process runs only on first 4 cores +AffinityMask=0 1 + +# + +# 0 - Compatibility mode disabled +# 1 - Windows 95 +# 2 - Windows 98 +# 3 - Windows NT 4.0 SP5 +# 4 - Windows 2000 +# 5 - Windows XP SP2 +# 6 - Windows XP SP3 +# 7 - Server 2003 SP1 +# 8 - Server 2008 SP1 +# 9 - Vista +# 10 - Vista SP1 +# 11 - Vista SP2 +# 12 - Windows 7 +# 13 - Windows 8 +OSCompatMode=0 + +# Use 1 to disable visual themes +CompatDisableVisualThemes=0 + +# Use 1 to disable desktop composition +CompatDisableDesktopComp=0 + +# Use 1 to run in 640 x 480 resolution +Compat640480=0 + +# Use 1 to disable full screen optimizations +CompatDisableFullScreenOpt=0 + +# 0 - Reduced colors disabled +# 1 - 8-bit, 256 colors +# 2 - 16-bit, 65536 colors +CompatColors=0 + +# 0 - High DPI scaling override disabled +# 1 - Application +# 2 - System +# 3 - System Enhanced +CompatHighDPI=0 + +# 1 - Use current system environment variables without any change +# 2 - Merge the following environment variables with the system variables +# 3 - Use only the following environment variables (ignore the system variables) +EnvironmentVariablesMode=1 + +# Advanced Run window position - only for AutoRun 0 +WinPos=2C 00 00 00 00 00 00 00 01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF D5 03 00 00 4B 04 00 00 A2 08 00 00 FC 07 00 00 + +[EnvironmentVariables] + +# Advanced Run window position - only for AutoRun 0 +WinPos=2C 00 00 00 00 00 00 00 01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 78 03 00 00 FC 02 00 00 45 08 00 00 AD 06 00 00 + +# Number of environment variables to merge - only for EnvironmentVariablesMode 2, 3 +Lines=0 + +# Merge the following environment variables, one by one on each line +Line1= +Line2= +Line3= +Line4= +Line5= +Line6= +Line7= +Line8= +Line9= diff --git a/tools/generate_emu_config/post_build/generate_emu_config.exe_test.exe b/tools/generate_emu_config/post_build/generate_emu_config.exe_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..c6d71fad8783c2d7a74d54a32df476c2493926d3 GIT binary patch literal 83832 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 literal 0 HcmV?d00001 diff --git a/tools/generate_emu_config/requirements.txt b/tools/generate_emu_config/requirements.txt index 278911a3..f1106539 100644 --- a/tools/generate_emu_config/requirements.txt +++ b/tools/generate_emu_config/requirements.txt @@ -1,4 +1,4 @@ -steam[client] +steam[client] @ git+https://github.com/Sak32009/steam_py_fork.git@fix-cm-servers pyinstaller requests certifi diff --git a/tools/generate_interfaces/generate_interfaces.cpp b/tools/generate_interfaces/generate_interfaces.cpp index 79b81708..b6ac90d2 100644 --- a/tools/generate_interfaces/generate_interfaces.cpp +++ b/tools/generate_interfaces/generate_interfaces.cpp @@ -7,8 +7,9 @@ // these are defined in dll.cpp at the top like this: // static char old_xxx[128] = ... const static std::vector interface_patterns = { - R"(STEAMAPPS_INTERFACE_VERSION\d+)", + R"(SteamAppDisableUpdate\d+)", R"(STEAMAPPLIST_INTERFACE_VERSION\d+)", + R"(STEAMAPPS_INTERFACE_VERSION\d+)", R"(STEAMAPPTICKET_INTERFACE_VERSION\d+)", R"(SteamClient\d+)", R"(STEAMCONTROLLER_INTERFACE_VERSION)",