feat: Initial release (1.0)
Signed-off-by: Julien Riou <julien@riou.xyz>
This commit is contained in:
parent
c318df8bf3
commit
f51679193a
16 changed files with 956 additions and 0 deletions
123
notification.go
Normal file
123
notification.go
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
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)
|
||||
}
|
||||
Reference in a new issue