#!/bin/bash ## A simple script that will update a specific set of Matrix rooms ## with a simple notice message and a custom event depending on ## whether you're busy or not ## Where the below says "url-encoded" it means special characters ## (e.g. "!") are in the url-encoded form (i.e. "%21") # Change the display name, based on the state we want to be in. BUSY_STATE="I am busy right now" FREE_STATE="I am available now" TARGET_STATE="" # Room to test for what the current state is. TEST_ROOM="" MATRIX_SERVER="" ACCESS_TOKEN="" # My ID ME="]=. The label is just ## to help you manage this list. The list below is just an example. ROOM_LIST=([MatrixHQ]=%21OGEhHVWSdvArJzumhm:matrix.org [SynapseAdmins]=%21ehXvUhWNASUkSLvAGP:matrix.org [myTestRoom]=${TEST_ROOM}) usage () { echo "Usage: $(basename ${0}) [ -h | [ -d [ -d ] ] | -q | -b | -f | -t ]" echo echo "Alert a set of matrix rooms that I am either busy and would like not" echo "to be disturbed, or that I am now free." echo echo "Where ..." echo " -h: Print out this help and exit." echo " -d: Debug output (a second -d means extra debug output)." echo " -q: Query the current status." echo " -b: Declare that I am busy regardless of the current status." echo " -f: Declare that I am free regardless of the current status." echo " -t: I'm running a test, don't spam everyone." echo } # Processing command-line options. export DEBUG=N export QUERY_ONLY=N while getopts "dqbfth" opt; do case ${opt} in d) # We want DEBUG output if [ "${DEBUG}" = "N" ]; then DEBUG=Y else set -x fi # if the command-line includes " -d -d" or "-dd" bash -x is used. ;; q) # We're just querying QUERY_ONLY=Y ;; b) # Set to busy regardless TARGET_STATE=${BUSY_STATE} ;; f) # Set to free regardless TARGET_STATE=${FREE_STATE} ;; t) # We're testing something, so we set the ROOM_LIST to just that # one test room. unset ROOM_LIST ROOM_LIST=([myTestRoom]=${TEST_ROOM}) ;; h) # Help! usage exit 0 ;; *) echo "Oops" exit 1 ;; esac done ## org.gibiris.availability is a custom event, as I don't know what ## the deal is with a formal status/availablility event # Learn what the curret display name is. export ACTUAL_STATE=$(curl -s -X GET "${MATRIX_SERVER}/_matrix/client/v3/user/${ME}/rooms/${TEST_ROOM}/account_data/org.gibiris.availability?access_token=${ACCESS_TOKEN}" -H "Accept: application/json" | jq .availability) echo "Current state: ${ACTUAL_STATE}" # If we're only checkin', we're done. if [ "${QUERY_ONLY}" == "Y" ]; then exit 0 fi # If TARGET_STATE isn't set at this point, we're togglin' if [ -z "${TARGET_STATE}" ]; then if [ "${ACTUAL_STATE}" == "\"${FREE_STATE}\"" ]; then echo "You are supposedly free currently." TARGET_STATE="${BUSY_STATE}" elif [ "${ACTUAL_STATE}" == "\"${BUSY_STATE}\"" ]; then echo "You are supposedly busy at the moment." TARGET_STATE="${FREE_STATE}" else echo "We don't know what state you are in" exit 1 fi fi echo "Setting availability to \"${TARGET_STATE}\"." export MATRIX_TXN_ID="$(date '+%s%N')" # Apply the changes for room in ${ROOM_LIST[@]} do echo ${room} curl -X PUT "${MATRIX_SERVER}/_matrix/client/v3/user/${ME}/rooms/${room}/account_data/org.gibiris.availability?access_token=${ACCESS_TOKEN}" -H "Accept: application/json" -H "Content-Type: application/json" -d "{ \"availability\": \"${TARGET_STATE}\" }" curl -X PUT "${MATRIX_SERVER}/_matrix/client/r0/rooms/${room}/send/m.room.message/${MATRIX_TXN_ID}?access_token=${ACCESS_TOKEN}" -H 'Accept: application/json' -H 'Content-Type: application/json' -d "{ \"body\": \"${TARGET_STATE}\", \"msgtype\": \"m.notice\" }" echo; echo sleep 2 done