summaryrefslogtreecommitdiffstats
path: root/vendor/maunium.net/go/mautrix-whatsapp/whatsapp-ext/jsonmessage.go
blob: 11748443831b414ebb752315a8b036a3606120d6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
// Copyright (C) 2019 Tulir Asokan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

package whatsappExt

import (
	"encoding/json"

	"github.com/Rhymen/go-whatsapp"
)

type JSONMessage []json.RawMessage

type JSONMessageType string

const (
	MessageMsgInfo  JSONMessageType = "MsgInfo"
	MessageMsg      JSONMessageType = "Msg"
	MessagePresence JSONMessageType = "Presence"
	MessageStream   JSONMessageType = "Stream"
	MessageConn     JSONMessageType = "Conn"
	MessageProps    JSONMessageType = "Props"
	MessageCmd      JSONMessageType = "Cmd"
	MessageChat     JSONMessageType = "Chat"
)

func (ext *ExtendedConn) AddHandler(handler whatsapp.Handler) {
	ext.Conn.AddHandler(handler)
	ext.handlers = append(ext.handlers, handler)
}

func (ext *ExtendedConn) HandleError(error) {}

type UnhandledJSONMessageHandler interface {
	whatsapp.Handler
	HandleUnhandledJSONMessage(string)
}

type JSONParseErrorHandler interface {
	whatsapp.Handler
	HandleJSONParseError(error)
}

func (ext *ExtendedConn) jsonParseError(err error) {
	for _, handler := range ext.handlers {
		errorHandler, ok := handler.(JSONParseErrorHandler)
		if !ok {
			continue
		}
		errorHandler.HandleJSONParseError(err)
	}
}

func (ext *ExtendedConn) HandleJsonMessage(message string) {
	msg := JSONMessage{}
	err := json.Unmarshal([]byte(message), &msg)
	if err != nil || len(msg) < 2 {
		ext.jsonParseError(err)
		return
	}

	var msgType JSONMessageType
	json.Unmarshal(msg[0], &msgType)

	switch msgType {
	case MessagePresence:
		ext.handleMessagePresence(msg[1])
	case MessageStream:
		ext.handleMessageStream(msg[1:])
	case MessageConn:
		ext.handleMessageConn(msg[1])
	case MessageProps:
		ext.handleMessageProps(msg[1])
	case MessageMsgInfo, MessageMsg:
		ext.handleMessageMsgInfo(msgType, msg[1])
	case MessageCmd:
		ext.handleMessageCommand(msg[1])
	case MessageChat:
		ext.handleMessageChatUpdate(msg[1])
	default:
		for _, handler := range ext.handlers {
			ujmHandler, ok := handler.(UnhandledJSONMessageHandler)
			if !ok {
				continue
			}
			ujmHandler.HandleUnhandledJSONMessage(message)
		}
	}
}