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