diff --git a/rowbot b/rowbot index 368b46a..c16e5cf 100755 --- a/rowbot +++ b/rowbot @@ -17,30 +17,57 @@ put_array() { # The variable named array is a nameref to an array # shellcheck disable=SC2178 declare -n array=$1 - declare -n scalar=ARR_${1^^} - local key + declare -n scalar=RB_A_${1^^} + local val - for key in "${!array[@]}"; do - scalar+=${#key}:$key${array[$key]}$'\n' + for val in "${array[@]}"; do + scalar+=${#val}:$val done - scalar=${scalar%$'\n'} - export "ARR_${1^^}" + export "RB_A_${1^^}" } get_array() { - declare -n scalar=ARR_${1^^} declare -n array=$1 - local entry idx_size + declare -n scalar=RB_A_${1^^} + local len val idx=0 - while read -r entry; do - idx_size=${entry%%:*} entry=${entry#"$idx_size":} - array[${entry:0:idx_size}]=${entry:idx_size} - done <<< "$scalar" + while [[ $scalar ]]; do + len=${scalar%%:*} scalar=${scalar#"$len":} + val=${scalar:0:len} scalar=${scalar:len} + array[$idx]=$val + (( idx += 1 )) + done + + unset "RB_A_${1^^}" } -is_good_variable() { - [[ $1 =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]] +b64_encode() { + local idx=0 numerics table_idxs table_idx encoded + local table=( {A..Z} {a..z} {0..9} + / ) + + for (( ; idx < ${#1}; idx+=3 )); do + read -ra numerics < <( + printf '%d %d %d\n' "'${1:idx:1}" "'${1:idx+1:1}" "'${1:idx+2:1}" + ) + + (( table_idxs[0] = numerics[0] >> 2 )) + (( table_idxs[1] = (( (numerics[0] & 0x03) << 6) | (numerics[1] & 0xF0) >> 2) >> 2 )) + (( table_idxs[2] = (( (numerics[1] & 0x0F) << 4) | (numerics[2] & 0xC0) >> 4) >> 2 )) + (( table_idxs[3] = numerics[2] & 0x3F )) + + for table_idx in "${table_idxs[@]}"; do + encoded+=${table[$table_idx]} + done + done + + if (( ${#1} % 3 == 1 )); then + encoded=${encoded::-2}== + elif (( ${#1} % 3 == 2 )); then + encoded=${encoded::-1}= + fi + + prints %s "$encoded" } # code reloading helpers @@ -62,12 +89,8 @@ get_option() { fi } -is_parent() { - (( BASHPID == $$ )) -} - is_reloaded() { - [[ $RELOADED = yes ]] || (( LORE_LIVES > 1 )) + [[ $RELOADED = yes ]] || (( RELOAD_COUNT )) } # message classification @@ -196,34 +219,6 @@ url() { prints %s:%s "${config[server]}" "${config[port]}" } -b64_encode() { - local idx=0 numerics table_idxs table_idx encoded - local table=( {A..Z} {a..z} {0..9} + / ) - - for (( ; idx < ${#1}; idx+=3 )); do - read -ra numerics < <( - printf '%d %d %d\n' "'${1:idx:1}" "'${1:idx+1:1}" "'${1:idx+2:1}" - ) - - (( table_idxs[0] = numerics[0] >> 2 )) - (( table_idxs[1] = (((numerics[0] & 0x03) << 6) | (numerics[1] & 0xF0) >> 2) >> 2 )) - (( table_idxs[2] = (((numerics[1] & 0x0F) << 4) | (numerics[2] & 0xC0) >> 4) >> 2 )) - (( table_idxs[3] = numerics[2] & 0x3F )) - - for table_idx in "${table_idxs[@]}"; do - encoded+=${table[$table_idx]} - done - done - - if (( ${#1} % 3 == 1 )); then - encoded=${encoded::-2}== - elif (( ${#1} % 3 == 2 )); then - encoded=${encoded::-1}= - fi - - prints %s "$encoded" -} - ### # configure rowbot's environment ### @@ -902,8 +897,12 @@ irc_who() { # plugin api ### +plugin_is_good_variable() { + [[ $1 =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]] +} + plugin_reg() { - if ! is_good_variable irc_plugin_array_"$1"; then + if ! plugin_is_good_variable irc_plugin_array_"$1"; then return 1 fi @@ -927,7 +926,7 @@ plugin_run() { # This is a false positive. # shellcheck disable=SC2178 - if is_good_variable irc_plugin_array_"$1" && [[ -v irc_plugin_array_"$1" ]]; then + if plugin_is_good_variable irc_plugin_array_"$1" && [[ -v irc_plugin_array_"$1" ]]; then declare -n plugins=irc_plugin_array_"$1" shift local plugin