diff --git a/src/cmd/root.go b/src/cmd/root.go index d66b01d..64a6e43 100644 --- a/src/cmd/root.go +++ b/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 | 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 | example: --autoreply="Don't reply this message"`) + rootCmd.PersistentFlags().StringVarP(&config.WhatsappAutoReplyCallbackEndpoint, "callback", "c", config.WhatsappAutoReplyMessage, `auto reply when received message --callback | example: --callback="https://yourcallback.com/callback"`) } func runRest(cmd *cobra.Command, args []string) { diff --git a/src/config/settings.go b/src/config/settings.go index af23098..1584d20 100644 --- a/src/config/settings.go +++ b/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 ) diff --git a/src/utils/whatsapp.go b/src/utils/whatsapp.go index 3b7d363..0467e3a 100644 --- a/src/utils/whatsapp.go +++ b/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 +}