maximo tejeda 0d735735ba
Some checks failed
dev test / test (push) Failing after 29s
dev test / vulnCheck (push) Has been skipped
dev test / Ci-Lint (push) Has been skipped
ADAPT to local git
2024-12-04 22:15:22 -04:00

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 "🟰"
}
}