voicera/gooseberry

View on GitHub
scripts/example/main.go

Summary

Maintainability
A
0 mins
Test Coverage
package main

import (
    "net/http"
    "time"

    "github.com/voicera/gooseberry"
    "github.com/voicera/gooseberry/log"
    "github.com/voicera/gooseberry/log/zap"
    "github.com/voicera/gooseberry/polling"
    "github.com/voicera/gooseberry/web"
    "github.com/voicera/gooseberry/web/rest"
)

const (
    baseURL    = "https://api.twilio.com/2010-04-01/Accounts/"
    accountSid = "AC072dcbab90350495b2c0fabf9a7817bb"
    authToken  = "883XXXXXXXXXXXXXXXXXXXXXXXXX1985"
)

type call struct {
    SID    string `json:"sid"`
    Status string `json:"status"`
}

type receiver struct {
    restClient rest.Client
}

func main() {
    gooseberry.Logger = zap.DefaultLogger
    gooseberry.Logger.Info("starting example")
    transport := web.NewBasicAuthRoundTripper(
        web.NewLeveledLoggerRoundTripper(
            http.DefaultTransport,
            log.NewPrefixedLeveledLogger(gooseberry.Logger, "TWL:")),
        accountSid, authToken)
    httpClient := &http.Client{Transport: transport}
    twilioClient := rest.NewURLEncodedRequestJSONResponseClient(httpClient).
        WithBaseURL(baseURL + accountSid)
    go makeCall(twilioClient)
    go poll(&receiver{twilioClient})
    time.Sleep(3 * time.Second)
    gooseberry.Logger.Sync()
}

func makeCall(twilioClient rest.Client) {
    parameters := map[string]string{
        "From": "+15005550006",
        "To":   "+14108675310",
        "Url":  "http://demo.twilio.com/docs/voice.xml",
    }
    call := &call{}
    if _, err := twilioClient.Post("Calls.json", parameters, &call); err != nil {
        gooseberry.Logger.Error("error making a call", "err", err)
    } else {
        gooseberry.Logger.Debug("made a call", "sid", call.SID)
    }
}

func poll(receiver *receiver) {
    poller, err := polling.NewBernoulliExponentialBackoffPoller(
        receiver, "twilio", 0.95, time.Second, time.Minute)
    if err != nil {
        gooseberry.Logger.Error("error creating a poller", "err", err)
    }
    go poller.Start()
    for batch := range poller.Channel() {
        calls := batch.([]*call)
        gooseberry.Logger.Debug("found calls", "callsCount", len(calls))
    }
}

func (r *receiver) Receive() (interface{}, bool, error) {
    calls := []*call{}
    _, err := r.restClient.Get("Calls", nil, &calls)
    return calls, len(calls) > 0, err
}