1
0
Fork 0
golang-github-nicholas-fedo.../pkg/services/telegram/telegram.go
Daniel Baumann c0c4addb85
Adding upstream version 0.8.9.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-22 10:16:14 +02:00

89 lines
2.3 KiB
Go

package telegram
import (
"errors"
"fmt"
"net/url"
"github.com/nicholas-fedor/shoutrrr/pkg/format"
"github.com/nicholas-fedor/shoutrrr/pkg/services/standard"
"github.com/nicholas-fedor/shoutrrr/pkg/types"
)
// apiFormat defines the Telegram API endpoint template.
const (
apiFormat = "https://api.telegram.org/bot%s/%s"
maxlength = 4096
)
// ErrMessageTooLong indicates that the message exceeds the maximum allowed length.
var (
ErrMessageTooLong = errors.New("Message exceeds the max length")
)
// Service sends notifications to configured Telegram chats.
type Service struct {
standard.Standard
Config *Config
pkr format.PropKeyResolver
}
// Send delivers a notification message to Telegram.
func (service *Service) Send(message string, params *types.Params) error {
if len(message) > maxlength {
return ErrMessageTooLong
}
config := *service.Config
if err := service.pkr.UpdateConfigFromParams(&config, params); err != nil {
return fmt.Errorf("updating config from params: %w", err)
}
return service.sendMessageForChatIDs(message, &config)
}
// Initialize configures the service with a URL and logger.
func (service *Service) Initialize(configURL *url.URL, logger types.StdLogger) error {
service.SetLogger(logger)
service.Config = &Config{
Preview: true,
Notification: true,
}
service.pkr = format.NewPropKeyResolver(service.Config)
if err := service.Config.setURL(&service.pkr, configURL); err != nil {
return err
}
return nil
}
// GetID returns the identifier for this service.
func (service *Service) GetID() string {
return Scheme
}
// sendMessageForChatIDs sends the message to all configured chat IDs.
func (service *Service) sendMessageForChatIDs(message string, config *Config) error {
for _, chat := range service.Config.Chats {
if err := sendMessageToAPI(message, chat, config); err != nil {
return err
}
}
return nil
}
// GetConfig returns the current configuration for the service.
func (service *Service) GetConfig() *Config {
return service.Config
}
// sendMessageToAPI sends a message to the Telegram API for a specific chat.
func sendMessageToAPI(message string, chat string, config *Config) error {
client := &Client{token: config.Token}
payload := createSendMessagePayload(message, chat, config)
_, err := client.SendMessage(&payload)
return err
}