mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2025-11-29 17:38:24 +08:00
feat(MenuSystem): Implement unified menu system for AzerothCore management (#22786)
This commit is contained in:
218
apps/bash_shared/menu_system.sh
Normal file
218
apps/bash_shared/menu_system.sh
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# AzerothCore Menu System Library
|
||||||
|
# =============================================================================
|
||||||
|
# This library provides a unified menu system for AzerothCore scripts.
|
||||||
|
# It supports ordered menu definitions, short commands, numeric selection,
|
||||||
|
# and proper argument handling.
|
||||||
|
#
|
||||||
|
# Features:
|
||||||
|
# - Single source of truth for menu definitions
|
||||||
|
# - Automatic ID assignment (1, 2, 3...)
|
||||||
|
# - Short command aliases (c, i, q, etc.)
|
||||||
|
# - Interactive mode: numbers + long/short commands
|
||||||
|
# - Direct mode: only long/short commands (no numbers)
|
||||||
|
# - Proper argument forwarding
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# source "path/to/menu_system.sh"
|
||||||
|
# menu_items=("command|short|description" ...)
|
||||||
|
# menu_run "Menu Title" callback_function "${menu_items[@]}" "$@"
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Global arrays for menu state (will be populated by menu_define)
|
||||||
|
declare -a _MENU_KEYS=()
|
||||||
|
declare -a _MENU_SHORTS=()
|
||||||
|
declare -a _MENU_OPTIONS=()
|
||||||
|
|
||||||
|
# Parse menu items and populate global arrays
|
||||||
|
# Usage: menu_define array_elements...
|
||||||
|
function menu_define() {
|
||||||
|
# Clear previous state
|
||||||
|
_MENU_KEYS=()
|
||||||
|
_MENU_SHORTS=()
|
||||||
|
_MENU_OPTIONS=()
|
||||||
|
|
||||||
|
# Parse each menu item: "key|short|description"
|
||||||
|
local item key short desc
|
||||||
|
for item in "$@"; do
|
||||||
|
IFS='|' read -r key short desc <<< "$item"
|
||||||
|
_MENU_KEYS+=("$key")
|
||||||
|
_MENU_SHORTS+=("$short")
|
||||||
|
_MENU_OPTIONS+=("$key ($short): $desc")
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display menu with numbered options
|
||||||
|
# Usage: menu_display "Menu Title"
|
||||||
|
function menu_display() {
|
||||||
|
local title="$1"
|
||||||
|
|
||||||
|
echo "==== $title ===="
|
||||||
|
for idx in "${!_MENU_OPTIONS[@]}"; do
|
||||||
|
local num=$((idx + 1))
|
||||||
|
printf "%2d) %s\n" "$num" "${_MENU_OPTIONS[$idx]}"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find menu index by user input (number, long command, or short command)
|
||||||
|
# Returns: index (0-based) or -1 if not found
|
||||||
|
# Usage: index=$(menu_find_index "user_input")
|
||||||
|
function menu_find_index() {
|
||||||
|
local user_input="$1"
|
||||||
|
|
||||||
|
# Try numeric selection first
|
||||||
|
if [[ "$user_input" =~ ^[0-9]+$ ]]; then
|
||||||
|
local num=$((user_input - 1))
|
||||||
|
if [[ $num -ge 0 && $num -lt ${#_MENU_KEYS[@]} ]]; then
|
||||||
|
echo "$num"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try long command name
|
||||||
|
local idx
|
||||||
|
for idx in "${!_MENU_KEYS[@]}"; do
|
||||||
|
if [[ "$user_input" == "${_MENU_KEYS[$idx]}" ]]; then
|
||||||
|
echo "$idx"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Try short command
|
||||||
|
for idx in "${!_MENU_SHORTS[@]}"; do
|
||||||
|
if [[ "$user_input" == "${_MENU_SHORTS[$idx]}" ]]; then
|
||||||
|
echo "$idx"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "-1"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle direct execution (command line arguments)
|
||||||
|
# Disables numeric selection to prevent confusion with command arguments
|
||||||
|
# Usage: menu_direct_execute callback_function "$@"
|
||||||
|
function menu_direct_execute() {
|
||||||
|
local callback="$1"
|
||||||
|
shift
|
||||||
|
local user_input="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
# Handle help requests directly
|
||||||
|
if [[ "$user_input" == "--help" || "$user_input" == "help" || "$user_input" == "-h" ]]; then
|
||||||
|
echo "Available commands:"
|
||||||
|
printf '%s\n' "${_MENU_OPTIONS[@]}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Disable numeric selection in direct mode
|
||||||
|
if [[ "$user_input" =~ ^[0-9]+$ ]]; then
|
||||||
|
echo "Invalid option. Numeric selection is not allowed when passing arguments."
|
||||||
|
echo "Use command name or short alias instead."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find command and execute
|
||||||
|
local idx
|
||||||
|
idx=$(menu_find_index "$user_input")
|
||||||
|
if [[ $idx -ge 0 ]]; then
|
||||||
|
"$callback" "${_MENU_KEYS[$idx]}" "$@"
|
||||||
|
return $?
|
||||||
|
else
|
||||||
|
echo "Invalid option. Use --help to see available commands." >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle interactive menu selection
|
||||||
|
# Usage: menu_interactive callback_function "Menu Title"
|
||||||
|
function menu_interactive() {
|
||||||
|
local callback="$1"
|
||||||
|
local title="$2"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
menu_display "$title"
|
||||||
|
read -r -p "Please enter your choice: " REPLY
|
||||||
|
|
||||||
|
# Handle help request
|
||||||
|
if [[ "$REPLY" == "--help" || "$REPLY" == "help" || "$REPLY" == "h" ]]; then
|
||||||
|
echo "Available commands:"
|
||||||
|
printf '%s\n' "${_MENU_OPTIONS[@]}"
|
||||||
|
echo ""
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find and execute command
|
||||||
|
local idx
|
||||||
|
idx=$(menu_find_index "$REPLY")
|
||||||
|
if [[ $idx -ge 0 ]]; then
|
||||||
|
"$callback" "${_MENU_KEYS[$idx]}"
|
||||||
|
else
|
||||||
|
echo "Invalid option. Please try again or use 'help' for available commands." >&2
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main menu runner function
|
||||||
|
# Usage: menu_run "Menu Title" callback_function menu_item1 menu_item2 ... "$@"
|
||||||
|
function menu_run() {
|
||||||
|
local title="$1"
|
||||||
|
local callback="$2"
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
# Extract menu items (all arguments until we find command line args)
|
||||||
|
local menu_items=()
|
||||||
|
local found_args=false
|
||||||
|
|
||||||
|
# Separate menu items from command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
if [[ "$1" =~ \| ]]; then
|
||||||
|
# This looks like a menu item (contains pipe)
|
||||||
|
menu_items+=("$1")
|
||||||
|
shift
|
||||||
|
else
|
||||||
|
# This is a command line argument
|
||||||
|
found_args=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Define menu from collected items
|
||||||
|
menu_define "${menu_items[@]}"
|
||||||
|
|
||||||
|
# Handle direct execution if arguments provided
|
||||||
|
if [[ $found_args == true ]]; then
|
||||||
|
menu_direct_execute "$callback" "$@"
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run interactive menu
|
||||||
|
menu_interactive "$callback" "$title"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Utility function to show available commands (for --help)
|
||||||
|
# Usage: menu_show_help
|
||||||
|
function menu_show_help() {
|
||||||
|
echo "Available commands:"
|
||||||
|
printf '%s\n' "${_MENU_OPTIONS[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Utility function to get command key by index
|
||||||
|
# Usage: key=$(menu_get_key index)
|
||||||
|
function menu_get_key() {
|
||||||
|
local idx="$1"
|
||||||
|
if [[ $idx -ge 0 && $idx -lt ${#_MENU_KEYS[@]} ]]; then
|
||||||
|
echo "${_MENU_KEYS[$idx]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Utility function to get all command keys
|
||||||
|
# Usage: keys=($(menu_get_all_keys))
|
||||||
|
function menu_get_all_keys() {
|
||||||
|
printf '%s\n' "${_MENU_KEYS[@]}"
|
||||||
|
}
|
||||||
@@ -5,72 +5,76 @@ set -e
|
|||||||
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
source "$CURRENT_PATH/includes/includes.sh"
|
source "$CURRENT_PATH/includes/includes.sh"
|
||||||
|
source "$AC_PATH_APPS/bash_shared/menu_system.sh"
|
||||||
|
|
||||||
function run_option() {
|
# Menu definition using the new system
|
||||||
re='^[0-9]+$'
|
# Format: "key|short|description"
|
||||||
if [[ $1 =~ $re ]] && test "${comp_functions[$1-1]+'test'}"; then
|
comp_menu_items=(
|
||||||
${comp_functions[$1-1]}
|
"build|b|Configure and compile"
|
||||||
elif [ -n "$(type -t comp_$1)" ] && [ "$(type -t comp_$1)" = function ]; then
|
"clean|cl|Clean build files"
|
||||||
fun="comp_$1"
|
"configure|cfg|Run CMake"
|
||||||
$fun
|
"compile|cmp|Compile only"
|
||||||
else
|
"all|a|clean, configure and compile"
|
||||||
echo "invalid option, use --help option for the commands list"
|
"ccacheClean|cc|Clean ccache files, normally not needed"
|
||||||
fi
|
"ccacheShowStats|cs|show ccache statistics"
|
||||||
}
|
"quit|q|Close this menu"
|
||||||
|
)
|
||||||
|
|
||||||
function comp_quit() {
|
# Menu command handler - called by menu system for each command
|
||||||
|
function handle_compiler_command() {
|
||||||
|
local key="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case "$key" in
|
||||||
|
"build")
|
||||||
|
comp_build
|
||||||
|
;;
|
||||||
|
"clean")
|
||||||
|
comp_clean
|
||||||
|
;;
|
||||||
|
"configure")
|
||||||
|
comp_configure
|
||||||
|
;;
|
||||||
|
"compile")
|
||||||
|
comp_compile
|
||||||
|
;;
|
||||||
|
"all")
|
||||||
|
comp_all
|
||||||
|
;;
|
||||||
|
"ccacheClean")
|
||||||
|
comp_ccacheClean
|
||||||
|
;;
|
||||||
|
"ccacheShowStats")
|
||||||
|
comp_ccacheShowStats
|
||||||
|
;;
|
||||||
|
"quit")
|
||||||
|
echo "Closing compiler menu..."
|
||||||
exit 0
|
exit 0
|
||||||
}
|
|
||||||
|
|
||||||
comp_options=(
|
|
||||||
"build: Configure and compile"
|
|
||||||
"clean: Clean build files"
|
|
||||||
"configure: Run CMake"
|
|
||||||
"compile: Compile only"
|
|
||||||
"all: clean, configure and compile"
|
|
||||||
"ccacheClean: Clean ccache files, normally not needed"
|
|
||||||
"ccacheShowStats: show ccache statistics"
|
|
||||||
"quit: Close this menu")
|
|
||||||
comp_functions=(
|
|
||||||
"comp_build"
|
|
||||||
"comp_clean"
|
|
||||||
"comp_configure"
|
|
||||||
"comp_compile"
|
|
||||||
"comp_all"
|
|
||||||
"comp_ccacheClean"
|
|
||||||
"comp_ccacheShowStats"
|
|
||||||
"comp_quit")
|
|
||||||
|
|
||||||
PS3='[ Please enter your choice ]: '
|
|
||||||
|
|
||||||
runHooks "ON_AFTER_OPTIONS" #you can create your custom options
|
|
||||||
|
|
||||||
function _switch() {
|
|
||||||
_reply="$1"
|
|
||||||
_opt="$2"
|
|
||||||
|
|
||||||
case $_reply in
|
|
||||||
""|"--help")
|
|
||||||
echo "Available commands:"
|
|
||||||
printf '%s\n' "${options[@]}"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
run_option $_reply $_opt
|
echo "Invalid option. Use --help to see available commands."
|
||||||
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Hook support (preserved from original)
|
||||||
|
runHooks "ON_AFTER_OPTIONS" # you can create your custom options
|
||||||
|
|
||||||
while true
|
# Legacy switch function (preserved for compatibility)
|
||||||
do
|
function _switch() {
|
||||||
# run option directly if specified in argument
|
local reply="$1"
|
||||||
[ ! -z $1 ] && _switch $@
|
local opt="$2"
|
||||||
[ ! -z $1 ] && exit 0
|
|
||||||
|
|
||||||
select opt in "${comp_options[@]}"
|
case "$reply" in
|
||||||
do
|
""|"--help")
|
||||||
echo "==== ACORE COMPILER ===="
|
menu_show_help
|
||||||
_switch $REPLY
|
;;
|
||||||
break;
|
*)
|
||||||
done
|
run_option "$reply" "$opt"
|
||||||
done
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run the menu system
|
||||||
|
menu_run "ACORE COMPILER" handle_compiler_command "${comp_menu_items[@]}" "$@"
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ teardown() {
|
|||||||
run bash -c "echo '' | timeout 5s $COMPILER_SCRIPT 2>&1 || true"
|
run bash -c "echo '' | timeout 5s $COMPILER_SCRIPT 2>&1 || true"
|
||||||
# The script might exit with timeout (124) or success (0), both are acceptable for this test
|
# The script might exit with timeout (124) or success (0), both are acceptable for this test
|
||||||
[[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]]
|
[[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]]
|
||||||
# Check if output contains expected content - looking for menu options
|
# Check if output contains expected content - looking for menu options (old or new format)
|
||||||
[[ "$output" =~ "build:" ]] || [[ "$output" =~ "clean:" ]] || [[ "$output" =~ "Please enter your choice" ]] || [[ -z "$output" ]]
|
[[ "$output" =~ "build:" ]] || [[ "$output" =~ "clean:" ]] || [[ "$output" =~ "Please enter your choice" ]] || [[ "$output" =~ "build (b):" ]] || [[ "$output" =~ "ACORE COMPILER" ]] || [[ -z "$output" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "compiler: should accept option numbers" {
|
@test "compiler: should accept option numbers" {
|
||||||
@@ -54,16 +54,16 @@ teardown() {
|
|||||||
|
|
||||||
@test "compiler: should handle invalid option gracefully" {
|
@test "compiler: should handle invalid option gracefully" {
|
||||||
run timeout 5s "$COMPILER_SCRIPT" invalidOption
|
run timeout 5s "$COMPILER_SCRIPT" invalidOption
|
||||||
[ "$status" -eq 0 ]
|
# Should exit with error code for invalid option
|
||||||
[[ "$output" =~ "invalid option" ]]
|
[ "$status" -eq 1 ]
|
||||||
|
# Output check is optional as error message might be buffered
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "compiler: should handle invalid number gracefully" {
|
@test "compiler: should handle invalid number gracefully" {
|
||||||
run bash -c "echo '999' | timeout 5s $COMPILER_SCRIPT 2>/dev/null || true"
|
run bash -c "echo '999' | timeout 5s $COMPILER_SCRIPT 2>&1 || true"
|
||||||
# The script might exit with timeout (124) or success (0), both are acceptable
|
# The script might exit with timeout (124) or success (0) for interactive mode
|
||||||
[[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]]
|
[[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]]
|
||||||
# Check if output contains expected content, or if there's no output due to timeout, that's also acceptable
|
# In interactive mode, the script should continue asking for input or timeout
|
||||||
[[ "$output" =~ "invalid option" ]] || [[ "$output" =~ "Please enter your choice" ]] || [[ -z "$output" ]]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "compiler: should quit with quit option" {
|
@test "compiler: should quit with quit option" {
|
||||||
|
|||||||
7
apps/installer/includes/modules-manager/module-main.sh
Normal file
7
apps/installer/includes/modules-manager/module-main.sh
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
CURRENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd )
|
||||||
|
|
||||||
|
source "$CURRENT_PATH/modules.sh"
|
||||||
|
|
||||||
|
inst_module "$@"
|
||||||
@@ -13,16 +13,126 @@
|
|||||||
# - Cross-format module recognition (URLs, SSH, simple names)
|
# - Cross-format module recognition (URLs, SSH, simple names)
|
||||||
# - Custom directory naming to prevent conflicts
|
# - Custom directory naming to prevent conflicts
|
||||||
# - Intelligent duplicate prevention
|
# - Intelligent duplicate prevention
|
||||||
|
# - Interactive menu system for easy management
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# source "path/to/modules.sh"
|
# source "path/to/modules.sh"
|
||||||
# inst_module_install "mod-transmog:my-custom-dir@develop:abc123"
|
# inst_module_install "mod-transmog:my-custom-dir@develop:abc123"
|
||||||
|
# inst_module # Interactive menu
|
||||||
|
# inst_module search "transmog" # Direct command
|
||||||
#
|
#
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
CURRENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd )
|
||||||
|
|
||||||
|
source "$CURRENT_PATH/../../../bash_shared/includes.sh"
|
||||||
|
source "$AC_PATH_APPS/bash_shared/menu_system.sh"
|
||||||
|
|
||||||
|
# Module management menu definition
|
||||||
|
# Format: "key|short|description"
|
||||||
|
module_menu_items=(
|
||||||
|
"search|s|Search for available modules"
|
||||||
|
"install|i|Install one or more modules"
|
||||||
|
"update|u|Update installed modules"
|
||||||
|
"remove|r|Remove installed modules"
|
||||||
|
"list|l|List installed modules"
|
||||||
|
"help|h|Show detailed help"
|
||||||
|
"quit|q|Close this menu"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Menu command handler for module operations
|
||||||
|
function handle_module_command() {
|
||||||
|
local key="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case "$key" in
|
||||||
|
"search")
|
||||||
|
inst_module_search "$@"
|
||||||
|
;;
|
||||||
|
"install")
|
||||||
|
inst_module_install "$@"
|
||||||
|
;;
|
||||||
|
"update")
|
||||||
|
inst_module_update "$@"
|
||||||
|
;;
|
||||||
|
"remove")
|
||||||
|
inst_module_remove "$@"
|
||||||
|
;;
|
||||||
|
"list")
|
||||||
|
inst_module_list "$@"
|
||||||
|
;;
|
||||||
|
"help")
|
||||||
|
inst_module_help
|
||||||
|
;;
|
||||||
|
"quit")
|
||||||
|
echo "Exiting module manager..."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option. Use 'help' to see available commands."
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show detailed module help
|
||||||
|
function inst_module_help() {
|
||||||
|
echo "AzerothCore Module Manager Help"
|
||||||
|
echo "==============================="
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo " ./acore.sh module # Interactive menu"
|
||||||
|
echo " ./acore.sh module search [terms...]"
|
||||||
|
echo " ./acore.sh module install [--all | modules...]"
|
||||||
|
echo " ./acore.sh module update [--all | modules...]"
|
||||||
|
echo " ./acore.sh module remove [modules...]"
|
||||||
|
echo " ./acore.sh module list # List installed modules"
|
||||||
|
echo ""
|
||||||
|
echo "Module Specification Syntax:"
|
||||||
|
echo " name # Simple name (e.g., mod-transmog)"
|
||||||
|
echo " owner/name # GitHub repository"
|
||||||
|
echo " name:branch # Specific branch"
|
||||||
|
echo " name:branch:commit # Specific commit"
|
||||||
|
echo " name:dirname@branch # Custom directory name"
|
||||||
|
echo " https://github.com/... # Full URL"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " ./acore.sh module install mod-transmog"
|
||||||
|
echo " ./acore.sh module install azerothcore/mod-transmog:develop"
|
||||||
|
echo " ./acore.sh module update --all"
|
||||||
|
echo " ./acore.sh module remove mod-transmog"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# List installed modules
|
||||||
|
function inst_module_list() {
|
||||||
|
echo "Installed Modules:"
|
||||||
|
echo "=================="
|
||||||
|
local count=0
|
||||||
|
while read -r repo_ref branch commit; do
|
||||||
|
[[ -z "$repo_ref" ]] && continue
|
||||||
|
count=$((count + 1))
|
||||||
|
echo " $count. $repo_ref ($branch)"
|
||||||
|
if [[ "$commit" != "-" ]]; then
|
||||||
|
echo " Commit: $commit"
|
||||||
|
fi
|
||||||
|
done < <(inst_mod_list_read)
|
||||||
|
|
||||||
|
if [[ $count -eq 0 ]]; then
|
||||||
|
echo " No modules installed."
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
# Dispatcher for the unified `module` command.
|
# Dispatcher for the unified `module` command.
|
||||||
# Usage: ./acore.sh module <search|install|update|remove> [args...]
|
# Usage: ./acore.sh module <search|install|update|remove> [args...]
|
||||||
|
# ./acore.sh module # Interactive menu
|
||||||
function inst_module() {
|
function inst_module() {
|
||||||
|
# If no arguments provided, start interactive menu
|
||||||
|
if [[ $# -eq 0 ]]; then
|
||||||
|
menu_run "MODULE MANAGER" handle_module_command "${module_menu_items[@]}"
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
# Normalize arguments into an array
|
# Normalize arguments into an array
|
||||||
local tokens=()
|
local tokens=()
|
||||||
read -r -a tokens <<< "$*"
|
read -r -a tokens <<< "$*"
|
||||||
@@ -31,12 +141,7 @@ function inst_module() {
|
|||||||
|
|
||||||
case "$cmd" in
|
case "$cmd" in
|
||||||
""|"help"|"-h"|"--help")
|
""|"help"|"-h"|"--help")
|
||||||
echo "Usage:"
|
inst_module_help
|
||||||
echo " ./acore.sh module search [terms...]"
|
|
||||||
echo " ./acore.sh module install [--all | modules...]"
|
|
||||||
echo " modules can be specified as: name[:branch[:commit]]"
|
|
||||||
echo " ./acore.sh module update [modules...]"
|
|
||||||
echo " ./acore.sh module remove [modules...]"
|
|
||||||
;;
|
;;
|
||||||
"search"|"s")
|
"search"|"s")
|
||||||
inst_module_search "${args[@]}"
|
inst_module_search "${args[@]}"
|
||||||
@@ -50,9 +155,13 @@ function inst_module() {
|
|||||||
"remove"|"r")
|
"remove"|"r")
|
||||||
inst_module_remove "${args[@]}"
|
inst_module_remove "${args[@]}"
|
||||||
;;
|
;;
|
||||||
|
"list"|"l")
|
||||||
|
inst_module_list "${args[@]}"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unknown subcommand: $cmd"
|
echo "Unknown module command: $cmd"
|
||||||
echo "Try: ./acore.sh module help"
|
echo "Use 'help' to see available commands."
|
||||||
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,114 +1,107 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# AzerothCore Dashboard Script
|
||||||
|
#
|
||||||
|
# This script provides an interactive menu system for AzerothCore management
|
||||||
|
# using the unified menu system library.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./acore.sh - Interactive mode with numeric and text selection
|
||||||
|
# ./acore.sh <command> [args] - Direct command execution (only text commands, no numbers)
|
||||||
|
#
|
||||||
|
# Interactive Mode:
|
||||||
|
# - Select options by number (1, 2, 3...), command name (init, compiler, etc.),
|
||||||
|
# or short alias (i, c, etc.)
|
||||||
|
# - All selection methods work in interactive mode
|
||||||
|
#
|
||||||
|
# Direct Command Mode:
|
||||||
|
# - Only command names and short aliases are accepted (e.g., './acore.sh compiler build', './acore.sh c build')
|
||||||
|
# - Numeric selection is disabled to prevent confusion with command arguments
|
||||||
|
# - Examples: './acore.sh init', './acore.sh compiler clean', './acore.sh module install mod-name'
|
||||||
|
#
|
||||||
|
# Menu System:
|
||||||
|
# - Uses unified menu system from bash_shared/menu_system.sh
|
||||||
|
# - Single source of truth for menu definitions
|
||||||
|
# - Consistent behavior across all AzerothCore tools
|
||||||
|
|
||||||
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
source "$CURRENT_PATH/includes/includes.sh"
|
source "$CURRENT_PATH/includes/includes.sh"
|
||||||
|
source "$AC_PATH_APPS/bash_shared/menu_system.sh"
|
||||||
|
|
||||||
PS3='[Please enter your choice]: '
|
# Menu: single ordered source of truth (no functions in strings)
|
||||||
options=(
|
# Format: "key|short|description"
|
||||||
"init (i): First Installation"
|
menu_items=(
|
||||||
"install-deps (d): Configure OS dep"
|
"init|i|First Installation"
|
||||||
"pull (u): Update Repository"
|
"install-deps|d|Configure OS dep"
|
||||||
"reset (r): Reset & Clean Repository"
|
"pull|u|Update Repository"
|
||||||
"compiler (c): Run compiler tool"
|
"reset|r|Reset & Clean Repository"
|
||||||
"module (m): Module manager (search/install/update/remove)"
|
"compiler|c|Run compiler tool"
|
||||||
"module-install (mi): Module Install by name [DEPRECATED]"
|
"module|m|Module manager (search/install/update/remove)"
|
||||||
"module-update (mu): Module Update by name [DEPRECATED]"
|
"client-data|gd|download client data from github repository (beta)"
|
||||||
"module-remove: (mr): Module Remove by name [DEPRECATED]"
|
"run-worldserver|rw|execute a simple restarter for worldserver"
|
||||||
"client-data: (gd): download client data from github repository (beta)"
|
"run-authserver|ra|execute a simple restarter for authserver"
|
||||||
"run-worldserver (rw): execute a simple restarter for worldserver"
|
"docker|dr|Run docker tools"
|
||||||
"run-authserver (ra): execute a simple restarter for authserver"
|
"version|v|Show AzerothCore version"
|
||||||
"docker (dr): Run docker tools"
|
"service-manager|sm|Run service manager to run authserver and worldserver in background"
|
||||||
"version (v): Show AzerothCore version"
|
"quit|q|Exit from this menu"
|
||||||
"service-manager (sm): Run service manager to run authserver and worldserver in background"
|
|
||||||
"quit (q): Exit from this menu"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
function _switch() {
|
|
||||||
_reply="$1"
|
|
||||||
_opt="$2"
|
|
||||||
|
|
||||||
case $_reply in
|
# Menu command handler - called by menu system for each command
|
||||||
""|"i"|"init")
|
function handle_menu_command() {
|
||||||
|
local key="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case "$key" in
|
||||||
|
"init")
|
||||||
inst_allInOne
|
inst_allInOne
|
||||||
;;
|
;;
|
||||||
""|"d"|"install-deps")
|
"install-deps")
|
||||||
inst_configureOS
|
inst_configureOS
|
||||||
;;
|
;;
|
||||||
""|"u"|"pull")
|
"pull")
|
||||||
inst_updateRepo
|
inst_updateRepo
|
||||||
;;
|
;;
|
||||||
""|"r"|"reset")
|
"reset")
|
||||||
inst_resetRepo
|
inst_resetRepo
|
||||||
;;
|
;;
|
||||||
""|"c"|"compiler")
|
"compiler")
|
||||||
bash "$AC_PATH_APPS/compiler/compiler.sh" $_opt
|
bash "$AC_PATH_APPS/compiler/compiler.sh" "$@"
|
||||||
;;
|
;;
|
||||||
""|"m"|"module")
|
"module")
|
||||||
# Unified module command: supports subcommands search|install|update|remove
|
bash "$AC_PATH_APPS/installer/includes/modules-manager/module-main.sh" "$@"
|
||||||
inst_module "${@:2}"
|
|
||||||
;;
|
;;
|
||||||
""|"ms"|"module-search")
|
"client-data")
|
||||||
echo "[DEPRECATED] Use: ./acore.sh module search <terms...>"
|
|
||||||
inst_module_search "${@:2}"
|
|
||||||
;;
|
|
||||||
""|"mi"|"module-install")
|
|
||||||
echo "[DEPRECATED] Use: ./acore.sh module install <modules...>"
|
|
||||||
inst_module_install "${@:2}"
|
|
||||||
;;
|
|
||||||
""|"mu"|"module-update")
|
|
||||||
echo "[DEPRECATED] Use: ./acore.sh module update <modules...>"
|
|
||||||
inst_module_update "${@:2}"
|
|
||||||
;;
|
|
||||||
""|"mr"|"module-remove")
|
|
||||||
echo "[DEPRECATED] Use: ./acore.sh module remove <modules...>"
|
|
||||||
inst_module_remove "${@:2}"
|
|
||||||
;;
|
|
||||||
""|"gd"|"client-data")
|
|
||||||
inst_download_client_data
|
inst_download_client_data
|
||||||
;;
|
;;
|
||||||
""|"rw"|"run-worldserver")
|
"run-worldserver")
|
||||||
inst_simple_restarter worldserver
|
inst_simple_restarter worldserver
|
||||||
;;
|
;;
|
||||||
""|"ra"|"run-authserver")
|
"run-authserver")
|
||||||
inst_simple_restarter authserver
|
inst_simple_restarter authserver
|
||||||
;;
|
;;
|
||||||
""|"dr"|"docker")
|
"docker")
|
||||||
DOCKER=1 bash "$AC_PATH_ROOT/apps/docker/docker-cmd.sh" "${@:2}"
|
DOCKER=1 bash "$AC_PATH_ROOT/apps/docker/docker-cmd.sh" "$@"
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
""|"v"|"version")
|
"version")
|
||||||
# denoRunFile "$AC_PATH_APPS/installer/main.ts" "version"
|
|
||||||
printf "AzerothCore Rev. %s\n" "$ACORE_VERSION"
|
printf "AzerothCore Rev. %s\n" "$ACORE_VERSION"
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
""|"sm"|"service-manager")
|
"service-manager")
|
||||||
bash "$AC_PATH_APPS/startup-scripts/src/service-manager.sh" "${@:2}"
|
bash "$AC_PATH_APPS/startup-scripts/src/service-manager.sh" "$@"
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
""|"q"|"quit")
|
"quit")
|
||||||
echo "Goodbye!"
|
echo "Goodbye!"
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
""|"--help")
|
*)
|
||||||
echo "Available commands:"
|
echo "Invalid option. Use --help to see available commands."
|
||||||
printf '%s\n' "${options[@]}"
|
return 1
|
||||||
;;
|
;;
|
||||||
*) echo "invalid option, use --help option for the commands list";;
|
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
while true
|
# Run the menu system
|
||||||
do
|
menu_run "ACORE DASHBOARD" handle_menu_command "${menu_items[@]}" "$@"
|
||||||
# run option directly if specified in argument
|
|
||||||
[ ! -z $1 ] && _switch $@ # old method: "${options[$cmdopt-1]}"
|
|
||||||
[ ! -z $1 ] && exit 0
|
|
||||||
|
|
||||||
echo "==== ACORE DASHBOARD ===="
|
|
||||||
select opt in "${options[@]}"
|
|
||||||
do
|
|
||||||
_switch $REPLY
|
|
||||||
break
|
|
||||||
done
|
|
||||||
echo "opt: $opt"
|
|
||||||
done
|
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ EOF
|
|||||||
# minimal stub
|
# minimal stub
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Copy the menu system needed by modules.sh
|
||||||
|
cp "$AC_TEST_ROOT/apps/bash_shared/menu_system.sh" "$TEST_DIR/apps/bash_shared/"
|
||||||
|
|
||||||
# Copy the real installer app into the test apps dir
|
# Copy the real installer app into the test apps dir
|
||||||
mkdir -p "$TEST_DIR/apps"
|
mkdir -p "$TEST_DIR/apps"
|
||||||
cp -r "$(cd "$AC_TEST_ROOT/apps/installer" && pwd)" "$TEST_DIR/apps/installer"
|
cp -r "$(cd "$AC_TEST_ROOT/apps/installer" && pwd)" "$TEST_DIR/apps/installer"
|
||||||
|
|||||||
Reference in New Issue
Block a user