package providers import ( "fmt" "net/url" "one.com/kettle/htp" "one.com/kettle/sms" "one.com/kettle/utl" "strconv" "strings" ) const ( url_SENDSMS = "http://api.smsbao.com/sms" query_SENDSMS = "u=%s&p=%s&m=%s&c=%s" url_BALANCE = "http://www.smsbao.com/query" query_BALANCE = "u=%s&p=%s" ) func NewSmsBao(username, password string) sms.ISms { return &smsBao{ username: username, password: password, c: htp.NewClient(), } } type smsBao struct { username, password string c *htp.Client } func (self *smsBao) Send(phone, msg string) error { uri := fmt.Sprintf(url_SENDSMS+"?"+query_SENDSMS, url_SENDSMS, self.username, self.password, phone, url.QueryEscape(msg)) var err error = nil data, err := self.c.Get(uri) if err != nil { return err } if string(data) != "0" { err = sms.ErrSmsNoMoney } return err } //TODO: this implement is error. // @see official docs func (self *smsBao) SendTpl(phone, tpl, params string) error { return self.Send(phone, tpl) } func (self *smsBao) GetBalance() (float64, error) { return 0, utl.ErrNotImplement } func (self *smsBao) GetAvailable() (int64, error) { uri := fmt.Sprintf(url_BALANCE+"?"+query_BALANCE, self.username, self.password) clt := htp.NewClient() data, err := clt.Get(uri) if err != nil { return 0, err } sbody := fmt.Sprintf("%s", data) lines := strings.Split(sbody, "\n") if len(lines) < 2 { return 0, sms.ErrSmsProviderReturnBadValue } if lines[0] != "0" { return 0, sms.ErrSmsProviderReturnBadValue } parts := strings.Split(lines[1], ",") if len(parts) < 2 { return 0, sms.ErrSmsProviderReturnBadValue } remains, err := strconv.ParseInt(parts[1], 10, 64) if err != nil { return 0, err } return remains, nil } func (self *smsBao) Name() string { return "smsbao.com" }