diff --git a/doc/cesium-dunikey-800.png b/doc/cesium-dunikey-800.png deleted file mode 100644 index 26354b1..0000000 Binary files a/doc/cesium-dunikey-800.png and /dev/null differ diff --git a/doc/cesium-other-methods-800.png b/doc/cesium-other-methods-800.png deleted file mode 100644 index bea116d..0000000 Binary files a/doc/cesium-other-methods-800.png and /dev/null differ diff --git a/doc/create-account.gif b/doc/create-account.gif new file mode 100644 index 0000000..6913c03 Binary files /dev/null and b/doc/create-account.gif differ diff --git a/doc/process-likes-g1tx.gif b/doc/process-likes-g1tx.gif deleted file mode 100644 index ee649de..0000000 Binary files a/doc/process-likes-g1tx.gif and /dev/null differ diff --git a/doc/ssb-g1-tip-logo.png b/doc/ssb-g1-tip-logo.png new file mode 100644 index 0000000..80f16a7 Binary files /dev/null and b/doc/ssb-g1-tip-logo.png differ diff --git a/doc/ssb-g1like-logo.png b/doc/ssb-g1like-logo.png deleted file mode 100644 index 966b711..0000000 Binary files a/doc/ssb-g1like-logo.png and /dev/null differ diff --git a/doc/tip.gif b/doc/tip.gif new file mode 100644 index 0000000..d764578 Binary files /dev/null and b/doc/tip.gif differ diff --git a/doc/value-fields.png b/doc/value-fields.png new file mode 100644 index 0000000..733fa9f Binary files /dev/null and b/doc/value-fields.png differ diff --git a/find_ssb_user_G1_pubkey.sh b/find_ssb_user_G1_pubkey.sh new file mode 100755 index 0000000..3541cdc --- /dev/null +++ b/find_ssb_user_G1_pubkey.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +ssbPubkey=$1 + +if [[ ${ssbPubkey:0:1} == "@" ]] +then + ssbPubkey=${ssbPubkey:1} +fi + +ssbPubkey=$(echo $ssbPubkey | cut -d '.' -f 1) +g1pub=$(echo "$ssbPubkey" | base64 -d | base58) + +echo "" +echo $g1pub +echo "" \ No newline at end of file diff --git a/readme.md b/readme.md index e664e0f..dcbc910 100644 --- a/readme.md +++ b/readme.md @@ -1,62 +1,94 @@ -SSB/Ğ1 like +![SSB/Ğ1 tip](https://git.p2p.legal/axiom-team/ssb-g1-tip/raw/master/doc/ssb-g1-tip-logo.png) === -**SSB/Ğ1 like** is a micro donation system, just like Flattr, except: +**SSB/Ğ1 tip** is a micro donation system, just like Flattr, except: - It runs on SSB instead of the centralized web - It uses a libre currency (Ğ1) instead of a private one -![SSB/Ğ1 like logo](https://git.p2p.legal/axiom-team/ssb-g1like/raw/dev-boris/doc/ssb-g1like-logo.png) - -## Authors - -- **cel** from the SSB community (`@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519`) -- **Fred** from the Ğ1 community (`@9BbJwPDjcyIqrOUPNn0nJZBduWdIrpMk3Cjz5MP361s=.ed25519`) -- **Boris** from the Ğ1 community (`@l5nYExWYIgDLV6BYHOJPoI97jIUyTdSm8CTLpQ0XeOg=.ed25519`) - -## What is a libre currency? - -A [libre currency](https://libre-currency.org/) is a concept that originated from the [Relative Theory of Money](https://en.trm.creationmonetaire.info/). - -It is a way to design a currency so that every human, whatever the generation they are part of, produces the same relative amount of money. - -The Relative Theory of Money was written by a French mathematician in 2010, and the first libre currency (Ğ1) was born in 2017. Up to this day, Ğ1 is the only libre currency we know of. - -### Ğ1, the first libre currency - -Ğ1 the first libre currency we know of. - -It runs on [the Duniter blockchain engine](https://duniter.org/). - -The main clients for Duniter are [Cesium](https://cesium.app/) and [Silkaj](https://mystifying-nobel-66ae54.netlify.com/) - -## How to spend your Ğ1 - -The Ğ1 currency originated in called France, so the main part of the fun happens there. - -The economy is still in its infancy, but you can already [book a reservation in a B&B](https://www.gchange.fr/#/app/market/lg?last&category=cat67&type=offer). - -An other way to spend your Ğ1 is use it with this micro-donation system: - -![](https://git.p2p.legal/axiom-team/ssb-g1like/raw/dev-boris/doc/process-likes-g1tx.gif) ## An SSB user sent you Ğ1? Here is how to claim it: -First, you need to get your Duniter secret key from your SSB secret key. +First, you need to generate your base58 Duniter secret key from your base64 SSB secret key. ``` chmod +x secret2dunikey.sh ./secret2dunikey.sh ``` -Then, all you need to do is connect to a Duniter client, like [Cesium](https://cesium.app/), using the generated ~/.ssb/secret.dunikey +Then, all you need to do is connect to a Duniter client, using the generated ~/.ssb/secret.dunikey -On Cesium homescreen, click "**Other methods**" and choose "**Keychain file**" : +1. Download [Cesium](https://cesium.app/) +2. On Cesium homescreen, click "**Other methods**" and choose "**Keychain file**" : +3. Then, browse your filesystem to select your Duniter secret key stored in ~/.ssb/secret.dunikey : +4. Contemplate how rich and resilient you now are. +5. Update your Cesium+ profile to appear on the registry map. -![Cesium authentification](https://git.p2p.legal/axiom-team/ssb-g1like/raw/dev-boris/doc/cesium-other-methods-800.png) +![Cesium authentification](https://git.p2p.legal/axiom-team/ssb-g1-tip/raw/master/doc/create-account.gif) -Then, browse your filesystem to select your Duniter secret key stored in ~/.ssb/secret.dunikey : +## You too want to send tips? + +A cool way to spend your Ğ1 is use it with this micro-donation system. + +### Install + +First, you have to install the necessary tools using the `install.sh` script. + +``` +chmod +x install.sh tip.sh +./install.sh +``` + +This script installs tools like Silkaj, the command line Duniter client. Don't worry, you will only have to do this once 😉 + +### Usage + +Then, once every other week, you can use the `tip.sh` script : + +``` +./tip.sh +``` + +`tip.sh` will have a look at the posts you liked and will send from your Duniter account the corresponding amount (based on the number of times you liked a post) to the appropriate recipients. + +It will also generate one or more markdown formatted files to help you thank publicly your fellow butts, and make them aware you sent them a tip 😉 + +![](https://git.p2p.legal/axiom-team/ssb-g1-tip/raw/master/doc/tip.gif) + + +## Other ways to spend your Ğ1 + +The Ğ1 currency originated in called France, so the main part of the fun happens there. + +The economy is still in its infancy, but you can already: + +- [book a reservation in a B&B](https://www.gchange.fr/#/app/market/lg?last&category=cat67&type=offer), +- [buy SEO services](https://www.gchange.fr/#/app/market/lg?type=offer&q=SEO), +- [buy web hosting services](https://www.gchange.fr/#/app/market/lg?type=offer&q=h%C3%A9bergement%20web) +- [buy foreign language courses](https://www.gchange.fr/#/app/market/lg?type=offer&q=langues) (for example: [french](https://www.gchange.fr/#/app/market/view/AWybPgso8tT4T_JOSi4w/francais-langue-trangre)) +- etc. etc. ([see latest offers](https://www.gchange.fr/#/app/market/lg?last&type=offer)) + +## Curious about libre currencies? + +[Libre currencies](https://libre-currency.org/) are a concept that originated from the [Relative Theory of Money](https://en.trm.creationmonetaire.info/). + +It is a way to design a currency so that every human, whatever the generation they are part of, produces the same relative amount of money. + +Unlinke the majority of currencies, where money creation is centralized (money is created by big private banks via credit), in a libre currency, money creation takes place everywhere. + +![](https://git.p2p.legal/axiom-team/ssb-g1-tip/raw/master/doc/value-fields.png) + +The Relative Theory of Money was written in 2010 by French mathematician Stephane Laborde, and the first libre currency (Ğ1) was born in 2017. Up to this day, Ğ1 is the only libre currency we know of. + +### Ğ1, the first libre currency + +Ğ1 the first libre currency we know of. + +Ğ1 has the particularity to use blockchain to secure transactions, and uses on a web of trust to identify unique users, in order to make sure each individual can produce only one **Universal Dividend** each day, and nobody is cheating by producing a disproportionate amount of money. + +Ğ1 runs on [the Duniter blockchain engine](https://duniter.org/). + +The main clients for Duniter are [Cesium](https://cesium.app/) and [Silkaj](https://mystifying-nobel-66ae54.netlify.com/) -![Cesium log with keychain file](https://git.p2p.legal/axiom-team/ssb-g1like/raw/dev-boris/doc/cesium-dunikey-800.png) ## With docker (experimental) @@ -78,3 +110,12 @@ run main script ``` docker run -ti --rm -v ~/.ssb:/home/astroport/.ssb ssb-g1like ``` + +## Authors + +- **cel** (`@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519`) +- **Fred** (`@9BbJwPDjcyIqrOUPNn0nJZBduWdIrpMk3Cjz5MP361s=.ed25519`) +- **Boris** (`@l5nYExWYIgDLV6BYHOJPoI97jIUyTdSm8CTLpQ0XeOg=.ed25519`) +- **poka** (`@vDQif9KU3T78XJx+NliK+wdo1vmehHZCWqD+3X700Uk=.ed25519`) +- **chamalow** (`@qio8/4L4vnzq3qRD0dqKI7sTpey54u8ZWbaICfpJOZw=.ed25519`) + diff --git a/samples/message.json b/samples/message.json new file mode 100644 index 0000000..2ca3941 --- /dev/null +++ b/samples/message.json @@ -0,0 +1,18 @@ +{ + "value": { + "previous": "%bcGFgwgdCjhGQjVYCNaUSKZq6xqMBpiB23U4q2lq2uE=.sha256", + "sequence": 392, + "author": "@l5nYExWYIgDLV6BYHOJPoI97jIUyTdSm8CTLpQ0XeOg=.ed25519", + "timestamp": 1584565226366, + "hash": "sha256", + "content": { + "type": "post", + "text": "", + "mentions": [ + ] + }, + "signature": "TZ8R5HlKvuPquS26CJkq2VhPdR+yA2LdnL0cVo1GD6jJioTufup1n6mSrQIc3jHyqy+wZ8ILJfsWnqt8WegQAg==.sig.ed25519" + }, + "timestamp": 1584565226369, + "rts": 1584565226366 +} \ No newline at end of file diff --git a/samples/post_mention.json b/samples/post_mention.json new file mode 100644 index 0000000..30b099a --- /dev/null +++ b/samples/post_mention.json @@ -0,0 +1,5 @@ + + { + "link": "", + "name": "" + }, \ No newline at end of file diff --git a/samples/tag_mention.json b/samples/tag_mention.json new file mode 100644 index 0000000..709afc9 --- /dev/null +++ b/samples/tag_mention.json @@ -0,0 +1,4 @@ + + { + "link": "#" + }, \ No newline at end of file diff --git a/samples/user_mention.json b/samples/user_mention.json new file mode 100644 index 0000000..30b099a --- /dev/null +++ b/samples/user_mention.json @@ -0,0 +1,5 @@ + + { + "link": "", + "name": "" + }, \ No newline at end of file diff --git a/sbotc b/sbotc deleted file mode 160000 index f1337ff..0000000 --- a/sbotc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f1337fffb2467ae35d1e694221cd0fd9ba97923f diff --git a/process-likes-g1tx.sh b/tip.sh similarity index 53% rename from process-likes-g1tx.sh rename to tip.sh index 64d4990..cb6eb13 100755 --- a/process-likes-g1tx.sh +++ b/tip.sh @@ -1,40 +1,66 @@ #!/bin/bash ################################################################################ +# # Authors: +# # [@cel](@f/6sQ6d2CMxRUhLpspgGIulDxDCwYD7DzFzPNr7u5AU=.ed25519) # [@Fred](@9BbJwPDjcyIqrOUPNn0nJZBduWdIrpMk3Cjz5MP361s=.ed25519) # [@Boris](@l5nYExWYIgDLV6BYHOJPoI97jIUyTdSm8CTLpQ0XeOg=.ed25519) +# [@poka](@vDQif9KU3T78XJx+NliK+wdo1vmehHZCWqD+3X700Uk=.ed25519) +# @[chamalow](@qio8/4L4vnzq3qRD0dqKI7sTpey54u8ZWbaICfpJOZw=.ed25519) +# # Version: 1.0 +# # License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) +# ########################################################################################### # PREVENT DOUBLE PAYEMENT # ADD Ğ1 Layer 10 LOVE to message writer you like ! ############################################################################################ + +# Customizable + +# debugMsgMode, when set to 1 does doesn't send transaction and does not update "last timestamp" +debugMsgMode=0 + +# If you don't want to wait +readable=1 + +minimumAmountPerLikeInUD="0.1" + +############################################################################################ + # Let's get Ğ1 public and private keys g1pub=$(cat ~/.ssb/secret.dunikey | grep "pub" | cut -d ' ' -f 2) g1priv=$(cat ~/.ssb/secret.dunikey | grep "sec" | cut -d ' ' -f 2) + # SSB pubkey ssbpub=$(cat ~/.ssb/secret | grep public\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g) -amountPerLikeInUD="0.05" +defaultAmountPerLikeInUD="0.1" bold=$(tput bold) normal=$(tput sgr0) ssbMaxSize=8192 -ssbMsgHeadersSize=5810 # Here is a wild guess! - + +baseSizeOfAMessageFile=$(wc -c samples/message.json | awk '{print $1}') +sizeOfATagMention=$(wc -c samples/tag_mention.json | awk '{print $1}') +sizeOfAUserMention=$(wc -c samples/user_mention.json | awk '{print $1}') +sizeOfAPostMention=$(wc -c samples/post_mention.json | awk '{print $1}') + + ############################################################################################ #### CHECK LIKE AND SEND LOVE # Let's get Ğ1 account balance echo "" echo -e "${bold}Welcome${normal} to the Ğ1/SSB-like microdonation system!\n" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi echo "MMMMMMMMMMMMMNk;'cdxxd:,c0WMMMMMMMMMMMMM MMMMMMMMMMMMMNx,. .;kWMMMMMMMMMMMMM MMMMMMMMMMMMMMMNOdlccld0NMMMMMMMMMMMMMMM MMMMMMMMMMMWXko:,'....',:okXWMMMMMMMMMMM MMMMMMMMMNk:. .cOWMMMMMMMMM MMMMMMMW0: .c0MMMMMMMM" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi echo "MMMMMMWk. 'lxkOOkdc' .cOWMMMMMMM MMMMMMO' 'kNMMMMMMMMNxcoOXWMMMMMMMMM MMMMMNl '0MMMMMMMMMMMMMMMMMMMMMMMMMM @@ -42,7 +68,7 @@ MMMMMX; cNMMMMMMMNOkkkkkkkkkkONMMMMM MMMMMNc ;XMMMMMMMNd' .OMMMMM MMMMMWx. cKMMMMMMMWKc. .OMMMMM MMMMMMNo. .lkKXNNXKkc. .OMMMMM" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi echo "MMMMMMMNd. ...... .OMMMMM MMMMMMMMWKl. 'c:. .OMMMMM MMMMMMMMMMWXkc,.. ..,lkXWWO:;OMMMMM @@ -51,17 +77,17 @@ MMMMMMMMMMMMMMMMNx;'',dNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMK, '0MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMNd. .oNMMMMMMMMMMMMMMMM " -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi printf "You know your SSB pubkey:\n%s\n\n" $ssbpub -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi printf "...but did you know it is also a valid Ğ1 wallet?\n%s\n\n" $g1pub -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi printf "Let's check the current balance of your wallet!\n\n" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi printf "I am interrogating the Ğ1 blockchain to check if anyone has already sent you Ğ1...\n\n" -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi printf "A moment please...\n\n" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi silkajRelativeAmountPattern='Total\sRelative\s+=\s+(.*)\s+UD' @@ -104,9 +130,9 @@ else fi printf "You have ${bold}%s UDĞ1${normal} on your Duniter Ğ1 wallet.\n\n" "$balance" -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi printf "Want to show your appreciation of your fellow butts' posts while helping spreading awareness about libre currencies?\n\n" -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 3; fi # BEGIN timestamp computation @@ -121,7 +147,8 @@ if [ -s "$state_file" ] then last_ts=$(cat "$state_file") || exit 1 else - last_ts=$((current_ts - 3600000)) # timestamp from 1h ago + # timestamp from 24h ago + last_ts=$((current_ts - 24*3600*1000 - 1)) #else last_ts=null fi @@ -130,7 +157,7 @@ days_from_last_tx=$(( (current_ts - last_ts) / (24*60*60*1000) )) printf "First, let's see how much ❤ you gave lately...\n\n" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi declare -A likesNbPerAuthor @@ -165,6 +192,7 @@ process_author() { author_id=$1 g1_author=$(echo $author_id | cut -d '.' -f 1 | cut -d '@' -f2 | base64 -d | base58) author_name=$(sbotc query.read '{"query":[{"$filter":{"value":{"author": "'"$author_id"'", "content":{"type":"about", "about": "'"$author_id"'"}}}}]}' | jq .value?.content?.name | grep -v null | tail -n 1) + author_name=${author_name:1:-1} } authorsNb=0 @@ -219,11 +247,14 @@ do excerpts[$target_id]=$msg_excerpt - if ! postsTimestamps[$target_id]=$(printf %s "$msg" | jq -r .value.timestamp) - then - printf 'Unable to get message timestamp\n' >&2 - exit 1 - fi + # We cannot use this anymore + # (now saving current_ts once all tx have been sent) + # + # if ! postsTimestamps[$target_id]=$(printf %s "$msg" | jq -r .value.timestamp) + #then + # printf 'Unable to get message timestamp\n' >&2 + # exit 1 + #fi ((i++)) fi @@ -236,66 +267,102 @@ then fi printf "You gave ${bold}%s❤${normal} during the past %s days.\n\n" "$totalLikesGiven" "$days_from_last_tx" -sleep 2 - -printf "How many UDĞ1 do you want to send per each like you gave? (default is ${bold}%s UDĞ1${normal}) " "$amountPerLikeInUD" -read a -echo "" +if [[ $readable -eq 1 ]]; then sleep 2; fi tx_are_possible=0 while [[ $tx_are_possible -eq 0 ]] do - - amountPerLikeInUD=$a + + printf "How many UDĞ1 do you want to send per each like you gave? (minimum is ${bold}%s UDĞ1${normal}) " "$minimumAmountPerLikeInUD" + read a + printf "\n" + + if [[ -z $a ]] + then + amountPerLikeInUD=$minimumAmountPerLikeInUD + else + amountPerLikeInUD=$a + fi amountGiven=$(echo "$totalLikesGiven * $amountPerLikeInUD" | bc -l) + + + has_enough_money=$(( $(echo "$amountGiven <= $balance" | bc -l) )) + amountPerLike_is_enough=$(( $(echo "$amountPerLikeInUD >= $minimumAmountPerLikeInUD" | bc -l) )) + tx_are_possible=$(( $has_enough_money && $amountPerLike_is_enough )) + + if [[ $readable -eq 1 ]]; then sleep 1; fi + + if [[ $tx_are_possible -eq 0 ]] ; then + + if [[ $has_enough_money -eq 0 ]] ; then - tx_are_possible=$(( $(echo "$amountGiven <= $balance" | bc -l) )) - - if [[ $tx_are_possible -ne 0 ]] ; then - newBalance=$(echo "$balance - $amountGiven" | bc -l) - printf "${bold}%s UDĞ1${normal} will be given.\n\n" "$amountGiven" - sleep 1 - printf "After sending transactions, your new balance will be ${bold}%s UDĞ1${normal}\n\n" "$newBalance" - sleep 1 - printf "Press ENTER to continue: " && read - printf "\n" - else - printf "You don't have enough UDĞ1 to send all transactions.\n\n" - sleep 1 - printf "${bold}%s UDĞ1${normal} are needed.\n\n" "$amountGiven" - sleep 1 + printf "You don't have enough UDĞ1 to send all transactions.\n\n" + if [[ $readable -eq 1 ]]; then sleep 1; fi + printf "${bold}%s UDĞ1${normal} are needed.\n\n" "$amountGiven" + if [[ $readable -eq 1 ]]; then sleep 1; fi + elif [[ $amountPerLike_is_enough -eq 0 ]] ; then + + printf "Minimum amount per like is %s UDĞ1.\n\n" $minimumAmountPerLikeInUD + if [[ $readable -eq 1 ]]; then sleep 1; fi + + fi + printf "Try again with a different amount per like.\n\n" maxAmountPerLike=$(awk -vp=$balance -vq=$totalLikesGiven 'BEGIN{printf "%.2f" ,p / q}') - sleep 1 + if [[ $readable -eq 1 ]]; then sleep 1; fi printf "Maximum amount per like possible: ${bold}%s UDĞ1${normal}\n\n" "$maxAmountPerLike" - sleep 1 - printf "How many UDĞ1 do you want to send per each like you gave? " - read a - echo "" + if [[ $readable -eq 1 ]]; then sleep 1; fi + else + newBalance=$(echo "$balance - $amountGiven" | bc -l) + printf "${bold}%s UDĞ1${normal} will be given.\n\n" "$amountGiven" + if [[ $readable -eq 1 ]]; then sleep 1; fi + printf "After sending transactions, your new balance will be ${bold}%s UDĞ1${normal}\n\n" "$newBalance" + if [[ $readable -eq 1 ]]; then sleep 1; fi + printf "Press ENTER to continue: " && read + printf "\n" fi done -# Let's construct thank you message and send transactions! +# Let's construct thank you posts (tyPosts) and send transactions! -n=0 -outputs[$n]="" -outputs[$n]+=$(printf "Huge thanks to the ScuttleButt community for all the fascinating posts you allowed me to read in the past %s days." "$days_from_last_tx") -outputs[$n]+="\n\nAs a means to thank you further, I have just sent you #Ğ1 libre money.\n\n" -outputs[$n]+="These messages, though they might feel spammy (sorry) are also a way for the Ğ1 community to spread awareness about [libre currencies](https://libre-currency.org/) so we can build #resilience at every level.\n\n" -outputs[$n]+="You can learn how to spend your freshly earned money at [https://git.p2p.legal/Axiom-Team/ssb-g1like](https://git.p2p.legal/Axiom-Team/ssb-g1like)\n\n" -outputs[$n]+="Below is the list of SSB users whose content I liked recently, and the amount each one was given:\n\n" - -tableHeaders='| thanks to | for their posts | given |\n' +tyPostIndex=0 +tyPosts[0]="" +tyPosts[0]+="# I tipped you for your posts!\n\n" +tyPosts[0]+=$(printf "Huge thanks to the ScuttleButt community for all the fascinating posts you allowed me to read in the past %s days." "$days_from_last_tx") +tyPosts[0]+="\n\nAs a means to thank you further, I have just sent you #Ğ1 libre money.\n\n" +tyPosts[0]+="These messages, though they might feel spammy (sorry) are also a way for the Ğ1 community to spread awareness about [libre currencies](https://libre-currency.org/) so we can build #resilience at every level.\n\n" +tyPosts[0]+="You can learn how to spend your freshly earned money at [https://git.p2p.legal/Axiom-Team/ssb-g1-tip](https://git.p2p.legal/Axiom-Team/ssb-g1-tip)\n\n" +tyPosts[0]+="Below is the list of SSB users whose content I liked recently, and the amount each one was given:\n\n" +tableHeaders='| thanks to | for their posts | tip |\n' tableHeaders+='| --- | --- | ---- |\n' +sizeOfTableHeaders=$(printf "%s" "$tableHeaders" | wc -c) +tyPosts[0]+=$tableHeaders -outputs[$n]+=$tableHeaders +# for message size calculation +# update following if you add tags in the message : +tags[0]="Ğ1" +tags[1]="resilience" + +sizeOfTags=0 +for t in ${!tags[@]} +do + tagSize=$(printf "%s" "${tags[t]}" | wc -c) + + (( sizeOfTags+=sizeOfATagMention + tagSize )) +done + +firstPostContentSize=$(printf "%s" "${tyPosts[0]}" | wc -c) +tyPostsSizes[0]=$((baseSizeOfAMessageFile + firstPostContentSize + sizeOfTags)) + +nbOfAuthors=${#likesNbPerAuthor[@]} +authorNum=1 for author_id in ${!likesNbPerAuthor[@]} do process_author $author_id - + # (Legacy) saving authors we have already mentionned in a message likedAuthorsFile=$ssb_dir/db/g1likes if [ ! -f $likedAuthorsFile ]; then @@ -307,126 +374,159 @@ do fi - author_amount=$(bc <<< "${likesNbPerAuthor[$author_id]} * $amountPerLikeInUD") + tipAmount=$(bc <<< "${likesNbPerAuthor[$author_id]} * $amountPerLikeInUD") newLine='' - newLine+=$(printf "| [@%s](%s) " "${author_name:1:-1}" "$author_id") + newLine+=$(printf "| [@%s](%s) " "$author_name" "$author_id") newLine+="| " - posts=${likedPosts[$author_id]} - thisAuthorLikedPosts=( ${posts//\\n/ } ) + sizeOfAuthorName=$(printf "%s" "$author_name" | wc -c) + sizeOfAuthorId=$(printf "%s" "$author_id" | wc -c) + newLineSize=0 + (( newLineSize+=sizeOfAUserMention + sizeOfAuthorName + sizeOfAuthorId)) - firstPost=1 - for post_id in ${thisAuthorLikedPosts[@]} + p=${likedPosts[$author_id]} + thisAuthorLikedPosts=( ${p//\\n/ } ) + + isFirstPostOfThisAuthor=1 + + for likedPostId in ${thisAuthorLikedPosts[@]} do - if [[ $firstPost ]] + if [[ $isFirstPostOfThisAuthor -eq 1 ]] then - firstPost=0 + isFirstPostOfThisAuthor=0 else newLine+=", " + (( newLineSize+=2 )) fi - newLine+=$(printf " %s❤" "${likesNbPerPost[$post_id]}") - newLine+=$(printf "[%s](%s)" "${post_id:0:9}" "$post_id") - newLine+=$(printf "[\`%s\`](%s)" "${excerpts[$post_id]}" "$post_id") + newLine+=$(printf " %s❤" "${likesNbPerPost[$likedPostId]}") + newLine+=$(printf "[\`%s\`](%s)" "${excerpts[$likedPostId]}" "$likedPostId") + + sizeOfExcerpt=${#excerpts[$likedPostId]} + (( sizeOfExcerpt+=2 )) # for before ` and after ` + sizeOfLikedPostId=$(printf "%s" "$likedPostId" | wc -c) + (( newLineSize+=sizeOfAPostMention + sizeOfExcerpt + sizeOfLikedPostId )) done - newLine+=$(printf "| %s UDĞ1 " $author_amount) + newLine+=$(printf "| %s UDĞ1 " "$tipAmount") newLine+="|\n" - messageSize=$(printf "%s%s" "${outputs[$n]}" "$newLine" | wc -c) - totalSize=$((messageSize + ssbMsgHeadersSize)) - if [[ $totalSize -gt $ssbMaxSize ]] + (( newLineSize+=$(printf "%s" "$newLine" | wc -c) )) + + # printf "total size: %s\n\n" "$((${tyPostsSizes[$tyPostIndex]} + $newLineSize))" + + + # If adding new line would exceed max size, we create a new thank you post + + sizeWithNewLine=${tyPostsSizes[$tyPostIndex]} + (( sizeWithNewLine+=newLineSize )) + + if [[ $sizeWithNewLine -gt $ssbMaxSize ]] then - outputs[$n]+="For message size reasons, the rest of the list had to be displayed below, in the following answer:" - ((n++)) - outputs[$n]+=$tableHeaders + printf "size before split: %s\n\n" "${tyPostsSizes[$tyPostIndex]}" + printf "size with new line: %s\n\n" "$sizeWithNewLine" + printf "size of new line: %s\n\n" "$newLineSize" + + (( tyPostIndex++ )) + tyPosts[$tyPostIndex]+=$tableHeaders + (( tyPostsSizes[$tyPostIndex]=baseSizeOfAMessageFile + sizeOfTableHeaders )) fi - outputs[$n]+=$newLine + tyPosts[$tyPostIndex]+=$newLine + (( tyPostsSizes[$tyPostIndex]+=newLineSize )) + + if [[ $debugMsgMode -eq 0 ]] + then + + if [[ $authorNum -ne 1 ]] + then + sleep 20 # DO NOT OVER CHARGE DUNITER + fi + #printf '%s\n' "silkaj -af --file ~/.ssb/secret.dunikey tx --output $g1_author --amountUD $tipAmount --comment "Thx for your cool posts on ScuttleButt" + silkaj -p "$duniter_server" -af --file ~/.ssb/secret.dunikey tx --output $g1_author --amountUD $tipAmount --comment "Thx for your cool posts on ScuttleButt" -y 2>/dev/null + + printf "\n${bold}%s UDĞ1${normal} sent to %s!\n\n" "$tipAmount" "$author_name" + fi - - #printf '%s\n' "silkaj -af --file ~/.ssb/secret.dunikey tx --outputs[$n] $g1_author --amountUD $author_amount --comment "Thx for your cool posts on ScuttleButt" - silkaj -p "$duniter_server" -af --file ~/.ssb/secret.dunikey tx --outputs[$n] $g1_author --amountUD $author_amount --comment "Thx for your cool posts on ScuttleButt" -y 2>/dev/null - - printf "\n${bold}%s UDĞ1${normal} sent to %s!\n\n" "$author_amount" "${author_name:1:-1}" - - # Let's save the timestamp of the last processed message - if ! echo "${postsTimestamps[$target_id]}" > "$state_file"~ + (( authorNum++ )) +done + +# Let's save the current timestamp +if [[ $debugMsgMode -eq 0 ]] +then + if ! echo "$current_ts" > "$state_file"~ then printf 'Unable to write to backup state file.\n' >&2 exit 1 fi - + if ! mv "$state_file"~ "$state_file" then - msg_id=$(printf %s "$msg" | jq -r .key) - printf 'Unable to write to state file. Update state file manually to prevent %s from being processed twice.\n' "$msg_id" >&2 + printf 'Unable to write to state file. Update state file manually to prevent tips to %s from being processed twice.\n' "$author_name" >&2 exit 1 fi - - sleep 20 # DO NOT OVER CHARGE DUNITER -done +fi printf "\n%s UDĞ1 sent to %s butts!\n\n" "$amountGiven" "${#likesNbPerAuthor[@]}" # Let's publicly thank everyone! -#echo -e "${outputs[$n]}" +#echo -e "${tyPosts[$n]}" # the following produces error: # "sbotc: unexpected end of parent stream" # must be a non-escaped quote problem... -#thank_you_msg=$(printf "%q" "${outputs[$n]}") +#thank_you_msg=$(printf "%q" "${tyPosts[$n]}") #sbotc publish '{"type":"post","text":"'"$thank_you_msg"'"}' 2>&1>/dev/null printf "What now ?\n\n" -sleep 1 +if [[ $readable -eq 1 ]]; then sleep 1; fi date=$(date -u +%Y-week-%W) -if [[ ${#outputs[@]} -eq 1 ]] +if [[ ${#tyPosts[@]} -eq 1 ]] then msg_filename=thank-your-butts-$date - echo -e ${outputs[$n]} > ~/$msg_filename + echo -e ${tyPosts[$n]} > ~/$msg_filename.md else - for i in ${!outputs[@]} + for i in ${!tyPosts[@]} do part=$((i + 1)) msg_filename=thank-your-butts-$date - echo -e ${outputs[$i]} > ~/$msg_filename-part-$part.md + echo -e ${tyPosts[$i]} > ~/$msg_filename-part-$part.md done fi printf "A surprise is awaiting in your home dir (~).\n\n" -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi -if [[ ${#outputs[@]} -eq 1 ]] +if [[ ${#tyPosts[@]} -eq 1 ]] then printf "It's a file.\n\n" - sleep 2 + if [[ $readable -eq 1 ]]; then sleep 2; fi printf "It's called $msg_filename.md\n\n" else - printf "It's %s files.\n\n" "${#outputs[@]}" - sleep 2 + printf "It's %s files.\n\n" "${#tyPosts[@]}" + if [[ $readable -eq 1 ]]; then sleep 2; fi printf "The first one is called $msg_filename-part-1.md.\n\n" fi -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi -printf "Customize it to your needs to thank you fellow butts publicly and help spread awareness about libre currencies :-)\n\n" +printf "Customize it to your needs to thank your fellow butts publicly and help spread awareness about libre currencies :-)\n\n" -sleep 3 +if [[ $readable -eq 1 ]]; then sleep 3; fi printf "Then delete it.\n\n" -sleep 2 +if [[ $readable -eq 1 ]]; then sleep 2; fi printf "...because it won't self-destruct, haha :D \n\n"