smpp-otp/internal/infrastructure/smpp.go

70 lines
1.5 KiB
Go

package smpp
import (
"log"
"log/slog"
"os"
"smpp-otp/internal/config"
"smpp-otp/pkg/lib/logger"
"time"
"github.com/fiorix/go-smpp/smpp"
"github.com/fiorix/go-smpp/smpp/pdu"
"github.com/fiorix/go-smpp/smpp/pdu/pdutext"
)
type SMPPClient struct {
Transceiver *smpp.Transceiver
}
func NewSMPPClient(cfg *config.Config) (*SMPPClient, error) {
logger, err := logger.SetupLogger(cfg.Env)
if err != nil {
slog.Error("failed to set up logger: %v", err)
os.Exit(1)
}
smppCfg := cfg.SMPP
var tx *smpp.Transceiver
for {
tx = &smpp.Transceiver{
Addr: smppCfg.Addr,
User: smppCfg.User,
Passwd: smppCfg.Pass,
Handler: func(p pdu.Body) {},
}
connStatus := tx.Bind()
status := <-connStatus
if status.Status() == smpp.Connected {
logger.InfoLogger.Info("Connected to SMPP server.")
break
} else {
logger.ErrorLogger.Error("Failed to connect:", status.Error())
logger.InfoLogger.Info("Retrying in 5 seconds...")
time.Sleep(5 * time.Second) // Wait for 5 seconds before retrying
}
}
return &SMPPClient{Transceiver: tx}, nil
}
func (c *SMPPClient) SendSMS(cfg *config.Config, dest, text string) error {
src := cfg.SMPP.Src_Phone_Number
params := &smpp.ShortMessage{
Src: src,
Dst: dest,
Text: pdutext.Raw(text),
Register: 0, // No delivery receipt
}
resp, err := c.Transceiver.Submit(params)
if err != nil {
log.Println("Failed to send SMS:", err)
return err
}
log.Println("SMS sent successfully, response:", resp)
return nil
}