From b1388658cb570e75c2c5f7eee9f63006bca5cde8 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sun, 29 Dec 2024 23:42:46 +0500 Subject: [PATCH 01/32] check available steamgriddb --- data_from_portwine/scripts/add_in_steam.sh | 57 ++++++++++++---------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 717da97a..3bd871d5 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -100,7 +100,7 @@ getSteamId() { if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "$NOSTAPPNAME" 'has($key)' <<< "${SteamIds}" > /dev/null; then SteamAppId=$(jq -r --arg key "${NOSTAPPNAME}" '.[$key]' <<< "${SteamIds}") else - if [[ -n "${1:-}" ]]; then + if [[ -n "${1:-}" ]] && [[ -z "${SGDBNOTAVAILABLE}" ]]; then getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi if [[ $SteamGridDBTypeSteam == true ]]; then @@ -108,6 +108,8 @@ getSteamId() { if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" fi + elif [[ -n "${SGDBNOTAVAILABLE}" ]]; then + SteamAppId="$(curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" fi SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") echo "${SteamIds}" > "${cache_file}" @@ -120,15 +122,19 @@ getSteamId() { getSteamGridDBId() { unset SteamGridDBId NOSTAPPNAME="$1" - SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") - if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then - if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then - SteamGridDBTypeSteam=true - else - SteamGridDBTypeSteam=false + if [[ -z "${SGDBNOTAVAILABLE}" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs -o /dev/null "${BASESTEAMGRIDDBAPI}"; then + SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then + if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then + SteamGridDBTypeSteam=true + else + SteamGridDBTypeSteam=false + fi + SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" + echo "${SteamGridDBId}" fi - SteamGridDBId="$(jq '.data[0].id' <<< "${SGDBRES}")" - echo "${SteamGridDBId}" + else + SGDBNOTAVAILABLE="1" fi } @@ -272,25 +278,30 @@ downloadImageSteam() { } downloadImageSteamGridDB() { - SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1/game/${SteamGridDBId}?limit=1" - [[ -n "$3" ]] && SGDBIMGAPI+="&$3" - [[ -n "$4" ]] && SGDBIMGAPI+="&$4" - SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") - if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then - SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") - downloadImage "${SGDBIMGURL}" "$2" - elif [[ -n "$3" ]]; then - downloadImageSteamGridDB "$1" "$2" "" "$4" + if [[ -n "${SteamGridDBId}" ]]; then + SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1/game/${SteamGridDBId}?limit=1" + [[ -n "$3" ]] && SGDBIMGAPI+="&$3" + [[ -n "$4" ]] && SGDBIMGAPI+="&$4" + SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") + if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then + SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") + downloadImage "${SGDBIMGURL}" "$2" + elif [[ -n "$3" ]]; then + downloadImageSteamGridDB "$1" "$2" "" "$4" + else + return 1 + fi else return 1 fi } addGrids() { - if [[ -n "${SGDBAPIKEY}" ]]; then - getSteamGridDBId "${name_desktop}" > /dev/null + getSteamGridDBId "${name_desktop}" > /dev/null + if [[ -n "${SGDBNOTAVAILABLE}" ]]; then + getSteamId > /dev/null fi - if [[ -n "${SteamGridDBId}" ]]; then + if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then create_new_dir "${STCFGPATH}/grid" downloadImageSteamGridDB "grids" "${NOSTAIDGRID}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID}.jpg" || echo "Failed to load header.jpg" downloadImageSteamGridDB "grids" "${NOSTAIDGRID}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID}p.jpg" || echo "Failed to load library_600x900_2x.jpg" @@ -372,10 +383,6 @@ addNonSteamGame() { printf '\x08\x08\x08\x08' } >> "${SCPATH}" - # TODO: замень использование steamgriddb на steam так как сайт steamgriddb у многих без VPN не работает - # а пока просто блочим использование - export DOWNLOAD_STEAM_GRID="0" - if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" addGrids From f27eb542b30a0555ad8385e0d435eb2cac7b6383 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Mon, 30 Dec 2024 14:18:36 +0500 Subject: [PATCH 02/32] var USE_STEABGRIDDB --- data_from_portwine/scripts/add_in_steam.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 3bd871d5..254a93f9 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -100,7 +100,7 @@ getSteamId() { if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "$NOSTAPPNAME" 'has($key)' <<< "${SteamIds}" > /dev/null; then SteamAppId=$(jq -r --arg key "${NOSTAPPNAME}" '.[$key]' <<< "${SteamIds}") else - if [[ -n "${1:-}" ]] && [[ -z "${SGDBNOTAVAILABLE}" ]]; then + if [[ -n "${1:-}" ]] && [[ "${USE_STEABGRIDDB:-1}" == "1" ]]; then getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi if [[ $SteamGridDBTypeSteam == true ]]; then @@ -108,7 +108,7 @@ getSteamId() { if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" fi - elif [[ -n "${SGDBNOTAVAILABLE}" ]]; then + elif [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then SteamAppId="$(curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" fi SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") @@ -122,7 +122,7 @@ getSteamId() { getSteamGridDBId() { unset SteamGridDBId NOSTAPPNAME="$1" - if [[ -z "${SGDBNOTAVAILABLE}" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs -o /dev/null "${BASESTEAMGRIDDBAPI}"; then + if [[ "${USE_STEABGRIDDB:-1}" == "1" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs -o /dev/null "${BASESTEAMGRIDDBAPI}"; then SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then @@ -134,7 +134,7 @@ getSteamGridDBId() { echo "${SteamGridDBId}" fi else - SGDBNOTAVAILABLE="1" + USE_STEABGRIDDB="0" fi } @@ -298,7 +298,7 @@ downloadImageSteamGridDB() { addGrids() { getSteamGridDBId "${name_desktop}" > /dev/null - if [[ -n "${SGDBNOTAVAILABLE}" ]]; then + if [[ "${USE_STEABGRIDDB:-1}" == "1" ]]; then getSteamId > /dev/null fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then From 206556056674966f1531df93a5d9317b6584d875 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Mon, 30 Dec 2024 14:27:56 +0500 Subject: [PATCH 03/32] timeouts --- data_from_portwine/scripts/add_in_steam.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 254a93f9..be9207fc 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -104,12 +104,12 @@ getSteamId() { getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi if [[ $SteamGridDBTypeSteam == true ]]; then - SRES=$(curl -Ls -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") + SRES=$(curl -Ls --connect-timeout 5 -m 10 -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" fi elif [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then - SteamAppId="$(curl -s "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" + SteamAppId="$(curl -s --connect-timeout 5 -m 10 "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" fi SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") echo "${SteamIds}" > "${cache_file}" @@ -122,8 +122,8 @@ getSteamId() { getSteamGridDBId() { unset SteamGridDBId NOSTAPPNAME="$1" - if [[ "${USE_STEABGRIDDB:-1}" == "1" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs -o /dev/null "${BASESTEAMGRIDDBAPI}"; then - SGDBRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") + if [[ "${USE_STEABGRIDDB:-1}" == "1" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs --connect-timeout 5 -m 10 -o /dev/null "${BASESTEAMGRIDDBAPI}"; then + SGDBRES=$(curl -Ls --connect-timeout 5 -m 10 -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then SteamGridDBTypeSteam=true @@ -261,7 +261,7 @@ restartSteam() { } downloadImage() { - if ! curl -Lf# -o "${STCFGPATH}/grid/$2" "$1"; then + if ! curl -Lf# --connect-timeout 5 -m 10 -o "${STCFGPATH}/grid/$2" "$1"; then return 1 fi } @@ -282,7 +282,7 @@ downloadImageSteamGridDB() { SGDBIMGAPI="${BASESTEAMGRIDDBAPI}/$1/game/${SteamGridDBId}?limit=1" [[ -n "$3" ]] && SGDBIMGAPI+="&$3" [[ -n "$4" ]] && SGDBIMGAPI+="&$4" - SGDBIMGRES=$(curl -Ls -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") + SGDBIMGRES=$(curl -Ls --connect-timeout 5 -m 10 -H "Authorization: Bearer ${SGDBAPIKEY}" "${SGDBIMGAPI}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBIMGRES}" > /dev/null 2>&1; then SGDBIMGURL=$(jq -r '.data[0].url' <<< "${SGDBIMGRES}") downloadImage "${SGDBIMGURL}" "$2" @@ -298,15 +298,15 @@ downloadImageSteamGridDB() { addGrids() { getSteamGridDBId "${name_desktop}" > /dev/null - if [[ "${USE_STEABGRIDDB:-1}" == "1" ]]; then + if [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then getSteamId > /dev/null fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then create_new_dir "${STCFGPATH}/grid" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID}.jpg" || echo "Failed to load header.jpg" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID}p.jpg" || echo "Failed to load library_600x900_2x.jpg" - downloadImageSteamGridDB "heroes" "${NOSTAIDGRID}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAIDGRID}_hero.jpg" || echo "Failed to load library_hero.jpg" - downloadImageSteamGridDB "logos" "${NOSTAIDGRID}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAIDGRID}_logo.png" || echo "Failed to load logo.png" + downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID:-0}.jpg" || echo "Failed to load header.jpg" + downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID:-0}p.jpg" || echo "Failed to load library_600x900_2x.jpg" + downloadImageSteamGridDB "heroes" "${NOSTAIDGRID:-0}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAIDGRID:-0}_hero.jpg" || echo "Failed to load library_hero.jpg" + downloadImageSteamGridDB "logos" "${NOSTAIDGRID:-0}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAIDGRID:-0}_logo.png" || echo "Failed to load logo.png" else echo "Game is not found" fi From b0864223f00a53ba9018d3992a75092b6b2828d8 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 31 Dec 2024 17:27:12 +0500 Subject: [PATCH 04/32] removeNonSteamGame --- data_from_portwine/scripts/add_in_steam.sh | 63 +++++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 717da97a..69f2a166 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -48,12 +48,14 @@ generateShortcutGridAppId() { ### END MAGIC APPID FUNCTIONS getSteamShortcutsVdfFileHex() { - STCFGPATH="$(getUserPath)" - if [[ -n "${STCFGPATH}" ]]; then + if [[ -z "${STCFGPATH}" ]]; then + STCFGPATH="$(getUserPath)" + fi + if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then SCPATH="${STCFGPATH}/shortcuts.vdf" - if [[ -f "${SCPATH}" ]]; then - LC_ALL=C perl -0777 -ne 'print unpack("H*", $_)' "${SCPATH}" - fi + fi + if [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then + LC_ALL=C perl -0777 -ne 'print unpack("H*", $_)' "${SCPATH}" fi } @@ -301,21 +303,54 @@ addGrids() { fi } -addNonSteamGame() { - NOSTAPPNAME="${name_desktop}" - NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" - NOSTEXEPATH="\"${NOSTSHPATH}\"" - NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" - if [[ -z "${NOSTSTDIR}" ]]; then - NOSTSTDIR="\"${STEAM_SCRIPTS}\"" +removeNonSteamGame() { + if [[ -z "${STCFGPATH}" ]]; then + STCFGPATH="$(getUserPath)" fi - STCFGPATH="$(getUserPath)" - if [[ -n "${STCFGPATH}" ]]; then + if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then + SCPATH="${STCFGPATH}/shortcuts.vdf" + fi + if [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then + cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null + fi + [[ -n "${1:-}" ]] && appid="$1" + if [[ -n "${appid}" ]]; then + NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${appid}")) + LC_ALL=C perl -pe ' + $hex = pack("H*", shift); + $pos = index($_, $hex); + if ($pos != -1) { + $start_pos = rindex($_, "\x00", $pos - 1); + $end_pos = index($_, "ppid", $pos); + $end_pos = index($_, "\x08\x08", $pos) if $end_pos == -1; + if ($start_pos != -1 && $end_pos != -1) { + $end_pos += 4; + $_ = substr($_, 0, $start_pos) . substr($_, $end_pos); + } + } + ' "${SCPATH}" "${NOSTAIDVDFHEX}" > "${SCPATH}~" + mv "${SCPATH}~" "${SCPATH}" + rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" + fi +} + +addNonSteamGame() { + if [[ -z "${STCFGPATH}" ]]; then + STCFGPATH="$(getUserPath)" + fi + if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then SCPATH="${STCFGPATH}/shortcuts.vdf" fi if [[ -n "${SCPATH}" ]]; then + NOSTAPPNAME="${name_desktop}" + NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") if [[ -z "${NOSTAIDGRID}" ]]; then + NOSTEXEPATH="\"${NOSTSHPATH}\"" + if [[ -z "${NOSTSTDIR}" ]]; then + NOSTSTDIR="\"${STEAM_SCRIPTS}\"" + fi + NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc From f5dd208f2ad7af167d135fb8de6418024034564a Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 31 Dec 2024 19:53:44 +0500 Subject: [PATCH 05/32] getUserId getUserIds getUserPath --- data_from_portwine/scripts/add_in_steam.sh | 57 ++++++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 69f2a166..35425235 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -41,7 +41,8 @@ generateShortcutVDFHexAppId() { } # Takes an signed 32bit integer and converts it to an unsigned 32bit integer -generateShortcutGridAppId() { +extractSteamId32() { +# STUID32=$((STUID64 - 76561197960265728)) echo $(($1 & 0xFFFFFFFF)) } ## ---------- @@ -134,29 +135,55 @@ getSteamGridDBId() { fi } -getUserPath() { +getUserIds() { + SLUF="${HOME}/.local/share/Steam/config/loginusers.vdf" + if [[ -f "${SLUF}" ]]; then + STUIDS=() + while read -r line; do + if [[ "${line}" =~ ^[[:space:]]*\"([0-9]+)\"$ ]]; then + STUID=$(extractSteamId32 "${BASH_REMATCH[1]}") + STUIDS+=("${STUID}") + fi + done < "${SLUF}" + if [[ ${#STUIDS[@]} -gt 0 ]]; then + echo "${STUIDS[@]}" + fi + fi +} + +getUserId() { SLUF="${HOME}/.local/share/Steam/config/loginusers.vdf" if [[ -f "${SLUF}" ]]; then SLUFUB=false - STUID64="" + STUID="" while read -r line; do if [[ "${line}" =~ ^[[:space:]]*\"([0-9]+)\"$ ]]; then STUIDCUR="${BASH_REMATCH[1]}" SLUFUB=true elif [[ "${line}" == *'"MostRecent"'*'"1"' && ${SLUFUB} = true ]]; then - STUID64="${STUIDCUR}" + STUID=$(extractSteamId32 "${STUIDCUR}") break elif [[ "${line}" == "}" ]]; then SLUFUB=false fi done < "${SLUF}" - if [ -n "${STUID64}" ]; then - STUID32=$((STUID64 - 76561197960265728)) - STUIDPATH="${HOME}/.local/share/Steam/userdata/${STUID32}" - if [[ -d "${STUIDPATH}" ]]; then - if [[ -f "${STUIDPATH}/config/shortcuts.vdf" ]]; then - echo "${STUIDPATH}/config" - fi + fi + if [ -n "${STUID}" ]; then + echo "${STUID}" + fi +} + +getUserPath() { + if [[ -n "${1:-}" ]]; then + STUID="$1" + else + STUID="$(getUserId)" + fi + if [ -n "${STUID}" ]; then + STUIDPATH="${HOME}/.local/share/Steam/userdata/${STUID}" + if [[ -d "${STUIDPATH}" ]]; then + if [[ -f "${STUIDPATH}/config/shortcuts.vdf" ]]; then + echo "${STUIDPATH}/config" fi fi fi @@ -304,17 +331,15 @@ addGrids() { } removeNonSteamGame() { + [[ -n "${1:-}" ]] && appid="$1" if [[ -z "${STCFGPATH}" ]]; then STCFGPATH="$(getUserPath)" fi if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then SCPATH="${STCFGPATH}/shortcuts.vdf" fi - if [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then + if [[ -n "${appid}" ]] && [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null - fi - [[ -n "${1:-}" ]] && appid="$1" - if [[ -n "${appid}" ]]; then NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${appid}")) LC_ALL=C perl -pe ' $hex = pack("H*", shift); @@ -354,7 +379,7 @@ addNonSteamGame() { NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc - NOSTAIDGRID="$(generateShortcutGridAppId "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts + NOSTAIDGRID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts create_new_dir "${STEAM_SCRIPTS}" echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" From df86ec04167087270c5dde32e72f9c4254fb4f26 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 31 Dec 2024 20:55:49 +0500 Subject: [PATCH 06/32] getAppExe --- data_from_portwine/scripts/add_in_steam.sh | 35 +++++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 35425235..8c77b2cb 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -74,10 +74,14 @@ getSteamShortcutEntryHex() { printf "%s" "${SHORTCUTSVDFINPUTHEX}" | grep -oP "${SHORTCUTSVDFMATCHPATTERN}\K.*?(?=${SHORTCUTVDFENDPAT})" } +getAppExe() { + [[ -n "$1" ]] && listNonSteamGames | jq -r --arg id "$1" 'map(select(.id == $id)) | first(.[].exe)' +} + getAppTarget() { - exe=$(listNonSteamGames | jq -r --arg id "$1" 'map(select(.id == $id)) | first(.[].exe)') + exe=$(getAppExe "$1") if [[ -n "${exe}" ]]; then - if [[ "${exe}" =~ .sh$ ]] ; then + if [[ "${exe}" =~ .sh$ ]]; then parseSteamTargetExe "${exe}" else echo "${exe}"; @@ -90,7 +94,7 @@ getSteamGameId() { } getAppId() { - listNonSteamGames | jq -r --arg exe "$1" 'map(select(.exe == $exe)) | first(.[]?.id)' + [[ -n "$1" ]] && listNonSteamGames | jq -r --arg exe "$1" 'map(select(.exe == $exe)) | first(.[]?.id)' } getSteamId() { @@ -141,8 +145,7 @@ getUserIds() { STUIDS=() while read -r line; do if [[ "${line}" =~ ^[[:space:]]*\"([0-9]+)\"$ ]]; then - STUID=$(extractSteamId32 "${BASH_REMATCH[1]}") - STUIDS+=("${STUID}") + STUIDS+=("$(extractSteamId32 "${BASH_REMATCH[1]}")") fi done < "${SLUF}" if [[ ${#STUIDS[@]} -gt 0 ]]; then @@ -332,13 +335,14 @@ addGrids() { removeNonSteamGame() { [[ -n "${1:-}" ]] && appid="$1" - if [[ -z "${STCFGPATH}" ]]; then - STCFGPATH="$(getUserPath)" - fi + [[ -n "${2:-}" ]] && NOSTSHPATH="$2" + [[ -z "${STUID}" ]] && STUID=$(getUserId) + [[ -z "${STCFGPATH}" ]] && STCFGPATH="$(getUserPath ${STUID})" if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then SCPATH="${STCFGPATH}/shortcuts.vdf" fi if [[ -n "${appid}" ]] && [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then + [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH=$(getAppExe ${appid}) cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${appid}")) LC_ALL=C perl -pe ' @@ -357,6 +361,21 @@ removeNonSteamGame() { mv "${SCPATH}~" "${SCPATH}" rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" fi + if [[ -n "${STUID}" ]] && [[ -n "${NOSTSHPATH}" ]] && [[ -f "${NOSTSHPATH}" ]]; then + isInstallGame=false + for STUIDCUR in $(getUserIds); do + [[ "${STUIDCUR}" == "${STUID}" ]] && continue + STCFGPATH="$(getUserPath ${STUIDCUR})" + SCPATH="${STCFGPATH}/shortcuts.vdf" + if [[ -n "$(getAppId "${NOSTSHPATH}")" ]]; then + isInstallGame=true + break + fi + done + if [[ ${isInstallGame} == false ]]; then + rm "${NOSTSHPATH}" + fi + fi } addNonSteamGame() { From 23be9fc637107b406c67cb1f33da98d84db84247 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 2 Jan 2025 03:09:24 +0500 Subject: [PATCH 07/32] addEntry --- data_from_portwine/scripts/add_in_steam.sh | 203 ++++++++++++--------- 1 file changed, 116 insertions(+), 87 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 8c77b2cb..54ae69b1 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -210,19 +210,22 @@ listInstalledSteamGames() { } listNonSteamGames() { - getSteamShortcutHex | while read -r SCVDFE; do - jq -n \ - --arg id "$(parseSteamShortcutEntryAppID "${SCVDFE}")" \ - --arg name "$(parseSteamShortcutEntryAppName "${SCVDFE}")" \ - --arg exe "$(parseSteamShortcutEntryExe "${SCVDFE}")" \ - '{id: $id, name: $name, exe: $exe}' - done | jq -s '.' + getSteamShortcutHex | while read -r SCVDFE; do + jq -n \ + --arg id "$(parseSteamShortcutEntryAppID "${SCVDFE}")" \ + --arg name "$(parseSteamShortcutEntryAppName "${SCVDFE}")" \ + --arg exe "$(parseSteamShortcutEntryExe "${SCVDFE}")" \ + --arg dir "$(parseSteamShortcutEntryStartDir "${SCVDFE}")" \ + --arg icon "$(parseSteamShortcutEntryIcon "${SCVDFE}")" \ + --arg args "$(parseSteamShortcutEntryLaunchOptions "${SCVDFE}")" \ + '{id: $id, name: $name, exe: $exe, dir: $dir, icon: $icon, args: $args}' + done | jq -s '.' } listSteamGames() { ( jq -r 'map({AppId: .id, SteamAppId: .id, SteamGameId: .id, Name: .name}) | .[] | tostring' <<< "$(listInstalledSteamGames)" - jq -r '.[] | tostring' <<< "$(listNonSteamGames)" | while read game; do + jq -r '.[] | tostring' <<< "$(listNonSteamGames)" | while read -r game; do id=$(jq -r '.id' <<< "${game}") name=$(jq -r '.name' <<< "${game}") jq -r \ @@ -240,19 +243,22 @@ convertSteamShortcutAppID() { } convertSteamShortcutHex() { - # printf "%s" "$1" | xxd -r -p | tr -d '\0' LC_ALL=C perl -le 'print pack "H*", $ARGV[0]' "$1" | tr -d '\0' } +convertStringToSteamShortcutHex() { + LC_ALL=C perl -e 'print unpack "H*", "$ARGV[0]" . "\x00"' "$(echo "$1" | tr -cd '[:alpha:]')" +} + parseSteamShortcutEntryHex() { SHORTCUTSVDFINPUTHEX="$1" # The hex block representing the shortcut SHORTCUTSVDFMATCHPATTERN="$2" # The pattern to match against in the block convertSteamShortcutHex "$(getSteamShortcutEntryHex "${SHORTCUTSVDFINPUTHEX}" "${SHORTCUTSVDFMATCHPATTERN}")" } -parseSteamShortcutEntryExe() { - SHORTCUTVDFEXEHEXPAT="000145786500" # 'Exe' ('exe' is 6578650a if we ever need it) - parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFEXEHEXPAT}" | tr -d '"' +parseSteamShortcutEntryAppID() { + SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid' + convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")" } parseSteamShortcutEntryAppName() { @@ -260,9 +266,24 @@ parseSteamShortcutEntryAppName() { parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFNAMEHEXPAT}" } -parseSteamShortcutEntryAppID() { - SHORTCUTVDFAPPIDHEXPAT="617070696400" # 'appid' - convertSteamShortcutAppID "$(printf "%s" "$1" | grep -oP "${SHORTCUTVDFAPPIDHEXPAT}\K.{8}")" +parseSteamShortcutEntryExe() { + SHORTCUTVDFEXEHEXPAT="000145786500" # 'Exe' ('exe' is 6578650a if we ever need it) + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFEXEHEXPAT}" | tr -d '"' +} + +parseSteamShortcutEntryStartDir() { + SHORTCUTVDFSTARTDIRHEXPAT="0001537461727444697200" + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFSTARTDIRHEXPAT}" | tr -d '"' +} + +parseSteamShortcutEntryIcon() { + SHORTCUTVDFICONHEXPAT="000169636f6e00" + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFICONHEXPAT}" +} + +parseSteamShortcutEntryLaunchOptions() { + SHORTCUTVDFARGHEXPAT="00014c61756e63684f7074696f6e7300" # echo "0001$(convertStringToSteamShortcutHex "LaunchOptions")" + parseSteamShortcutEntryHex "$1" "${SHORTCUTVDFARGHEXPAT}" | tr '\002' '\n' | head -n 1 | tr -d '\000' } parseSteamTargetExe() { @@ -333,47 +354,90 @@ addGrids() { fi } +addEntry() { + if [[ -n "${SCPATH}" ]]; then + if [[ -f "${SCPATH}" ]] ; then + truncate -s-2 "${SCPATH}" + OLDSET="$(grep -aPo '\x00[0-9]\x00\x02appid' "${SCPATH}" | tail -n1 | tr -dc '0-9')" + NEWSET=$((OLDSET + 1)) + else + printf '\x00%s\x00' "shortcuts" > "${SCPATH}" + NEWSET=0 + fi + NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc + + { + printf '\x00%s\x00' "${NEWSET}" + printf '\x02%s\x00%b' "appid" "${NOSTAIDVDFHEXFMT}" + printf '\x01%s\x00%s\x00' "AppName" "${NOSTAPPNAME}" + printf '\x01%s\x00%s\x00' "Exe" "\"${NOSTEXEPATH}\"" + printf '\x01%s\x00%s\x00' "StartDir" "\"${NOSTSTDIR}\"" + printf '\x01%s\x00%s\x00' "icon" "${NOSTICONPATH}" + printf '\x01%s\x00%s\x00' "ShortcutPath" "" + printf '\x01%s\x00%s\x00' "LaunchOptions" "${NOSTARGS:-}" + + printf '\x02%s\x00%b\x00\x00\x00' "IsHidden" "\x00" + printf '\x02%s\x00%b\x00\x00\x00' "AllowDesktopConfig" "\x00" + + # These values are now stored in localconfig.vdf under the "Apps" section, + # under a block using the Non-Steam Game Signed 32bit AppID. (i.e., -223056321) + # This is handled by `updateLocalConfigAppsValue` below + # + # Unsure if required, but still write these to the shortcuts.vdf file for consistency + printf '\x02%s\x00%b\x00\x00\x00' "AllowOverlay" "\x00" + printf '\x02%s\x00%b\x00\x00\x00' "OpenVR" "\x00" + + printf '\x02%s\x00\x00\x00\x00\x00' "Devkit" + printf '\x01%s\x00\x00' "DevkitGameID" + printf '\x02%s\x00\x00\x00\x00\x00' "DevkitOverrideAppID" + printf '\x02%s\x00\x00\x00\x00\x00' "LastPlayTime" + printf '\x01%s\x00\x00' "FlatpakAppID" + printf '\x00%s\x00' "tags" + printf '\x08\x08\x08\x08' + } >> "${SCPATH}" + fi +} + removeNonSteamGame() { - [[ -n "${1:-}" ]] && appid="$1" - [[ -n "${2:-}" ]] && NOSTSHPATH="$2" + [[ -n "$1" ]] && appid="$1" [[ -z "${STUID}" ]] && STUID=$(getUserId) [[ -z "${STCFGPATH}" ]] && STCFGPATH="$(getUserPath ${STUID})" if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then SCPATH="${STCFGPATH}/shortcuts.vdf" fi - if [[ -n "${appid}" ]] && [[ -n "${SCPATH}" ]] && [[ -f "${SCPATH}" ]]; then - [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH=$(getAppExe ${appid}) - cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null - NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${appid}")) - LC_ALL=C perl -pe ' - $hex = pack("H*", shift); - $pos = index($_, $hex); - if ($pos != -1) { - $start_pos = rindex($_, "\x00", $pos - 1); - $end_pos = index($_, "ppid", $pos); - $end_pos = index($_, "\x08\x08", $pos) if $end_pos == -1; - if ($start_pos != -1 && $end_pos != -1) { - $end_pos += 4; - $_ = substr($_, 0, $start_pos) . substr($_, $end_pos); - } - } - ' "${SCPATH}" "${NOSTAIDVDFHEX}" > "${SCPATH}~" - mv "${SCPATH}~" "${SCPATH}" - rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" - fi - if [[ -n "${STUID}" ]] && [[ -n "${NOSTSHPATH}" ]] && [[ -f "${NOSTSHPATH}" ]]; then - isInstallGame=false - for STUIDCUR in $(getUserIds); do - [[ "${STUIDCUR}" == "${STUID}" ]] && continue - STCFGPATH="$(getUserPath ${STUIDCUR})" - SCPATH="${STCFGPATH}/shortcuts.vdf" - if [[ -n "$(getAppId "${NOSTSHPATH}")" ]]; then - isInstallGame=true - break + if [[ -n "${appid}" ]]; then + games=$(listNonSteamGames) + NOSTSHPATH=$(jq -r --arg id "${appid}" 'map(select(.id == $id)) | first(.[].exe)' <<< "${games}") + if [[ -n "${NOSTSHPATH}" ]]; then + mv "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null + jq --arg id "${appid}" 'map(select(.id != $id))' <<< "${games}" | jq -c '.[]' | while read -r game; do + NOSTAIDGRID=$(jq -r '.id' <<< "${game}") + NOSTAPPNAME=$(jq -r '.name' <<< "${game}") + NOSTEXEPATH=$(jq -r '.exe' <<< "${game}") + NOSTSTDIR=$(jq -r '.dir' <<< "${game}") + NOSTICONPATH=$(jq -r '.icon' <<< "${game}") + NOSTARGS=$(jq -r '.args' <<< "${game}") + NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${NOSTAIDGRID}")) + addEntry + done + rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" + if [[ -f "${NOSTSHPATH}" ]]; then + isInstallGame=false + for STUIDCUR in $(getUserIds); do + [[ "${STUIDCUR}" == "${STUID}" ]] && continue + STCFGPATH="$(getUserPath ${STUIDCUR})" + SCPATH="${STCFGPATH}/shortcuts.vdf" + if [[ -n "$(getAppId "${NOSTSHPATH}")" ]]; then + isInstallGame=true + break + fi + done + unset STCFGPATH SCPATH + if [[ ${isInstallGame} == false ]]; then + rm "${NOSTSHPATH}" + fi fi - done - if [[ ${isInstallGame} == false ]]; then - rm "${NOSTSHPATH}" + restartSteam fi fi } @@ -390,14 +454,13 @@ addNonSteamGame() { NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") if [[ -z "${NOSTAIDGRID}" ]]; then - NOSTEXEPATH="\"${NOSTSHPATH}\"" + NOSTEXEPATH="${NOSTSHPATH}" if [[ -z "${NOSTSTDIR}" ]]; then - NOSTSTDIR="\"${STEAM_SCRIPTS}\"" + NOSTSTDIR="${STEAM_SCRIPTS}" fi NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc - NOSTAIDVDFHEXFMT="\x$(awk '{$1=$1}1' FPAT='.{2}' OFS="\\\x" <<< "$NOSTAIDVDFHEX")" # binary-formatted string hex of the above which we actually write out - ex: \xc1\xc2\x5a\xdc NOSTAIDGRID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts create_new_dir "${STEAM_SCRIPTS}" @@ -413,43 +476,9 @@ addNonSteamGame() { if [[ -f "${SCPATH}" ]] ; then cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null - truncate -s-2 "${SCPATH}" - OLDSET="$(grep -aPo '\x00[0-9]\x00\x02appid' "${SCPATH}" | tail -n1 | tr -dc '0-9')" - NEWSET=$((OLDSET + 1)) - else - printf '\x00%s\x00' "shortcuts" > "${SCPATH}" - NEWSET=0 fi - { - printf '\x00%s\x00' "${NEWSET}" - printf '\x02%s\x00%b' "appid" "${NOSTAIDVDFHEXFMT}" - printf '\x01%s\x00%s\x00' "AppName" "${NOSTAPPNAME}" - printf '\x01%s\x00%s\x00' "Exe" "${NOSTEXEPATH}" - printf '\x01%s\x00%s\x00' "StartDir" "${NOSTSTDIR}" - printf '\x01%s\x00%s\x00' "icon" "${NOSTICONPATH}" - printf '\x01%s\x00%s\x00' "ShortcutPath" "" - printf '\x01%s\x00%s\x00' "LaunchOptions" "" - - printf '\x02%s\x00%b\x00\x00\x00' "IsHidden" "\x00" - printf '\x02%s\x00%b\x00\x00\x00' "AllowDesktopConfig" "\x00" - - # These values are now stored in localconfig.vdf under the "Apps" section, - # under a block using the Non-Steam Game Signed 32bit AppID. (i.e., -223056321) - # This is handled by `updateLocalConfigAppsValue` below - # - # Unsure if required, but still write these to the shortcuts.vdf file for consistency - printf '\x02%s\x00%b\x00\x00\x00' "AllowOverlay" "\x00" - printf '\x02%s\x00%b\x00\x00\x00' "OpenVR" "\x00" - - printf '\x02%s\x00\x00\x00\x00\x00' "Devkit" - printf '\x01%s\x00\x00' "DevkitGameID" - printf '\x02%s\x00\x00\x00\x00\x00' "DevkitOverrideAppID" - printf '\x02%s\x00\x00\x00\x00\x00' "LastPlayTime" - printf '\x01%s\x00\x00' "FlatpakAppID" - printf '\x00%s\x00' "tags" - printf '\x08\x08\x08\x08' - } >> "${SCPATH}" + addEntry # TODO: замень использование steamgriddb на steam так как сайт steamgriddb у многих без VPN не работает # а пока просто блочим использование From ded69ca4ebfcd0342f77d83bc4249ae610f59588 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Fri, 3 Jan 2025 14:36:52 +0600 Subject: [PATCH 08/32] New game LastChaos --- data_from_portwine/img/gui/lastchaos.png | Bin 0 -> 6659 bytes .../scripts/pw_autoinstall/PW_LAST_CHAOS | 25 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 data_from_portwine/img/gui/lastchaos.png create mode 100755 data_from_portwine/scripts/pw_autoinstall/PW_LAST_CHAOS diff --git a/data_from_portwine/img/gui/lastchaos.png b/data_from_portwine/img/gui/lastchaos.png new file mode 100644 index 0000000000000000000000000000000000000000..3960bf4fe5bb1d34766e26fbacb1b8cd91ed52d7 GIT binary patch literal 6659 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

4%y2?j!p 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 Date: Sat, 4 Jan 2025 12:29:26 +0600 Subject: [PATCH 09/32] New game FRACTURED_ONLINE --- .../img/gui/fracturedonline.png | Bin 0 -> 5649 bytes .../pw_autoinstall/PW_FRACTURED_ONLINE | 26 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 data_from_portwine/img/gui/fracturedonline.png create mode 100755 data_from_portwine/scripts/pw_autoinstall/PW_FRACTURED_ONLINE diff --git a/data_from_portwine/img/gui/fracturedonline.png b/data_from_portwine/img/gui/fracturedonline.png new file mode 100644 index 0000000000000000000000000000000000000000..f214cb90e3ecc9e76df17015e10397e4d33c222e GIT binary patch literal 5649 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 literal 0 HcmV?d00001 diff --git a/data_from_portwine/scripts/pw_autoinstall/PW_FRACTURED_ONLINE b/data_from_portwine/scripts/pw_autoinstall/PW_FRACTURED_ONLINE new file mode 100755 index 00000000..ff243ff0 --- /dev/null +++ b/data_from_portwine/scripts/pw_autoinstall/PW_FRACTURED_ONLINE @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Author: chal55rus +# type: games +# name: Fractured Online (ENG) +# image: fracturedonline +# info_en: Fractured Online is the first open-world sandbox MMORPG mixing action combat with fully interactable environments, appealing equally to lovers of competitive and cooperative gameplay. Jump right into the fray from day one. Defeat your enemies through your own skill and cleverness, not equipment or level. Gather resources, craft, trade and venture into legendary travels as a solitary hero, or start a settlement with your guild and grow it into the next empire. +# info_ru: Fractured Online — это первая массовая многопользовательская ролевая онлайн-игра с открытым миром, сочетающая динамичные сражения с полностью интерактивным окружением. Она одинаково понравится любителям соревновательного и кооперативного игрового процесса. С самого первого дня погрузитесь в бой. Побеждайте врагов благодаря собственным навыкам и смекалке, а не снаряжению или уровню. Собирайте ресурсы, создавайте предметы, торгуйте и отправляйтесь в легендарные путешествия в одиночку или создайте поселение со своей гильдией и превратите его в следующую империю. +######################################################################## +export PW_PREFIX_NAME="FRACTURED_ONLINE" +export LAUNCH_PARAMETERS="/S" +export PW_AUTOINSTALL_EXE="${PW_USER_TEMP}/fractured-online-setup.exe" +export PORTWINE_CREATE_SHORTCUT_NAME="Fractured Online" + +start_portwine +if try_download "https://assets.fracturedmmo.com/clients/3f990010d1afb2cabadc44c6c849116c/fractured-online-setup.exe" "${PW_AUTOINSTALL_EXE}" no_mirror +then + pw_start_progress_bar_install_game "Fractured Online." + pw_run "${PW_AUTOINSTALL_EXE}" + portwine_exe="$WINEPREFIX/drive_c/Program Files/Fractured Online/FracturedOnline.exe" + try_remove_file "${PW_AUTOINSTALL_EXE}" + try_remove_file "${portwine_exe}.ppdb" + kill_portwine + pw_stop_progress_bar + portwine_create_shortcut +fi +stop_portwine From b0fa4a43557fc9e525914b3316568232fdad3f02 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Tue, 7 Jan 2025 12:53:52 +0500 Subject: [PATCH 10/32] Fixed crash if scripts_backup folder is missing when trying to rollback scripts --- data_from_portwine/scripts/functions_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index f7d31fcd..be8213c0 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -6965,7 +6965,7 @@ gui_edit_db_file () { } gui_open_scripts_from_backup () { - cd "${PORT_WINE_TMP_PATH}/scripts_backup/" || fatal + [[ -d "${PORT_WINE_TMP_PATH}/scripts_backup/" ]] && cd "${PORT_WINE_TMP_PATH}/scripts_backup/" || cd "$HOME" PW_SCRIPT_FROM_BACKUP=$("${pw_yad}" --file --width=650 --height=500 \ --window-icon="$PW_GUI_ICON_PATH/portproton.svg" --title "SCRIPTS FROM BACKUP" --file-filter="backup_scripts|scripts_v*.tar.gz" 2>/dev/null ) YAD_STATUS="$?" From 59d3ee4f4ec609067dd1b1b101d875ad79777238 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 7 Jan 2025 17:59:14 +0500 Subject: [PATCH 11/32] portwine_delete_shortcut --- data_from_portwine/scripts/add_in_steam.sh | 5 +- data_from_portwine/scripts/functions_helper | 56 ++++++++++++++------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 54ae69b1..de27bb9b 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -400,6 +400,7 @@ addEntry() { removeNonSteamGame() { [[ -n "$1" ]] && appid="$1" + [[ -n "$2" ]] && NOSTSHPATH="$2" [[ -z "${STUID}" ]] && STUID=$(getUserId) [[ -z "${STCFGPATH}" ]] && STCFGPATH="$(getUserPath ${STUID})" if [[ -n "${STCFGPATH}" ]] && [[ -z "${SCPATH}" ]]; then @@ -407,7 +408,7 @@ removeNonSteamGame() { fi if [[ -n "${appid}" ]]; then games=$(listNonSteamGames) - NOSTSHPATH=$(jq -r --arg id "${appid}" 'map(select(.id == $id)) | first(.[].exe)' <<< "${games}") + [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH=$(jq -r --arg id "${appid}" 'map(select(.id == $id)) | first(.[].exe)' <<< "${games}") if [[ -n "${NOSTSHPATH}" ]]; then mv "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null jq --arg id "${appid}" 'map(select(.id != $id))' <<< "${games}" | jq -c '.[]' | while read -r game; do @@ -450,8 +451,8 @@ addNonSteamGame() { SCPATH="${STCFGPATH}/shortcuts.vdf" fi if [[ -n "${SCPATH}" ]]; then + [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAPPNAME="${name_desktop}" - NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") if [[ -z "${NOSTAIDGRID}" ]]; then NOSTEXEPATH="${NOSTSHPATH}" diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index f7d31fcd..3eb57ea9 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -6308,7 +6308,18 @@ portwine_change_shortcut () { then PW_SHORTCUT_DESKTOP="TRUE" else PW_SHORTCUT_DESKTOP="FALSE" fi - PW_SHORTCUT_STEAM="FALSE" + if [[ -n $PW_DELETE_STEAM ]]; then + source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" + NOSTSHPATH="${PW_DELETE_SHORTCUT_STEAM[0]//#@_@#/ }" + NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") + if [[ -n "${NOSTSHPATH}" ]] && [[ -n "${NOSTAIDGRID}" ]]; then + PW_SHORTCUT_STEAM="TRUE" + else + PW_SHORTCUT_STEAM="FALSE" + fi + else + PW_SHORTCUT_STEAM="FALSE" + fi unset name_desktop create_name_desktop @@ -6334,6 +6345,7 @@ portwine_change_shortcut () { PORTWINE_CHANGE_SHORTCUT=1 if [[ $PW_YAD_OUT == 1 ]] ; then [[ "$PW_GUI_START" == "NOTEBOOK" ]] && unset PW_YAD_FORM_TAB + PW_SHORTCUT_STEAM="FALSE" portwine_delete_shortcut restart_pp fi @@ -6341,24 +6353,29 @@ portwine_change_shortcut () { } portwine_search_shortcut () { - unset PW_DELETE_SHORTCUT_MENU PW_DELETE_SHORTCUT_DESKTOP - PW_DELETE_MENU="$(grep -il "${portwine_exe}" "${HOME}/.local/share/applications"/*.desktop 2>/dev/null)" - read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_MENU// /#@_@#}" + unset PW_DELETE_SHORTCUT_MENU PW_DELETE_SHORTCUT_STEAM PW_DELETE_SHORTCUT_DESKTOP + if [[ -n "${portwine_exe}" ]]; then + PW_DELETE_MENU="$(grep -il "${portwine_exe}" "${HOME}/.local/share/applications"/*.desktop 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_MENU// /#@_@#}" - PW_DELETE_PP="$(grep -il "${portwine_exe}" "${PORT_WINE_PATH}"/*.desktop 2>/dev/null)" - read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_PP// /#@_@#}" + PW_DELETE_PP="$(grep -il "${portwine_exe}" "${PORT_WINE_PATH}"/*.desktop 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_MENU <<< "${PW_DELETE_SHORTCUT_MENU[*]} ${PW_DELETE_PP// /#@_@#}" - if [[ -d "${HOME}/Desktop" ]] ; then - PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Desktop"/*.desktop 2>/dev/null)" - read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" - fi - if [[ -d "${HOME}/Рабочий стол" ]] ; then - PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Рабочий стол"/*.desktop 2>/dev/null)" - read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" - fi - if [[ $(xdg-user-dir DESKTOP) ]] ; then - PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "$(xdg-user-dir DESKTOP)"/*.desktop 2>/dev/null)" - read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" + PW_DELETE_STEAM="$(grep -il "${portwine_exe}" "${STEAM_SCRIPTS}"/*.sh 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_STEAM <<< "${PW_DELETE_SHORTCUT_STEAM[*]} ${PW_DELETE_STEAM// /#@_@#}" + + if [[ -d "${HOME}/Desktop" ]] ; then + PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Desktop"/*.desktop 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" + fi + if [[ -d "${HOME}/Рабочий стол" ]] ; then + PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "${HOME}/Рабочий стол"/*.desktop 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" + fi + if [[ $(xdg-user-dir DESKTOP) ]] ; then + PW_DELETE_DESKTOP="$(grep -il "${portwine_exe}" "$(xdg-user-dir DESKTOP)"/*.desktop 2>/dev/null)" + read -r -d '' -a PW_DELETE_SHORTCUT_DESKTOP <<< "${PW_DELETE_SHORTCUT_DESKTOP[*]} ${PW_DELETE_DESKTOP// /#@_@#}" + fi fi } @@ -6371,6 +6388,11 @@ portwine_delete_shortcut () { for delete_shortcut in "${PW_DELETE_SHORTCUT_MENU[@]}" "${PW_DELETE_SHORTCUT_DESKTOP[@]}" ; do rm -f "${delete_shortcut//#@_@#/ }" done + + if [[ "${PW_SHORTCUT_STEAM}" == "FALSE" ]] && [[ -n "${NOSTSHPATH}" ]] && [[ -n "${NOSTAIDGRID}" ]]; then + source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" + removeNonSteamGame "${NOSTAIDGRID}" "${NOSTSHPATH}" + fi } portwine_missing_shortcut () { From 97467d99258344b84a82a27c77eb119a60ae2159 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Wed, 8 Jan 2025 22:35:25 +0500 Subject: [PATCH 12/32] Fix desktop file permission change on KDE --- data_from_portwine/scripts/functions_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index f7d31fcd..a77e3933 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -6168,7 +6168,7 @@ portwine_output_yad_shortcut () { echo "Path=${PORT_SCRIPTS_PATH}/" echo "Icon=${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" } >> "${PORT_WINE_PATH}/${name_desktop}.desktop" - chmod u+x "${PORT_WINE_PATH}/${name_desktop}.desktop" + chmod +x "${PORT_WINE_PATH}/${name_desktop}.desktop" if [[ "${PW_SHORTCUT_MENU}" == "TRUE" ]] ; then try_remove_file "${HOME}/.local/share/applications/${name_desktop}.desktop" From d91580f18ee40cda5ca7473b02753f8ccf8eceb4 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Thu, 9 Jan 2025 21:32:00 +0300 Subject: [PATCH 13/32] Scripts version 2386 --- data_from_portwine/changelog_en | 9 +++++++++ data_from_portwine/changelog_ru | 9 +++++++++ data_from_portwine/scripts/thanks | 3 ++- data_from_portwine/scripts/var | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 82c56c4c..a2cb25ec 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,15 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2386### / Date: 09.01.2025 / Download update size: 4 megabytes +* corrected permissions when creating desktop files (thanks to Boria138) +* fixed the function of rolling back scripts from the archive if there is no scripts_backup directory (thanks to Boria138) +* added the ability to remove a game from the list in the Steam library using the functionality of changing the shortcut in PortProton (thanks to alex2844) +* when adding a game to the steam library, a check for the availability of the steamgriddb site has been added (thanks alex2844) +* added auto-installation of games (thanks to minergenon): + * Last Chaos + * Fractured Online + ###Scripts version 2385### / stable / Date: 29.12.2024 / Download update size: 195 megabytes * cumulative update to the stable version of PortProton scripts diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 8c9343f3..e97a7b61 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,15 @@ ----------------------------------------- История изменений: +###Scripts version 2386### / Дата: 09.01.2025 / Размер скачиваемого обновления: 4 мегабайта +* исправление прав при создании desktop файлов (спасибо Boria138) +* исправлена функция отката скриптов из архива, если нет каталога scripts_backup (спасибо Boria138) +* добавлена возможность удаления игры из списка в библиотеке Steam с помощью функционала изменения ярлыка в PortProton (спасибо alex2844) +* при добавлении игры в библиотеку steam добавлена проверка на доступность сайта steamgriddb (спасибо alex2844) +* добавлены автоустановки игр (спасибо minergenon): + * Last Chaos + * Fractured Online + ###Scripts version 2385### / stable / Дата: 29.12.2024 / Размер скачиваемого обновления: 195 мегабайт * кумулятивное обновление стабильной версии скриптов PortProton diff --git a/data_from_portwine/scripts/thanks b/data_from_portwine/scripts/thanks index 4bae4b2e..6566e64f 100644 --- a/data_from_portwine/scripts/thanks +++ b/data_from_portwine/scripts/thanks @@ -4,9 +4,10 @@ credits_devel () { echo " Boria138 Vano Majukin Eljeyna - chal55rus + minergenon (chal55rus) SDR Mels + alex2844 Cefeiko Dezert1r Taz_mania diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index 6b250c9d..eb79419c 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2385 +#SCRIPTS_NEXT_VERSION=2386 #SCRIPTS_STABLE_VERSION=2385 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" From df3f6de16f31affd35fb63d3f9bcfd682a920f13 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Mon, 13 Jan 2025 00:41:22 +0500 Subject: [PATCH 14/32] edit_db_from_gui: impove windows paths escaping closed #217 --- data_from_portwine/scripts/functions_helper | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index f7d31fcd..8fcccb4b 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -2891,6 +2891,10 @@ edit_db_from_gui () { elif [[ $proxy_mod_db =~ (${translations[Enabled]}|${translations[Enable]}) ]] ; then proxy_mod_db=enabled fi + + # Escaping backslashes and quotes for Windows paths + proxy_mod_db=$(echo "$proxy_mod_db" | sed 's/\\/\\\\\\\\/g; s/"/\\"/g') + if [[ $(<"${PORTWINE_DB_FILE}") =~ export\ ${mod_db}= ]] then sed -i "s|export ${mod_db}=.*|export ${mod_db}=\"$proxy_mod_db\"|g" "${PORTWINE_DB_FILE}" else echo "export ${mod_db}=\"$proxy_mod_db\"" >> "${PORTWINE_DB_FILE}" From 47c0fb5b7508e82debd14359da75f74d22061696 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Mon, 13 Jan 2025 12:52:34 +0300 Subject: [PATCH 15/32] added the ability to replace arguments to the WINEDEBUG --- data_from_portwine/changelog_ru | 2 ++ data_from_portwine/scripts/functions_helper | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index e97a7b61..21945543 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,8 @@ ----------------------------------------- История изменений: +* добавлена возможность замещения аргументов переменной WINEDEBUG в user.conf или .ppdb файлах настроек + ###Scripts version 2386### / Дата: 09.01.2025 / Размер скачиваемого обновления: 4 мегабайта * исправление прав при создании desktop файлов (спасибо Boria138) * исправлена функция отката скриптов из архива, если нет каталога scripts_backup (спасибо Boria138) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 862b4b72..b8f589bf 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -3140,18 +3140,18 @@ start_portwine () { var_winedlloverride_update "winegstreamer=" fi - check_variables VKD3D_DEBUG none - check_variables VKD3D_SHADER_DEBUG none - check_variables DXVK_LOG_LEVEL none - check_variables DXVK_NVAPI_LOG_LEVEL none - check_variables VK_LOADER_DEBUG none - check_variables VKBASALT_LOG_LEVEL none + check_variables VKD3D_DEBUG "none" + check_variables VKD3D_SHADER_DEBUG "none" + check_variables DXVK_LOG_LEVEL "none" + check_variables DXVK_NVAPI_LOG_LEVEL "none" + check_variables VK_LOADER_DEBUG "none" + check_variables VKBASALT_LOG_LEVEL "none" if [[ "${PW_LOG}" == 1 ]] \ || [[ -n "$PW_DEBUG" ]] then - export WINEDEBUG="+loaddll,+gstreamer" - export WINE_MONO_TRACE="E:System.NotImplementedException" - export VKBASALT_LOG_LEVEL="error" + check_variables WINEDEBUG "+loaddll" + check_variables WINE_MONO_TRACE "E:System.NotImplementedException" + check_variables VKBASALT_LOG_LEVEL "error" else export WINEDEBUG="-all" unset WINE_MONO_TRACE From aa1e52602e83b0613129ab4beccb700e4a50cac7 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 16 Jan 2025 02:54:28 +0500 Subject: [PATCH 16/32] support steamPlay --- data_from_portwine/scripts/add_in_steam.sh | 67 ++++++++++++++++------ 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 92254b3c..a0d316d5 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -293,7 +293,9 @@ parseSteamShortcutEntryLaunchOptions() { } parseSteamTargetExe() { - grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}' + exe=$(sed -n 's/^export portwine_exe="\([^"]*\)"/\1/p' "$1") + [[ -z "${exe}" ]] && exe=$(grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}') + [[ -n "${exe}" ]] && echo "${exe}" } restartSteam() { @@ -356,10 +358,10 @@ addGrids() { fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then create_new_dir "${STCFGPATH}/grid" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAIDGRID:-0}.jpg" || echo "Failed to load header.jpg" - downloadImageSteamGridDB "grids" "${NOSTAIDGRID:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAIDGRID:-0}p.jpg" || echo "Failed to load library_600x900_2x.jpg" - downloadImageSteamGridDB "heroes" "${NOSTAIDGRID:-0}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAIDGRID:-0}_hero.jpg" || echo "Failed to load library_hero.jpg" - downloadImageSteamGridDB "logos" "${NOSTAIDGRID:-0}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAIDGRID:-0}_logo.png" || echo "Failed to load logo.png" + downloadImageSteamGridDB "grids" "${NOSTAPPID:-0}.jpg" "mimes=image/jpeg" "dimensions=460x215,920x430" || downloadImageSteam "header.jpg" "${NOSTAPPID:-0}.jpg" || echo "Failed to load header.jpg" + downloadImageSteamGridDB "grids" "${NOSTAPPID:-0}p.jpg" "mimes=image/jpeg" "dimensions=600x900,660x930" || downloadImageSteam "library_600x900_2x.jpg" "${NOSTAPPID:-0}p.jpg" || echo "Failed to load library_600x900_2x.jpg" + downloadImageSteamGridDB "heroes" "${NOSTAPPID:-0}_hero.jpg" "mimes=image/jpeg" || downloadImageSteam "library_hero.jpg" "${NOSTAPPID:-0}_hero.jpg" || echo "Failed to load library_hero.jpg" + downloadImageSteamGridDB "logos" "${NOSTAPPID:-0}_logo.png" "mimes=image/png" || downloadImageSteam "logo.png" "${NOSTAPPID:-0}_logo.png" || echo "Failed to load logo.png" else echo "Game is not found" fi @@ -423,16 +425,18 @@ removeNonSteamGame() { if [[ -n "${NOSTSHPATH}" ]]; then mv "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null jq --arg id "${appid}" 'map(select(.id != $id))' <<< "${games}" | jq -c '.[]' | while read -r game; do - NOSTAIDGRID=$(jq -r '.id' <<< "${game}") + NOSTAPPID=$(jq -r '.id' <<< "${game}") NOSTAPPNAME=$(jq -r '.name' <<< "${game}") NOSTEXEPATH=$(jq -r '.exe' <<< "${game}") NOSTSTDIR=$(jq -r '.dir' <<< "${game}") NOSTICONPATH=$(jq -r '.icon' <<< "${game}") NOSTARGS=$(jq -r '.args' <<< "${game}") - NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${NOSTAIDGRID}")) + NOSTAIDVDFHEX=$(bigToLittleEndian $(printf '%08x' "${NOSTAPPID}")) addEntry done rm -f "${STCFGPATH}/grid/${appid}.jpg" "${STCFGPATH}/grid/${appid}p.jpg" "${STCFGPATH}/grid/${appid}_hero.jpg" "${STCFGPATH}/grid/${appid}_logo.png" + rm -rf "${HOME}/.local/share/Steam/steamapps/compatdata/${appid}" + rm -rf "${HOME}/.local/share/Steam/steamapps/shadercache/${appid}" if [[ -f "${NOSTSHPATH}" ]]; then isInstallGame=false for STUIDCUR in $(getUserIds); do @@ -464,8 +468,8 @@ addNonSteamGame() { if [[ -n "${SCPATH}" ]]; then [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAPPNAME="${name_desktop}" - NOSTAIDGRID=$(getAppId "${NOSTSHPATH}") - if [[ -z "${NOSTAIDGRID}" ]]; then + NOSTAPPID=$(getAppId "${NOSTSHPATH}") + if [[ -z "${NOSTAPPID}" ]]; then NOSTEXEPATH="${NOSTSHPATH}" if [[ -z "${NOSTSTDIR}" ]]; then NOSTSTDIR="${STEAM_SCRIPTS}" @@ -473,17 +477,18 @@ addNonSteamGame() { NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc - NOSTAIDGRID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts + NOSTAPPID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts create_new_dir "${STEAM_SCRIPTS}" - echo "#!/usr/bin/env bash" > "${NOSTSHPATH}" - echo "export START_FROM_STEAM=1" >> "${NOSTSHPATH}" - echo "export LD_PRELOAD=" >> "${NOSTSHPATH}" - if check_flatpak; then - echo "flatpak run ru.linux_gaming.PortProton \"${portwine_exe}\" " >> "${NOSTSHPATH}" - else - echo "\"${PORT_SCRIPTS_PATH}/start.sh\" \"${portwine_exe}\" " >> "${NOSTSHPATH}" - fi + cat <<-EOF > "${NOSTSHPATH}" + #!/usr/bin/env bash + export FLATPAK_IN_USE=$(check_flatpak && echo 1 || echo 0) + export portwine_exe="${portwine_exe}" + export PORT_WINE_PATH="${PORT_WINE_PATH}" + export PORT_SCRIPTS_PATH="\${PORT_WINE_PATH}/data/scripts" + source "\${PORT_SCRIPTS_PATH}/add_in_steam.sh" + rungame "\$@" + EOF chmod u+x "${NOSTSHPATH}" if [[ -f "${SCPATH}" ]] ; then @@ -504,3 +509,29 @@ addNonSteamGame() { return 1 fi } + +rungame() { + export START_FROM_STEAM=1 + if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then + cd "$(dirname "${portwine_exe}")" + PORTWINE_DB_FILE="${portwine_exe}.ppdb" + if [[ -f "${PORTWINE_DB_FILE}" ]]; then + source "${PORTWINE_DB_FILE}" + fi + for path in "ProgramData" "users/Public" "users/steamuser"; do + if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then + mkdir -p "${WINEPREFIX}/drive_c/users/" + rm -rf "${WINEPREFIX}/drive_c/${path}" + ln -sr "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + fi + done + "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" + else + export LD_PRELOAD= + if [[ "${FLATPAK_IN_USE:-0}" == 1 ]]; then + flatpak run ru.linux_gaming.PortProton "${portwine_exe}" + else + "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" + fi + fi +} From 109b27b3bad3575f4d1d195c682457b4ec773e77 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 16 Jan 2025 21:52:14 +0500 Subject: [PATCH 17/32] added saving statistics --- data_from_portwine/scripts/add_in_steam.sh | 47 +++++++++++++-------- data_from_portwine/scripts/functions_helper | 10 +++-- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index a0d316d5..4d12f250 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -512,26 +512,37 @@ addNonSteamGame() { rungame() { export START_FROM_STEAM=1 - if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then - cd "$(dirname "${portwine_exe}")" - PORTWINE_DB_FILE="${portwine_exe}.ppdb" - if [[ -f "${PORTWINE_DB_FILE}" ]]; then - source "${PORTWINE_DB_FILE}" - fi - for path in "ProgramData" "users/Public" "users/steamuser"; do - if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then - mkdir -p "${WINEPREFIX}/drive_c/users/" - rm -rf "${WINEPREFIX}/drive_c/${path}" - ln -sr "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + if [[ -n "${portwine_exe:-}" ]]; then + if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then + cd "$(dirname "${portwine_exe}")" + PORTWINE_DB_FILE="${portwine_exe}.ppdb" + export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" + source "${PORT_WINE_PATH}/data/user.conf" + source "${PORT_SCRIPTS_PATH}/functions_helper" + if [[ -f "${PORTWINE_DB_FILE}" ]]; then + source "${PORTWINE_DB_FILE}" + fi + for path in "ProgramData" "users/Public" "users/steamuser"; do + if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then + mkdir -p "${WINEPREFIX}/drive_c/users/" + rm -rf "${WINEPREFIX}/drive_c/${path}" + ln -sr "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + fi + done + [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" + "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" + if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then + debug_timer --end -s "PW_TIME_IN_GAME" + PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) # в секундах + search_desktop_file fi - done - "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" - else - export LD_PRELOAD= - if [[ "${FLATPAK_IN_USE:-0}" == 1 ]]; then - flatpak run ru.linux_gaming.PortProton "${portwine_exe}" else - "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" + export LD_PRELOAD= + if [[ "${FLATPAK_IN_USE:-0}" == 1 ]]; then + flatpak run ru.linux_gaming.PortProton "${portwine_exe}" + else + "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" + fi fi fi } diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 862b4b72..8bc28868 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -2886,10 +2886,12 @@ edit_db_from_gui () { then for mod_db in "$@" ; do proxy_mod_db="${!mod_db}" - if [[ $proxy_mod_db =~ (${translations[Disabled]}|${translations[Disable]}) ]] ; then - proxy_mod_db=disabled - elif [[ $proxy_mod_db =~ (${translations[Enabled]}|${translations[Enable]}) ]] ; then - proxy_mod_db=enabled + if (( ${#translations[@]} > 0 )); then + if [[ $proxy_mod_db =~ (${translations[Disabled]}|${translations[Disable]}) ]] ; then + proxy_mod_db=disabled + elif [[ $proxy_mod_db =~ (${translations[Enabled]}|${translations[Enable]}) ]] ; then + proxy_mod_db=enabled + fi fi if [[ $(<"${PORTWINE_DB_FILE}") =~ export\ ${mod_db}= ]] then sed -i "s|export ${mod_db}=.*|export ${mod_db}=\"$proxy_mod_db\"|g" "${PORTWINE_DB_FILE}" From 4c5ce9406742c5bad7c860c514dd6588615bdd7e Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 18 Jan 2025 03:29:54 +0500 Subject: [PATCH 18/32] cleaned --- data_from_portwine/scripts/add_in_steam.sh | 30 ++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 4d12f250..d89205c8 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -293,9 +293,7 @@ parseSteamShortcutEntryLaunchOptions() { } parseSteamTargetExe() { - exe=$(sed -n 's/^export portwine_exe="\([^"]*\)"/\1/p' "$1") - [[ -z "${exe}" ]] && exe=$(grep -E 'flatpak|start\.sh' "$1" | head -n 1 | awk -F'"' '{print $(NF-1)}') - [[ -n "${exe}" ]] && echo "${exe}" + grep -E '^[^# ]*?(rungame|flatpak|start\.sh)' "$1" | head -n 1 | sed 's/ "\$@"//' | awk -F'"' '{print $(NF-1)}' } restartSteam() { @@ -483,11 +481,8 @@ addNonSteamGame() { cat <<-EOF > "${NOSTSHPATH}" #!/usr/bin/env bash export FLATPAK_IN_USE=$(check_flatpak && echo 1 || echo 0) - export portwine_exe="${portwine_exe}" - export PORT_WINE_PATH="${PORT_WINE_PATH}" - export PORT_SCRIPTS_PATH="\${PORT_WINE_PATH}/data/scripts" - source "\${PORT_SCRIPTS_PATH}/add_in_steam.sh" - rungame "\$@" + source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" + rungame "${portwine_exe}" "\$@" EOF chmod u+x "${NOSTSHPATH}" @@ -512,28 +507,31 @@ addNonSteamGame() { rungame() { export START_FROM_STEAM=1 + export portwine_exe="${1:-}" if [[ -n "${portwine_exe:-}" ]]; then if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then cd "$(dirname "${portwine_exe}")" - PORTWINE_DB_FILE="${portwine_exe}.ppdb" + export PORTWINE_DB_FILE="${portwine_exe}.ppdb" + export PORT_SCRIPTS_PATH=$(readlink -f "${BASH_SOURCE[0]%/*}") + export PORT_WINE_PATH=${PORT_SCRIPTS_PATH%/*/*} export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" - source "${PORT_WINE_PATH}/data/user.conf" + [[ -f "${PORT_WINE_PATH}/data/user.conf" ]] && source "${PORT_WINE_PATH}/data/user.conf" + [[ -f "${PORTWINE_DB_FILE}" ]] && source "${PORTWINE_DB_FILE}" source "${PORT_SCRIPTS_PATH}/functions_helper" - if [[ -f "${PORTWINE_DB_FILE}" ]]; then - source "${PORTWINE_DB_FILE}" - fi + PORT_WINE_PREFIX="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}" for path in "ProgramData" "users/Public" "users/steamuser"; do + mkdir -p "${PORT_WINE_PREFIX}/drive_c/${path}" if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then mkdir -p "${WINEPREFIX}/drive_c/users/" rm -rf "${WINEPREFIX}/drive_c/${path}" - ln -sr "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + ln -sr "${PORT_WINE_PREFIX}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" fi done [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" - "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" + "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "${@:2}" if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then debug_timer --end -s "PW_TIME_IN_GAME" - PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) # в секундах + PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) search_desktop_file fi else From 4c0904a5f8d8dc4aadb93b90a8bf1fb5e4950043 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 18 Jan 2025 03:44:54 +0500 Subject: [PATCH 19/32] check if flatpak is installed --- data_from_portwine/scripts/add_in_steam.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index d89205c8..651429ff 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -536,7 +536,7 @@ rungame() { fi else export LD_PRELOAD= - if [[ "${FLATPAK_IN_USE:-0}" == 1 ]]; then + if [[ "${FLATPAK_IN_USE:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then flatpak run ru.linux_gaming.PortProton "${portwine_exe}" else "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" From c278df4e84d41bcbc2a2fd6f6d1bf41ad99df582 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 18 Jan 2025 04:24:32 +0500 Subject: [PATCH 20/32] FLATPAK_IN_USE => START_FROM_FLATPAK --- data_from_portwine/scripts/add_in_steam.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 651429ff..2aef70c5 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -480,7 +480,8 @@ addNonSteamGame() { create_new_dir "${STEAM_SCRIPTS}" cat <<-EOF > "${NOSTSHPATH}" #!/usr/bin/env bash - export FLATPAK_IN_USE=$(check_flatpak && echo 1 || echo 0) + export START_FROM_STEAM=1 + export START_FROM_FLATPAK=$(check_flatpak && echo 1 || echo 0) source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" rungame "${portwine_exe}" "\$@" EOF @@ -506,7 +507,6 @@ addNonSteamGame() { } rungame() { - export START_FROM_STEAM=1 export portwine_exe="${1:-}" if [[ -n "${portwine_exe:-}" ]]; then if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then @@ -536,7 +536,7 @@ rungame() { fi else export LD_PRELOAD= - if [[ "${FLATPAK_IN_USE:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then + if [[ "${START_FROM_FLATPAK:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then flatpak run ru.linux_gaming.PortProton "${portwine_exe}" else "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" From e958e49b9373483c93f5f55a7e75b318f3ccd97c Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 18 Jan 2025 17:02:49 +0500 Subject: [PATCH 21/32] use start.sh --- data_from_portwine/scripts/add_in_steam.sh | 45 ++------------------- data_from_portwine/scripts/functions_helper | 24 +++++++++++ data_from_portwine/scripts/start.sh | 9 +++++ 3 files changed, 36 insertions(+), 42 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 2aef70c5..d0137db9 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -293,7 +293,7 @@ parseSteamShortcutEntryLaunchOptions() { } parseSteamTargetExe() { - grep -E '^[^# ]*?(rungame|flatpak|start\.sh)' "$1" | head -n 1 | sed 's/ "\$@"//' | awk -F'"' '{print $(NF-1)}' + grep -E '^[^# ]*?(flatpak|start\.sh)' "$1" | head -n 1 | sed 's/ "\$@"//' | awk -F'"' '{print $(NF-1)}' } restartSteam() { @@ -480,10 +480,10 @@ addNonSteamGame() { create_new_dir "${STEAM_SCRIPTS}" cat <<-EOF > "${NOSTSHPATH}" #!/usr/bin/env bash + export LD_PRELOAD= export START_FROM_STEAM=1 export START_FROM_FLATPAK=$(check_flatpak && echo 1 || echo 0) - source "${PORT_SCRIPTS_PATH}/add_in_steam.sh" - rungame "${portwine_exe}" "\$@" + "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" "\$@" EOF chmod u+x "${NOSTSHPATH}" @@ -505,42 +505,3 @@ addNonSteamGame() { return 1 fi } - -rungame() { - export portwine_exe="${1:-}" - if [[ -n "${portwine_exe:-}" ]]; then - if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then - cd "$(dirname "${portwine_exe}")" - export PORTWINE_DB_FILE="${portwine_exe}.ppdb" - export PORT_SCRIPTS_PATH=$(readlink -f "${BASH_SOURCE[0]%/*}") - export PORT_WINE_PATH=${PORT_SCRIPTS_PATH%/*/*} - export PORT_WINE_TMP_PATH="${PORT_WINE_PATH}/data/tmp" - [[ -f "${PORT_WINE_PATH}/data/user.conf" ]] && source "${PORT_WINE_PATH}/data/user.conf" - [[ -f "${PORTWINE_DB_FILE}" ]] && source "${PORTWINE_DB_FILE}" - source "${PORT_SCRIPTS_PATH}/functions_helper" - PORT_WINE_PREFIX="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}" - for path in "ProgramData" "users/Public" "users/steamuser"; do - mkdir -p "${PORT_WINE_PREFIX}/drive_c/${path}" - if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then - mkdir -p "${WINEPREFIX}/drive_c/users/" - rm -rf "${WINEPREFIX}/drive_c/${path}" - ln -sr "${PORT_WINE_PREFIX}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" - fi - done - [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" - "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "${@:2}" - if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then - debug_timer --end -s "PW_TIME_IN_GAME" - PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) - search_desktop_file - fi - else - export LD_PRELOAD= - if [[ "${START_FROM_FLATPAK:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then - flatpak run ru.linux_gaming.PortProton "${portwine_exe}" - else - "${PORT_SCRIPTS_PATH}/start.sh" "${portwine_exe}" - fi - fi - fi -} diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 8bc28868..f14063fb 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4370,6 +4370,30 @@ pw_yad_form_vulkan () { fi } +steamplay_launch () { + if [[ -n "${portwine_exe:-}" ]]; then + cd "$(dirname "${portwine_exe}")" + export PORTWINE_DB_FILE="${portwine_exe}.ppdb" + [[ -f "${PORTWINE_DB_FILE}" ]] && source "${PORTWINE_DB_FILE}" + PORT_WINE_PREFIX="${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME:-DEFAULT}" + for path in "ProgramData" "users/Public" "users/steamuser"; do + mkdir -p "${PORT_WINE_PREFIX}/drive_c/${path}" + if [[ ! -L "${WINEPREFIX}/drive_c/${path}" ]]; then + mkdir -p "${WINEPREFIX}/drive_c/users/" + rm -rf "${WINEPREFIX}/drive_c/${path}" + ln -sr "${PORT_WINE_PREFIX}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" + fi + done + [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" + echo "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "$@" + if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then + debug_timer --end -s "PW_TIME_IN_GAME" + PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) + search_desktop_file + fi + fi +} + portwine_launch () { start_portwine unset PW_VD_TMP diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 1d55a7bb..c6d138bc 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -6,6 +6,10 @@ export url_site="https://linux-gaming.ru/portproton/" export url_cloud="https://cloud.linux-gaming.ru/portproton" export url_git="https://git.linux-gaming.ru/CastroFidel/PortWINE" ######################################################################## +if [[ "${START_FROM_FLATPAK:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then + flatpak run ru.linux_gaming.PortProton "$@" + exit +fi echo ' █░░ █ █▄░█ █░█ ▀▄▀ ▄▄ █▀▀ ▄▀█ █▀▄▀█ █ █▄░█ █▀▀ ░ █▀█ █░█ █▄▄ █ █░▀█ █▄█ █░█ ░░ █▄█ █▀█ █░▀░█ █ █░▀█ █▄█ ▄ █▀▄ █▄█ @@ -191,6 +195,11 @@ if [[ $TRANSLATIONS_VER != "$scripts_install_ver" ]] ; then source "$PW_CACHE_LANG_PATH/$LANGUAGE" fi +if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then + steamplay_launch "${@:2}" + exit +fi + # check PortProton theme if [[ -n "$GUI_THEME" ]] \ && [[ -f "$PW_GUI_THEMES_PATH/$GUI_THEME.pptheme" ]] From 4446ddd6ab76441c8230d650f63972e682699262 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 18 Jan 2025 17:04:01 +0500 Subject: [PATCH 22/32] cleaned --- data_from_portwine/scripts/functions_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index f14063fb..d620cfed 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4385,7 +4385,7 @@ steamplay_launch () { fi done [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" - echo "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "$@" + "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "$@" if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then debug_timer --end -s "PW_TIME_IN_GAME" PW_TIME_IN_GAME=$(( PW_TIME_IN_GAME / 1000 )) From cb8f27e673bd84986c7173e9f51ccc619bd7a9e8 Mon Sep 17 00:00:00 2001 From: Htylol Date: Sun, 19 Jan 2025 14:46:21 +0500 Subject: [PATCH 23/32] resize_png can now create multiple icons at once --- data_from_portwine/scripts/functions_helper | 107 ++++++++++++++------ data_from_portwine/scripts/start.sh | 34 ++++--- 2 files changed, 97 insertions(+), 44 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 862b4b72..834b7f83 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -975,10 +975,25 @@ debug_timer () { fi } +fix_icon_name_png () { + if [[ $1 =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_OLD=$1 + local ICON_NAME_NEW=$ICON_NAME_OLD + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + ICON_NAME_NEW="${ICON_NAME_NEW//$i/}" + done + sed -i "s|Icon=$ICON_NAME_OLD|Icon=$ICON_NAME_NEW|" "$2" + return 0 + else + return 1 + fi +} + # Поиск нужного .desktop файла по $portwine_exe (для показа в комментариях нужного времени) # Параллельное создание базы по времени после завершения приложения search_desktop_file () { - local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND + local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP ICON_NAME BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND if [[ -z $FILE_SHA256SUM ]] ; then read -r -a FILE_SHA256SUM_ARRAY < <(sha256sum "$portwine_exe") FILE_SHA256SUM=${FILE_SHA256SUM_ARRAY[0]} @@ -996,7 +1011,9 @@ search_desktop_file () { EXEC_DESKTOP=${line1//Exec=env \"$PORT_SCRIPTS_PATH\/start.sh\" /} fi fi + [[ $line1 =~ ^Icon= ]] && ICON_NAME=${line1//Icon=/} done < "$desktop_file" + fix_icon_name_png "$ICON_NAME" "$desktop_file" if [[ $portwine_exe == "${EXEC_DESKTOP//\"/}" ]] ; then DESKTOP_CORRECT_FILE="$desktop_file" break @@ -2982,9 +2999,15 @@ pw_create_gui_png () { edit_db_from_gui PORTPROTON_NAME FILE_DESCRIPTION fi - resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128" + resize_png "$portwine_exe" "${PORTPROTON_NAME}" "48" "128" PORTPROTON_NAME_PNG="${PORTPROTON_NAME// /_}" + if [[ $PORTPROTON_NAME_PNG =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + PORTPROTON_NAME_PNG="${PORTPROTON_NAME_PNG//$i/}" + done + fi if [[ -z "${PW_ICON_FOR_YAD}" ]] ; then if [[ -n "$(file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}")" ]] ; then export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" @@ -6074,35 +6097,49 @@ resize_png () { print_error "no argument specified for resize_png" return 1 else - local RESIZE_FILE="$1" - local RESIZE_NAME_PNG="${2// /_}" - local RESIZE_TO="$3" + local RESIZE_FILE RESIZE_NAME_PNG resize_to resize_to_helper + RESIZE_FILE="$1" + RESIZE_NAME_PNG="${2// /_}" fi - if [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" ]] \ - || [[ ! -f "${RESIZE_FILE}" ]] \ - || [[ ! ${RESIZE_FILE,,} =~ .exe$ ]] - then - return 0 - fi - try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png" - try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png" - - if check_flatpak ; then - if ! timeout 3 \ - exe-thumbnailer --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" \ - && [[ "$ALPINE_FP" != "1" ]] - then - print_error "exe-thumbnailer - broken!" + for resize_to in "${@:3}" ; do + if [[ $resize_to == 128 ]] + then resize_to_helper="" + else resize_to_helper="_$resize_to" fi - else - print_warning "use portable exe-thumbnailer" - env PYTHONPATH="${PW_PLUGINS_PATH}/portable/lib/python3.9/site-packages/" \ - LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" \ - "${PW_WINELIB}/runtime/files/bin/python3.9" \ - "${PW_PLUGINS_PATH}/portable/bin/exe-thumbnailer" --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" - fi - return 0 + + if [[ $RESIZE_NAME_PNG =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + RESIZE_NAME_PNG="${RESIZE_NAME_PNG//$i/}" + done + fi + + if [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" ]] \ + || [[ ! -f "${RESIZE_FILE}" ]] \ + || [[ ! ${RESIZE_FILE,,} =~ .exe$ ]] + then + return 0 + fi + + try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png" + try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png" + + if check_flatpak ; then + if ! timeout 3 \ + exe-thumbnailer --force-resize -s "$resize_to" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" \ + && [[ "$ALPINE_FP" != "1" ]] + then + print_error "exe-thumbnailer - broken!" + fi + else + print_warning "use portable exe-thumbnailer" + env PYTHONPATH="${PW_PLUGINS_PATH}/portable/lib/python3.9/site-packages/" \ + LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" \ + "${PW_WINELIB}/runtime/files/bin/python3.9" \ + "${PW_PLUGINS_PATH}/portable/bin/exe-thumbnailer" --force-resize -s "$resize_to" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" + fi + done } # GUI CREATE SHORTCUT @@ -6122,6 +6159,12 @@ portwine_create_shortcut () { export name_desktop="$PW_NAME_DESKTOP_PROXY" [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}" + if [[ $name_desktop_png =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + name_desktop_png="${name_desktop_png//$i/}" + done + fi OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \ --gui-type="settings-shortcut" \ @@ -6287,7 +6330,7 @@ pw_auto_create_shortcut () { print_info "Created link for: $link_name" PORTPROTON_NAME="$link_name" export portwine_exe="$exe_path" - resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128" + resize_png "$portwine_exe" "${PORTPROTON_NAME}" "48" "128" export PW_NO_RESTART_PPDB=1 portwine_create_shortcut fi @@ -6327,6 +6370,12 @@ portwine_change_shortcut () { pw_create_gui_png [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}" + if [[ $name_desktop_png =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + name_desktop_png="${name_desktop_png//$i/}" + done + fi OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \ --gui-type="settings-shortcut" \ diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 1d55a7bb..c134875d 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -645,6 +645,12 @@ else fi [[ $line1 =~ ^Icon= ]] && PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]=${line1//Icon=/} done < "$desktop_file" + if fix_icon_name_png "${PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]}" "$desktop_file" ; then + ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]="${PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]//$i/}" + done + fi PW_ALL_DF["$AMOUNT_GENERATE_BUTTONS"]="$desktop_file_new" # Для конвертации существующих .desktop файлов flatpak в натив и наоборот if [[ ${PW_NAME_D_ICON["$AMOUNT_GENERATE_BUTTONS"]} =~ ^"Exec=flatpak run ru.linux_gaming.PortProton " ]] ; then @@ -702,20 +708,6 @@ else for dp in "${PW_AMOUNT_NEW_DESKTOP[@]}" "${PW_AMOUNT_OLD_DESKTOP[@]}" ; do PW_DESKTOP_FILES="${PW_ALL_DF[$dp]}" PW_DESKTOP_FILES_SHOW="$PW_DESKTOP_FILES" - PW_ICON_PATH[dp]=${PW_ICON_PATH[dp]%.png} - PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" - - PW_NAME_D_ICON_128="${PW_ICON_PATH[dp]}" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_128//"${PORT_WINE_PATH}/data/img/"/}" "128" - if [[ $PW_DESKTOP_FILES =~ [\!\%\$\&\<] || ${PW_ICON_PATH[dp]} =~ [\!\%\$\&\<] ]] ; then - PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) - for i in "${PW_DESKTOP_FILES_SHOW_REGEX[@]}" ; do - PW_DESKTOP_FILES_SHOW="${PW_DESKTOP_FILES_SHOW//$i/}" - PW_ICON_PATH[dp]="${PW_ICON_PATH[dp]//$i/}" - done - fi - PW_NAME_D_ICON_48="${PW_ICON_PATH[dp]}_48" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_48//"${PORT_WINE_PATH}/data/img/"/}" "48" if [[ $PW_DESKTOP_FILES =~ [\(\)\!\$\%\&\`\'\"\>\<\\\|\;] ]] ; then PW_DESKTOP_FILES_REGEX=(\( \) \! \$ % \& \` \' \" \> \< \\ \| \;) @@ -726,7 +718,19 @@ else done fi - PW_GENERATE_BUTTONS+="--field= $(print_wrapped "${PW_DESKTOP_FILES_SHOW//".desktop"/""}" "25" "...")!${PW_NAME_D_ICON_48}.png!:FBTNR%@bash -c \"button_click --desktop "${PW_DESKTOP_FILES// /#@_@#}"\"%" + if [[ $PW_DESKTOP_FILES_SHOW =~ [\!\%\$\&\<] ]] ; then + PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) + for i in "${PW_DESKTOP_FILES_SHOW_REGEX[@]}" ; do + PW_DESKTOP_FILES_SHOW="${PW_DESKTOP_FILES_SHOW//$i/}" + done + fi + + PW_ICON_PATH[dp]=${PW_ICON_PATH[dp]%.png} + PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" + + resize_png "$PW_NAME_D_ICON_NEW" "${PW_ICON_PATH[dp]//"${PORT_WINE_PATH}/data/img/"/}" "48" "128" + + PW_GENERATE_BUTTONS+="--field= $(print_wrapped "${PW_DESKTOP_FILES_SHOW//".desktop"/""}" "25" "...")!${PW_ICON_PATH[dp]}_48.png!:FBTNR%@bash -c \"button_click --desktop "${PW_DESKTOP_FILES// /#@_@#}"\"%" done if [[ $AMOUNT_GENERATE_BUTTONS == 1 ]] ; then From 8d71f99b3642f149fbf9dff3c2e18fd088e1c636 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 24 Jan 2025 01:38:03 +0500 Subject: [PATCH 24/32] unset start_from_flatpak, move unset wineprefix --- data_from_portwine/scripts/start.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index c6d138bc..d8ce7c99 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -6,7 +6,8 @@ export url_site="https://linux-gaming.ru/portproton/" export url_cloud="https://cloud.linux-gaming.ru/portproton" export url_git="https://git.linux-gaming.ru/CastroFidel/PortWINE" ######################################################################## -if [[ "${START_FROM_FLATPAK:-0}" == 1 ]] && command -v "flatpak" &>/dev/null; then +if [[ "${START_FROM_FLATPAK:-0}" == 1 ]] && [[ -z "${STEAM_COMPAT_DATA_PATH:-}" ]] && command -v "flatpak" &>/dev/null; then + unset START_FROM_FLATPAK flatpak run ru.linux_gaming.PortProton "$@" exit fi @@ -100,7 +101,7 @@ fi unset MANGOHUD MANGOHUD_DLSYM PW_NO_ESYNC PW_NO_FSYNC PW_VULKAN_USE WINEDLLOVERRIDES PW_NO_WRITE_WATCH PW_YAD_SET PW_ICON_FOR_YAD unset PW_CHECK_AUTOINSTALL PW_VKBASALT_EFFECTS PW_VKBASALT_FFX_CAS PORTWINE_DB PORTWINE_DB_FILE RADV_PERFTEST unset CHK_SYMLINK_FILE PW_MESA_GL_VERSION_OVERRIDE PW_VKD3D_FEATURE_LEVEL PATH_TO_GAME PW_START_DEBUG PORTPROTON_NAME PW_PATH -unset PW_PREFIX_NAME WINEPREFIX VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR PW_WINE_CPU_TOPOLOGY +unset PW_PREFIX_NAME VULKAN_MOD PW_WINE_VER PW_ADD_TO_ARGS_IN_RUNTIME PW_GAMEMODERUN_SLR PW_WINE_CPU_TOPOLOGY unset MANGOHUD_CONFIG FPS_LIMIT PW_WINE_USE WINEDLLPATH WINE WINEDIR WINELOADER WINESERVER PW_USE_RUNTIME PORTWINE_CREATE_SHORTCUT_NAME MIRROR unset PW_LOCALE_SELECT PW_SETTINGS_INDICATION PW_GUI_START PW_AUTOINSTALL_EXE NOSTSTDIR RADV_DEBUG PW_NO_AUTO_CREATE_SHORTCUT unset PW_TERM PW_EXEC_FROM_DESKTOP WEBKIT_DISABLE_DMABUF_RENDERER PW_AMD_VULKAN_USE PW_VK_ICD_FILENAMES LAUNCH_URI @@ -199,6 +200,7 @@ if [[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]]; then steamplay_launch "${@:2}" exit fi +unset WINEPREFIX # check PortProton theme if [[ -n "$GUI_THEME" ]] \ From fd3cfffcb51494cc2036d6a302afe1b643f515b3 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Fri, 24 Jan 2025 01:38:57 +0500 Subject: [PATCH 25/32] support PW_DLL_INSTALL on steamplay_launch --- data_from_portwine/scripts/functions_helper | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index d620cfed..38a65694 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -4384,6 +4384,11 @@ steamplay_launch () { ln -sr "${PORT_WINE_PREFIX}/drive_c/${path}" "${WINEPREFIX}/drive_c/${path}" fi done + if [[ -n "${PW_DLL_INSTALL:-}" ]] ; then + update_winetricks + PATH="${PATH}:${PW_PLUGINS_PATH}/portable/bin" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32" \ + "${PORT_WINE_TMP_PATH}/winetricks" -q ${PW_DLL_INSTALL} + fi [[ $PW_LOG != 1 ]] && debug_timer --start -s "PW_TIME_IN_GAME" "${STEAM_COMPAT_TOOL_PATHS%%:*}/proton" "run" "${portwine_exe}" "$@" if [[ $PW_LOG != 1 ]] && [[ -n $START_PW_TIME_IN_GAME ]] ; then From 54be04a474786cac642859ee3ad43edc2170d31d Mon Sep 17 00:00:00 2001 From: Htylol Date: Mon, 27 Jan 2025 13:18:47 +0500 Subject: [PATCH 26/32] Umip check for HogwartsLegacy --- .../scripts/portwine_db/HogwartsLegacy.ppdb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/data_from_portwine/scripts/portwine_db/HogwartsLegacy.ppdb b/data_from_portwine/scripts/portwine_db/HogwartsLegacy.ppdb index f4bfbf98..babbe60b 100644 --- a/data_from_portwine/scripts/portwine_db/HogwartsLegacy.ppdb +++ b/data_from_portwine/scripts/portwine_db/HogwartsLegacy.ppdb @@ -3,16 +3,18 @@ #HogwartsLegacy.exe #Rating=1-5 #####################examples########################### -if [[ "$LANGUAGE" == "ru" ]] ; then - export PW_COMMENT_DB="Если у вас игра не запускается, то необходимо добавить +if [[ $(cat /proc/cpuinfo | grep umip) ]] ; then + if [[ "$LANGUAGE" == "ru" ]] ; then + export PW_COMMENT_DB="Если у вас игра не запускается, то необходимо добавить clearcpuid=514 в раздел GRUB_CMDLINE_LINUX_DEFAULT в файле /etc/default/grub. Для упрощения можно использовать утилиту Grub Customizer" -else - export PW_COMMENT_DB="If your game does not start, you need to add + else + export PW_COMMENT_DB="If your game does not start, you need to add clearcpuid=514 to the GRUB_CMDLINE_LINUX_DEFAULT section in the /etc/default/grub file. To simplify things, you can use Grub Customizer utility" + fi fi export PW_VULKAN_USE="2" From aa4c8cabf9c7a13c709ef9c4988720cd4a388212 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 20:03:47 +0300 Subject: [PATCH 27/32] updated dxvk and vkd3d --- data_from_portwine/scripts/var | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index eb79419c..f4668929 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -54,9 +54,9 @@ export PW_VULKAN_USE="2" export VKD3D_LIMIT_TESS_FACTORS="64" export DXVK_LEGACY_VER="1.6.1" export DXVK_STABLE_VER="1.10.3-28" -export DXVK_GIT_VER="2.5.2-1" +export DXVK_GIT_VER="2.5.3-31" export VKD3D_STABLE_VER="1.1-2602" -export VKD3D_GIT_VER="1.1-4326" +export VKD3D_GIT_VER="1.1-4367" ###VKBASALT### export PW_VKBASALT_EFFECTS="Curves:cas" export PW_VKBASALT_FFX_CAS="0.50" From b2830979bf1a52a0f1de4b78e61bf86e476a08b9 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 20:23:42 +0300 Subject: [PATCH 28/32] added check scripts_ver file --- data_from_portwine/scripts/start.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 0d0f7633..223ca377 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -168,7 +168,10 @@ export PW_WINELIB="${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}" try_remove_dir "${PW_WINELIB}/var" install_ver="$(<"${PORT_WINE_TMP_PATH}/PortProton_ver")" export install_ver -scripts_install_ver="$(<"${PORT_WINE_TMP_PATH}/scripts_ver")" +if [[ -f "${PORT_WINE_TMP_PATH}/scripts_ver" ]] +then scripts_install_ver="$(<"${PORT_WINE_TMP_PATH}/scripts_ver")" +else scripts_install_ver="2025" +fi export scripts_install_ver export WINETRICKS_DOWNLOADER="curl" export USER_CONF="${PORT_WINE_PATH}/data/user.conf" From c784add1e28b28bbe44e90956aaad8522ce4afda Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 20:24:58 +0300 Subject: [PATCH 29/32] HNY 2025 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 0d1f2737..c3d4f46f 100755 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Castro-Fidel (linux-gaming.ru) +Copyright (c) 2025 Castro-Fidel (linux-gaming.ru) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 7cfd56f98e63de59152d70150768f71565fcd8e2 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 21:50:03 +0300 Subject: [PATCH 30/32] revert: lsbash to ls --- data_from_portwine/scripts/functions_helper | 31 +++++++++++---------- data_from_portwine/scripts/start.sh | 9 +++--- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index 2d1e8844..9bc690a9 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -410,6 +410,7 @@ lsbash () { else directory=$PWD fi + grep_find_file1 () { find_file_old=$find_file if [[ $grep_with_i == true ]] ; then @@ -1624,7 +1625,7 @@ init_wine_ver () { else if [[ -d "${PORT_WINE_PATH}/data/dist" ]] ; then IFS=$'\n' - for dist_dir in $(lsbash "${PORT_WINE_PATH}/data/dist/") ; do + for dist_dir in $(ls -1 "${PORT_WINE_PATH}/data/dist") ; do dist_dir_new=$(echo "${dist_dir}" | awk '$1=$1' | sed -e s/[[:blank:]]/_/g) if [[ ! -d "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}" ]] ; then mv -- "${PORT_WINE_PATH}/data/dist/$dist_dir" "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}" @@ -1632,7 +1633,7 @@ init_wine_ver () { done IFS="$orig_IFS" fi - if [[ -z $(lsbash "${PORT_WINE_PATH}/data/dist/" --grep "${PW_WINE_USE}") ]] ; then + if [[ -z $(ls "${PORT_WINE_PATH}/data/dist/" | grep "${PW_WINE_USE}") ]] ; then if [[ "$PW_WINE_USE" =~ PROTON_LG* ]] then export PW_WINE_USE=PROTON_LG else export PW_WINE_USE=WINE_LG @@ -1649,20 +1650,20 @@ init_wine_ver () { export WINELOADER="${WINEDIR}/bin/wine" export WINESERVER="${WINEDIR}/bin/wineserver" if [[ -d "${WINEDIR}/files" && ! -d "${WINEDIR}/dist" ]] ; then - for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(files|version)$//g") ; do + for clear_dist_files in $(ls "${WINEDIR}" | sed -r "s/^(files|version)$//g") ; do rm -fr "${WINEDIR}/$clear_dist_files" done mv -f "${WINEDIR}/files"/* "${WINEDIR}/" rm -fr "${WINEDIR}/files" elif [[ ! -d "${WINEDIR}/files" && -d "${WINEDIR}/dist" ]] ; then - for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(dist|version)$//g") ; do + for clear_dist_files in $(ls "${WINEDIR}" | sed -r "s/^(dist|version)$//g") ; do rm -fr "${WINEDIR}/$clear_dist_files" done mv -f "${WINEDIR}/dist"/* "${WINEDIR}/" rm -fr "${WINEDIR}/dist" elif [[ -f "${WINEDIR}/proton_dist.tar" ]] ; then unpack "${WINEDIR}/proton_dist.tar" "${WINEDIR}/" - for clear_dist_files in $(lsbash "$WINEDIR" | sed -r "s/^(bin|lib|lib64|share|version)$//g") ; do + for clear_dist_files in $(ls "${WINEDIR}" | sed -r "s/^(bin|lib|lib64|share|version)$//g") ; do rm -fr "${WINEDIR}/$clear_dist_files" done fi @@ -1951,7 +1952,7 @@ pw_kill_autostart () { fi done - if [[ -n "$(lsbash "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/ | grep -m 1 ".tmp")" ]] ; then + if [[ -n "$(ls "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/ | grep -m 1 ".tmp")" ]] ; then rm -f "${PORT_WINE_PATH}/data/prefixes/${PW_PREFIX_NAME}"/drive_c/*.tmp fi @@ -2042,8 +2043,8 @@ pw_download_libs () { "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" ; then if unpack "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/" ; then try_remove_file "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}.tar.xz" - if lsbash "${PORT_WINE_TMP_PATH}" --grep libs_v --grep -v libs"${PW_LIBS_VER}" ; then - for RM_LIBS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep libs_v --grep -v libs"${PW_LIBS_VER}") + if ls "${PORT_WINE_TMP_PATH}" | grep libs_v | grep -v libs"${PW_LIBS_VER}" ; then + for RM_LIBS in $(ls "${PORT_WINE_TMP_PATH}" | grep libs_v | grep -v libs"${PW_LIBS_VER}") do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_LIBS}" done fi @@ -2193,9 +2194,9 @@ pw_check_and_download_plugins () { try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" # TODO: drop clear prefix, and add update prefix from new plugins pw_clear_pfx - if lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}" + if ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}" then - for RM_PLUGINS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}") + for RM_PLUGINS in $(ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}") do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}" done fi @@ -2226,9 +2227,9 @@ pw_check_and_download_plugins () { try_remove_file "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" # TODO: drop clear prefix, and add update prefix from new plugins pw_clear_pfx - if lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}" + if ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}" then - for RM_PLUGINS in $(lsbash "${PORT_WINE_TMP_PATH}" --grep plugins_v --grep -v "plugins${PW_PLUGINS_VER}") + for RM_PLUGINS in $(ls "${PORT_WINE_TMP_PATH}" | grep plugins_v | grep -v "plugins${PW_PLUGINS_VER}") do try_remove_dir "${PORT_WINE_TMP_PATH}/${RM_PLUGINS}" done fi @@ -2355,7 +2356,7 @@ pw_init_db () { # shellcheck source=/dev/null source "${PORTWINE_DB_FILE}" if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then - if [[ -z $(lsbash "${PORT_WINE_PATH}/prefixes/" --grep ^"${PW_PREFIX_NAME}"$) ]] \ + if [[ -z $(ls "${PORT_WINE_PATH}/prefixes/" | grep -e ^"${PW_PREFIX_NAME}"$) ]] \ || [[ -z $(grep -e ^"export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]] then PW_PREFIX_NAME=$(echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') @@ -2395,7 +2396,7 @@ pw_init_db () { try_copy_file "${PW_FIND_DB_FILE}" "${portwine_exe}".ppdb PORTWINE_DB_FILE="${portwine_exe}".ppdb if echo "${portwine_exe}" | grep "/prefixes/" &>/dev/null ; then - if [[ -z $(lsbash "${PORT_WINE_PATH}/prefixes/" --grep ^"${PW_PREFIX_NAME}"$) ]] \ + if [[ -z $(ls "${PORT_WINE_PATH}/prefixes/" | grep -e ^"${PW_PREFIX_NAME}"$) ]] \ || [[ -z $(grep -e ^"export PW_PREFIX_NAME=" "${PORTWINE_DB_FILE}" 2>/dev/null) ]] then PW_PREFIX_NAME=$(echo "${portwine_exe}" | awk -F"/prefixes/" '{print $2}' | awk -F"/" '{print $1}') @@ -2444,7 +2445,7 @@ pw_init_db () { if [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] && [[ -n "${WINE_CPU_TOPOLOGY}" ]] ; then export PW_WINE_CPU_TOPOLOGY="${WINE_CPU_TOPOLOGY}" fi - if lsbash "${PATH_TO_GAME}"/*_Data/Resources/ --grep "unity" &>/dev/null \ + if ls "${PATH_TO_GAME}"/*_Data/Resources/ 2>/dev/null | grep "unity" &>/dev/null \ && [[ "${PW_WINE_CPU_TOPOLOGY}" == "disabled" ]] \ && [[ $(grep -c ^"processor" /proc/cpuinfo) -gt "8" ]] then diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 223ca377..f2fa1a71 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -120,15 +120,14 @@ echo "" > "${PW_TMPFS_PATH}/tmp_yad_form" echo "" > "${PW_TMPFS_PATH}/tmp_yad_form_vulkan" create_new_dir "${PORT_WINE_PATH}/data/dist" -pushd "${PORT_WINE_PATH}/data/dist/" 1>/dev/null || fatal -for dist_dir in ./* ; do - [[ -d "$dist_dir" ]] || continue - dist_dir_new="${dist_dir//[[:blank:]]/_}" +IFS=$'\n' +for dist_dir in $(ls -1 "${PORT_WINE_PATH}/data/dist") ; do + dist_dir_new=$(echo "${dist_dir}" | awk '$1=$1' | sed -e s/[[:blank:]]/_/g) if [[ ! -d "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}" ]] ; then mv -- "${PORT_WINE_PATH}/data/dist/$dist_dir" "${PORT_WINE_PATH}/data/dist/${dist_dir_new^^}" fi done -popd 1>/dev/null || fatal +IFS="$orig_IFS" create_new_dir "${PORT_WINE_PATH}/data/prefixes/DEFAULT" create_new_dir "${PORT_WINE_PATH}/data/prefixes/DOTNET" From 6fd26a2110f660cfb9603210a32c9d166df18140 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 22:03:23 +0300 Subject: [PATCH 31/32] Scripts version 2387 --- data_from_portwine/changelog_en | 10 ++++++++++ data_from_portwine/changelog_ru | 8 ++++++++ data_from_portwine/scripts/var | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index a2cb25ec..37c223cb 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,16 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2387### / Date: 04.02.2025 / Download update size: 10 megabytes +* updated versions: + * DXVK_GIT "2.5.3-31" (shared with dxvk-nvapi) + * VKD3D_GIT "1.1-4367" (shared with vkd3d-shader) +* added the ability to replace WINEDEBUG variable arguments in user.conf or .ppdb settings files. +* improved icon creation functions (thanks to Htylol) +* added Steam Play support for games supported via PortProton and the selected Proton version on Steam (thanks to alex2844) +* fixed windows operation, paths in game launch arguments (thanks to Boria138) +* fixed errors with empty "dist" directory + ###Scripts version 2386### / Date: 09.01.2025 / Download update size: 4 megabytes * corrected permissions when creating desktop files (thanks to Boria138) * fixed the function of rolling back scripts from the archive if there is no scripts_backup directory (thanks to Boria138) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 21945543..8a6ae09a 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,7 +2,15 @@ ----------------------------------------- История изменений: +###Scripts version 2387### / Дата: 04.02.2025 / Размер скачиваемого обновления: 10 мегабайт +* обновлены версии: + * DXVK_GIT "2.5.3-31" (совместно с dxvk-nvapi) + * VKD3D_GIT "1.1-4367" (совместно vkd3d-shader) * добавлена возможность замещения аргументов переменной WINEDEBUG в user.conf или .ppdb файлах настроек +* улучшение функций создания иконок (спасибо Htylol) +* добавлена поддержка Steam Play для игр установленных с помощью PortProton и когда выбрана версия proton в steam (спасибо alex2844) +* исправлена работа windows путей в аргументах запуска к игре (спасибо Boria138) +* исправлены ошибки при пустом каталоге "dist" ###Scripts version 2386### / Дата: 09.01.2025 / Размер скачиваемого обновления: 4 мегабайта * исправление прав при создании desktop файлов (спасибо Boria138) diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index f4668929..d0559200 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,6 +1,6 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2386 +#SCRIPTS_NEXT_VERSION=2387 #SCRIPTS_STABLE_VERSION=2385 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" From c99435d2a1501e9aab9e9aab7be6a71374aec582 Mon Sep 17 00:00:00 2001 From: Mikhail Tergoev Date: Tue, 4 Feb 2025 22:18:51 +0300 Subject: [PATCH 32/32] STABLE: Scripts version 2388 --- data_from_portwine/changelog_en | 3 +++ data_from_portwine/changelog_ru | 3 +++ data_from_portwine/scripts/var | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data_from_portwine/changelog_en b/data_from_portwine/changelog_en index 37c223cb..fa4bdf20 100755 --- a/data_from_portwine/changelog_en +++ b/data_from_portwine/changelog_en @@ -2,6 +2,9 @@ You can help us in the development of the project on the website: https://linux- ---------------------------------------- Changelog: +###Scripts version 2388### / stable / Date: 04.02.2025 / Download update size: 10 megabytes +* cumulative update to the stable version of PortProton scripts + ###Scripts version 2387### / Date: 04.02.2025 / Download update size: 10 megabytes * updated versions: * DXVK_GIT "2.5.3-31" (shared with dxvk-nvapi) diff --git a/data_from_portwine/changelog_ru b/data_from_portwine/changelog_ru index 8a6ae09a..22756084 100755 --- a/data_from_portwine/changelog_ru +++ b/data_from_portwine/changelog_ru @@ -2,6 +2,9 @@ ----------------------------------------- История изменений: +###Scripts version 2388### / stable / Дата: 04.02.2025 / Размер скачиваемого обновления: 10 мегабайт +* кумулятивное обновление стабильной версии скриптов PortProton + ###Scripts version 2387### / Дата: 04.02.2025 / Размер скачиваемого обновления: 10 мегабайт * обновлены версии: * DXVK_GIT "2.5.3-31" (совместно с dxvk-nvapi) diff --git a/data_from_portwine/scripts/var b/data_from_portwine/scripts/var index d0559200..1316b19d 100755 --- a/data_from_portwine/scripts/var +++ b/data_from_portwine/scripts/var @@ -1,7 +1,7 @@ #!/usr/bin/env bash #Author: Castro-Fidel (linux-gaming.ru) -#SCRIPTS_NEXT_VERSION=2387 -#SCRIPTS_STABLE_VERSION=2385 +#SCRIPTS_NEXT_VERSION=2388 +#SCRIPTS_STABLE_VERSION=2388 ######################################################################## export AI_TOP_GAMES="PW_LGC PW_VKPLAY PW_EPIC PW_BATTLE_NET PW_WORLD_OF_SEA_BATTLE PW_RUSSIAN_FISHING PW_HO_YO_PLAY PW_FARLIGHT84 PW_WARFRAME PW_WGC PW_UBISOFT" # export PROTON_USE_XALIA="1"