From 625dce94ecff042053b230221380a7c009eb58c3 Mon Sep 17 00:00:00 2001 From: Daniel Ceregatti Date: Mon, 28 Jul 2025 16:32:44 -0600 Subject: [PATCH] Add function that handles custom installations of mod files, e.g. MMGMightysMilitaryGear, which ships separate types files that must all be used for the mod to work. --- files/bin/dz-common | 14 ++++++ files/mods/2663169692/install.sh | 4 +- web/bin/dz | 82 +++++++++++++++----------------- 3 files changed, 55 insertions(+), 45 deletions(-) diff --git a/files/bin/dz-common b/files/bin/dz-common index 2929578..c6165b2 100755 --- a/files/bin/dz-common +++ b/files/bin/dz-common @@ -114,6 +114,20 @@ get_mod_name(){ echo -n ${NAME} } +# Lint XML files +lint(){ + FILE=${1} + ID=${2} + var=${3} + xmllint --noout ${FILE} && ( + # Keep the normalized version in the /mods directory + echo -e "${green}The ${var,,} file passes XML lint test! Copying to install location ${WORKSHOP_DIR}/${ID}/${var,,}.xml${default}" + cp -v ${FILE} ${WORKSHOP_DIR}/${ID}/${var,,}.xml + ) || ( + echo -e "${yellow}The ${var,,} file does not pass XML lint test! IT WAS NOT COPIED!${default}" + ) +} + get_mod_id(){ # If we were passed a valid mod id, just return it if [ -d "${WORKSHOP_DIR}/${1}" ] diff --git a/files/mods/2663169692/install.sh b/files/mods/2663169692/install.sh index 6d80d40..e7d82cf 100755 --- a/files/mods/2663169692/install.sh +++ b/files/mods/2663169692/install.sh @@ -1,3 +1,5 @@ # Merge all the XML files into a single types.xml file in the run time mods directory: +source /files/bin/dz-common cd /mods/221100/2663169692/files/types -xmlmerge -o /mods/221100/2663169692/types.xml *.xml +xmlmerge -o /tmp/x *.xml +lint /tmp/x 2663169692 TYPES diff --git a/web/bin/dz b/web/bin/dz index aa8eb34..c97a0be 100755 --- a/web/bin/dz +++ b/web/bin/dz @@ -6,7 +6,7 @@ source dz-common WORKSHOP_DIR="/mods/${release_client_appid}" if [ ! -d ${WORKSHOP_DIR} ] then - mkdir -p ${WORKSHOP_DIR} + mkdir -p ${WORKSHOP_DIR} fi workshoplist="" @@ -15,7 +15,7 @@ workshoplist="" # Usage usage(){ - echo -e " + echo -e " ${red}Bad option or arguments! ${yellow}${*}${default} Usage: ${green}$(basename $0)${yellow} option [ arg1 [ arg2 ] ] @@ -50,19 +50,19 @@ symlink(){ } installxml(){ - ID=${1} - # Going to have to maintain a matrix of file names -> root node -> child node permutations - for i in "CFGEVENTGROUPS:eventgroupdef:group" "CFGEVENTSPAWNS:eventposdef:event" "CFGSPAWNABLETYPES:spawnabletypes:type" "EVENTS:events:event" "TYPES:types:type" - do - var=$(echo ${i} | cut -d: -f1) - CHECK=$(echo ${i} | cut -d: -f2) - if [ -f "${WORKSHOP_DIR}/${ID}/${var,,}.xml" ] - then - echo "Normalizing ${WORKSHOP_DIR}/${ID}/${var,,}.xml..." - cp ${WORKSHOP_DIR}/${ID}/${var,,}.xml /tmp/x - # Quirks - # Some cfgeventspanws.xml files have instead of . Let's just try to fix that first. - if [[ ${var} = "CFGEVENTSPAWNS" ]] + ID=${1} + # Going to have to maintain a matrix of file names -> root node -> child node permutations + for i in "CFGEVENTGROUPS:eventgroupdef:group" "CFGEVENTSPAWNS:eventposdef:event" "CFGSPAWNABLETYPES:spawnabletypes:type" "EVENTS:events:event" "TYPES:types:type" + do + var=$(echo ${i} | cut -d: -f1) + CHECK=$(echo ${i} | cut -d: -f2) + if [ -f "${WORKSHOP_DIR}/${ID}/${var,,}.xml" ] + then + echo "Normalizing ${WORKSHOP_DIR}/${ID}/${var,,}.xml..." + cp ${WORKSHOP_DIR}/${ID}/${var,,}.xml /tmp/x + # Quirks + # Some cfgeventspanws.xml files have instead of . Let's just try to fix that first. + if [[ ${var} = "CFGEVENTSPAWNS" ]] then if grep -q '' /tmp/x then @@ -70,30 +70,23 @@ installxml(){ xmlstarlet ed -L -r "events" -v "eventposdef" /tmp/x fi fi - if ! grep -q '<'${CHECK}'>' /tmp/x - then - echo " - has no root node <${CHECK}>. fixing..." - echo '<'${CHECK}'>' > /tmp/y - cat /tmp/x >> /tmp/y - echo '' >> /tmp/y - xmlstarlet fo /tmp/y > /tmp/x - fi - if ! grep -q ' /tmp/y - mv /tmp/y /tmp/x - fi - xmllint --noout /tmp/x && ( - # Keep the normalized version in the /mods directory - cp /tmp/x ${WORKSHOP_DIR}/${ID}/${var,,}.xml - echo -e "${green}${WORKSHOP_DIR}/${ID}/${var,,}.xml passes XML lint test!${default}" - ) || ( - echo -e "${yellow}The final ${WORKSHOP_DIR}/${ID}/${var,,}.xml does not pass XML lint test! IT WAS NOT COPIED!${default}" - ) - fi - done - exit 0 + if ! grep -q '<'${CHECK}'>' /tmp/x + then + echo " - has no root node <${CHECK}>. fixing..." + echo '<'${CHECK}'>' > /tmp/y + cat /tmp/x >> /tmp/y + echo '' >> /tmp/y + xmlstarlet fo /tmp/y > /tmp/x + fi + if ! grep -q ' /tmp/y + mv /tmp/y /tmp/x + fi + lint /tmp/x ${ID} ${var} + fi + done } # Add a mod @@ -122,8 +115,8 @@ add(){ symlink 1 ${1} "${MODNAME}" echo -e "Mod id ${1} - ${green}${MODNAME}${default} - added" xml ${ID} - map ${ID} installMod ${ID} + map ${ID} } # Remove a mod @@ -149,11 +142,12 @@ remove(){ # Handle custom scripts after installing a mod installMod(){ - FILE="${WORKSHOP_DIR}/${1:?}/install.sh" + FILE="${FILES}/mods/${1}/install.sh" if [ -f "${FILE}" ] then MODNAME=$(get_mod_name ${1}) - echo "Running custom install script ${FILE} for mod id ${1}" + echo + echo "Running custom install script for ${MODNAME}" ${FILE} fi } @@ -360,8 +354,8 @@ mod_install(){ # "Manage" XML files. xml(){ - /files/bin/xml.sh ${1} - installxml ${1} + /files/bin/xml.sh ${1} + installxml ${1} } # Capture the first argument and shift it off so we can pass $@ to every function