Skip to content

Commit 9464758

Browse files
Victor9401Victor
andauthored
Updated mods updater script to correctly process mod dependencies (#557)
Co-authored-by: Victor <[email protected]>
1 parent 50f04fb commit 9464758

File tree

1 file changed

+130
-3
lines changed

1 file changed

+130
-3
lines changed

docker/files/update-mods.sh

Lines changed: 130 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,149 @@ print_failure()
2323
echo "$1"
2424
}
2525

26+
# Checks game version vs version in mod.
27+
# Returns 0 if major version differs or mod minor version is less than game version, 1 if ok
28+
check_game_version() {
29+
local game_version="$1"
30+
local mod_version="$2"
31+
32+
local game_major mod_major game_minor mod_minor
33+
game_major=$(echo "$game_version" | cut -d '.' -f1)
34+
game_minor=$(echo "$game_version" | cut -d '.' -f2)
35+
mod_major=$(echo "$mod_version" | cut -d '.' -f1)
36+
mod_minor=$(echo "$mod_version" | cut -d '.' -f2)
37+
38+
if [[ "$game_major" -ne "$mod_major" ]]; then
39+
echo 0
40+
return
41+
fi
42+
43+
if [[ "$mod_minor" -ge "$game_minor" ]]; then
44+
echo 1
45+
else
46+
echo 0
47+
fi
48+
}
49+
50+
# Checks dependency string with provided version.
51+
# Only checks for operator based string, ignoring everything else
52+
# Returns 1 if check is ok, 0 if not
53+
check_dependency_version()
54+
{
55+
local dependency="$1"
56+
local mod_version="$2"
57+
58+
if [[ "$dependency" =~ ^(\?|!|~|\(~\)) ]]; then
59+
echo 1
60+
fi
61+
62+
local condition
63+
condition=$(echo "$dependency" | grep -oE '(>=|<=|>|<|=) [0-9]+(\.[0-9]+)*')
64+
65+
if [[ -z "$condition" ]]; then
66+
echo 1
67+
fi
68+
69+
local operator required_version
70+
operator=$(echo "$condition" | awk '{print $1}')
71+
required_version=$(echo "$condition" | awk '{print $2}')
72+
73+
case "$operator" in
74+
">=")
75+
if [[ "$(printf '%s\n%s\n' "$required_version" "$mod_version" | sort -V | head -n1)" == "$required_version" ]]; then
76+
echo 1
77+
else
78+
echo 0
79+
fi
80+
;;
81+
">")
82+
if [[ "$(printf '%s\n%s\n' "$required_version" "$mod_version" | sort -V | head -n1)" == "$required_version" && "$required_version" != "$FACTORIO_VERSION" ]]; then
83+
echo 1
84+
else
85+
echo 0
86+
fi
87+
;;
88+
"<=")
89+
if [[ "$(printf '%s\n%s\n' "$required_version" "$mod_version" | sort -V | tail -n1)" == "$required_version" ]]; then
90+
echo 1
91+
else
92+
echo 0
93+
fi
94+
;;
95+
"<")
96+
if [[ "$(printf '%s\n%s\n' "$required_version" "$mod_version" | sort -V | tail -n1)" == "$required_version" && "$required_version" != "$FACTORIO_VERSION" ]]; then
97+
echo 1
98+
else
99+
echo 0
100+
fi
101+
;;
102+
"=")
103+
if [[ "$mod_version" == "$required_version" ]]; then
104+
echo 1
105+
else
106+
echo 0
107+
fi
108+
;;
109+
*)
110+
echo 0
111+
;;
112+
esac
113+
}
114+
115+
get_mod_info()
116+
{
117+
local mod_info_json="$1"
118+
119+
while IFS= read -r mod_release_info; do
120+
local mod_version mod_factorio_version
121+
mod_version=$(echo "$mod_release_info" | jq -r ".version")
122+
mod_factorio_version=$(echo "$mod_release_info" | jq -r ".info_json.factorio_version")
123+
124+
if [[ $(check_game_version "$mod_factorio_version" "$FACTORIO_VERSION") == 0 ]]; then
125+
echo " Skipping mod version $mod_version because of factorio version mismatch" >&2
126+
continue
127+
fi
128+
129+
# If we found 'dependencies' element, we also check versions there
130+
if [[ $(echo "$mod_release_info" | jq -e '.info_json | has("dependencies") and (.dependencies | length > 0)') == true ]]; then
131+
while IFS= read -r dependency; do
132+
133+
# We only check for 'base' dependency
134+
if [[ "$dependency" == base* ]] && [[ $(check_dependency_version "$dependency" "$FACTORIO_VERSION") == 0 ]]; then
135+
echo " Skipping mod version $mod_version, unsatisfied base dependency: $dependency" >&2
136+
continue 2
137+
fi
138+
139+
done < <(echo "$mod_release_info" | jq -r '.info_json.dependencies[]')
140+
fi
141+
142+
echo "$mod_release_info" | jq -j ".file_name, \";\", .download_url, \";\", .sha1"
143+
break
144+
145+
done < <(echo "$mod_info_json" | jq -c ".releases|sort_by(.released_at)|reverse|.[]")
146+
}
147+
26148
update_mod()
27149
{
28150
MOD_NAME="$1"
29151
MOD_NAME_ENCODED="${1// /%20}"
30152

31153
print_step "Checking for update of mod $MOD_NAME for factorio $FACTORIO_VERSION ..."
32154

33-
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED"
155+
MOD_INFO_URL="$MOD_BASE_URL/api/mods/$MOD_NAME_ENCODED/full"
34156
MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL")
35157

36158
if ! echo "$MOD_INFO_JSON" | jq -e .name >/dev/null; then
37159
print_success " Custom mod not on $MOD_BASE_URL, skipped."
38160
return 0
39161
fi
40162

41-
MOD_INFO=$(echo "$MOD_INFO_JSON" | jq -j --arg version "$FACTORIO_VERSION" ".releases|reverse|map(select(.info_json.factorio_version as \$mod_version | \$version | startswith(\$mod_version)))[0]|.file_name, \";\", .download_url, \";\", .sha1")
163+
MOD_INFO=$(get_mod_info "$MOD_INFO_JSON")
164+
165+
if [[ "$MOD_INFO" == "" ]]; then
166+
print_failure " Not compatible with version"
167+
return 0
168+
fi
42169

43170
MOD_FILENAME=$(echo "$MOD_INFO" | cut -f1 -d";")
44171
MOD_URL=$(echo "$MOD_INFO" | cut -f2 -d";")
@@ -90,7 +217,7 @@ update_mod()
90217
if [[ -f $MOD_DIR/mod-list.json ]]; then
91218
jq -r ".mods|map(select(.enabled))|.[].name" "$MOD_DIR/mod-list.json" | while read -r mod; do
92219
if [[ $mod != base ]]; then
93-
update_mod "$mod"
220+
update_mod "$mod" || true
94221
fi
95222
done
96223
fi

0 commit comments

Comments
 (0)