Browse Source

feat: add new webhook endpoint

pull/25/head
Aldino Kemal 3 years ago
parent
commit
07146f8224
  1. 1
      src/cmd/root.go
  2. 9
      src/config/settings.go
  3. 47
      src/utils/whatsapp.go

1
src/cmd/root.go

@ -37,6 +37,7 @@ func init() {
rootCmd.PersistentFlags().BoolVarP(&config.AppDebug, "debug", "d", config.AppDebug, "hide or displaying log with --debug <true/false> | example: --debug=true")
rootCmd.PersistentFlags().StringVarP(&config.AppBasicAuthCredential, "basic-auth", "b", config.AppBasicAuthCredential, "basic auth credential | yourUsername:yourPassword")
rootCmd.PersistentFlags().StringVarP(&config.WhatsappAutoReplyMessage, "autoreply", "", config.WhatsappAutoReplyMessage, `auto reply when received message --autoreply <string> | example: --autoreply="Don't reply this message"`)
rootCmd.PersistentFlags().StringVarP(&config.WhatsappAutoReplyCallbackEndpoint, "callback", "c", config.WhatsappAutoReplyMessage, `auto reply when received message --callback <string> | example: --callback="https://yourcallback.com/callback"`)
}
func runRest(cmd *cobra.Command, args []string) {

9
src/config/settings.go

@ -20,8 +20,9 @@ var (
DBName string = "hydrogenWaCli.db"
WhatsappLogLevel string = "ERROR"
WhatsappAutoReplyMessage string
WhatsappSettingMaxFileSize int64 = 30000000 // 10MB
WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB
WhatsappLogLevel string = "ERROR"
WhatsappAutoReplyMessage string
WhatsappAutoReplyCallbackEndpoint string
WhatsappSettingMaxFileSize int64 = 30000000 // 10MB
WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB
)

47
src/utils/whatsapp.go

@ -1,6 +1,7 @@
package utils
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -15,6 +16,7 @@ import (
waLog "go.mau.fi/whatsmeow/util/log"
"google.golang.org/protobuf/proto"
"mime"
"net/http"
"os"
"strings"
"sync/atomic"
@ -181,6 +183,12 @@ func handler(rawEvt interface{}) {
if config.WhatsappAutoReplyMessage != "" {
_, _ = cli.SendMessage(context.Background(), evt.Info.Sender, "", &waProto.Message{Conversation: proto.String(config.WhatsappAutoReplyMessage)})
}
if config.WhatsappAutoReplyCallbackEndpoint != "" {
go func() {
_ = sendAutoReplyCallback(evt)
}()
}
case *events.Receipt:
if evt.Type == events.ReceiptTypeRead || evt.Type == events.ReceiptTypeReadSelf {
log.Infof("%v was read by %s at %s", evt.MessageIDs, evt.SourceString(), evt.Timestamp)
@ -218,3 +226,42 @@ func handler(rawEvt interface{}) {
log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue)
}
}
type AutoReplyCallbackBody struct {
From string `json:"from"`
Message string `json:"message"`
}
func sendAutoReplyCallback(evt *events.Message) error {
client := &http.Client{Timeout: 10 * time.Second}
body := map[string]interface{}{
"from": evt.Info.SourceString(),
"message": evt.Message.GetConversation(),
"image": evt.Message.GetImageMessage(),
"video": evt.Message.GetVideoMessage(),
"audio": evt.Message.GetAudioMessage(),
"document": evt.Message.GetDocumentMessage(),
"location": evt.Message.GetLocationMessage(),
"sticker": evt.Message.GetStickerMessage(),
"live_location": evt.Message.GetLiveLocationMessage(),
"view_once": evt.Message.GetViewOnceMessage(),
"list": evt.Message.GetListMessage(),
"order": evt.Message.GetOrderMessage(),
"contact": evt.Message.GetContactMessage(),
"forwarded": evt.Message.GetGroupInviteMessage(),
}
postBody, _ := json.Marshal(body)
req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, config.WhatsappAutoReplyCallbackEndpoint, bytes.NewBuffer(postBody))
if err != nil {
log.Errorf("error when create http object %v", err)
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Errorf("error when submit webhook %v", err)
return err
}
defer resp.Body.Close()
return nil
}
Loading…
Cancel
Save