130 lines
4.2 KiB
Bash
130 lines
4.2 KiB
Bash
|
#!/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="<url-encoded matrix room>"
|
||
|
MATRIX_SERVER="<matrix server where your log in (e.g. https://matrix.org)>"
|
||
|
|
||
|
ACCESS_TOKEN="<an access token for one of your sessions>"
|
||
|
|
||
|
# My ID
|
||
|
ME="<your url-encoded matrix ID (e.g. %40eibhear%3Amatrix.org)"
|
||
|
|
||
|
# An associative array. It's structured this way so that I can quickly
|
||
|
# look to see what each room ID is.
|
||
|
declare -A ROOM_LIST
|
||
|
|
||
|
## The ROOM_LIST is a bash array of room identifiers, each in the
|
||
|
## format of [<label>]=<url-encoded matrix room id>. 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
|