obedy/discord-webhook.sh

191 lines
5.5 KiB
Bash
Executable File

#!/usr/bin/bash
#### SET PATHS ####
# Get path to where script is located.
scriptPath=$(echo "${0%/*}")
# Set other paths.
limitCheckScrip=${scriptPath}/discord-webhook-data-limit-check.sh
lastMessageFile=${scriptPath}/discord-webhook-last-message.json
#### SCRIP USAGE FUNCTION ####
# Usage function.
usage() {
echo ""
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -c, --content <content> Set the content of the Discord message."
echo " -e, --embeds <embeds> Set the embeds of the Discord message."
echo " -f, --file <file-path> Set the file attachment path (optional)."
echo " -d, --debug Turns on console output"
echo " -h, --help Show this help message and exit."
echo ""
echo "Refer to the Discord documentation for more information on Webhooks"
echo ""
echo " https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks"
echo ""
}
### SEND WEBHOOK FUNCTION ###
# Send Discord notification with or without payloaad.
sendWebhook() {
local discordJsonData="$1"
local includeAttachment="$2"
# Write last message that was attmepted to be sent to file
echo "${discordJsonData}" > ${lastMessageFile}
# Check if attachment pathe exits and if is should be included in the message
if [ -z "${discordAttachmentPath}" ] || [ "${includeAttachment}" = "false" ]; then
# Send message without attachment
echo ${discordWebhookBase}"/"${discordID}"/"${discordToken}
echo "$discordJsonData"
response=$(curl -H "Content-Type: application/json" -d "$discordJsonData" ${discordWebhookBase}"/"${discordID}"/"${discordToken})
else
# Send message with attachment
response=$(curl -s -F payload_json="${discordJsonData}" -F "file1=@${discordAttachmentPath}" ${discordWebhookBase}"/"${discordID}"/"${discordToken})
fi
# Check if curl was successful
if [ $? -ne 0 ]; then
echo "Error: Failed to send webhook message." >&2
exit 1
fi
# Output curl reposnse if debug enabled
[ ${debug} ] && echo "${response}" >&2
}
#### PARSE ARGUMENTS ####
# Parsed from command line arguments.
while [[ $# -gt 0 ]]; do
case "$1" in
-c|--content)
discordMessageContent="$2"
shift 2
;;
-e|--embeds)
discordMessageEmbeds="$2"
shift 2
;;
-f|--file)
discordAttachmentPath="$2"
shift 2
;;
-d|--debug)
debug=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Invalid option: $1" >&2
usage
exit 1
;;
esac
done
# Check if JSON is provided and not empty
if [ -z "${discordMessageContent}" ] && [ -z "${discordMessageEmbeds}" ]; then
echo "Error: Either a message 'content' or message 'embed' is required." >&2
usage
exit 1
fi
#### DISCORD VARIABLES ####
# Discord webhook address base.
discordWebhookBase="https://discord.com/api/webhooks"
# Import secret variables.
source ${scriptPath}/discord-variables.sh
# Discord secret variables.
discordToken=${DISCORD_TOKEN}
discordID=${DISCORD_ID}
discordUsername=${DISCORD_USER}
discordAvatarURL=${DISCORD_AVATAR_URL}
discordRoleID=${DISCORD_ROLE_ID}
#### REPLACE ROLES ####
# Replace @admin mention with correct ID.
discordMessageEmbeds=$(echo "${discordMessageEmbeds}" | sed 's/\@admin/\<\@\&'${discordRoleID}'/g')
#### BUILD DISCORD MESSAGE ####
# Complete the Discord JSON string.
discordJson='{
"username":"'"${discordUsername}"'",
"content":"'"${discordMessageContent}"'",
"avatar_url":"'"${discordAvatarURL}"'",
"embeds": [ '${discordMessageEmbeds%?}' ]
}'
#### MESSAGE LIMIT CHECK & SEND ####
# Call script to perform limit checks (pass on debug argument if debug enabled)
${limitCheckScrip} -m "${discordJson}" ${debug:+-d}
# Send full, split or drop message based in limit check
case ${?} in
# Send full message
0)
# Output info if debug enabled
[ ${debug} ] && echo "Content within limits. Sending full webhook message." >&2
# Send full Json
sendWebhook "${discordJson}" true
;;
# Split message in multiple webhooks
1)
# Output info if debug enabled
[ ${debug} ] && echo "Content to large, but within manageable limits. Splitting webhook message" >&2
# Remove embeds section
discordJsonMinusEmbeds=$(jq "del(.embeds)" <<< "${discordJson}")
# Send message without embeds
sendWebhook "${discordJsonMinusEmbeds}" true
# Get number of embeds in original message
embedsCount=$(jq ".embeds | length" <<< "${discordJson}")
# Send each embed as a separate message
for (( index=0; index<$embedsCount; index++ )); do
# Get current embed in embeds section
embed=$(jq ".embeds[$index]" <<< "${discordJson}")
# Replace embeds in orignal message with current single embed and remove content section
discordJsonSingleEmbed=$(jq ".embeds=[$embed] | del(.content)" <<< "${discordJson}")
# Send message with single embed and without the rest of the data
sendWebhook "${discordJsonSingleEmbed}" false
done
;;
# Drop message and exit with error
*)
echo "Error: Limit check failed or content outside manageable limits. Unable to send webhook." >&2
exit 1
;;
esac