#!/bin/bash ## ## leaseassist — Leasehackr Rate Findr lease data (residuals, money factors, ## incentives) pulled through a logged-in browser tab. ## ## chromeassist runs the Rate Findr API calls in-page, so your supporter ## session supplies auth. Needs a Rate Findr tab open and signed in. ## CMD=$(basename $0) TMP=$HOME/.tmp/$CMD ; mkdir -p $TMP TENTEN_DIR=$(dirname $(dirname $(realpath "$0"))) LIBEXEC=$TENTEN_DIR/libexec/$CMD CONFIG=$TENTEN_DIR/config/$CMD/default.config [ -f "$CONFIG" ] && . "$CONFIG" TAB=${TAB:-calculator.leasehackr} usage() { echo "Usage: $CMD -a models -k make -y year [-b tab]" echo " $CMD -a trims -k make -o model -y year [-b tab]" echo " $CMD -a deal -k make -o model -t trim -y year -l term -d miles [-z zip] [-b tab] [-v]" echo "" echo " -b browser tab (chromeassist match string/id; default: $TAB)" echo " -k make (e.g. Hyundai) -o model (e.g. 'Santa Fe')" echo " -t trim (e.g. 'Calligraphy AWD') -y model year" echo " -l lease term months -d annual miles" echo " -z zipcode (incentives are region-specific; default: ${ZIP:-none})" echo " -v raw JSON instead of |-delimited output" echo "" echo " trims output: style_id|trim" echo " deal output: program|delivery|mf|apr|rv|exp|incentives" exit 1 } unset ACTION MAKE MODEL TRIM YEAR TERM MILES VERBOSE while getopts ":a:b:k:o:t:y:l:d:z:vh" o; do case "$o" in a) ACTION=$OPTARG ;; b) TAB=$OPTARG ;; k) MAKE=$OPTARG ;; o) MODEL=$OPTARG ;; t) TRIM=$OPTARG ;; y) YEAR=$OPTARG ;; l) TERM=$OPTARG ;; d) MILES=$OPTARG ;; z) ZIP=$OPTARG ;; v) VERBOSE=1 ;; *|h) usage ;; esac done ## Runs the Rate Findr client in-page with ARGS; exits on its { err }. run_ratefindr() { local args args=$(jq -n \ --arg action "$ACTION" --arg make "$MAKE" --arg model "$MODEL" \ --arg trim "$TRIM" --arg year "$YEAR" --arg term "$TERM" \ --arg miles "$MILES" --arg zip "$ZIP" \ '{action:$action,make:$make,model:$model,trim:$trim,year:$year,term:$term,miles:$miles,zip:$zip}') local js="var ARGS=$args; $(cat "$LIBEXEC/ratefindr.js")" local out out=$(chromeassist -a js -t "$TAB" -e "$js") || { echo "$CMD: chromeassist failed (is the Rate Findr tab open?)" >&2; exit 1; } local err err=$(echo "$out" | jq -r '.err // empty' 2>/dev/null) [ -n "$err" ] && { echo "$CMD: $err" >&2; exit 1; } echo "$out" } case "$ACTION" in models) [ -z "$MAKE" ] || [ -z "$YEAR" ] && usage out=$(run_ratefindr) || exit 1 if [ -n "$VERBOSE" ]; then echo "$out" | jq . else echo "$out" | jq -r '.models[]'; fi ;; trims) [ -z "$MAKE" ] || [ -z "$MODEL" ] || [ -z "$YEAR" ] && usage out=$(run_ratefindr) || exit 1 if [ -n "$VERBOSE" ]; then echo "$out" | jq . else echo "$out" | jq -r '.trims[] | "\(.id)|\(.trim)"'; fi ;; deal) [ -z "$MAKE" ] || [ -z "$MODEL" ] || [ -z "$TRIM" ] || [ -z "$YEAR" ] || [ -z "$TERM" ] || [ -z "$MILES" ] && usage [ -z "$ZIP" ] && { echo "$CMD: -z zip required for deal (incentives are region-specific)" >&2; exit 1; } out=$(run_ratefindr) || exit 1 if [ -n "$VERBOSE" ]; then echo "$out" | jq . else echo "$out" | jq -r '.programs[] | [ .program, .delivery, (.mf|tostring), ((.apr|tostring)+"%"), ((.rv|tostring)+"%"), .exp_date, ([.incentives[] | "\(.name) $\(.value)"] | join("; ")) ] | join("|")' fi ;; *) usage ;; esac