Archived
1
0
Fork 0
This repository has been archived on 2024-12-18. You can view files and clone it, but cannot push or open issues or pull requests.
flexassistant/notification.go

124 lines
3.3 KiB
Go
Raw Normal View History

package main
import (
"fmt"
"strings"
"github.com/leekchan/accounting"
telegram "github.com/go-telegram-bot-api/telegram-bot-api/v5"
log "github.com/sirupsen/logrus"
)
// Notifier interface to define how to send all kind of notifications
type Notifier interface {
NotifyBalance(miner Miner, difference float64) error
NotifyPayment(miner Miner, payment Payment) error
NotifyBlock(pool Pool, block Block) error
}
// TelegramNotifier to send notifications using Telegram
// Implements the Notifier interface
type TelegramNotifier struct {
bot *telegram.BotAPI
chatID int64
channelName string
}
// NewTelegramNotifier to create a TelegramNotifier
func NewTelegramNotifier(config *TelegramConfig) (*TelegramNotifier, error) {
bot, err := telegram.NewBotAPI(config.Token)
if err != nil {
return nil, err
}
log.Debugf("Connected to Telegram as %s", bot.Self.UserName)
return &TelegramNotifier{
bot: bot,
chatID: config.ChatID,
channelName: config.ChannelName,
}, nil
}
// sendMessage to send a generic message on Telegram
func (t *TelegramNotifier) sendMessage(message string) error {
var request telegram.MessageConfig
if t.chatID != 0 {
request = telegram.NewMessage(t.chatID, message)
} else {
request = telegram.NewMessageToChannel(t.channelName, message)
}
request.DisableWebPagePreview = true
request.ParseMode = telegram.ModeMarkdown
response, err := t.bot.Send(request)
if err != nil {
return err
}
log.Debugf("Message %d sent to Telegram", response.MessageID)
return nil
}
// NotifyBalance to format and send a notification when the unpaid balance has changed
// Implements the Notifier interface
func (t *TelegramNotifier) NotifyBalance(miner Miner) error {
ac := accounting.Accounting{
Symbol: strings.ToUpper(miner.Coin),
Precision: 6,
Format: "%v %s",
}
convertedBalance, err := ConvertCurrency(miner.Coin, miner.Balance)
if err != nil {
return err
}
message := fmt.Sprintf("💰 *Balance* _%s_", ac.FormatMoney(convertedBalance))
return t.sendMessage(message)
}
// NotifyPayment to format and send a notification when a new payment has been detected
// Implements the Notifier interface
func (t *TelegramNotifier) NotifyPayment(miner Miner, payment Payment) error {
ac := accounting.Accounting{
Symbol: strings.ToUpper(miner.Coin),
Precision: 6,
Format: "%v %s",
}
convertedValue, err := ConvertCurrency(miner.Coin, payment.Value)
if err != nil {
return err
}
message := fmt.Sprintf("💵 *Payment* _%s_", ac.FormatMoney(convertedValue))
return t.sendMessage(message)
}
// NotifyBlock to format and send a notification when a new block has been detected
// Implements the Notifier interface
func (t *TelegramNotifier) NotifyBlock(pool Pool, block Block) error {
precision := 6
if pool.Coin == "xch" {
precision = 2
}
ac := accounting.Accounting{
Symbol: strings.ToUpper(pool.Coin),
Precision: precision,
Format: "%v %s",
}
convertedValue, err := ConvertCurrency(pool.Coin, block.Reward)
if err != nil {
return err
}
verb, err := ConvertAction(pool.Coin)
if err != nil {
return err
}
url, err := FormatBlockURL(pool.Coin, block.Hash)
if err != nil {
return err
}
message := fmt.Sprintf("🎉 *%s* [#%.0f](%s) _%s_", verb, block.Number, url, ac.FormatMoney(convertedValue))
return t.sendMessage(message)
}