diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh new file mode 100644 index 000000000..a2c7b8bed --- /dev/null +++ b/lgsm/functions/command_mods_install.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# LGSM command_mods_install.sh function +# Author: Daniel Gibbs +# Contributor: UltimateByte +# Website: https://gameservermanagers.com +# Description: List and installs available mods along with mods_list.sh. + +local commandname="MODS" +local commandaction="Mod Installation" +local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" + +check.sh +mods_list.sh + +fn_mods_install_init(){ + fn_script_log "Entering mods & addons installation" + echo "=================================" + echo "${gamename} mods & addons installation" + echo "" + # Display available mods from mods_list.sh + fn_mods_show_available + echo "" + # Keep prompting as long as the user input doesn't correspond to an available mod + while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do + echo -en "Enter a \e[36mmod\e[0m to install (or exit to abort): " + read -r usermodselect + # Exit if user says exit or abort + if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then + fn_script_log "User aborted." + echo "Aborted." + core_exit.sh + # Supplementary output upon invalid user input + elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then + fn_print_error2_nl "${usermodselect} is not a valid mod." + echo " * Enter a valid mod or input exit to abort." + fi + done + # Gives a pretty name to the user and get all mod info + currentmod="${usermodselect}" + fn_mod_get_info_from_command + fn_print_dots "Installing ${modprettyname}" + sleep 1 + fn_script_log "Installing ${modprettyname}." +} + +# Create mods directory if it doesn't exist +# Assuming the game is already installed as mods_list.sh checked for it. +fn_mods_dir(){ + if [ ! -d "${modinstalldir}" ]; then + fn_script_log_info "Creating mods directory: ${modinstalldir}" + fn_print_dots "Creating mods directory" + sleep 1 + mkdir -p "${modinstalldir}" + fn_print_ok_nl "Created mods directory" + fi +} + +# Clear mod download directory so that there is only one file in it since we don't the file name and extention +fn_clear_tmp_mods(){ + if [ -d "${modstmpdir}" ]; then + rm -r "${modstmpdir}" + fn_script_log "Clearing temp mod download directory: ${modstmpdir}" + fi +} + +# Create tmp download mod directory +fn_mods_tmpdir(){ + if [ ! -d "${modstmpdir}" ]; then + mkdir -p "${modstmpdir}" + fn_script_log "Creating temp mod download directory: ${modstmpdir}" + fi +} + +fn_mod_dl(){ + # fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}" + fileurl="${modurl}" + filedir="${modstmpdir}" + filename="${modfilename}" + fn_script_log "Downloading mods to ${modstmpdir}" + fn_fetch_file "${fileurl}" "${filedir}" "${filename}" + # Check if variable is valid checking if file has been downloaded and exists + if [ ! -f "${modstmpdir}/${modfilename}" ]; then + fn_print_fail "An issue occurred upon downloading ${modprettyname}" + core_exit.sh + fi +} + +fn_mod_extract(){ + # fn_dl_extract "${filedir}" "${filename}" "${extractdir}" + filename="${modfilename}" + extractdir="${modstmpdir}/extracted" + if [ ! -d "${extractdir}" ]; then + mkdir -p "${extractdir}" + fi + fn_script_log "Extracting ${modprettyname} to ${extractdir}" + fn_dl_extract "${filedir}" "${filename}" "${extractdir}" +} + +fn_mod_fileslist(){ + # ${modsdatadir}/${modcommand}-files.list + true; +} + +fn_mod_copy_destination(){ + # Destination directory: ${modinstalldir} + fn_script_log "Copying ${modprettyname} to ${modinstalldir}" + cp -Rf "${extractdir}/." "${modinstalldir}/" +} + +# Check if the mod is already installed and warn the user +fn_mod_already_installed(){ + if [ -f "${modslockfilefullpath}" ]; then + if [ -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "" + fn_print_warning_nl "${modprettyname} has already been installed." + echo " * Mod files will be overwritten." + sleep 4 + fi + fi +} + +# Add the mod to the installed mods list +fn_mod_add_list(){ + # Create lgsm/data directory + if [ ! -d "${modsdatadir}" ]; then + mkdir -p "${modsdatadir}" + fn_script_log "Created ${modsdatadir}" + fi + # Create lgsm/data/${modslockfile} + if [ ! -f "${modslockfilefullpath}" ]; then + touch "${modslockfilefullpath}" + fn_script_log "Created ${modslockfilefullpath}" + fi + # Input mod name to lockfile + if [ ! -n "$(cat "${modslockfilefullpath}" | grep "${modcommand}")" ]; then + echo "${modcommand}" >> "${modslockfilefullpath}" + fn_script_log "${modcommand} added to ${modslockfile}" + fi +} + +# Run all required operation +fn_mod_installation(){ + # If a mod was selected + if [ -n "${currentmod}" ]; then + # Get mod info + fn_mod_get_info_from_command + # Check if mod is already installed + fn_mod_already_installed + # Check and create required directories + fn_mods_dir + # Clear lgsm/tmp/mods dir if exists then recreate it + fn_clear_tmp_mods + fn_mods_tmpdir + # Download mod + fn_mod_dl + # Extract the mod + fn_mod_extract + # Build a file list + fn_mod_fileslist + # Copying to destination + fn_mod_copy_destination + # Ending with installation routines + fn_mod_add_list + fn_clear_tmp_mods + fn_print_ok_nl "${modprettyname} installed." + fn_script_log "${modprettyname} installed." + else + fn_print_fail "No mod was selected." + core_exit.sh + fi +} + +fn_mods_install_checks +fn_mods_install_init +fn_mod_installation