Last active
October 4, 2018 20:19
-
-
Save Ajnasz/9c087e360c9a1c41fe412478aac1d343 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# pomodoro.sh to play a sound after pomodoro finished | |
# set update frequency to 0 to don't display updates | |
# In that case send a USR1 signal to the process if you want to see the elapsed time | |
# The script will update you slack status if slack token set | |
# You can set slack token by setting the SLACK_TOKEN env var | |
# Or put the token into a gpg encrypted file to $HOME/.secret/slack_token.gpg | |
# You can override that path by setting the SLACK_TOKEN_FILE_PATH env var | |
DEFAULT_MINUTES=25 | |
NOTIFY_SEND="/usr/bin/notify-send" | |
DUNSTIFY="$HOME/bin/dunstify" | |
DEFAULT_SOUND="/usr/share/sounds/purple/alert.wav" | |
MINUTES=${POMODORO_MINUTES:-$DEFAULT_MINUTES} | |
SOUND=${POMODORO_SOUND:-$DEFAULT_SOUND} | |
DEFAULT_SLACK_TOKE_FILE_PATH="$HOME/.secret/slack_token.gpg" | |
SLACK_TOKEN_FILE_PATH=${POMODORO_SLACK_TOKEN_FILE_PATH:-$DEFAULT_SLACK_TOKE_FILE_PATH} | |
DEFAULT_SLACK_EMOJI=":tomato:" | |
DEFAULT_SLACK_STATUS_TEXT="" | |
SLACK_EMOJI=${POMODORO_SLACK_EMOJI:-$DEFAULT_SLACK_EMOJI} | |
SLACK_STATUS_TEXT=${POMODORO_SLACK_STATUS_TEXT:-$DEFAULT_SLACK_STATUS_TEXT} | |
DEFAULT_SLACK_STATUS_EMOJI="" | |
DEFAULT_SLACK_STATUS_TEXT="" | |
QUIET=0 | |
DURATION=0 | |
start=$(date -u +%s) | |
help() { | |
echo "pomodoro.sh" | |
echo | |
echo "Options:" | |
echo " -m minutes Duration of the pomodoro session in minutes ($DEFAULT_MINUTES is the default)" | |
echo " -a alarm_sound_file played after pomodoro finished ($DEFAULT_SOUND is the default)" | |
echo " -q Don't show elapsed time" | |
echo " -h Show this help" | |
echo | |
echo "Signals:" | |
echo " Send an USR1 to print elapsed time (useful if -q is used)" | |
echo | |
echo "Some of the parameters can be configured with environment variables:" | |
echo " POMODORO_MINUTES Same as -m option. Duration of the pomodoro session in minutes" | |
echo " POMODORO_SOUND Same as -a option. Sound file played after pomodoro finished" | |
echo " POMODORO_SLACK_TOKEN_FILE_PATH Path to a gpg encrypted file which content is your slack token" | |
echo " POMODORO_SLACK_EMOJI An emoji as text which should be shown when you are doing in a pomodoro session" | |
echo " POMODORO_SLACK_STATUS_TEXT Status message shown during pomodoro session" | |
echo | |
echo "Usage $0 [-m minutes] [-a sound_file.wav] [-q]" | |
} | |
get_time_string() { | |
dt=$1 | |
local ds=$((dt % 60)) | |
local dm=$(((dt / 60) % 60)) | |
local dh=$((dt / 3600)) | |
printf '%d:%02d:%02d' $dh $dm $ds | |
} | |
show_elapsed_time() { | |
local elapsed=$(($(date -u +%s) - $start)) | |
dt=$(($DURATION - $elapsed)) | |
remaining=$(get_time_string "$dt") | |
echo -n "\r$remaining" | |
} | |
slack_call() { | |
if [ -z "$SLACK_TOKEN" ];then | |
return 0 | |
fi | |
api=$1 | |
data=$2 | |
url="https://slack.com/api/$api" | |
if [ -z "$data" ];then | |
curl -s -H 'Content-Type: application/json; charset=utf-8' -H "Authorization: Bearer $SLACK_TOKEN" $url | |
else | |
curl -s -H 'Content-Type: application/json; charset=utf-8' -H "Authorization: Bearer $SLACK_TOKEN" -d "$data" $url | |
fi | |
} | |
set_slack_status() { | |
emoji=$1 | |
status_text=$2 | |
if [ -z "$emoji" ];then | |
data='{"profile": {"status_text": "'$DEFAULT_SLACK_STATUS_TEXT'", "status_emoji": "'$DEFAULT_SLACK_STATUS_EMOJI'"}}' | |
else | |
data='{"profile": {"status_emoji": "'$emoji'", "status_text": "'$status_text'"}}' | |
fi | |
slack_call 'users.profile.set' "$data" > /dev/null | |
} | |
set_slack_snooze() { | |
minutes=$1 | |
slack_call "dnd.setSnooze?num_minutes=$minutes" > /dev/null | |
} | |
get_slack_status() { | |
local STATUS="$(slack_call 'users.profile.get' | jq -r '.profile.status_emoji, .profile.status_text')" | |
DEFAULT_SLACK_STATUS_TEXT=$(echo $STATUS | cut -d ' ' -f 2) | |
DEFAULT_SLACK_STATUS_EMOJI=$(echo $STATUS | cut -d ' ' -f 1) | |
} | |
stop_pomodoro() { | |
echo "stopping" | |
aplay -q $SOUND | |
echo | |
date | |
MSG="Pomodoro finished, take a break!" | |
echo $MSG | |
if [ -e "$DUNSTIFY" ];then | |
$DUNSTIFY -p -a "$0" -u normal "$MSG" | |
else | |
$NOTIFY_SEND -p -a "$0" -u normal "$MSG" | |
fi | |
set_slack_snooze 0 | |
set_slack_status '' | |
exit 0 | |
} | |
while getopts "m:a:qh" opt;do | |
case $opt in | |
'm') | |
MINUTES=$OPTARG | |
;; | |
'a') | |
SOUND=$OPTARG | |
;; | |
'q') | |
QUIET=1 | |
;; | |
'h') | |
help | |
exit 0 | |
;; | |
[?]) | |
help | |
exit 1 | |
;; | |
esac | |
done | |
if [ -z "$SLACK_TOKEN" ] && [ -f "$SLACK_TOKEN_FILE_PATH" ];then | |
SLACK_TOKEN=$(gpg -d $HOME/.secret/slack_token.gpg 2>/dev/null) | |
fi | |
echo "Pomodoro will run $MINUTES minutes. PID: $$" | |
get_slack_status | |
set_slack_snooze $MINUTES | |
set_slack_status "$SLACK_EMOJI" "$SLACK_STATUS_TEXT" | |
DURATION=$(awk "BEGIN {print $MINUTES * 60}") | |
trap 'show_elapsed_time' USR1 | |
trap 'stop_pomodoro' 2 | |
while [ $(($(date -u +%s) - $start)) -lt $DURATION ];do | |
sleep 1 | |
if [ $QUIET -eq 0 ];then | |
show_elapsed_time | |
fi | |
done | |
stop_pomodoro | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment