Compare commits
5 commits
Author | SHA1 | Date | |
---|---|---|---|
7f50b0ed77 | |||
95ec066e85 | |||
811cda558e | |||
7ef8d17972 | |||
97c61442ca |
3 changed files with 134 additions and 58 deletions
|
@ -4,7 +4,7 @@ This is a basic script to use `bash | jq` to process the contents of a `.json` "
|
||||||
|
|
||||||
Results are delivered via an encoded [itty.bitty](https://about.bitty.site) url and can be downloaded as `csv` records.
|
Results are delivered via an encoded [itty.bitty](https://about.bitty.site) url and can be downloaded as `csv` records.
|
||||||
|
|
||||||
[**Here is an example.**](https://itty.bitty.site/#Portfolio/XQAAAAT//////////wAeCEUG0O+oKBdZ2an16qclP3ZWSMUzhiDsEZ6qy1sgvhIq6Hr2L4YPd7IJhqr4o8AZqF9O9RftB9GDuVd2SlkYO7UY2awqwmBdB6MalZZnLcYV3O8NcFqO7TrHGf5CHNaQh3RY3FDPWDwhpMAQixOrVtPbWsnuwOKfsQtPTVqBibnT3EgSReJIx+p7vNOMDKV5s29g6OWtMkpuKgGXpwYnQtx3+8VrHAbsKHgM2MYHKk8sL6rdDCIPZQUWOW19GSrBC629KYV3J6BNWjcXhgW+B64age7uWmielfhcrbFdHJTt9P8PjQuYsHoLt6CELj/qKkzaaGn7ellVvKKm3VMSQx0zI0SGg328iuW6yDF0FNeS3S6sw8PovseMmn6nIg0M31y2WnvDylZVIVVjEXrEsV27XyVWpXiOGeLhmg5aYUqPlrqxBjiKbKUWpEwyoGIYLRXT1Tf2HYQQjXXICXACt69bI8+kHFkG3qyGlVXlZhKqcfa9gDUY9d3aB4OciyuZcy3cJTHZ0jQxqF9xO/Oqrg9RbSYTLsQQYdPyZpj9YprCNak7WcS+AwlyaMuEoNSE+/kq7vlKu9wcC7GRnirrFD12ydrvasGdHPsMFndVWuuKFq4jO7GCSrK6KzPi1yAkZYMsbhm132fgiCY4rBlEQFTwOqHn0TSqgpVFsfGCm7SwUldSHy3zzv0fLRsC9BTTEtbBU2ODylCMKVufr5EcHey76YvhumCd3YCqXf5zXpzPbFRLvi2HkL8Q8nb6Se4mfa5WYyh5hNaQLtyPb3X55iyvvnJmttyjTEhosbW5ucUCzYzb55n7kcImt+srD+YnjDEaERccGLNiFXJT0UUCo5LdUrViU1DbJTFpEEuA+5avLmw3KVmsR1jOdncSmYJ9oeBFpPp2h+Pl1zCDy4igbzKzsC+WJ0A2HM5ODjxfb/Sq5ULPxi+qZg51gmuLldJUofxYxekYESgEIwcL3zH5nqG5DcSlIX0Jtn1OD+7Xgp/NeT0rO97KTVy0yeeEpDytv8hUAkd8exAWtXOS/AfTAxrltVNPwx0ljsmBfWvLFaf+/Cl8jw==)
|
[**Here is an example.**](https://itty.bitty.site/#Portfolio/XQAAAAT//////////wAeCEUG0O+oKBdZ2an16qclP3ZWSMUzhiDsEZ6qy1sgvhIq6Hr2L4YPd7IJhqr4o8AZqF9O9RftB9GDuVd2ew3DIGQH/llLp5S0EojwznKz6NbDEvWB38kQzph0vl+DVKB7JloE0005v60KvgjLTaZkb0TmDqMwF0/prHHur90RO9qPKF/vWE2HNNicZl3Jtz4uI4vsUKwDS1UAbDSSNVeLI3KmF7fw4Mh1vrir/vlMdDgrbhSuLPXG2+1VfARIpmCeOweP8DhSQl6KyoRLFUucpYajRinl4Mvu116YZfoQKIDYxQvlCYX57N7jNVOigDvOdjmYrXyi1XLWkcSBjWY5wnI1kqQcpjCfFkDTbekjPjUw+uRIP7WzE0JQyTCBltQF70vSZbmYM6BrDKPNAlnOPcXT0u8f6EkOwtjsg7M21zA3p6ikWoKaA/qFPoBjosGj44BH1t9qhyR1raxHuRrb02/1QfmrVHyCg6QW6vrHDQM3Om6CrNCXrvigQt/yQDC4yBQAOcbVpCgv+Cz4Buh/LnE8wJ4HXNu9ud7l77fSqh4YPhzc/5QiM3l1k1s3xrBIrxPO3UMb8qZ7c4J+Y/TWU57tkIHdZeRmLCwVK5xkJH37ql24f7QWT/9BfqfvvYyNCe8hLLY7c2mkjjq8p8MS5kgFz2W64R+GWSmONLcdsYg/Jj40U6odS9j1a6NOckVU7BmO3BWuRulioinZ+jKTBPOGfSrBi1FKY3jbsWUofb6QmQt7qyTCC8g9w6/y+rKF9dqA3DMD6kPfAA6TOpkCtMGWu9la3nOQorlH/HtyE7hU2b7AupwXJB239gOWnO2uBjIEPG0McP/6tKPM9QcqshxLwSp/ZgO854vSvV8qKwKdPZOGhNIARKR/AndlK2FWTDVx+CgSjAp4qhvNPId3A0+b85NoKr5QF2OR5a+gJenMSqt8GkrdpoSxaDdIplsfXaKMo9WcfEIGsTHY5picZ6B1twgFHXQ9vt6I8Dk0xxi2TLkAl+7IUprgl/T1z3NFj37QvN8NNU15q6twGzjCz2LiNVzL0lSI95hn100Jos5roicK7z8b9vl7YXOIJ25TGC8mXITcasa7vVtMCyMzNr0YYeunvYJT270G6sD33jN5U7wu10Nv5uL3/q6sdixjxB4kaOzSvhhTuWrKWj+WBxRvSG+Mob5XBGv7yIBsbUZIzOdcrRYq71DCqV0CgO7+wBPWe1VPT1mr1ppVX5j2gK+ghXHsqyTRKzzOsuVrrLa2Q1GehYaRe0oOzpvy6IxcmJUKxdWBHklvQzlyoVcTR24LNgI2ES62fN8r3gb++ihghXvHrPNIHKfgszcgKzOdi0LAwtoZk0GQNJq99lA79G79d70bJSzIkv+YXbpyjmpMW2n60kbhy3Id1rwvR5Ohbn/9etsuvrRc8MergNPKnpW9iYNbVkTGTHDYWj1x6iXzp/yqEhE=)
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
|
|
53
portfolio.sh
53
portfolio.sh
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# current dir
|
# current dir
|
||||||
dir="$(dirname $(realpath $0))"
|
dir="$(dirname "$(realpath "$0")")"
|
||||||
|
|
||||||
# get files
|
# get files
|
||||||
wallet="${dir}/wallet.json"
|
wallet="${dir}/wallet.json"
|
||||||
|
@ -22,7 +22,10 @@ portfolio=$(jq -s '[ .[0] + .[1] | group_by(.token)[] | add ]' \
|
||||||
<(echo "$(jq '.tokens' $wallet)") <(echo "$prices"))
|
<(echo "$(jq '.tokens' $wallet)") <(echo "$prices"))
|
||||||
|
|
||||||
# calculate value
|
# calculate value
|
||||||
calc=$(jq '[.[] | .["value"] = .balance * .price | .["margin"] = .value - .investment | .["movement"] = .margin / .investment]' \
|
calc=$(jq '[.[]
|
||||||
|
| .["value"] = .balance * .price
|
||||||
|
| .["margin"] = .value - .investment
|
||||||
|
| .["movement"] = .margin / .investment]' \
|
||||||
<(echo "$portfolio"))
|
<(echo "$portfolio"))
|
||||||
|
|
||||||
# create rows
|
# create rows
|
||||||
|
@ -32,13 +35,29 @@ for t in "${tokens[@]}"; do
|
||||||
tok=$(echo $t | jq '.token' | tr -d '"');
|
tok=$(echo $t | jq '.token' | tr -d '"');
|
||||||
bal=$(echo $t | jq '.balance|tonumber');
|
bal=$(echo $t | jq '.balance|tonumber');
|
||||||
prc=$(echo $t | jq '.price|tonumber');
|
prc=$(echo $t | jq '.price|tonumber');
|
||||||
inv=$(echo $t | jq '.investment|tonumber');
|
|
||||||
val=$(echo $t | jq '.value|tonumber');
|
|
||||||
mar=$(echo $t | jq '.margin|tonumber');
|
|
||||||
mov=$(echo $t | jq '.movement|tonumber');
|
|
||||||
|
|
||||||
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>");
|
if [[ -n "$prc" ]]; then
|
||||||
csv=$(echo "${csv}"$(echo -n $(date +",['"%F"','"%T"','"%:::z"'"))",'${tok}','${bal}','${prc}','${inv}','${val}','${mar}','${mov}']");
|
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
|
# Sum up
|
||||||
tot_inv=$(echo "${tot_inv:-0}+$inv" | bc);
|
tot_inv=$(echo "${tot_inv:-0}+$inv" | bc);
|
||||||
|
@ -48,21 +67,31 @@ for t in "${tokens[@]}"; do
|
||||||
done
|
done
|
||||||
|
|
||||||
# format array
|
# format array
|
||||||
csv=$(echo $csv | sed 's|^,||g')
|
csv=$(echo $csv | sed 's|\] \[|\],\[|g')
|
||||||
|
|
||||||
# calculate movement
|
# calculate movement
|
||||||
tot_mov=$(echo "scale=3 ; $tot_mar / $tot_inv" | bc)
|
tot_mov=$(echo "scale=3 ; $tot_mar / $tot_inv" | bc)
|
||||||
|
|
||||||
# fill template
|
# fill template
|
||||||
page=$(cat $template | sed "s|%row%|$row|g;s|%inv%|"$(printf "$%.2f\n" $tot_inv)"|g;s|%val%|"$(printf "$%.2f\n" $tot_val)"|g;s|%mar%|"$(printf "$%.2f\n" $tot_mar)"|g;s|%mov%|"$(printf "%.4f\n" $tot_mov)"|g;s|%dts%|$dts|g;s|%csv_data%|$csv|g;s|%dts_fln%|"$(echo -n $(date '+%F_%T%:::z'))"|g")
|
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
|
# encode link
|
||||||
itty=$(echo -n $page | lzma -9 | base64 -w0 | xargs -0 printf "https://itty.bitty.site/#Portfolio/%s\n")
|
itty=$(echo -n $page | lzma -9 | base64 -w0 | xargs -0 printf "https://itty.bitty.site/#Portfolio/%s\n")
|
||||||
|
|
||||||
# send signal
|
# get ntfy
|
||||||
ntfy=$(jq -r '.ntfy | "\(.server)/\(.topic)"' $wallet)
|
ntfy=$(jq -r '.ntfy | "\(.server)/\(.topic)"' $wallet)
|
||||||
|
|
||||||
|
# send report
|
||||||
curl \
|
curl \
|
||||||
-H "title: Portfolio Update" \
|
-H "title: Portfolio Update" \
|
||||||
-H "tags: coin" -H "click: ${itty}" \
|
-H "tags: coin" \
|
||||||
|
-H "click: ${itty}" \
|
||||||
-d "Click Here" $ntfy
|
-d "Click Here" $ntfy
|
||||||
|
|
137
template.html
137
template.html
|
@ -1,60 +1,107 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Crypto Portfolio</title>
|
<title>Crypto Portfolio</title>
|
||||||
<style>
|
<style>
|
||||||
table {
|
table.crypto {
|
||||||
border-style: solid;
|
font-family: "Lucida Console", Monaco, monospace;
|
||||||
border-width: 3px;
|
border: 2px solid #4F7849;
|
||||||
}
|
background-color: #EEEEEE;
|
||||||
|
width: 100%;
|
||||||
td, th {
|
text-align: right;
|
||||||
border-style: solid;
|
border-collapse: collapse;
|
||||||
border-width: 2px;
|
}
|
||||||
}
|
table.crypto td, table.crypto th {
|
||||||
td {
|
border: 1px solid #4F7849;
|
||||||
text-align: right;
|
padding: 2px 2px;
|
||||||
}
|
}
|
||||||
td.left {
|
table.crypto tbody td {
|
||||||
text-align: left;
|
font-size: 16px;
|
||||||
}
|
font-weight: bold;
|
||||||
</style>
|
color: #4F7849;
|
||||||
|
}
|
||||||
|
table.crypto tr:nth-child(even) {
|
||||||
|
background: #CEE0CC;
|
||||||
|
}
|
||||||
|
table.crypto thead {
|
||||||
|
background: #4F7849;
|
||||||
|
}
|
||||||
|
table.crypto thead th {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
table.crypto tfoot {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #FFFFFF;
|
||||||
|
background: #4F7849;
|
||||||
|
background: -moz-linear-gradient(top, #7b9a76 0%, #60855b 66%, #4F7849 100%);
|
||||||
|
background: -webkit-linear-gradient(top, #7b9a76 0%, #60855b 66%, #4F7849 100%);
|
||||||
|
background: linear-gradient(to bottom, #7b9a76 0%, #60855b 66%, #4F7849 100%);
|
||||||
|
border-top: 4px solid #444444;
|
||||||
|
}
|
||||||
|
table.crypto tfoot td {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
td.left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<table>
|
<table class="crypto">
|
||||||
<tr>
|
<thead>
|
||||||
<th>Token</th><th>Balance</th><th>Price</th><th>Investment</th><th>Value</th><th>Margin</th><th>Movement</th>
|
<tr>
|
||||||
</tr>
|
<th>Token</th>
|
||||||
%row%
|
<th>Balance</th>
|
||||||
<tr>
|
<th>Price</th>
|
||||||
<td class="left"><b>Total</b></td><td></td><td></td><td><b>%inv%</b></td><td><b>%val%</b></td><td><b>%mar%</b></td><td><b>%mov%</b></td>
|
<th>Investment</th>
|
||||||
</tr>
|
<th>Value</th>
|
||||||
</table>
|
<th>Margin</th>
|
||||||
<p><i>%dts%</i></p>
|
<th>Movement</th>
|
||||||
<button onclick="download_csv_file()"> Download CSV </button>
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
%row%
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<td class="left">Total</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td>%inv%</td>
|
||||||
|
<td>%val%</td>
|
||||||
|
<td>%mar%</td>
|
||||||
|
<td>%mov%</td>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
<p><i>%dts%</i></p>
|
||||||
|
<button onclick="download_csv_file()"> Download CSV </button>
|
||||||
</body>
|
</body>
|
||||||
<script>
|
<script>
|
||||||
var csvFileData = [
|
var csvFileData = [
|
||||||
%csv_data%
|
%csv_data%
|
||||||
];
|
];
|
||||||
|
|
||||||
function download_csv_file() {
|
function download_csv_file() {
|
||||||
|
|
||||||
var csv = 'Date,Time,Zone,Token,Balance,Price,Investment,Value,Margin,Movement\n';
|
var csv = 'Date,Time,Zone,Token,Balance,Price,Investment,Value,Margin,Movement\n';
|
||||||
|
|
||||||
csvFileData.forEach(function(row) {
|
csvFileData.forEach(function(row) {
|
||||||
csv += row.join(',');
|
csv += row.join(',');
|
||||||
csv += "\n";
|
csv += "\n";
|
||||||
});
|
});
|
||||||
|
|
||||||
document.write(csv);
|
document.write(csv);
|
||||||
|
|
||||||
var hiddenElement = document.createElement('a');
|
var hiddenElement = document.createElement('a');
|
||||||
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
|
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
|
||||||
hiddenElement.target = '_blank';
|
hiddenElement.target = '_blank';
|
||||||
|
|
||||||
hiddenElement.download = 'CSV_Portfolio_%dts_fln%.csv';
|
hiddenElement.download = 'CSV_Portfolio_%dts_fln%.csv';
|
||||||
hiddenElement.click();
|
hiddenElement.click();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Reference in a new issue