cryptfolio/portfolio.sh
2024-06-28 08:39:38 -07:00

97 lines
2.6 KiB
Bash
Executable file

#!/bin/bash
# current dir
dir="$(dirname "$(realpath "$0")")"
# get files
wallet="${dir}/wallet.json"
template="${dir}/template.html"
# list tokens
tokens=$(jq -r '.tokens | map(.token) | join(",")' $wallet)
# fetch prices
prices=$(curl "https://api.kucoin.com/api/v1/prices?base=USD&currencies=${tokens}" | \
jq '[.data | to_entries[] | {token: .key, price: .value} | .price |= tonumber]')
# date stamp
dts=$(echo -n "As of $(date '+%F %T %:::z')")
# build portfolio
portfolio=$(jq -s '[ .[0] + .[1] | group_by(.token)[] | add ]' \
<(echo "$(jq '.tokens' $wallet)") <(echo "$prices"))
# calculate value
calc=$(jq '[.[]
| .["value"] = .balance * .price
| .["margin"] = .value - .investment
| .["movement"] = .margin / .investment]' \
<(echo "$portfolio"))
# create rows
readarray -t tokens < <(jq -c '.[]' <(echo $calc))
for t in "${tokens[@]}"; do
tok=$(echo $t | jq '.token' | tr -d '"');
bal=$(echo $t | jq '.balance|tonumber');
prc=$(echo $t | jq '.price|tonumber');
if [[ -n "$prc" ]]; then
inv=$(echo $t | jq '.investment|tonumber');
val=$(echo $t | jq '.value|tonumber');
mar=$(echo $t | jq '.margin|tonumber');
mov=$(echo $t | jq '.movement|tonumber');
else
read -r inv val mar mov <<<$(echo 0 0 0 0);
fi
row=$(
echo "${row}<tr><td class=\"left\">${tok}</td><td>${bal}</td><td>" \
$(printf "$%.2f\n" $prc)"</td><td>" \
$(printf "$%.2f\n" $inv)"</td><td>" \
$(printf "$%.2f\n" $val)"</td><td>" \
$(printf "$%.2f\n" $mar)"</td><td>" \
$(printf "%.3f%%\n" $mov)"</td></tr>" \
);
csv=$(
echo "${csv}"\
$(echo -n $(date +"['"%F"','"%T"','"%:::z"'")) \
",'${tok}','${bal}','${prc}','${inv}','${val}','${mar}','${mov}']" \
);
# Sum up
tot_inv=$(echo "${tot_inv:-0}+$inv" | bc);
tot_val=$(echo "${tot_val:-0}+$val" | bc);
tot_mar=$(echo "${tot_mar:-0}+$mar" | bc);
done
# format array
csv=$(echo $csv | sed 's|\] \[|\],\[|g')
# calculate movement
tot_mov=$(echo "scale=3 ; $tot_mar / $tot_inv" | bc)
# fill template
page=$(cat $template | \
sed "s|%row%|$row|g" | \
sed "s|%inv%|"$(printf "$%.2f\n" $tot_inv)"|g" | \
sed "s|%val%|"$(printf "$%.2f\n" $tot_val)"|g" | \
sed "s|%mar%|"$(printf "$%.2f\n" $tot_mar)"|g" | \
sed "s|%mov%|"$(printf "%.4f\n" $tot_mov)"|g" | \
sed "s|%dts%|$dts|g" | \
sed "s|%csv_data%|$csv|g" | \
sed "s|%dts_fln%|"$(echo -n $(date '+%F_%T%:::z'))"|g")
# encode link
itty=$(echo -n $page | lzma -9 | base64 -w0 | xargs -0 printf "https://itty.bitty.site/#Portfolio/%s\n")
# get ntfy
ntfy=$(jq -r '.ntfy | "\(.server)/\(.topic)"' $wallet)
# send report
curl \
-H "title: Portfolio Update" \
-H "tags: coin" \
-H "click: ${itty}" \
-d "Click Here" $ntfy