mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-06-07 07:55:16 +02:00
fix: slack message body
This commit is contained in:
parent
02becc7fff
commit
cab288bb60
2 changed files with 192 additions and 22 deletions
168
scripts/prepare-slack-message.sh
Normal file
168
scripts/prepare-slack-message.sh
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
#!/bin/bash
|
||||
set -e # Exit on any error
|
||||
|
||||
# Debug logging function
|
||||
log_debug() {
|
||||
echo "[DEBUG] $1" >&2
|
||||
}
|
||||
|
||||
log_debug "Script started with arguments count: $#"
|
||||
|
||||
# Get discussion data from environment variables or command line arguments
|
||||
if [ -n "$DISCUSSION_TITLE" ] && [ -n "$DISCUSSION_BODY" ] && [ -n "$DISCUSSION_URL" ]; then
|
||||
# Use environment variables (preferred for GitHub Actions)
|
||||
TITLE="$DISCUSSION_TITLE"
|
||||
BODY="$DISCUSSION_BODY"
|
||||
URL="$DISCUSSION_URL"
|
||||
log_debug "Using environment variables"
|
||||
else
|
||||
# Fall back to command line arguments
|
||||
TITLE="$1"
|
||||
BODY="$2"
|
||||
URL="$3"
|
||||
log_debug "Using command line arguments"
|
||||
fi
|
||||
|
||||
if [ -z "$TITLE" ] || [ -z "$BODY" ] || [ -z "$URL" ]; then
|
||||
log_debug "Missing required data"
|
||||
echo "Usage: Set DISCUSSION_TITLE, DISCUSSION_BODY, DISCUSSION_URL env vars or pass as args: $0 <title> <body> <url>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_debug "Title length: ${#TITLE}"
|
||||
log_debug "Body length: ${#BODY}"
|
||||
log_debug "URL: $URL"
|
||||
|
||||
# Function to escape JSON strings
|
||||
escape_json() {
|
||||
# Use python for reliable JSON escaping
|
||||
python3 -c "
|
||||
import json
|
||||
import sys
|
||||
text = sys.stdin.read().rstrip('\n\r') # Remove trailing newline and carriage return from stdin
|
||||
print(json.dumps(text)[1:-1], end='') # Remove outer quotes
|
||||
" <<< "$1"
|
||||
}
|
||||
|
||||
# Function to convert GitHub markdown to Slack mrkdwn format
|
||||
convert_to_slack_format() {
|
||||
local text="$1"
|
||||
log_debug "Starting markdown conversion"
|
||||
|
||||
# First remove all carriage returns to prevent formatting issues
|
||||
log_debug "Removing carriage returns"
|
||||
text=$(echo "$text" | tr -d '\r')
|
||||
|
||||
# Convert headers (## Header -> *Header*)
|
||||
log_debug "Converting headers"
|
||||
text=$(echo "$text" | sed -E 's/^#{1,6}[[:space:]]+(.+)$/*\1*/g')
|
||||
|
||||
# Handle code blocks carefully - leave them as triple backticks
|
||||
log_debug "Preserving code blocks"
|
||||
|
||||
# Convert inline code (`code` -> `code`)
|
||||
log_debug "Converting inline code"
|
||||
text=$(echo "$text" | sed -E 's/`([^`\n]+)`/`\1`/g')
|
||||
|
||||
# Convert HTML breaks to newlines
|
||||
log_debug "Converting HTML breaks"
|
||||
text=$(echo "$text" | sed -E 's/<br[[:space:]]*\/?>/\n/gi')
|
||||
|
||||
# Convert markdown links [text](url) to Slack format <url|text>
|
||||
log_debug "Converting markdown links"
|
||||
text=$(echo "$text" | sed -E 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g')
|
||||
|
||||
# Convert bold text to Slack format
|
||||
log_debug "Converting bold text"
|
||||
text=$(echo "$text" | sed -E 's/\*\*([^*]+)\*\*/*\1*/g')
|
||||
|
||||
# Clean up excessive newlines
|
||||
log_debug "Cleaning up newlines"
|
||||
text=$(echo "$text" | sed -E 's/\n\n\n+/\n\n/g')
|
||||
|
||||
log_debug "Markdown conversion completed"
|
||||
echo "$text"
|
||||
}
|
||||
|
||||
# Convert body to Slack format
|
||||
log_debug "Converting body to Slack format"
|
||||
SLACK_BODY=$(convert_to_slack_format "$BODY")
|
||||
log_debug "Slack body length after conversion: ${#SLACK_BODY}"
|
||||
|
||||
# Truncate if too long (Slack limit)
|
||||
MAX_LENGTH=2500
|
||||
if [ ${#SLACK_BODY} -gt $MAX_LENGTH ]; then
|
||||
log_debug "Truncating body from ${#SLACK_BODY} to $MAX_LENGTH characters"
|
||||
SLACK_BODY="${SLACK_BODY:0:$MAX_LENGTH}...\n\n_View full announcement on GitHub_"
|
||||
fi
|
||||
|
||||
# Escape JSON strings
|
||||
log_debug "Escaping JSON strings"
|
||||
TITLE_ESCAPED=$(escape_json "$TITLE")
|
||||
SLACK_BODY_ESCAPED=$(escape_json "$SLACK_BODY")
|
||||
URL_ESCAPED=$(escape_json "$URL")
|
||||
|
||||
log_debug "Title escaped length: ${#TITLE_ESCAPED}"
|
||||
log_debug "Slack body escaped length: ${#SLACK_BODY_ESCAPED}"
|
||||
|
||||
# Create Slack payload JSON
|
||||
log_debug "Creating Slack payload JSON"
|
||||
PAYLOAD=$(cat <<EOF
|
||||
{
|
||||
"text": "New Announcement: $TITLE_ESCAPED",
|
||||
"blocks": [
|
||||
{
|
||||
"type": "header",
|
||||
"text": {
|
||||
"type": "plain_text",
|
||||
"text": "📢 New Announcement",
|
||||
"emoji": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "*$TITLE_ESCAPED*"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "$SLACK_BODY_ESCAPED"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "<$URL_ESCAPED|View full discussion on GitHub>"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
)
|
||||
|
||||
log_debug "Payload created successfully, length: ${#PAYLOAD}"
|
||||
|
||||
# Validate JSON syntax
|
||||
if echo "$PAYLOAD" | jq empty 2>/dev/null; then
|
||||
log_debug "JSON payload is valid"
|
||||
else
|
||||
log_debug "WARNING: JSON payload may be invalid"
|
||||
fi
|
||||
|
||||
# Always output to stdout - let the YAML workflow handle GITHUB_OUTPUT
|
||||
log_debug "Outputting payload to stdout"
|
||||
log_debug "Payload first 100 chars: ${PAYLOAD:0:100}..."
|
||||
echo "$PAYLOAD"
|
||||
|
||||
log_debug "Script completed successfully"
|
||||
Loading…
Add table
Add a link
Reference in a new issue