diff --git a/lang/chinese.txt b/lang/chinese.txt index 8e58bca2..d8a81c1e 100644 --- a/lang/chinese.txt +++ b/lang/chinese.txt @@ -1266,3 +1266,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/dutch.txt b/lang/dutch.txt index f984b1c2..69cdd48d 100644 --- a/lang/dutch.txt +++ b/lang/dutch.txt @@ -1265,3 +1265,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/english.txt b/lang/english.txt index 5be8de08..325af86f 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -1266,3 +1266,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/englishUK.txt b/lang/englishUK.txt index 539137d3..39a450c3 100644 --- a/lang/englishUK.txt +++ b/lang/englishUK.txt @@ -1265,3 +1265,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/french.txt b/lang/french.txt index c46d040a..bc3c066c 100644 --- a/lang/french.txt +++ b/lang/french.txt @@ -1264,3 +1264,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/german.txt b/lang/german.txt index f5d6e2d8..4d99f2ba 100644 --- a/lang/german.txt +++ b/lang/german.txt @@ -1267,3 +1267,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/italian.txt b/lang/italian.txt index 0932121c..bf31ba37 100644 --- a/lang/italian.txt +++ b/lang/italian.txt @@ -1265,3 +1265,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/polish.txt b/lang/polish.txt index 7d24a69f..9dba2997 100644 --- a/lang/polish.txt +++ b/lang/polish.txt @@ -1265,3 +1265,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/lang/russian.txt b/lang/russian.txt index 60989271..444c0c75 100644 --- a/lang/russian.txt +++ b/lang/russian.txt @@ -1265,3 +1265,5 @@ NOTY_X64DBG_ATTACHONSTARTUP="Attaching game 'YYY (ZZZ)' to x64dbg with XXX" NOTY_RUN_X64DBG="Starting game 'YYY (ZZZ)' with x64dbg using XXX" NOTY_NOSTEXENOTFOUND="Error: Could not add Non-Steam Game -- Executable is not a valid file" NOTY_NOSTEXEBLANK="Error: Could not add Non-Steam Game -- Executable path was not provided" +GUI_SPEKPROJURL="SpecialK URL" +DESC_SPEKPROJURL="SpecialK GitHub Page URL, used for nightly builds" diff --git a/steamtinkerlaunch b/steamtinkerlaunch index 0850d5ed..fcecb905 100755 --- a/steamtinkerlaunch +++ b/steamtinkerlaunch @@ -6,7 +6,7 @@ PREFIX="/usr" PROGNAME="SteamTinkerLaunch" NICEPROGNAME="Steam Tinker Launch" -PROGVERS="v14.0.20231114-1" +PROGVERS="v14.0.20231116-1" PROGCMD="${0##*/}" PROGINTERNALPROTNAME="Proton-stl" SHOSTL="stl" @@ -2961,6 +2961,7 @@ function setDefaultCfgValues { if [ -z "$CONTYRELURL" ] ; then CONTYRELURL="$GHURL/Kron4ek/Conty/releases"; fi if [ -z "$MO2PROJURL" ] ; then MO2PROJURL="$GHURL/ModOrganizer2/modorganizer"; fi if [ -z "$HMMPROJURL" ] ; then HMMPROJURL="$GHURL/thesupersonic16/HedgeModManager"; fi + if [ -z "$SPEKPROJURL" ] ; then SPEKPROJURL="$GHURL/SpecialKO/SpecialK"; fi if [ -z "$CW_KRON4EK" ] ; then CW_KRON4EK="$GHURL/Kron4ek/Wine-Builds/releases"; fi if [ -z "$CW_LUTRIS" ] ; then CW_LUTRIS="$GHURL/lutris/wine/releases"; fi if [ -z "$CW_WINEGE" ] ; then CW_WINEGE="$GHURL/GloriousEggroll/wine-ge-custom/releases"; fi @@ -3353,6 +3354,8 @@ function saveCfg { echo "MO2PROJURL=\"$MO2PROJURL\"" echo "## HedgeModManager Project URL" echo "HMMPROJURL=\"$HMMPROJURL\"" + echo "## SpecialK Project URL" + echo "SPEKPROJURL=\"$SPEKPROJURL\"" echo "## $DPRS DL URL" echo "DPRSRELURL=\"$DPRSRELURL\"" echo "## $DEPS URL" @@ -5629,7 +5632,7 @@ function AllSettingsEntriesDummyFunction { --field=" $GUI_AUTOBUMPGE!$DESC_AUTOBUMPGE ('AUTOBUMPGE')":CHK "${AUTOBUMPGE/#-/ -}" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ --field=" $GUI_AUTOBUMPPROTON!$DESC_AUTOBUMPPROTON ('AUTOBUMPPROTON')":CHK "${AUTOBUMPPROTON/#-/ -}" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ --field=" $GUI_USESPECIALK!$DESC_USESPECIALK ('USESPECIALK')":CHK "${USESPECIALK/#-/ -}" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ ---field=" $GUI_SPEKVERS!$DESC_SPEKVERS ('SPEKVERS')":CB "$(cleanDropDown "${SPEKVERS/#-/ -}" "default!$SPEKYADLIST")" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ +--field=" $GUI_SPEKVERS!$DESC_SPEKVERS ('SPEKVERS')":CB "$(cleanDropDown "${SPEKVERS/#-/ -}" "default!$SPEKYADLIST!nightly")" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ --field=" $GUI_SPEKDLLNAME!$DESC_SPEKDLLNAME ('SPEKDLLNAME')":CBE "$( cleanDropDown "${SPEKDLLNAME/#-/ -}" "$SPEKDLLNAMELIST" )" `#CAT_Proton` `#MENU_GAME` \ --field=" $GUI_USERESHSPEKPLUGIN!$DESC_USERESHSPEKPLUGIN ('USERESHSPEKPLUGIN')":CHK "${USERESHSPEKPLUGIN/#-/ -}" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ --field=" $GUI_USESPEKD3D47!$DESC_USESPEKD3D47 ('USESPEKD3D47')":CHK "${USESPEKD3D47/#-/ -}" `#CAT_Proton` `#SUB_Checkbox` `#MENU_GAME` \ @@ -5800,6 +5803,7 @@ function AllSettingsEntriesDummyFunction { --field=" $GUI_CONTYRELURL!$DESC_CONTYRELURL ('CONTYRELURL')" "${CONTYRELURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ --field=" $GUI_MO2DLURL!$DESC_MO2DLURL ('MO2PROJURL')" "${MO2PROJURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ --field=" $GUI_HMMDLURL!$DESC_HMMDLURL ('HMMPROJURL')" "${HMMPROJURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ +--field=" $GUI_SPEKPROJURL!$DESC_SPEKPROJURL ('SPEKPROJURL')" "${SPEKPROJURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ --field=" $GUI_DPRSRELURL!$DESC_DPRSRELURL ('DPRSRELURL')" "${DPRSRELURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ --field=" $GUI_DEPURL!$DESC_DEPURL ('DEPURL')" "${DEPURL/#-/ -}" `#CAT_Urls` `#MENU_URL` \ --field="$(spanFont "$GUI_OPTSVR" "H")":LBL "SKIP" `#CAT_VR` `#HEAD_VR` `#MENU_GAME` `#MENU_GLOBAL` \ @@ -9765,6 +9769,7 @@ function extSpek { SRCARCH="$1" SPEXT64="$SPEKDLDIR/$SPEKVERS/${SPEK}64.dll" + # TODO handle extracting ZIPs into SPEKDLDIR/SPEKVERS subfolder! (check extension) if [ -f "$SPEXT64" ]; then writelog "SKIP" "${FUNCNAME[0]} - Already have '$SPEXT64' - skipping extraction" "E" else @@ -9772,16 +9777,30 @@ function extSpek { SRCARCH="${SRCARCH//lK/l_K}" fi if [ -f "$SRCARCH" ]; then - if [ -x "$(command -v "$SEVZA")" ]; then - writelog "INFO" "${FUNCNAME[0]} - Extracting '$SRCARCH' to '$SPEKDLDIR/$SPEKVERS'" "E" - "$SEVZA" x "$SRCARCH" -o"$SPEKDLDIR/$SPEKVERS" 2>/dev/null - else - writelog "SKIP" "${FUNCNAME[0]} - Can't extract '$SRCARCH', because '$SEVZA' wasn't found!" "E" + SRCARCHEXT="${SRCARCH##*.}" + if [ "$SRCARCHEXT" = "zip" ]; then # zip archive from GitHub Actions (downloaded from nightly.link URL) + writelog "INFO" "${FUNCNAME[0]} - Extracting '$SRCARCH' into '$SPEKDLDIR/$SPEKVERS' using '$UNZIP'" + "$UNZIP" "$SRCARCH" -d "$SPEKDLDIR/$SPEKVERS" 2>/dev/null + else # else assume 7zip + if [ -x "$(command -v "$SEVZA")" ]; then + writelog "INFO" "${FUNCNAME[0]} - Extracting '$SRCARCH' to '$SPEKDLDIR/$SPEKVERS'" "E" + "$SEVZA" x "$SRCARCH" -o"$SPEKDLDIR/$SPEKVERS" 2>/dev/null + else + writelog "SKIP" "${FUNCNAME[0]} - Can't extract '$SRCARCH', because '$SEVZA' wasn't found!" "E" + fi fi fi fi } +# Get latest artifact download link from nightly.link +function getLatestNightlyLinkArtifactURL { + NIGHTLYLINKURL="$1" + NIGHTLYLINKURLPAT="$2" + + "$WGET" -q "${NIGHTLYLINKURL}" -O - 2> >(grep -v "SSL_INIT") | grep -oP "${NIGHTLYLINKURLPAT}" | head -n1 # Grep all links matching this pattern and pick the first one (should only be one anyway) +} + function dlSpecialK { if [ -n "$1" ]; then SPEKVERS="$1" @@ -9791,21 +9810,37 @@ function dlSpecialK { mkProjDir "$SPEKDLDIR/$SPEKVERS" - SPEKDL="$SPEKDLDIR/$SPEKVERS/$SPEKARC" - if [ "$SPEKVERS" == "default" ]; then SPEKDLURL="$SPEKURL/$SPEKARC" elif [ "$SPEKVERS" == "latest" ]; then SPEKDLURL="$SPEKGHURL/$SPEKVERS/download/$SPEKARC" + elif [ "$SPEKVERS" == "nightly" ]; then + writelog "INFO" "${FUNCNAME[0]} - Using SpecialK Nightly release, fetching from nightly.link" + + SPEKAPIURLPATH="${SPEKPROJURL//$GHURL}" + SPEKNIGHTLYHASH="$( fetchLatestGitHubActionsBuild "${AGHURL}/repos${SPEKAPIURLPATH}" 1 "Builds" | cut -d ';' -f2 )" + SPEKNIGHTLYURL="https://nightly.link${SPEKAPIURLPATH}/workflows/build-windows/main" + + writelog "INFO" "${FUNCNAME[0]} - SpecialK GitHub Actions hash is '$SPEKNIGHTLYHASH'" + writelog "INFO" "${FUNCNAME[0]} - SpecialK nightly.link URL is '$SPEKNIGHTLYURL'" + + SPEKNIGHTLYURLPATTERN="${SPEKNIGHTLYURL}.*?${SPEKNIGHTLYHASH}[a-zA-Z0-9].zip(?=\")" # Hash in archive name is 8 chars, but fetchLatestGitHubActionsBuild only returns 7, so accept one extra alphanumeric character when parsing name + SPEKDLURL="$( getLatestNightlyLinkArtifactURL "$SPEKNIGHTLYURL" "$SPEKNIGHTLYURLPATTERN" )" + SPEKARC="$( basename "$SPEKDLURL" )" # Need to make sure the archive name uses the nightly archive name, which isn't fixed + + writelog "INFO" "${FUNCNAME[0]} - SpecialK DL URL is '$SPEKDLURL'" + writelog "INFO" "${FUNCNAME[0]} - SpecialK Archive name from DL URL is '$SPEKARC'" else SPEKDLURL="$SPEKGHURL/download/SK_${SPEKVERS//./_}/$SPEKARC" fi + SPEKDL="$SPEKDLDIR/$SPEKVERS/$SPEKARC" + if [ ! -f "$SPEKDL" ]; then notiShow "$(strFix "$NOTY_DLCUSTOMPROTON" "$SPEK")" dlCheck "$SPEKDLURL" "$SPEKDL" "X" "Downloading '$SPEKDLURL' to '$SPEKDLDIR'" extSpek "$SPEKDL" - elif [ "$AUTOSPEK" -eq 1 ] && { [ "$SPEKVERS" == "default" ] || [ "$SPEKVERS" == "latest" ];}; then + elif [ "$AUTOSPEK" -eq 1 ] && { [ "$SPEKVERS" == "default" ] || [ "$SPEKVERS" == "latest" ] || [ "$SPEKVERS" == "nightly" ] ;}; then writelog "INFO" "${FUNCNAME[0]} - AUTOSPEK is enabled and SPEKVERS is '$SPEKVERS' - so looking for $SPEK updates" "E" # XXXXXX todo remove previous download? notiShow "$(strFix "$NOTY_DLCUSTOMPROTON" "$SPEK")" @@ -14720,15 +14755,21 @@ function updateWineRegistryKey { function fetchLatestGitHubActionsBuild { PROJAPIURL="$1" ARTIFACTNUM=$2 + WORKFLOWNAME="$3" # /actions/runs - ARTIFACTRUNSRESP="$( curl -s "${PROJAPIURL}/actions/runs" | "$JQ" '.workflow_runs[0]' )" - ARTIFACTRUNSUITEID="$( echo "$ARTIFACTRUNSRESP" | "$JQ" '.check_suite_id' )" + ARTIFACTRUNSRESPJQ=".workflow_runs[0]" + ## optionally filter by workflow name if we give one + if [ -n "$WORKFLOWNAME" ]; then + ARTIFACTRUNSRESPJQ="[.workflow_runs[] | select(.name==\"${WORKFLOWNAME}\")] | first" + fi + ARTIFACTRUNSRESP="$( curl -s "${PROJAPIURL}/actions/runs" | "$JQ" "${ARTIFACTRUNSRESPJQ}" )" + ARTIFACTRUNSUITEID="$( echo "$ARTIFACTRUNSRESP" | "$JQ" '.check_suite_id' )" LATESTARTIFACTURL="$( echo "$ARTIFACTRUNSRESP" | "$JQ" '.artifacts_url' | cut -d '"' -f 2 )" # /actions/runs//artifacts - LATESTARTIFACTRESP="$( curl -s "${LATESTARTIFACTURL}" | "$JQ" ".artifacts[${ARTIFACTNUM}]" )" - LATESTARTIFACTID="$( echo "$LATESTARTIFACTRESP" | "$JQ" ".id" )" + LATESTARTIFACTRESP="$( curl -s "${LATESTARTIFACTURL}" | "$JQ" ".artifacts[${ARTIFACTNUM}]" )" + LATESTARTIFACTID="$( echo "$LATESTARTIFACTRESP" | "$JQ" ".id" )" LATESTARTIFACTSHA="$( echo "$LATESTARTIFACTRESP" | "$JQ" ".workflow_run.head_sha" | cut -d '"' -f 2 )" ARTIFACTDLURL="suites/${ARTIFACTRUNSUITEID}/artifacts/${LATESTARTIFACTID}"