1
0
mirror of https://github.com/chapvic/telegram-notify.git synced 2025-04-18 02:17:36 +03:00
telegram-notify/main.go
2024-06-29 19:44:51 +03:00

143 lines
3.8 KiB
Go

package main
import (
"fmt"
"log"
"os"
"strings"
"strconv"
"context"
"github.com/go-telegram/bot"
"github.com/go-telegram/bot/models"
"github.com/JohannesKaufmann/html-to-markdown/escape"
)
var (
icons = map[string] string {
"success": "✅",
"failure": "🔴",
"cancelled": "❌",
"info": "🔔",
}
// Init zero value for ChatID
chat_id = 0
// Arguments list
token = os.Getenv("INPUT_TOKEN") // required
chat = os.Getenv("INPUT_CHAT") // required
status = os.Getenv("INPUT_STATUS") // recommended
title = os.Getenv("INPUT_TITLE") // optional
message = os.Getenv("INPUT_MESSAGE") // optional
footer = os.Getenv("INPUT_FOOTER") // optional
// Github enviroment variables
actor = os.Getenv("GITHUB_ACTOR") // who's made a commit
server = os.Getenv("GITHUB_SERVER_URL") // git-server
workflow = os.Getenv("GITHUB_WORKFLOW") // workflow name
repo = os.Getenv("GITHUB_REPOSITORY") // repository name
commit = os.Getenv("GITHUB_SHA") // commit message
// Format template for title
fmt_title = "%s %s *%s*" // icon, message, status
)
func main() {
log.Printf("🚀 Starting Telegram Notify...")
s := false
if token == "" {
log.Printf(" ⚡ Token is required!")
s = true
}
if chat == "" {
log.Printf(" ⚡ Chat ID is required!")
s = true
}
if s == true {
fatal("Notification was interrupted!")
}
// Prepare ChatID numeric value (int64)
chat_id, err := strconv.ParseInt(chat, 10, 64)
if err != nil {
fatal(err)
}
// Make status icon text
log.Printf(" - Check status message and create icon")
if status == "" {
warning("Status is not given! Set to 'info'...")
status = "info"
} else if status != "success" && status != "failure" && status != "cancelled" {
warning(fmt.Sprintf("Invalid status %v! Set to 'info'...", status))
status = "info"
}
icon := icons[strings.ToLower(status)]
workflow = escape.MarkdownCharacters(workflow)
title = escape.MarkdownCharacters(title)
message = escape.MarkdownCharacters(message)
footer = escape.MarkdownCharacters(footer)
// Make title text
m_title := ""
log.Printf(" - Create notification title")
if title == "" {
m_title = fmt.Sprintf(fmt_title, icon, workflow, status)
} else {
m_title = fmt.Sprintf(fmt_title, icon, title, status)
}
msg := fmt.Sprintf("%s", m_title)
// Append message text
log.Printf(" - Prepare notification message")
if message != "" {
msg = fmt.Sprintf("%v\n%v", msg, message)
} else {
warning("No message given! Using default notification message...")
m_commit := fmt.Sprintf("💬 Commit: [%v](%v/%v/commit/%v)", "open link", server, repo, commit)
msg = fmt.Sprintf("%v\n%v", msg, m_commit)
}
// Append footer text
if footer != "" {
msg = fmt.Sprintf("%v\n%v", msg, footer)
}
// Sending notification message
log.Printf("📢 Sending notification message...")
opts := []bot.Option{}
b, err := bot.New(token, opts...)
if err != nil {
fatal(err)
}
_, err = b.SendMessage(context.TODO(), &bot.SendMessageParams{
ChatID: chat_id,
Text: msg,
ParseMode: models.ParseModeMarkdown,
})
if err != nil {
fatal(err)
}
log.Printf("✅ Success!")
}
// Output fatal message and terminate
func fatal(msg any) {
log.Fatal(fmt.Sprintf(`❗ Fatal: %s`, msg))
}
// Output warning message
func warning(msg any) {
log.Printf(fmt.Sprintf(`⚠️ Warning: %s`, msg))
}