Aquí tienes un breve resumen de algunos partidos recientes que han captado nuestra atención:
Predicciones para la Próxima Jornada
Nuestros expertos han elaborado las siguientes predicciones para los próximos partidos:
<|repo_name|>neekus/SMS<|file_sep|>/sms/service.go
package sms
import (
"context"
"errors"
"net/http"
"time"
"github.com/iancoleman/strcase"
)
// Service interface for all services.
type Service interface {
Send(ctx context.Context, message Message) error
}
// DefaultService is the default service.
type DefaultService struct {
client *http.Client
apiKey string
}
// NewDefaultService creates a new DefaultService.
func NewDefaultService(apiKey string) *DefaultService {
return &DefaultService{
client: &http.Client{Timeout: time.Second * 5},
apiKey: apiKey,
}
}
// Send sends an SMS message.
func (s *DefaultService) Send(ctx context.Context, message Message) error {
if err := message.Validate(); err != nil {
return err
}
form := url.Values{}
form.Add("api_key", s.apiKey)
form.Add("message", message.Body)
form.Add("from", strcase.ToKebab(message.From))
form.Add("to", strcase.ToKebab(message.To))
req, err := http.NewRequestWithContext(ctx, http.MethodPost,
message.Provider().BaseURL+"/messages.json", strings.NewReader(form.Encode()))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := s.client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return errors.New("failed to send message")
}
return nil
}
<|repo_name|>neekus/SMS<|file_sep|>/sms/message.go
package sms
import (
"fmt"
)
// Message represents an SMS message.
type Message struct {
ID int64
Status string
Error string
CreatedAt string
SentAt string
Sender Sender
Provider Provider
From string `json:"from"`
To string `json:"to"`
Bcc []string
Type MessageType
MessageType string `json:"message_type"`
Code string `json:"code,omitempty"`
SenderCode string `json:"sender_code,omitempty"`
SenderLabel string `json:"sender_label,omitempty"`
Category Category `json:"category,omitempty"`
Priority Priority `json:"priority,omitempty"`
Latency float64 `json:"latency,omitempty"`
LatencyCount int64 `json:"latency_count,omitempty"`
Body string `json:"body"`
}
// Validate validates the message.
func (m Message) Validate() error {
if m.From == "" || m.To == "" || m.Body == "" {
return fmt.Errorf("from/to/body must be set")
}
return nil
}
// Body returns the body of the message.
func (m Message) Body() string {
return m.Body
}
// From returns the from address of the message.
func (m Message) From() string {
return m.From
}
// To returns the to address of the message.
func (m Message) To() string {
return m.To
}
// Provider returns the provider of the message.
func (m Message) Provider() Provider {
return m.Provider
}
<|repo_name|>neekus/SMS<|file_sep|>/sms/provider_test.go
package sms_test
import (
"testing"
sms "github.com/neekus/SMS"
)
func TestProviders(t *testing.T) {
for _, p := range sms.Providers() {
t.Run(p.Name(), func(t *testing.T) {
t.Parallel()
if p.Name() == "" || p.BaseURL == "" || p.Sender == nil || p.MessageType == "" || p.Category == "" || p.Priority == "" || p.DefaultFrom == "" {
t.Error("missing required fields")
}
t.Logf("%+v", p)
m := p.NewMessage(sms.DefaultMessage{
Type: sms.Text,
Code: "default code",
SenderCode: "default sender code",
SenderLabel: "default sender label",
Category: sms.Info,
Priority: sms.High,
Latency: float64(0),
LatencyCount: int64(0),
MessageType: "default",
Body: "default body",
From: p.DefaultFrom,
})
if m.ID != -1 || m.Status != "" || m.Error != "" || m.CreatedAt != "" || m.SentAt != "" ||
m.Sender.ID != -1 || m.Sender.Name != "" || m.Sender.Number != "" ||
m.Type != sms.Text || m.MessageType != "default" || m.Code != "default code" ||
m.SenderCode != "default sender code" || m.SenderLabel != "default sender label" ||
m.Category != sms.Info || m.Priority != sms.High ||
m.LatencyCount != int64(0) || m.Latency != float64(0) ||
m.From != p.DefaultFrom {
t.Error("unexpected defaults")
}
m = p.NewMessage(sms.Message{
ID: -1,
Status: "",
Error: "",
CreatedAt: "",
SentAt: "",
Sender: sms.Sender{},
Type: sms.Text,
MessageType: "default",
Code: "custom code",
SenderCode: "custom sender code",
SenderLabel: "custom sender label",
Category: sms.Warn,
Priority: sms.Low,
})
if m.ID != -1 || m.Status != "" || m.Error != "" || m.CreatedAt != "" || m.SentAt != "" ||
m.Sender.ID != -1 || m.Sender.Name != "" || m.Sender.Number != "" ||
m.Type != sms.Text || m.MessageType != "default" || m.Code != "custom code" ||
m.SenderCode != "custom sender code" || m.SenderLabel != "custom sender label" ||
m.Category != sms.Warn || m.Priority != sms.Low ||
m.LatencyCount == int64(0) && m.Latency == float64(0) ||
m.From == p.DefaultFrom {
t.Error("unexpected defaults")
}
t.Logf("%+v", *m)
if _, err := p.Send(m); err == nil {
t.Error("should have failed to send")
}
if _, err := p.Send(&sms.Message{Body: "", From: "", To: "", Provider: *p}); err == nil {
t.Error("should have failed to send")
}
if _, err := p.Send(&sms.Message{Body: "", From: "from", To: "", Provider: *p}); err == nil {
t.Error("should have failed to send")
}
if _, err := p.Send(&sms.Message{Body: "", From: "", To: "to", Provider: *p}); err == nil {
t.Error("should have failed to send")
}
if _, err := p.Send(&sms.Message{Body: "", From: "from", To: "to", Provider: *p}); err == nil {
t.Error("should have failed to send")
}
t.Logf("%+v", &sms.Message{Body: "", From: "from", To: "to"})
err := p.Send(&sms.Message{Body: "", From: "", To:"", Bcc:["bcc"]})
if err == nil {
t.Error("should have failed to send")
}
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
if len(p.Bcc()) > len([]string{"bcc"}) {
t.Error("unexpected number of bcc addresses")
}
t.Logf("%+v", &sms.Message{Body:"", From:"", To:"", Bcc:["bcc"]})
}<|repo_name|>neekus/SMS<|file_sep|>/sms/sms_test.go
package sms_test
import (
sms "github.com/neekus/SMS"
)
var (
defaultMessage = sms.DefaultMessage{
Type: sms.Text,
Code: "default code",
SenderCode: "default sender code",
SenderLabel: "default sender label",
Category: sms.Info,
Priority: sms.High,
LatencyCount:int64(0),
Latency :float64(0),
MessageType : "default",
Body : "default body",
}
)
var _ = defaultMessage.Validate()
<|file_sep|># SMS
SMS library for Go.
## Installation
sh
go get github.com/neekus/SMS
## Usage
### Send Text Message
go
package main
import (
sms "github.com/neekus/SMS"
)
func main() {
srv := sms.NewDefaultService("")
message := srv.NewMessage(sms.DefaultMessage{
Type : sms.Text,
Code : "",
SenderCode : "",
SenderLabel : "",
Category : sms.Info,
Priority : sms.High,
LatencyCount:int64(0),
Latency :float64(0),
MessageType : "",
Body : "",
From : "",
To : "",
Bcc:[],
})
err := srv.Send(message)
if err!=nil{
panic(err)
}
}
### Send Rich Media Message