110 lines
3.1 KiB
Go
110 lines
3.1 KiB
Go
package broadcaster
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log/slog"
|
|
"strings"
|
|
"time"
|
|
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
|
"git.maximotejeda.com/maximo/us-dop-bot/internal/application/domain"
|
|
"git.maximotejeda.com/maximo/us-dop-bot/internal/application/helpers"
|
|
"git.maximotejeda.com/maximo/us-dop-bot/internal/ports"
|
|
)
|
|
|
|
type Broadcaster struct {
|
|
ctx context.Context
|
|
log *slog.Logger
|
|
user ports.UserService
|
|
dolar ports.DolarService
|
|
data []byte
|
|
botName string
|
|
}
|
|
|
|
type Message struct {
|
|
Message string `json:"message"`
|
|
Data change `json:"data"`
|
|
Error error `json:"error"`
|
|
}
|
|
type change struct {
|
|
Before *domain.History `json:"before"`
|
|
After *domain.History `json:"after"`
|
|
}
|
|
|
|
func NewBroadCast(ctx context.Context, user ports.UserService, dolar ports.DolarService, data []byte) *Broadcaster {
|
|
log := slog.Default()
|
|
log = log.With("place", "broadcast")
|
|
return &Broadcaster{
|
|
ctx: ctx,
|
|
user: user,
|
|
dolar: dolar,
|
|
data: data,
|
|
log: log,
|
|
}
|
|
}
|
|
|
|
func (b *Broadcaster) SendList() []tgbotapi.MessageConfig {
|
|
// convert data to map
|
|
m := Message{}
|
|
listMsg := []tgbotapi.MessageConfig{}
|
|
err := json.Unmarshal(b.data, &m)
|
|
if err != nil {
|
|
b.log.Error("unmarshaling data", "error", err)
|
|
}
|
|
if strings.Contains(m.Message, "change") && m.Error == nil {
|
|
|
|
userList, err := b.dolar.GetSubscribedUsers(m.Data.After.Institution.Name)
|
|
if err != nil {
|
|
b.log.Error("querying DB data", "error", err)
|
|
return nil
|
|
}
|
|
cancelBTN := map[string]string{}
|
|
cancelBTN["Eliminar ❌"] = "cancelar=true"
|
|
keyboard := helpers.CreateKeyboard(cancelBTN)
|
|
b.log.Info("printing change", "user list", userList, "name", m.Data.After.Institution.Name, "data", m.Data.After)
|
|
compraCHG := comparer(m.Data.Before.Compra, m.Data.After.Compra)
|
|
ventaCHG := comparer(m.Data.Before.Venta, m.Data.After.Venta)
|
|
loc, _ := time.LoadLocation("America/Santo_Domingo")
|
|
text := fmt.Sprintf("Cambio Registrado:\n\nInstitucion: %s\n\t Compra: %.2f %s %.2f\n\t Venta: %.2f %s %.2f\n\n\t %s", m.Data.After.Institution.Name, m.Data.Before.Compra, compraCHG, m.Data.After.Compra, m.Data.Before.Venta, ventaCHG, m.Data.After.Venta, time.Unix(m.Data.After.Parsed, 0).In(loc).Format(time.DateTime))
|
|
|
|
for _, userID := range userList {
|
|
msg := tgbotapi.NewMessage(userID, text)
|
|
msg.ReplyMarkup = keyboard
|
|
listMsg = append(listMsg, msg)
|
|
}
|
|
}
|
|
return listMsg
|
|
}
|
|
|
|
func (b Broadcaster) SendAllUsers(ctx context.Context, log *slog.Logger, data []byte, botname string) []tgbotapi.MessageConfig {
|
|
userList, err := b.user.GetAllBotsUsers(botname)
|
|
b.log.Info("broadcast", "user list", userList)
|
|
msgs := []tgbotapi.MessageConfig{}
|
|
if err != nil {
|
|
return msgs
|
|
}
|
|
cancelBTN := map[string]string{}
|
|
cancelBTN["Eliminar ❌"] = "cancelar=true"
|
|
keyboard := helpers.CreateKeyboard(cancelBTN)
|
|
for _, user := range userList {
|
|
msg := tgbotapi.NewMessage(user.TguID, "")
|
|
msg.Text = string(data)
|
|
msg.ReplyMarkup = keyboard
|
|
msgs = append(msgs, msg)
|
|
}
|
|
return msgs
|
|
}
|
|
|
|
func comparer(before, after float64) string {
|
|
if before > after {
|
|
return "⬇️"
|
|
} else if before < after {
|
|
return "⬆️"
|
|
} else {
|
|
return "🟰"
|
|
}
|
|
|
|
}
|