scripts

scripts to make my pc work
Index Commits Files Refs
commit 223f584e8cc9ccd3387d941c24c99fb059f1cee9
parent 63caefa3abfc499cc36d758cf32e4f550a609d27
Author: klewer-martin <martin.cachari@gmail.com>
Date:   Thu, 25 Mar 2021 20:25:52 -0300

Update;

Diffstat:
Mautostart.sh | 6+++++-
Mkeyboardmap | 2++
Astatusbar/sb-battery | 36++++++++++++++++++++++++++++++++++++
Astatusbar/sb-clock | 30++++++++++++++++++++++++++++++
Astatusbar/sb-cpu | 12++++++++++++
Astatusbar/sb-cpubars | 44++++++++++++++++++++++++++++++++++++++++++++
Astatusbar/sb-disk | 23+++++++++++++++++++++++
Astatusbar/sb-forecast | 35+++++++++++++++++++++++++++++++++++
Astatusbar/sb-help-icon | 17+++++++++++++++++
Astatusbar/sb-internet | 24++++++++++++++++++++++++
Astatusbar/sb-iplocate | 10++++++++++
Astatusbar/sb-kbselect | 16++++++++++++++++
Astatusbar/sb-mailbox | 20++++++++++++++++++++
Astatusbar/sb-memory | 12++++++++++++
Astatusbar/sb-moonphase | 37+++++++++++++++++++++++++++++++++++++
Astatusbar/sb-mpdup | 8++++++++
Astatusbar/sb-music | 19+++++++++++++++++++
Astatusbar/sb-nettraf | 29+++++++++++++++++++++++++++++
Astatusbar/sb-news | 17+++++++++++++++++
Astatusbar/sb-pacpackages | 29+++++++++++++++++++++++++++++
Astatusbar/sb-popupgrade | 9+++++++++
Astatusbar/sb-price | 38++++++++++++++++++++++++++++++++++++++
Astatusbar/sb-tasks | 20++++++++++++++++++++
Astatusbar/sb-torrent | 27+++++++++++++++++++++++++++
Astatusbar/sb-volume | 29+++++++++++++++++++++++++++++
25 files changed, 548 insertions(+), 1 deletion(-)
diff --git a/autostart.sh b/autostart.sh
@@ -1,7 +1,11 @@
+# set proper resolution
+xrandr -s 1366x768
 
+# set wallpaper
 nitrogen --restore
 
-xrandr -s 1360x768
+# start compositor
+picom &
 
 setxkbmap -option caps:swapescape
 setxkbmap -option altwin:swap_lalt:lwin
diff --git a/keyboardmap b/keyboardmap
@@ -5,3 +5,5 @@
 setxkbmap -option caps:swapescape
 
 setxkbmap -option altwin:swap_lalt_lwin
+
+# setxkbmap -option caps:super ; xcape -e 'Super_L=Escape'
diff --git a/statusbar/sb-battery b/statusbar/sb-battery
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Prints all batteries, their percentage remaining and an emoji corresponding
+# to charge status (🔌 for plugged up, 🔋 for discharging on battery, etc.).
+
+case $BLOCK_BUTTON in
+    3) notify-send "🔋 Battery module" "🔋: discharging
+🛑: not charging
+♻: stagnant charge
+🔌: charging
+⚡: charged
+❗: battery very low!
+- Scroll to change adjust xbacklight." ;;
+    4) xbacklight -inc 10 ;;
+    5) xbacklight -dec 10 ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# Loop through all attached batteries and format the info
+for battery in /sys/class/power_supply/BAT?*; do
+    # If non-first battery, print a space separator.
+    [ -n "${capacity+x}" ] && printf " "
+    # Sets up the status and capacity
+    case "$(cat "$battery/status")" in
+        "Full") status="⚡" ;;
+        "Discharging") status="🔋" ;;
+        "Charging") status="🔌" ;;
+        "Not charging") status="🛑" ;;
+        "Unknown") status="♻️" ;;
+    esac
+    capacity=$(cat "$battery/capacity")
+    # Will make a warn variable if discharging and low
+    [ "$status" = "🔋" ] && [ "$capacity" -le 25 ] && warn="❗"
+    # Prints the info
+    printf "%s%s%d%%" "$status" "$warn" "$capacity"; unset warn
+done && exit 0
diff --git a/statusbar/sb-clock b/statusbar/sb-clock
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+clock=$(date '+%I')
+
+case "$clock" in
+    "00") icon="🕛" ;;
+    "01") icon="🕐" ;;
+    "02") icon="🕑" ;;
+    "03") icon="🕒" ;;
+    "04") icon="🕓" ;;
+    "05") icon="🕔" ;;
+    "06") icon="🕕" ;;
+    "07") icon="🕖" ;;
+    "08") icon="🕗" ;;
+    "09") icon="🕘" ;;
+    "10") icon="🕙" ;;
+    "11") icon="🕚" ;;
+    "12") icon="🕛" ;;
+esac
+
+#case $BLOCK_BUTTON in
+#    1) notify-send "This Month" "$(cal --color=always | sed "s/..7m/<b><span color=\"red\">/;s/..27m/<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;;
+#    2) setsid -f "$TERMINAL" -e calcurse ;;
+#    3) notify-send "📅 Time/date module" "\- Left click to show upcoming appointments for the next three days via \`calcurse -d3\` and show the month via \`cal\`
+#- Middle click opens calcurse if installed" ;;
+#    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+#esac
+
+#date "+ %a %b %d %Y $icon: %I:%M%p"
+date "+📅: %a %d/%m/%Y | $icon: %R "
diff --git a/statusbar/sb-cpu b/statusbar/sb-cpu
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+case $BLOCK_BUTTON in
+    1) notify-send "🖥 CPU hogs" "$(ps axch -o cmd:15,%cpu --sort=-%cpu | head)\\n(100% per core)" ;;
+    2) setsid -f "$TERMINAL" -e htop ;;
+    3) notify-send "🖥 CPU module " "\- Shows CPU temperature.
+- Click to show intensive processes.
+- Middle click to open htop." ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+sensors | awk '/Core 0/ {print "🌡: " $3}'
diff --git a/statusbar/sb-cpubars b/statusbar/sb-cpubars
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+# Module showing CPU load as a changing bars.
+# Just like in polybar.
+# Each bar represents amount of load on one core since
+# last run.
+
+# Cache in tmpfs to improve speed and reduce SSD load
+cache=/tmp/cpubarscache
+
+case $BLOCK_BUTTON in
+    2) setsid -f "$TERMINAL" -e htop ;;
+    3) notify-send "🪨 CPU load module" "Each bar represents
+one CPU core";;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# id total idle
+stats=$(awk '/cpu[0-9]+/ {printf "%d %d %d\n", substr($1,4), ($2 + $3 + $4 + $5), $5 }' /proc/stat)
+[ ! -f $cache ] && echo "$stats" > "$cache"
+old=$(cat "$cache")
+printf "🪨"
+echo "$stats" | while read -r row; do
+    id=${row%% *}
+    rest=${row#* }
+    total=${rest%% *}
+    idle=${rest##* }
+
+    case "$(echo "$old" | awk '{if ($1 == id)
+        printf "%d\n", (1 - (idle - $3)  / (total - $2))*100 /12.5}' \
+        id="$id" total="$total" idle="$idle")" in
+
+        "0") printf "▁";;
+        "1") printf "▂";;
+        "2") printf "▃";;
+        "3") printf "▄";;
+        "4") printf "▅";;
+        "5") printf "▆";;
+        "6") printf "▇";;
+        "7") printf "█";;
+        "8") printf "█";;
+    esac
+done; printf "\\n"
+echo "$stats" > "$cache"
diff --git a/statusbar/sb-disk b/statusbar/sb-disk
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# Status bar module for disk space
+# $1 should be drive mountpoint, otherwise assumed /.
+
+location=${1:-/}
+
+[ -d "$location" ] || exit
+
+case $BLOCK_BUTTON in
+    1) notify-send "💽 Disk space" "$(df -h --output=target,used,size)" ;;
+    3) notify-send "💽 Disk module" "\- Shows used hard drive space.
+- Click to show all disk info." ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+case "$location" in
+    "/home"* ) icon="🏠" ;;
+    "/mnt"* ) icon="💾" ;;
+    *) icon="🖥";;
+esac
+
+printf "%s: %s\n" "$icon" "$(df -h "$location" | awk ' /[0-9]/ {print $3 "/" $2}')"
diff --git a/statusbar/sb-forecast b/statusbar/sb-forecast
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# Displays todays precipication chance (☔) and daily low (🥶) and high (🌞).
+# Usually intended for the statusbar.
+
+# If we have internet, get a weather report from wttr.in and store it locally.
+# You could set up a shell alias to view the full file in a pager in the
+# terminal if desired. This function will only be run once a day when needed.
+weatherreport="${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport"
+getforecast() { curl -sf "wttr.in/$LOCATION" > "$weatherreport" || exit 1 ;}
+
+# Some very particular and terse stream manipulation. We get the maximum
+# precipitation chance and the daily high and low from the downloaded file and
+# display them with coresponding emojis.
+showweather() { printf "%s" "$(sed '16q;d' "$weatherreport" |
+    grep -wo "[0-9]*%" | sort -rn | sed "s/^/☔/g;1q" | tr -d '\n')"
+sed '13q;d' "$weatherreport" | grep -o "m\\([-+]\\)*[0-9]\\+" | sed 's/+//g' | sort -n -t 'm' -k 2n | sed -e 1b -e '$!d' | tr '\n|m' ' ' | awk '{print " 🥶" $1 "°","🌞" $2 "°"}' ;}
+
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e less -Srf "$weatherreport" ;;
+    2) getforecast && showweather ;;
+    3) notify-send "🌈 Weather module" "\- Left click for full forecast.
+- Middle click to update forecast.
+☔: Chance of rain/snow
+🥶: Daily low
+🌞: Daily high" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+# The test if our forcecast is updated to the day. If it isn't download a new
+# weather report from wttr.in with the above function.
+[ "$(stat -c %y "$weatherreport" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] ||
+    getforecast
+
+showweather
diff --git a/statusbar/sb-help-icon b/statusbar/sb-help-icon
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# The clickable help menu. Middle click to restart wm.
+
+# If dwm is running, use dwm's readme and restart.
+pidof dwm >/dev/null &&
+    READMEFILE=/usr/local/share/dwm/larbs.mom
+    restartwm() { pkill -HUP dwm ;} ||
+        restartwm() { i3 restart ;}
+
+case $BLOCK_BUTTON in
+    1) groff -mom "${READMEFILE:-${XDG_DATA_HOME:-$HOME/.local/share}/larbs/readme.mom}" -Tpdf | zathura - ;;
+    2) restartwm ;;
+    3) notify-send "❓ Help module" "\- Left click to open LARBS guide.
+- Middle click to refresh window manager." ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac; echo "❓"
diff --git a/statusbar/sb-internet b/statusbar/sb-internet
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# Show wifi 📶 and percent strength or 📡 if none.
+# Show 🌐 if connected to ethernet or ❎ if none.
+# Show 🔒 if a vpn connection is active
+
+case $BLOCK_BUTTON in
+    1) "$TERMINAL" -e nmtui; pkill -RTMIN+4 dwmblocks ;;
+    3) notify-send "🌐 Internet module" "\- Click to connect
+📡: no wifi connection
+📶: wifi connection with quality
+❎: no ethernet
+🌐: ethernet working
+🔒: vpn is active
+" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+case "$(cat /sys/class/net/w*/operstate 2>/dev/null)" in
+    down) wifiicon="📡 " ;;
+    up) wifiicon="$(awk '/^\s*w/ { print "📶", int($3 * 100 / 70) "% " }' /proc/net/wireless)" ;;
+esac
+
+printf "%s%s%s\n" "$wifiicon" "$(sed "s/down/❎/;s/up/🌐/" /sys/class/net/e*/operstate 2>/dev/null)" "$(sed "s/.*/🔒/" /sys/class/net/tun*/operstate 2>/dev/null)"
diff --git a/statusbar/sb-iplocate b/statusbar/sb-iplocate
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Gets your public ip address checks which country you are in and
+# displays that information in the statusbar
+#
+# https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/
+
+ifinstalled "geoip" || exit
+addr="$(curl ifconfig.me 2>/dev/null)" || exit
+grep "flag: " "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji" | grep "$(geoiplookup "$addr" | sed 's/.*, //')" | sed "s/flag: //;s/;.*//"
diff --git a/statusbar/sb-kbselect b/statusbar/sb-kbselect
@@ -0,0 +1,16 @@
+#!/bin/sh
+# works on any init system
+# requirements: dmenu, xorg-setxkbmap
+kb="$(setxkbmap -query | grep -oP 'layout:\s*\K\w+')" || exit 1
+
+case $BLOCK_BUTTON in
+    1) kb_choice="$(awk '/! layout/{flag=1; next} /! variant/{flag=0} flag {print $2, "- " $1}' /usr/share/X11/xkb/rules/base.lst | dmenu -l 15)"
+    kb="$(echo "$kb_choice" | awk '{print $3}')"
+    setxkbmap "$kb"
+    pkill -RTMIN+30 "${STATUSBAR:-dwmblocks}";;
+    3) notify-send "⌨  Keyboard/language module" "$(printf "%s" "\- Current layout: $(setxkbmap -query | grep -oP 'layout:\s*\K\w+')")
+- Left click to change keyboard.";;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+echo "$kb"
diff --git a/statusbar/sb-mailbox b/statusbar/sb-mailbox
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Displays number of unread mail and an loading icon if updating.
+# When clicked, brings up `neomutt`.
+
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e neomutt ;;
+    2) setsid -f mw sync >/dev/null ;;
+    3) notify-send "📬 Mail module" "\- Shows unread mail
+- Shows 🔃 if syncing mail
+- Left click opens neomutt
+- Middle click syncs mail" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+unread="$(find "${XDG_DATA_HOME:-$HOME/.local/share}"/mail/*/[Ii][Nn][Bb][Oo][Xx]/new/* -type f | wc -l 2>/dev/null)"
+
+pidof mbsync >/dev/null 2>&1 && icon="🔃"
+
+[ "$unread" = "0" ] && [ "$icon" = "" ] || echo "📬$unread$icon"
diff --git a/statusbar/sb-memory b/statusbar/sb-memory
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+#case $BLOCK_BUTTON in
+#    1) notify-send "🧠 Memory hogs" "$(ps axch -o cmd:15,%mem --sort=-%mem | head)" ;;
+#    2) setsid -f "$TERMINAL" -e htop ;;
+#    3) notify-send "🧠 Memory module" "\- Shows Memory Used/Total.
+#- Click to show memory hogs.
+#- Middle click to open htop." ;;
+#    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+#esac
+
+free --mebi | sed -n '2{p;q}' | awk '{printf ("🧠: %2.2fGiB\n", ( $3 / 1024), ($2 / 1024))}'
diff --git a/statusbar/sb-moonphase b/statusbar/sb-moonphase
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# Shows the current moon phase.
+
+moonfile="${XDG_DATA_HOME:-$HOME/.local/share}/moonphase"
+
+[ "$(stat -c %y "$moonfile" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] ||
+    { curl -sf "wttr.in/?format=%m" > "$moonfile" || exit 1 ;}
+
+icon="$(cat "$moonfile")"
+
+case "$icon" in
+    🌑) name="New" ;;
+    🌒) name="Waxing Crescent" ;;
+    🌓) name="First Quarter" ;;
+    🌔) name="Waxing Gibbous" ;;
+    🌕) name="Full" ;;
+    🌖) name="Waning Gibbous" ;;
+    🌗) name="Last Quarter" ;;
+    🌘) name="Waning Crescent" ;;
+    *) exit 1 ;;
+esac
+
+echo "${icon-?}"
+
+case $BLOCK_BUTTON in
+    3) notify-send "🌜 Moon phase module" "Displays current moon phase.
+- 🌑: New
+- 🌒: Waxing Crescent
+- 🌓: First Quarter
+- 🌔: Waxing Gibbous
+- 🌕: Full
+- 🌖: Waning Gibbous
+- 🌗: Last Quarter
+- 🌘: Waning Crescent" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
diff --git a/statusbar/sb-mpdup b/statusbar/sb-mpdup
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# This loop will update the mpd statusbar module whenever a command changes the
+# music player's status. mpd must be running on X's start for this to work.
+
+while : ; do
+    mpc idle >/dev/null && kill -45 "$(pidof "${STATUSBAR:-dwmblocks}")" || break
+done
diff --git a/statusbar/sb-music b/statusbar/sb-music
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+filter() { mpc | sed "/^volume:/d;s/\\&/&amp;/g;s/\\[paused\\].*/⏸/g;/\\[playing\\].*/d" | paste -sd ' ' -;}
+
+pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 &
+
+case $BLOCK_BUTTON in
+    1) mpc status | filter ; setsid -f "$TERMINAL" -e ncmpcpp ;;  # right click, pause/unpause
+    2) mpc toggle | filter ;;  # right click, pause/unpause
+    3) mpc status | filter ; notify-send "🎵 Music module" "\- Shows mpd song playing.
+- ⏸ when paused.
+- Left click opens ncmpcpp.
+- Middle click pauses.
+- Scroll changes track.";;  # right click, pause/unpause
+    4) mpc prev   | filter ;;  # scroll up, previous
+    5) mpc next   | filter ;;  # scroll down, next
+    6) mpc status | filter ; "$TERMINAL" -e "$EDITOR" "$0" ;;
+    *) mpc status | filter ;;
+esac
diff --git a/statusbar/sb-nettraf b/statusbar/sb-nettraf
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# Module showing network traffic. Shows how much data has been received (RX) or
+# transmitted (TX) since the previous time this script ran. So if run every
+# second, gives network traffic per second.
+
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e bmon ;;
+    3) notify-send "🌐 Network traffic module" "🔻: Traffic received
+🔺: Traffic transmitted" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+update() {
+    sum=0
+    for arg; do
+        read -r i < "$arg"
+        sum=$(( sum + i ))
+    done
+    cache=${XDG_CACHE_HOME:-$HOME/.cache}/${1##*/}
+    [ -f "$cache" ] && read -r old < "$cache" || old=0
+    printf %d\\n "$sum" > "$cache"
+    printf %d\\n $(( sum - old ))
+}
+
+rx=$(update /sys/class/net/[ew]*/statistics/rx_bytes)
+tx=$(update /sys/class/net/[ew]*/statistics/tx_bytes)
+
+printf "🔻%4sB 🔺%4sB\\n" $(numfmt --to=iec $rx) $(numfmt --to=iec $tx)
diff --git a/statusbar/sb-news b/statusbar/sb-news
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Displays number of unread news items and an loading icon if updating.
+# When clicked, brings up `newsboat`.
+
+case $BLOCK_BUTTON in
+        1) setsid "$TERMINAL" -e newsboat ;;
+    2) setsid -f newsup >/dev/null exit ;;
+        3) notify-send "📰 News module" "\- Shows unread news items
+- Shows 🔃 if updating with \`newsup\`
+- Left click opens newsboat
+- Middle click syncs RSS feeds
+<b>Note:</b> Only one instance of newsboat (including updates) may be running at a time." ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+ cat /tmp/newsupdate 2>/dev/null || echo "$(newsboat -x print-unread | awk '{ if($1>0) print "📰" $1}')$(cat "${XDG_CONFIG_HOME:-$HOME/.config}"/newsboat/.update 2>/dev/null)"
diff --git a/statusbar/sb-pacpackages b/statusbar/sb-pacpackages
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# Displays number of upgradeable packages.
+# For this to work, have a `pacman -Sy` command run in the background as a
+# cronjob every so often as root. This script will then read those packages.
+# When clicked, it will run an upgrade via pacman.
+#
+# Add the following text as a file in /usr/share/libalpm/hooks/statusbar.hook:
+#
+# [Trigger]
+# Operation = Upgrade
+# Type = Package
+# Target = *
+#
+# [Action]
+# Description = Updating statusbar...
+# When = PostTransaction
+# Exec = /usr/bin/pkill -RTMIN+8 dwmblocks # Or i3blocks if using i3.
+
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e sb-popupgrade ;;
+    2) notify-send "$(/usr/bin/pacman -Qu)" ;;
+    3) notify-send "🎁 Upgrade module" "📦: number of upgradable packages
+- Left click to upgrade packages
+- Middle click to show upgradable packages" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+pacman -Qu | grep -Fcv "[ignored]" | sed "s/^/📦/;s/^📦0$//g"
diff --git a/statusbar/sb-popupgrade b/statusbar/sb-popupgrade
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+printf "Beginning upgrade.\\n"
+
+yay -Syu
+pkill -RTMIN+8 "${STATUSBAR:-dwmblocks}"
+
+printf "\\nUpgrade complete.\\nPress <Enter> to exit window.\\n\\n"
+read -r _
diff --git a/statusbar/sb-price b/statusbar/sb-price
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+# Usage:
+#    price <url> <Name of currency> <icon>
+#    price bat "Basic Attention Token" 🦁
+# When the name of the currency is multi-word, put it in quotes.
+
+[ -z "$3" ] && exit 1
+interval="@14d"    # History contained in chart preceded by '@' (7d = 7 days)
+dir="${XDG_DATA_HOME:-$HOME/.local/share}/crypto-prices"
+pricefile="$dir/$1"
+chartfile="$dir/$1-chart"
+
+updateprice() { ping -q -c 1 example.org >/dev/null 2>&1 &&
+    curl -s "rate.sx/1$1" > "$pricefile" &&
+    curl -s "rate.sx/$1$interval" > "$chartfile" ;}
+
+[ -d "$dir" ] || mkdir -p "$dir"
+
+[ "$(stat -c %x "$pricefile" 2>/dev/null | cut -d' ' -f1)" != "$(date '+%Y-%m-%d')" ] &&
+    updateprice "$1"
+
+case $BLOCK_BUTTON in
+    1) setsid "$TERMINAL" -e less -Srf "$chartfile" ;;
+    2) notify-send -u low "$3 Updating..." "Updating $2 price..."
+        updateprice "$1" && notify-send "$3 Update complete." "$2 price is now
+\$$(cat "$pricefile")" ;;
+    3) uptime="$(date -d "$(stat -c %x "$pricefile")" '+%D at %T' | sed "s|$(date '+%D')|Today|")"
+        notify-send "$3 $2 module" "\- <b>Exact price: \$$(cat "$pricefile")</b>
+- Left click for chart of changes.
+- Middle click to update.
+- Shows 🔃 if updating prices.
+- <b>Last updated:
+    $uptime</b>" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
+
+printf "$3$%0.2f" "$(cat "$pricefile")"
diff --git a/statusbar/sb-tasks b/statusbar/sb-tasks
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Originally by Andr3as07 <https://github.com/Andr3as07>
+# Some changes by Luke
+# Rebuild by Tenyun
+
+# This block displays the number running background tasks.  Requires tsp.
+
+num=$(tsp -l | awk -v numr=0 -v numq=0 '{if (/running/)numr++; if (/queued/)numq++} END{print numr+numq"("numq")"}')
+
+# Handle mouse clicks
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e tsp -l ;;
+    3) notify-send "Tasks module" "🤖: number of running/queued background tasks
+- Left click opens tsp" ;; # Right click
+    2) $EDITOR "$0" ;; # Middle click
+esac
+
+[ "$num" != "0(0)" ] &&
+    echo "🤖$num"
diff --git a/statusbar/sb-torrent b/statusbar/sb-torrent
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+transmission-remote -l | grep % |
+    sed " # The letters are for sorting and will not appear.
+    s/.*Stopped.*/A 🛑/;
+    s/.*Seeding.*/Z 🌱/;
+    s/.*100%.*/N ✅/;
+    s/.*Idle.*/B 🕰️/;
+    s/.*Uploading.*/L ⬆️/;
+    s/.*%.*/M ⬇️/" |
+        sort -h | uniq -c | awk '{print $3 $1}' | paste -sd ' ' -
+
+case $BLOCK_BUTTON in
+    1) setsid -f "$TERMINAL" -e tremc ;;
+    2) td-toggle ;;
+    3) notify-send "🌱 Torrent module" "\- Left click to open tremc.
+- Middle click to toggle transmission.
+- Shift click to edit script.
+Module shows number of torrents:
+🛑: paused
+🕰: idle (seeds needed)
+🔼: uploading (unfinished)
+🔽: downloading
+✅: done
+🌱: done and seeding" ;;
+    6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+esac
diff --git a/statusbar/sb-volume b/statusbar/sb-volume
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# Prints the current volume or 🔇 if muted.
+
+# case $BLOCK_BUTTON in
+#     1) setsid -f "$TERMINAL" -e pulsemixer ;;
+#     2) pamixer -t ;;
+#     4) pamixer --allow-boost -i 1 ;;
+#     5) pamixer --allow-boost -d 1 ;;
+#     3) notify-send "📢 Volume module" "\- Shows volume 🔊, 🔇 if muted.
+# - Middle click to mute.
+# - Scroll to change." ;;
+#     6) "$TERMINAL" -e "$EDITOR" "$0" ;;
+# esac
+
+[ $(pamixer --get-mute) = true ] && echo 🔇 && exit
+
+vol="$(pamixer --get-volume)"
+
+if [ "$vol" -gt "50" ]; then
+    icon="🔊"
+elif [ "$vol" -lt "25" ]; then
+    icon="🔈"
+else
+    icon="🔉"
+fi
+
+#echo "$icon: $vol%"
+echo "VOL: $vol%"