|
@@ -1,4 +1,4 @@
|
|
-// mautrix-whatsapp - A puppeting Matrix-Whatsapp bridge.
|
|
|
|
|
|
+// mautrix-whatsapp - A Matrix-Whatsapp puppeting bridge.
|
|
// Copyright (C) 2018 Tulir Asokan
|
|
// Copyright (C) 2018 Tulir Asokan
|
|
//
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// This program is free software: you can redistribute it and/or modify
|
|
@@ -16,6 +16,99 @@
|
|
|
|
|
|
package main
|
|
package main
|
|
|
|
|
|
|
|
+import (
|
|
|
|
+ "github.com/Rhymen/go-whatsapp"
|
|
|
|
+ "time"
|
|
|
|
+ "fmt"
|
|
|
|
+ "os"
|
|
|
|
+ "bufio"
|
|
|
|
+ "encoding/gob"
|
|
|
|
+ "github.com/mdp/qrterminal"
|
|
|
|
+)
|
|
|
|
+
|
|
func main() {
|
|
func main() {
|
|
-
|
|
|
|
|
|
+ wac, err := whatsapp.NewConn(20 * time.Second)
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ wac.AddHandler(myHandler{})
|
|
|
|
+
|
|
|
|
+ sess, err := LoadSession("whatsapp.session")
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ sess, err = Login(wac)
|
|
|
|
+ } else {
|
|
|
|
+ sess, err = wac.RestoreSession(sess)
|
|
|
|
+ }
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+ SaveSession(sess, "whatsapp.session")
|
|
|
|
+
|
|
|
|
+ reader := bufio.NewReader(os.Stdin)
|
|
|
|
+ for {
|
|
|
|
+ fmt.Print("receiver> ")
|
|
|
|
+ receiver, _ := reader.ReadString('\n')
|
|
|
|
+ fmt.Print("message> ")
|
|
|
|
+ message, _ := reader.ReadString('\n')
|
|
|
|
+ wac.Send(whatsapp.TextMessage{
|
|
|
|
+ Info: whatsapp.MessageInfo{
|
|
|
|
+ RemoteJid: fmt.Sprintf("%s@s.whatsapp.net", receiver),
|
|
|
|
+ },
|
|
|
|
+ Text: message,
|
|
|
|
+ })
|
|
|
|
+ fmt.Println(receiver, message)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func Login(wac *whatsapp.Conn) (whatsapp.Session, error) {
|
|
|
|
+ qrChan := make(chan string)
|
|
|
|
+ go func() {
|
|
|
|
+ qrterminal.Generate(<-qrChan, qrterminal.L, os.Stdout)
|
|
|
|
+ }()
|
|
|
|
+ return wac.Login(qrChan)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func SaveSession(session whatsapp.Session, fileName string) {
|
|
|
|
+ file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0600)
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ enc := gob.NewEncoder(file)
|
|
|
|
+ enc.Encode(session)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func LoadSession(fileName string) (sess whatsapp.Session, err error) {
|
|
|
|
+ file, err := os.OpenFile(fileName, os.O_RDONLY, 0600)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return sess, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dec := gob.NewDecoder(file)
|
|
|
|
+ dec.Decode(sess)
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type myHandler struct{}
|
|
|
|
+
|
|
|
|
+func (myHandler) HandleError(err error) {
|
|
|
|
+ fmt.Fprintf(os.Stderr, "%v", err)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (myHandler) HandleTextMessage(message whatsapp.TextMessage) {
|
|
|
|
+ fmt.Println(message)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (myHandler) HandleImageMessage(message whatsapp.ImageMessage) {
|
|
|
|
+ fmt.Println(message)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (myHandler) HandleVideoMessage(message whatsapp.VideoMessage) {
|
|
|
|
+ fmt.Println(message)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (myHandler) HandleJsonMessage(message string) {
|
|
|
|
+ fmt.Println(message)
|
|
}
|
|
}
|