From b1363349536628d332bd125253299fa06cc81234 Mon Sep 17 00:00:00 2001 From: iamatulsingh Date: Tue, 24 Mar 2026 21:23:41 +0100 Subject: [PATCH] feat: webhook option added for incoming messages --- whatsapp-bridge/.idea/data_source_mapping.xml | 6 --- whatsapp-bridge/.idea/sqldialects.xml | 6 --- whatsapp-bridge/config/config.go | 9 ++-- whatsapp-bridge/docker-compose.yaml | 1 + whatsapp-bridge/main.go | 48 +++++++++++++++++++ 5 files changed, 55 insertions(+), 15 deletions(-) delete mode 100644 whatsapp-bridge/.idea/data_source_mapping.xml delete mode 100644 whatsapp-bridge/.idea/sqldialects.xml diff --git a/whatsapp-bridge/.idea/data_source_mapping.xml b/whatsapp-bridge/.idea/data_source_mapping.xml deleted file mode 100644 index 1a66341..0000000 --- a/whatsapp-bridge/.idea/data_source_mapping.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/whatsapp-bridge/.idea/sqldialects.xml b/whatsapp-bridge/.idea/sqldialects.xml deleted file mode 100644 index 0928188..0000000 --- a/whatsapp-bridge/.idea/sqldialects.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/whatsapp-bridge/config/config.go b/whatsapp-bridge/config/config.go index 544e7a2..f1fadc0 100644 --- a/whatsapp-bridge/config/config.go +++ b/whatsapp-bridge/config/config.go @@ -14,9 +14,10 @@ type dbConfig struct { } type Config struct { - DB dbConfig - JWTSecret []byte - APIKey string + DB dbConfig + JWTSecret []byte + APIKey string + WebhookUrl string } func LoadConfig() (*Config, error) { @@ -45,6 +46,7 @@ func LoadConfig() (*Config, error) { if !ok { return nil, fmt.Errorf("missing API_KEY") } + webhookUrl := os.Getenv("WEBHOOK_URL") isPostgres := os.Getenv("IS_POSTGRES") == "true" @@ -58,5 +60,6 @@ func LoadConfig() (*Config, error) { }, JWTSecret: []byte(jwtSecret), APIKey: apiKey, + WebhookUrl: webhookUrl, }, nil } diff --git a/whatsapp-bridge/docker-compose.yaml b/whatsapp-bridge/docker-compose.yaml index 03e50a4..f1c155f 100644 --- a/whatsapp-bridge/docker-compose.yaml +++ b/whatsapp-bridge/docker-compose.yaml @@ -15,6 +15,7 @@ services: POSTGRES_PORT: "5432" API_KEY: "c3VwZXItbG9uZy1yYW5kb20tc3RyaW5nLW1pbmltdW0tb2YtNjQtY2hhcmFjdGVycy15b3UtbmVlZC10by1wYXN0ZS1oZXJl" JWT_SECRET: "YW5vdGhlci1zdXBlci1sb25nLXJhbmRvbS1zdHJpbmctbWluaW11bS1vZi02NC1jaGFyYWN0ZXJzLXlvdS1uZWVkLXRvLXBhc3RlLWhlcmU=" + WEBHOOK_URL: "http://192.168.178.52:5678/webhook-test/whatsapp" ports: - "8080:8080" volumes: diff --git a/whatsapp-bridge/main.go b/whatsapp-bridge/main.go index d9127bb..961f72f 100644 --- a/whatsapp-bridge/main.go +++ b/whatsapp-bridge/main.go @@ -555,6 +555,54 @@ func extractMediaInfo(msg *waE2E.Message) (mediaType string, filename string, ur // Handle regular incoming messages with media support func handleMessage(client *whatsmeow.Client, messageStore *MessageStore, msg *events.Message, logger waLog.Logger) { + go func() { + cfg, err := config.LoadConfig() + if err != nil { + return + } + defer func() { + if r := recover(); r != nil { + log.Println("Recovered in webhook goroutine:", r) + } + }() + if cfg.WebhookUrl == "" { + return + } + + content := extractTextContent(msg.Message) + if content == "" { + return + } + + payload := map[string]interface{}{ + "chat_jid": msg.Info.Chat.String(), + "sender": msg.Info.Sender.User, + "content": extractTextContent(msg.Message), + "is_from_me": msg.Info.IsFromMe, + "timestamp": msg.Info.Timestamp.String(), + "push_name": msg.Info.PushName, + "is_group": strings.Contains(msg.Info.Chat.String(), "@g.us"), + "message_id": msg.Info.ID, + } + + jsonData, err := json.Marshal(payload) + if err != nil { + log.Println("Webhook marshal error:", err) + return + } + + resp, err := http.Post( + cfg.WebhookUrl, + "application/json", + bytes.NewBuffer(jsonData), + ) + + if err != nil { + log.Println("Webhook POST error:", err) + return + } + defer resp.Body.Close() + }() chatJID := msg.Info.Chat.String() sender := msg.Info.Sender.User