name: Discord โ€” New Issue Notification on: issues: types: [opened] jobs: notify: runs-on: ubuntu-latest steps: - name: Send issue to Discord env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_ISSUES }} ISSUE_NUMBER: ${{ github.event.issue.number }} ISSUE_TITLE: ${{ github.event.issue.title }} ISSUE_URL: ${{ github.event.issue.html_url }} ISSUE_BODY: ${{ github.event.issue.body }} ISSUE_USER: ${{ github.event.issue.user.login }} ISSUE_AVATAR: ${{ github.event.issue.user.avatar_url }} ISSUE_CREATED_AT: ${{ github.event.issue.created_at }} REPO: ${{ github.repository }} LABELS_JSON: ${{ toJson(github.event.issue.labels) }} run: | python3 - <<'PYEOF' import json, os, urllib.request number = os.environ["ISSUE_NUMBER"] title = os.environ["ISSUE_TITLE"] url = os.environ["ISSUE_URL"] body = os.environ.get("ISSUE_BODY") or "" user = os.environ["ISSUE_USER"] avatar = os.environ["ISSUE_AVATAR"] repo = os.environ["REPO"] created_at = os.environ["ISSUE_CREATED_AT"] webhook = os.environ["DISCORD_WEBHOOK"] # Truncate body short_body = body[:300] + ("..." if len(body) > 300 else "") if not short_body.strip(): short_body = "*(no description)*" # Labels try: labels_raw = json.loads(os.environ.get("LABELS_JSON", "[]")) labels = ", ".join(f"`{l['name']}`" for l in labels_raw) if labels_raw else "*(none)*" except Exception: labels = "*(none)*" payload = { "content": "@everyone ๐Ÿ“ข **New issue reported on Velxio!**", "embeds": [{ "title": f"๐Ÿ› Issue #{number}: {title}", "url": url, "description": short_body, "color": 0xE74C3C, "fields": [ { "name": "๐Ÿ“ฆ Repository", "value": f"[`{repo}`](https://github.com/{repo})", "inline": True }, { "name": "๐Ÿท๏ธ Labels", "value": labels, "inline": True } ], "author": { "name": user, "url": f"https://github.com/{user}", "icon_url": avatar }, "footer": {"text": "Velxio ยท GitHub Issues"}, "timestamp": created_at }] } data = json.dumps(payload).encode() req = urllib.request.Request( webhook, data=data, headers={"Content-Type": "application/json"}, method="POST" ) try: with urllib.request.urlopen(req) as resp: print(f"Discord response: {resp.status}") except urllib.error.HTTPError as e: body_err = e.read().decode() print(f"Discord error: {e.code} {e.reason} โ€” {body_err}") raise SystemExit(1) PYEOF