AdityaSidharta/gombal

View on GitHub
pkg/handler.go

Summary

Maintainability
A
1 hr
Test Coverage
package pkg

import (
    "bytes"
    "encoding/json"
    "fmt"
    "github.com/sirupsen/logrus"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
)

func (bot *Bot) HandleMessage(inMessage Message, id string) {
    env, err := LoadEnv()
    if err != nil {
        logrus.Fatal(err)
    }

    logrus.Info(fmt.Sprintf("inMessage : %+v", inMessage))
    logrus.Info(fmt.Sprintf("id : %v", id))

    var outMessage Message
    if inMessage.Text == "" {
        outMessage = Message{
            Text: "Sorry, I am not yet trained to answer those! :( Are there anything else that you want to talk about?",
        }
    } else {
        query := inMessage.Text
        previousQuery, err := bot.GetLastMessage(id)

        if err != nil {
            logrus.Info(fmt.Sprintf("No Previous Conversation detected with %v", id))
        } else {
            logrus.Info(fmt.Sprintf("Previous Conversation detected with %v", id))
            bot.Add(previousQuery, query)
        }

        resp, err := bot.Get(query)
        if err != nil {
            logrus.Fatal(err)
        }
        outMessage = Message{
            Text: resp,
        }
        if err != nil {
            logrus.Fatal(err)
        }

        bot.UpdateLastMessage(id, resp)
    }

    logrus.Info(fmt.Sprintf("outMessage : %+v", outMessage))

    outResponse := Response{
        Recipient: User{ID: id},
        Message:   outMessage,
    }

    requestBody, err := json.Marshal(outResponse)
    if err != nil {
        logrus.Fatal(err)
    }

    url := fmt.Sprintf(FacebookApi, env.PageAccessToken)
    resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
    if err != nil {
        logrus.Fatal(err)
    }
    defer resp.Body.Close()

    bodyBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        logrus.Fatal(err)
    }

    logrus.Info(fmt.Sprintf("Response : %v", string(bodyBytes)))

}

func (bot *Bot) VerificationHandler(w http.ResponseWriter, r *http.Request) {
    logrus.Info("VerificationHandler is called")
    env, err := LoadEnv()
    if err != nil {
        logrus.Fatal(err)
    }

    challengeQuery := r.URL.Query().Get("hub.challenge")
    modeQuery := r.URL.Query().Get("hub.mode")
    verifyTokenQuery := r.URL.Query().Get("hub.verify_token")

    verifyToken := env.VerifyToken

    logrus.Info(fmt.Sprintf("Challenge Query : %v", challengeQuery))
    logrus.Info(fmt.Sprintf("modeQuery : %v", modeQuery))
    logrus.Info(fmt.Sprintf("verifyTokenQuery : %v", verifyTokenQuery))

    if modeQuery == "subscribe" && verifyTokenQuery == verifyToken {
        w.WriteHeader(200)
        _, err := w.Write([]byte(challengeQuery))
        if err != nil {
            logrus.Fatal(err)
        }
        logrus.Info("Verification is Successful")
    } else {
        w.WriteHeader(404)
        _, err := w.Write([]byte("Unauthorized Token"))
        logrus.Info("Verification has failed.")
        if err != nil {
            logrus.Fatal(err)
        }
    }
}

func (bot *Bot) TestHandler(w http.ResponseWriter, r *http.Request) {
    logrus.Info("TestHandler is called")
    requestDump, err := httputil.DumpRequest(r, true)
    if err != nil {
        logrus.Fatal(err)
    }
    logrus.Info(fmt.Sprintf("Request Received : %v", string(requestDump)))

    w.WriteHeader(200)
    _, err = w.Write([]byte("Hello World"))
    if err != nil {
        logrus.Fatal(err)
    }
    logrus.Info("TestHandler is Successful")
}

func (bot *Bot) CallbackHandler(w http.ResponseWriter, r *http.Request) {
    logrus.Info("CallbackHandler is called")
    var callback Callback
    err := json.NewDecoder(r.Body).Decode(&callback)
    if err != nil {
        logrus.Fatal(err)
    }

    if callback.Object == "page" {
        for _, entry := range callback.Entries {
            for _, messaging := range entry.Messagings {
                if messaging.Message != (Message{}) {
                    bot.HandleMessage(messaging.Message, messaging.Sender.ID)
                } else {
                    logrus.Fatal(emptyMessagingError)
                }
            }
            w.WriteHeader(200)
            _, err := w.Write([]byte("Message received successfully"))
            if err != nil {
                logrus.Fatal(err)
            }
            logrus.Info("Callback is Successful")
        }
    } else {
        w.WriteHeader(400)
        _, err := w.Write([]byte("callback.Object must be page"))
        if err != nil {
            logrus.Fatal(err)
        }
    }
}