package main
import (
"bytes"
"context"
"fmt"
"net/http"
"net/url"
"os"
"os/signal"
"syscall"
_ "github.com/mattn/go-sqlite3"
"github.com/mdp/qrterminal/v3"
"go.mau.fi/whatsmeow"
waProto "go.mau.fi/whatsmeow/binary/proto"
"go.mau.fi/whatsmeow/store/sqlstore"
"go.mau.fi/whatsmeow/types"
"go.mau.fi/whatsmeow/types/events"
waLog "go.mau.fi/whatsmeow/util/log"
"google.golang.org/protobuf/proto"
)
type MyClient struct {
WAClient *whatsmeow.Client
eventHandlerID uint32
}
func (mycli *MyClient) register() {
mycli.eventHandlerID = mycli.WAClient.AddEventHandler(mycli.eventHandler)
}
func (mycli *MyClient) eventHandler(evt interface{}) {
switch v := evt.(type) {
case *events.Message:
newMessage := v.Message
msg := newMessage.GetConversation()
fmt.Println("Message from:", v.Info.Sender.User, "->", msg)
if msg == "" {
return
}
urlEncoded := url.QueryEscape(msg)
url := "http://localhost:5001/chat?q=" + urlEncoded
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error making request:", err)
return
}
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
newMsg := buf.String()
response := &waProto.Message{Conversation: proto.String(string(newMsg))}
fmt.Println("Response:", response)
userJid := types.NewJID(v.Info.Sender.User, types.DefaultUserServer)
mycli.WAClient.SendMessage(context.Background(), userJid, "", response)
}
}
func main() {
dbLog := waLog.Stdout("Database", "DEBUG", true)
container, err := sqlstore.New("sqlite3", "file:examplestore.db?_foreign_keys=on", dbLog)
if err != nil {
panic(err)
}
deviceStore, err := container.GetFirstDevice()
if err != nil {
panic(err)
}
clientLog := waLog.Stdout("Client", "DEBUG", true)
client := whatsmeow.NewClient(deviceStore, clientLog)
mycli := &MyClient{WAClient: client}
mycli.register()
if client.Store.ID == nil {
qrChan, _ := client.GetQRChannel(context.Background())
err = client.Connect()
if err != nil {
panic(err)
}
for evt := range qrChan {
if evt.Event == "code" {
qrterminal.GenerateHalfBlock(evt.Code, qrterminal.L, os.Stdout)
} else {
fmt.Println("Login event:", evt.Event)
}
}
} else {
err = client.Connect()
if err != nil {
panic(err)
}
}
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
<-c
client.Disconnect()
}