Use type aliases for different ID types and add puppet type
This commit is contained in:
127
main.go
127
main.go
@ -17,13 +17,8 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/Rhymen/go-whatsapp"
|
||||
"time"
|
||||
"fmt"
|
||||
"os"
|
||||
"bufio"
|
||||
"encoding/gob"
|
||||
"github.com/mdp/qrterminal"
|
||||
"maunium.net/go/mautrix-whatsapp/config"
|
||||
flag "maunium.net/go/mauflag"
|
||||
"os/signal"
|
||||
@ -31,6 +26,8 @@ import (
|
||||
"maunium.net/go/mautrix-appservice"
|
||||
log "maunium.net/go/maulogger"
|
||||
"maunium.net/go/mautrix-whatsapp/database"
|
||||
"maunium.net/go/gomatrix"
|
||||
"maunium.net/go/mautrix-whatsapp/types"
|
||||
)
|
||||
|
||||
var configPath = flag.MakeFull("c", "config", "The path to your config file.", "config.yaml").String()
|
||||
@ -61,20 +58,21 @@ func (bridge *Bridge) GenerateRegistration() {
|
||||
}
|
||||
|
||||
type Bridge struct {
|
||||
AppService *appservice.AppService
|
||||
Config *config.Config
|
||||
DB *database.Database
|
||||
Log log.Logger
|
||||
AppService *appservice.AppService
|
||||
EventProcessor *appservice.EventProcessor
|
||||
Config *config.Config
|
||||
DB *database.Database
|
||||
Log log.Logger
|
||||
|
||||
StateStore *AutosavingStateStore
|
||||
|
||||
MatrixListener *MatrixListener
|
||||
|
||||
users map[string]*User
|
||||
users map[types.MatrixUserID]*User
|
||||
}
|
||||
|
||||
func NewBridge() *Bridge {
|
||||
bridge := &Bridge{}
|
||||
bridge := &Bridge{
|
||||
users: make(map[types.MatrixUserID]*User),
|
||||
}
|
||||
var err error
|
||||
bridge.Config, err = config.Load(*configPath)
|
||||
if err != nil {
|
||||
@ -97,7 +95,8 @@ func (bridge *Bridge) Init() {
|
||||
log.DefaultLogger = bridge.Log.(*log.BasicLogger)
|
||||
bridge.AppService.Log = log.Sub("Matrix")
|
||||
|
||||
bridge.StateStore = NewAutosavingStateStore(bridge.Config.Bridge.StateStore)
|
||||
bridge.Log.Debugln("Initializing state store")
|
||||
bridge.StateStore = NewAutosavingStateStore(bridge.Config.AppService.StateStore)
|
||||
err = bridge.StateStore.Load()
|
||||
if err != nil {
|
||||
bridge.Log.Fatalln("Failed to load state store:", err)
|
||||
@ -105,19 +104,26 @@ func (bridge *Bridge) Init() {
|
||||
}
|
||||
bridge.AppService.StateStore = bridge.StateStore
|
||||
|
||||
bridge.Log.Debugln("Initializing database")
|
||||
bridge.DB, err = database.New(bridge.Config.AppService.Database.URI)
|
||||
if err != nil {
|
||||
bridge.Log.Fatalln("Failed to initialize database:", err)
|
||||
os.Exit(13)
|
||||
}
|
||||
|
||||
bridge.MatrixListener = NewMatrixListener(bridge)
|
||||
bridge.Log.Debugln("Initializing event processor")
|
||||
bridge.EventProcessor = appservice.NewEventProcessor(bridge.AppService)
|
||||
bridge.EventProcessor.On(gomatrix.EventMessage, bridge.HandleMessage)
|
||||
bridge.EventProcessor.On(gomatrix.StateMember, bridge.HandleMembership)
|
||||
}
|
||||
|
||||
func (bridge *Bridge) Start() {
|
||||
bridge.DB.CreateTables()
|
||||
bridge.Log.Debugln("Starting application service HTTP server")
|
||||
go bridge.AppService.Start()
|
||||
go bridge.MatrixListener.Start()
|
||||
bridge.Log.Debugln("Starting event processor")
|
||||
go bridge.EventProcessor.Start()
|
||||
bridge.Log.Debugln("Updating bot profile")
|
||||
go bridge.UpdateBotProfile()
|
||||
}
|
||||
|
||||
@ -146,7 +152,7 @@ func (bridge *Bridge) UpdateBotProfile() {
|
||||
|
||||
func (bridge *Bridge) Stop() {
|
||||
bridge.AppService.Stop()
|
||||
bridge.MatrixListener.Stop()
|
||||
bridge.EventProcessor.Stop()
|
||||
err := bridge.StateStore.Save()
|
||||
if err != nil {
|
||||
bridge.Log.Warnln("Failed to save state store:", err)
|
||||
@ -190,90 +196,3 @@ func main() {
|
||||
|
||||
NewBridge().Main()
|
||||
}
|
||||
|
||||
func temp() {
|
||||
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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user