@@ -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+
26148update_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()
90217if [[ -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
96223fi
0 commit comments