Using the Shoutrrr Package¶
Overview¶
The Shoutrrr Go package (github.com/circa10a/shoutrrr) enables sending notifications to various services (e.g., discord, slack, telegram, smtp, etc.) using service URLs. It provides two primary methods: a direct Send function for simple use cases and a Sender struct for advanced scenarios with multiple URLs, message queuing, and parameter customization.
Usage¶
Go Import Statement
import "github.com/circa10a/shoutrrr"
Direct Send¶
Sends a notification to a single service URL with an optional parameters map.
- Function:
shoutrrr.Send(url string, message string, params ...map[string]string) []error - Behavior: Initializes a service from the provided URL, sends the message, and returns any errors. If a
paramsmap is provided, it customizes the notification (e.g., setting a title).
Example
Send to a Single Slack URL
url := "slack://token-a/token-b/token-c"
errs := shoutrrr.Send(url, "Hello, Slack!")
if len(errs) > 0 {
// Handle errors
for _, err := range errs {
fmt.Println("Error:", err)
}
}
Sender¶
Creates a Sender (*ServiceRouter) to manage multiple service URLs, support message queuing, and allow parameter customization.
- Function:
shoutrrr.CreateSender(urls ...string) (*ServiceRouter, error) - Methods:
Send(message string, params map[string]string) []error: Sends a message to all configured services.Enqueue(message string, a ...interface{}): Queues a formatted message for later sending.Flush(params map[string]string) []error: Sends all queued messages and resets the queue.- Behavior: Deduplicates URLs, initializes services, and supports asynchronous sending with a 10-second timeout per service.
Example
Create Sender with Multiple URLs
urls := []string{
"slack://token-a/token-b/token-c",
"telegram://110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw@telegram?channels=@mychannel",
}
sender, err := shoutrrr.CreateSender(urls...)
if err != nil {
log.Fatal(err)
}
params := map[string]string{"title": "Test Notification"}
errs := sender.Send("Hello, world!", params)
if len(errs) > 0 {
for _, err := range errs {
fmt.Println("Error:", err)
}
}
Message Queuing¶
Allows queuing messages for deferred sending, useful for aggregating notifications during a process.
- Queues messages with
Enqueueand sends them withFlush. Queued messages use theparamsprovided duringFlush.
Example
Queue and Flush Notifications
url := "discord://abc123@123456789"
sender, err := shoutrrr.CreateSender(url)
if err != nil {
log.Fatal(err)
}
defer sender.Flush(map[string]string{"title": "Work Result"})
sender.Enqueue("Started doing work")
if err := doWork(); err != nil {
sender.Enqueue("Error: %v", err)
return
}
sender.Enqueue("Work completed successfully!")
Examples¶
Send with Parameters and Error Handling¶
Example
Send with Title and Error Handling
url := "discord://abc123@123456789"
params := map[string]string{"title": "Alert"}
errs := shoutrrr.Send(url, "System alert!", params)
if len(errs) > 0 {
for _, err := range errs {
fmt.Println("Error:", err)
}
}
Expected Output (Success)
(No output on success)
Expected Output (Error)
Error: failed to send message: unexpected response status code
Send to Multiple Services with Queuing¶
Example
Queue Messages for Multiple Services
urls := []string{
"slack://token-a/token-b/token-c",
"discord://abc123@123456789",
}
sender, err := shoutrrr.CreateSender(urls...)
if err != nil {
log.Fatal(err)
}
start := time.Now()
defer sender.Flush(map[string]string{"title": "Task Summary"})
sender.Enqueue("Task started")
time.Sleep(time.Second)
sender.Enqueue("Task finished in %v", time.Now().Sub(start))
Expected Output (Success)
(No output on success)
Expected Output (Error)
Error: failed to initialize service: invalid URL format
Notes¶
- Error Handling: Both
SendandSender.Sendreturn a slice of errors, one per service. Checklen(errs) > 0to handle failures. - Parameters: The
paramsmap supports service-specific options (e.g.,titlefor Discord, Slack). Useshoutrrr docsto view supported parameters for each service. - Timeouts: Each service send operation has a 10-second timeout.
- Deduplication: Duplicate URLs are automatically removed when creating a
Sender.