From ecd31b6eac01f7dcf3ffcaf08430b1bd76d1aee7 Mon Sep 17 00:00:00 2001 From: v4n <105587619+v4n00@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:59:23 +0200 Subject: [PATCH] feat: unzip and directory functionality --- .gitignore | 3 ++- h2mm | 69 ++++++++++++++++++++++++++---------------------------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 5b7f7be..c7150a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ h2path -*.patch* \ No newline at end of file +*.patch* +*test* \ No newline at end of file diff --git a/h2mm b/h2mm index 3220bcc..9cbfcb6 100755 --- a/h2mm +++ b/h2mm @@ -1,7 +1,6 @@ #!/bin/bash # TODO: -# unzip command # export mods # import mods @@ -15,7 +14,7 @@ MODS_DIR="" DB_FILE="" function get_basename() { - base_name=$(echo "$1" | sed -E 's/\.+.*//') + base_name=$(echo "$1" | awk -F/ '{print $NF}' | sed -E 's/\.+.*//') } function find_game_directory() { @@ -32,7 +31,7 @@ function find_game_directory() { echo "$saved_dir" return else - echo "Saved game directory is invalid" + echo "Saved game directory is invalid." fi fi @@ -41,10 +40,10 @@ function find_game_directory() { game_dir=$(find "$search_dir" -type d -path "*/$target_dir" 2>/dev/null | head -n 1) if [[ -z "$game_dir" ]]; then - echo "Could not find the Helldivers 2 data directory automatically" >&2 + echo "Could not find the Helldivers 2 data directory automatically." >&2 read -p "Please enter the path to the Helldivers 2 data directory: " game_dir if [[ ! -d "$game_dir" ]]; then - echo -e "${RED}Error${NC}: Provided path is not a valid directory" + echo -e "${RED}Error${NC}: Provided path is not a valid directory." exit 1 fi fi @@ -71,12 +70,12 @@ function display_help() { echo "Helldivers 2 Mod Manager" echo "Usage: h2mm [command] [options]" echo "Commands:" - echo " install -n \"\" Install a mod with a name and files" - echo " list List all installed mods" - echo " uninstall -n \"\" Uninstall a mod by name" - echo " export \"\" Export installed mods to a zip file" - echo " import \"\" Import mods from a zip file" - echo " help Display this help message" + echo " install -n \"\" Install a mod with a name and files." + echo " list List all installed mods." + echo " uninstall -n \"\" Uninstall a mod by name." + echo " export \"\" Export installed mods to a zip file." + echo " import \"\" Import mods from a zip file." + echo " help Display this help message." echo "For more information, use h2mm [command] --help" echo "Basic Usage:" echo " h2mm install -n \"Example mod\" a5f2c029522e6714.patch_0 a5f2c029522e6714.patch_0.stream" @@ -86,10 +85,10 @@ function display_help() { function display_install_help() { echo "Usage: h2mm install -n \"\" [options] " echo "Options:" - echo " -n \"\" Name of the mod (MANDATORY), inside double quotes" - echo " -d Directory containing mod files" - echo " -z Zip file containing mod files (.zip, .rar)" - echo " List of mod files to install" + echo " -n \"\" Name of the mod (MANDATORY), inside double quotes." + echo " -d Directory containing mod files." + echo " -z Zip file containing mod files (.zip only)." + echo " List of mod files to install." echo "Usage:" echo " h2mm install -n \"Example mod\" a5f2c029522e6714.patch_0 a5f2c029522e6714.patch_0.stream" echo " h2mm install -n \"Example mod\" a5f* (using a wildcard to include all files)" @@ -100,8 +99,8 @@ function display_install_help() { function display_uninstall_help() { echo "Usage: h2mm uninstall [options]" echo "Options:" - echo " -n \"\" Name of the mod to uninstall" - echo " -i Index of the mod to uninstall" + echo " -n \"\" Name of the mod to uninstall." + echo " -i Index of the mod to uninstall." echo "Usage:" echo " h2mm uninstall -n \"Example mod\"" echo " h2mm uninstall -i 1" @@ -141,21 +140,19 @@ function install_mod() { # zip file containing mod files if [[ -n "$mod_zip" ]]; then if ! command -v unzip &> /dev/null; then - echo -e "${RED}Error${NC}: unzip is not installed, please install the package and try again" + echo -e "${RED}Error${NC}: unzip is not installed, please install the package and try again." exit 1 fi - temp_dir=$(mktemp -d) - unzip "$mod_zip" -d "$temp_dir" - mod_files+=$(find "$temp_dir" -type f -name "*.patch_*") - rm -rf "$temp_dir" + mod_dir=$(mktemp -d) + unzip -qq "$mod_zip" -d "$mod_dir" fi # directory containing mod files if [[ -n "$mod_dir" ]]; then - # mod_files+=$(find "$mod_dir" -type f -name "*.patch_*") readarray -d '' mod_files < <(find "$mod_dir" -type f -name "*.patch_*" -print0) fi + # verify minimum information required if [[ -z "$mod_name" || ${#mod_files[@]} -eq 0 ]]; then echo -e "${RED}Error${NC}: Mod name and files are required." exit 1 @@ -164,7 +161,7 @@ function install_mod() { # verify mod files exist for file in "${mod_files[@]}"; do if [[ ! -f "$file" ]]; then - echo -e "${RED}Error${NC}: File $file does not exist" + echo -e "${RED}Error${NC}: File $file does not exist." exit 1 fi done @@ -186,18 +183,18 @@ function install_mod() { target_files+=($target_file) cp "$file" "$MODS_DIR/$target_file" - echo -e "Mod file ${ORANGE}$file${NC} installed at ${GREEN}\$MODS_DIR/$target_file${NC}" + echo -e "Mod file ${ORANGE}$file${NC} installed at ${GREEN}\$MODS_DIR/$target_file${NC}." done # add entry to database next_id=$(awk -F, 'END {print $1 + 1}' "$DB_FILE") echo "$next_id,$mod_name,${target_files[*]}" >> "$DB_FILE" - echo -e "Mod $mod_name ($base_name) ${GREEN}installed successfully${NC}" + echo -e "Mod $mod_name ($base_name) ${GREEN}installed successfully${NC}." } function list_mods() { if [[ ! -s "$DB_FILE" ]]; then - echo "No mods installed" + echo "No mods installed." return fi @@ -224,14 +221,14 @@ function uninstall_mod() { exit 0 ;; *) - echo -e "${RED}Error${NC}: Invalid argument $1" + echo -e "${RED}Error${NC}: Invalid argument $1." exit 1 ;; esac done if [[ -z "$mod_name" && -z "$mod_index" ]]; then - echo -e "${RED}Error${NC}: Mod name or index is required to uninstall" + echo -e "${RED}Error${NC}: Mod name or index is required to uninstall." exit 1 fi @@ -245,7 +242,7 @@ function uninstall_mod() { fi if [[ -z "$entry" ]]; then - echo -e "${RED}Error${NC}: Mod not found" + echo -e "${RED}Error${NC}: Mod not found." exit 1 fi @@ -253,7 +250,7 @@ function uninstall_mod() { files=$(echo "$entry" | cut -d',' -f3- | tr ',' ' ') declare -A downgrades for file in $files; do - echo -e "Removing ${YELLOW}\$MODS_DIR/$file${NC}" + echo -e "Removing ${ORANGE}\$MODS_DIR/$file${NC}." rm -f "$MODS_DIR/$file" get_basename "$file" @@ -275,7 +272,7 @@ function uninstall_mod() { new_patch="${base_name}.patch_${new_version}${extension}" mv "$MODS_DIR/$patch" "$MODS_DIR/$new_patch" - echo -e "Downgraded ${ORANGE}$patch${NC} to ${GREEN}\$MODS_DIR/$new_patch${NC}" + echo -e "Downgraded ${ORANGE}$patch${NC} to ${GREEN}\$MODS_DIR/$new_patch${NC}." # save changes in database as well sed -i "s/$patch/$new_patch/" "$DB_FILE" @@ -286,7 +283,7 @@ function uninstall_mod() { # remove entry from database sed -i "/^$mod_index/d" "$DB_FILE" - echo -e "Mod ${GREEN}uninstalled successfully${NC}" + echo -e "Mod ${GREEN}uninstalled successfully${NC}." } # main @@ -303,15 +300,15 @@ initialize_directories case "$command" in install) install_mod "$@" - echo "--- /// ---" + echo "--- /// END /// ---" ;; list) list_mods - echo "--- /// ---" + echo "--- /// END /// ---" ;; uninstall) uninstall_mod "$@" - echo "--- /// ---" + echo "--- /// END /// ---" ;; *) display_help