#!/usr/bin/env bash actions="quick move fetch-client fetch-channel away not away back message message-user events ntfy-events" _ts_control_get_entity() { entity=$(_ts_control_single_or_dmenu "$(teamspeak-query-lib "$1s")" "$2") if [ -z "$entity" ]; then exit 1 fi echo "$entity" } _ts_control_get_message() { if [ -n "$1" ]; then message="$1" else message=$(printf "\n" | $DMENU -p "message") fi if [ -z "$message" ]; then exit 1 fi echo "$message" } _ts_control_move_self() { channel=$(_ts_control_get_entity channel "$1" "$2") teamspeak-query-lib move --strict-channel "$channel" } _ts_control_fetch() { target=$(_ts_control_get_entity "$1" "$2") teamspeak-query-lib fetch "--strict-$1" "--$1" "$target" } _ts_control_single_or_dmenu() { filter="$2" if [ "$filter" == "^$" ]; then filter="" fi options=$(echo "$1" | grep "$filter") count=$(echo "$options" | wc -l) if [ "$count" -eq 1 ]; then echo "$options" else echo "$1" | $DMENU fi } handle_ntfy_events() { while read -r data; do msg=$(echo "$data" | jq -r --unbuffered '.message') type=$(echo "$data" | jq -r --unbuffered '.type') mode=$(echo "$data" | jq -r --unbuffered '.params.targetmode') client_nickname=$(echo "$data" | jq -r --unbuffered '.client.client_nickname') echo "$data" if [ "$type" = "NotifyTextMessage" ] && [ "$mode" != "1" ]; then continue # Skip all messages that are not direct messages fi title="TS3 Event" case $type in "NotifyClientPoke") title="TS3 Poke" ;; "NotifyTextMessage") title="TS3 Message" ;; esac echo "($title) $target: $msg" payload=$(jq -n \ --arg topic "$TS3_NTFY_TOPIC" \ --arg webhook "$TS3_NTFY_WEBHOOK&client=$client_nickname" \ --arg msg "$msg" \ --arg type "$title" \ '{ topic: $topic, message: $msg, title: $type, actions: [{ action: "http", label: "TS response", method: "POST", url: $webhook, clear: true }] }') curl -sSL \ -H "Authorization: Bearer $TS3_NTFY_TOKEN" \ -d "$payload" \ "$TS3_NTFY_HOST" done } action=$(_ts_control_single_or_dmenu "$actions" "^$1$") case $action in "quick") action=$($DMENU < "$XDG_CONFIG_HOME/ts-control-quick") if [ -z "$action" ]; then exit 1 fi eval "$0 $action" ;; "move") _ts_control_move_self "$2" ;; "fetch-client") _ts_control_fetch client "$2" ;; "fetch-channel") _ts_control_fetch channel "$2" ;; "not away") teamspeak-query-lib move "Not Away From Keyboard" teamspeak-query-lib update --microphone=false --speakers=false ;; "away") message=$(_ts_control_get_message) teamspeak-query-lib move "Away From Keyboard" teamspeak-query-lib update --away "$message" teamspeak-query-lib update --microphone=false --speakers=false --away "$message" ;; "back") teamspeak-query-lib update --back _ts_control_move_self "$2" teamspeak-query-lib update --microphone=true --speakers=true ;; "message") message=$(_ts_control_get_message "$2") teamspeak-query-lib message "$message" ;; "message-user") user=$(_ts_control_get_entity client "$2") message=$(_ts_control_get_message "$3") teamspeak-query-lib message --strict-client --client "$user" "$message" ;; "events") teamspeak-query-lib events --filter=others NotifyClientMoved NotifyClientEnterView NotifyClientLeftView NotifyTextMessage NotifyClientPoke \ | jq -r --unbuffered '.message' \ | tee >(xargs -I{} notify-send "TS3 Event" "{}") ;; "ntfy-events") teamspeak-query-lib events --filter=others NotifyClientPoke NotifyTextMessage \ | handle_ntfy_events ;; esac