forked from hswaw/hscloud
80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
type twilio struct {
|
|
accountSID string
|
|
accountToken string
|
|
}
|
|
|
|
type incomingPhoneNumber struct {
|
|
FriendlyName string `json:"friendly_name"`
|
|
SMSMethod string `json:"sms_method"`
|
|
SMSURL string `json:"sms_url"`
|
|
SID string `json:"sid"`
|
|
}
|
|
|
|
func (t *twilio) getIncomingPhoneNumbers(ctx context.Context) ([]incomingPhoneNumber, error) {
|
|
url := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers.json", t.accountSID)
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req = req.WithContext(ctx)
|
|
req.SetBasicAuth(t.accountSID, t.accountToken)
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
result := struct {
|
|
Message string `json:"message"`
|
|
Status int64 `json:"status"`
|
|
IPN []incomingPhoneNumber `json:"incoming_phone_numbers"`
|
|
}{}
|
|
|
|
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if result.Message != "" {
|
|
return nil, fmt.Errorf("REST response error, status: %v, message: %q", result.Status, result.Message)
|
|
}
|
|
|
|
return result.IPN, nil
|
|
}
|
|
|
|
func (t *twilio) updateIncomingPhoneNumberSMSWebhook(ctx context.Context, sid, method, whurl string) error {
|
|
turl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers/%s.json", t.accountSID, sid)
|
|
|
|
data := url.Values{}
|
|
data.Set("SmsMethod", method)
|
|
data.Set("SmsUrl", whurl)
|
|
|
|
req, err := http.NewRequest("POST", turl, strings.NewReader(data.Encode()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req = req.WithContext(ctx)
|
|
req.SetBasicAuth(t.accountSID, t.accountToken)
|
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if res.StatusCode != 200 {
|
|
return fmt.Errorf("status code: %v", res.StatusCode)
|
|
}
|
|
return nil
|
|
}
|