You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.9 KiB
139 lines
4.9 KiB
#!/bin/bash
|
|
|
|
# Send message to a matrix room. API call looks like this:
|
|
# curl -XPOST -d '{"msgtype":"m.text", "body":"hello"}' "http://matrix.org/_matrix/client/api/v1/rooms/%21CvcvRuDYDzTOzfKKgh%3Alocalhost/send/m.room.message?access_token=YOUR_ACCESS_TOKEN"
|
|
|
|
log ()
|
|
{
|
|
if [[ $1 == "debug" ]]; then
|
|
echo "DEBUG: $2"
|
|
fi
|
|
}
|
|
|
|
set -e
|
|
# workaround for directory not existing before get in 3.0.0
|
|
mkdir -p "${1}"
|
|
cd "${1}"
|
|
|
|
exec 3>&1
|
|
exec 1>&2
|
|
|
|
# for jq
|
|
PATH=/usr/local/bin:$PATH
|
|
|
|
payload=$(mktemp /tmp/resource-in.XXXXXX)
|
|
|
|
cat > "${payload}" <&0
|
|
|
|
version=$(cat /opt/resource/version)
|
|
echo "Matrix-Notification-Resource Version: ${version}"
|
|
|
|
matrix_server_url="$(jq -r '.source.matrix_server_url' < "${payload}")"
|
|
token="$(jq -r '.source.token' < "${payload}")"
|
|
room_id="$(jq -r '.source.room_id' < "${payload}")"
|
|
msgtype="$(jq -r '.source.msgtype // "m.notice"' < "${payload}")"
|
|
data_file="$(jq -r '.source.data_file // ""' < "${payload}")"
|
|
|
|
ts="$(date +%s)"
|
|
|
|
matrix_endpoint="$matrix_server_url/_matrix/client/r0/rooms/$room_id/send/m.room.message/$ts?access_token=$token"
|
|
|
|
text_file="$(jq -r '.params.text_file // ""' < "${payload}")"
|
|
thisdata_file="$(jq -r '.params.data_file // ""' < "${payload}")"
|
|
[[ -n $thisdata_file && $thisthisdata_file != $data_file ]] && data_file="${thisdata_file}"
|
|
from="$(jq -r '.params.from // ""' < "${payload}")"
|
|
trigger="$(jq -r '.params.trigger // ""' < "${payload}")"
|
|
text="$(jq -r '(.params.text // "${TEXT_FILE_CONTENT}")' < "${payload}")"
|
|
thismsgtype="$(jq -r '.params.msgtype // ""' < "${payload}")"
|
|
[[ -n $thismsgtype && $thismsgtype != $msgtype ]] && msgtype="${thismsgtype}"
|
|
|
|
always_notify="$(jq -r '.params.always_notify // "false"' < "${payload}")"
|
|
debug="$(jq -r '.params.debug // ""' < "${payload}")"
|
|
silent="$(jq -r '.params.silent // "true"' < "${payload}")"
|
|
link="$(jq -r '.params.link // "false"' < "${payload}")"
|
|
team="$(jq -r '.params.team // "main"' < "${payload}")"
|
|
prefix="$(jq -r '.params.prefix // ""' < "${payload}")"
|
|
is_html="$(jq -r '.params.is_html // "false"' < "${payload}")"
|
|
|
|
log("$debug", "$(jq '.' < "${payload}")")
|
|
|
|
TEXT_FILE_CONTENT=""
|
|
[[ -n "${text_file}" && ! -f "${text_file}" ]] && TEXT_FILE_CONTENT="_(text_file not found)_"
|
|
if [[ -n "${text_file}" && -f "${text_file}" ]]; then
|
|
TEXT_FILE_CONTENT="$(cat "${text_file}")"
|
|
TEXT_FILE_CONTENT="${TEXT_FILE_CONTENT:-_(text_file empty)_}"
|
|
fi
|
|
|
|
DATA_FILE_CONTENT=""
|
|
[[ -n "${data_file}" && -f "${data_file}" ]] && DATA_FILE_CONTENT="$(cat "${data_file}")"
|
|
|
|
if [[ "$always_notify" == "true" || -n "$TEXT_FILE_CONTENT" || -z "$text_file" || -n "$DATA_FILE_CONTENT" ]]
|
|
then
|
|
export TEXT_FILE_CONTENT="${TEXT_FILE_CONTENT:-_(text_file not provided)_}"
|
|
|
|
text=$(echo -en "${text}" | envsubst)
|
|
[[ -z "${text}" ]] && text="_(missing notification text)_"
|
|
|
|
# If link is set, wrap the text in a link
|
|
[ "${link}" == "true" ] && formatted_body="<a href=\"$ATC_EXTERNAL_URL/teams/${team}/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME\">${text}</a>"
|
|
# If prefix is set formatted_body
|
|
if [ -n "$prefix" ]; then
|
|
prefix=$(echo "$prefix" | envsubst)
|
|
text="${prefix}: ${text}"
|
|
[ -n "${formatted_body}" ] && formatted_body="${prefix}: ${formatted_body}"
|
|
fi
|
|
|
|
if [[ -z "${formatted_body}" && "${is_html}" == "true" ]]; then
|
|
formatted_body="${text}"
|
|
log("$debug", "formatted_body=${formatted_body}")
|
|
fi
|
|
|
|
text=$(echo -n "${text}" | jq -R -s .)
|
|
[ -n "${formatted_body}" ] && formatted_body=$(echo -n "${formatted_body}" | jq -R -s .)
|
|
|
|
[[ "${token}" != "null" ]] && username=$(echo "$token" | envsubst | jq -R -s .)
|
|
[[ "${room_id}" != "null" ]] && room_id=$(echo "$room_id" | envsubst | jq -R -s .)
|
|
body="$(cat <<EOF
|
|
{
|
|
"msgtype": "${msgtype}",
|
|
"body": ${text}
|
|
}
|
|
EOF
|
|
)"
|
|
# if [ "${msgtype}" != "m.notice" ]; then
|
|
# we can attach custom data...
|
|
builddata="$(cat <<EOF
|
|
{
|
|
"build_job_name": "${BUILD_JOB_NAME}",
|
|
"build_name": "${BUILD_NAME}",
|
|
"build_pipeline_name": "${BUILD_PIPELINE_NAME}",
|
|
"build_team_name": "${BUILD_TEAM_NAME}",
|
|
"build_id": "${BUILD_ID}",
|
|
"atc_external_url": "${ATC_EXTERNAL_URL}"
|
|
}
|
|
EOF
|
|
)"
|
|
body=$(echo -n "$body" | jq -c ".build=$builddata")
|
|
if [ -n "${formatted_body}" ]; then
|
|
body=$(echo -n "$body" | jq -c ".formatted_body=$formatted_body")
|
|
body=$(echo -n "$body" | jq -c ".format=\"org.matrix.custom.html\"")
|
|
fi
|
|
if [ -n "$DATA_FILE_CONTENT" ]; then
|
|
body=$(echo -n "$body" | jq -c ".data=$DATA_FILE_CONTENT")
|
|
fi
|
|
if [ -n "${trigger}" ]; then
|
|
body=$(echo -n "$body" | jq -c ".trigger=\"${trigger}\"")
|
|
fi
|
|
|
|
compact_body=$(echo -n "${body}" | jq -c '.')
|
|
|
|
if [[ "$silent" == "true" ]]
|
|
then
|
|
echo "Using silent output"
|
|
curl -s -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d "${compact_body}" "${matrix_endpoint}"
|
|
else
|
|
curl -v -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d "${compact_body}" "${matrix_endpoint}"
|
|
fi
|
|
fi
|
|
|
|
jq -n "{version:{timestamp:\"$(date +%s)\"}}" >&3
|