summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext')
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/chat.go147
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/cmd.go59
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/conn.go60
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/jsonmessage.go102
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/msginfo.go90
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/presence.go67
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/props.go68
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/stream.go63
-rw-r--r--vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/whatsapp.go132
9 files changed, 788 insertions, 0 deletions
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/chat.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/chat.go
new file mode 100644
index 00000000..b1a08823
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/chat.go
@@ -0,0 +1,147 @@
+// 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"
+ "strings"
+
+ "github.com/matterbridge/go-whatsapp"
+)
+
+type ChatUpdateCommand string
+
+const (
+ ChatUpdateCommandAction ChatUpdateCommand = "action"
+)
+
+type ChatUpdate struct {
+ JID string `json:"id"`
+ Command ChatUpdateCommand `json:"cmd"`
+ Data ChatUpdateData `json:"data"`
+}
+
+type ChatActionType string
+
+const (
+ ChatActionNameChange ChatActionType = "subject"
+ ChatActionAddTopic ChatActionType = "desc_add"
+ ChatActionRemoveTopic ChatActionType = "desc_remove"
+ ChatActionRestrict ChatActionType = "restrict"
+ ChatActionAnnounce ChatActionType = "announce"
+ ChatActionPromote ChatActionType = "promote"
+ ChatActionDemote ChatActionType = "demote"
+)
+
+type ChatUpdateData struct {
+ Action ChatActionType
+ SenderJID string
+
+ NameChange struct {
+ Name string `json:"subject"`
+ SetAt int64 `json:"s_t"`
+ SetBy string `json:"s_o"`
+ }
+
+ AddTopic struct {
+ Topic string `json:"desc"`
+ ID string `json:"descId"`
+ SetAt int64 `json:"descTime"`
+ }
+
+ RemoveTopic struct {
+ ID string `json:"descId"`
+ }
+
+ Restrict bool
+
+ Announce bool
+
+ PermissionChange struct {
+ JIDs []string `json:"participants"`
+ }
+}
+
+func (cud *ChatUpdateData) UnmarshalJSON(data []byte) error {
+ var arr []json.RawMessage
+ err := json.Unmarshal(data, &arr)
+ if err != nil {
+ return err
+ } else if len(arr) < 3 {
+ return nil
+ }
+
+ err = json.Unmarshal(arr[0], &cud.Action)
+ if err != nil {
+ return err
+ }
+
+ err = json.Unmarshal(arr[1], &cud.SenderJID)
+ if err != nil {
+ return err
+ }
+ cud.SenderJID = strings.Replace(cud.SenderJID, OldUserSuffix, NewUserSuffix, 1)
+
+ var unmarshalTo interface{}
+ switch cud.Action {
+ case ChatActionNameChange:
+ unmarshalTo = &cud.NameChange
+ case ChatActionAddTopic:
+ unmarshalTo = &cud.AddTopic
+ case ChatActionRemoveTopic:
+ unmarshalTo = &cud.RemoveTopic
+ case ChatActionRestrict:
+ unmarshalTo = &cud.Restrict
+ case ChatActionAnnounce:
+ unmarshalTo = &cud.Announce
+ case ChatActionPromote, ChatActionDemote:
+ unmarshalTo = &cud.PermissionChange
+ default:
+ return nil
+ }
+ err = json.Unmarshal(arr[2], unmarshalTo)
+ if err != nil {
+ return err
+ }
+ cud.NameChange.SetBy = strings.Replace(cud.NameChange.SetBy, OldUserSuffix, NewUserSuffix, 1)
+ for index, jid := range cud.PermissionChange.JIDs {
+ cud.PermissionChange.JIDs[index] = strings.Replace(jid, OldUserSuffix, NewUserSuffix, 1)
+ }
+ return nil
+}
+
+type ChatUpdateHandler interface {
+ whatsapp.Handler
+ HandleChatUpdate(ChatUpdate)
+}
+
+func (ext *ExtendedConn) handleMessageChatUpdate(message []byte) {
+ var event ChatUpdate
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ event.JID = strings.Replace(event.JID, OldUserSuffix, NewUserSuffix, 1)
+ for _, handler := range ext.handlers {
+ chatUpdateHandler, ok := handler.(ChatUpdateHandler)
+ if !ok {
+ continue
+ }
+ go chatUpdateHandler.HandleChatUpdate(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/cmd.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/cmd.go
new file mode 100644
index 00000000..69dbe60c
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/cmd.go
@@ -0,0 +1,59 @@
+// 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"
+ "strings"
+
+ "github.com/matterbridge/go-whatsapp"
+)
+
+type CommandType string
+
+const (
+ CommandPicture CommandType = "picture"
+)
+
+type Command struct {
+ Type CommandType `json:"type"`
+ JID string `json:"jid"`
+
+ *ProfilePicInfo
+}
+
+type CommandHandler interface {
+ whatsapp.Handler
+ HandleCommand(Command)
+}
+
+func (ext *ExtendedConn) handleMessageCommand(message []byte) {
+ var event Command
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ event.JID = strings.Replace(event.JID, OldUserSuffix, NewUserSuffix, 1)
+ for _, handler := range ext.handlers {
+ commandHandler, ok := handler.(CommandHandler)
+ if !ok {
+ continue
+ }
+ go commandHandler.HandleCommand(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/conn.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/conn.go
new file mode 100644
index 00000000..5084cb5a
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/conn.go
@@ -0,0 +1,60 @@
+// 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/matterbridge/go-whatsapp"
+)
+
+type ConnInfo struct {
+ ProtocolVersion []int `json:"protoVersion"`
+ BinaryVersion int `json:"binVersion"`
+ Phone struct {
+ WhatsAppVersion string `json:"wa_version"`
+ MCC string `json:"mcc"`
+ MNC string `json:"mnc"`
+ OSVersion string `json:"os_version"`
+ DeviceManufacturer string `json:"device_manufacturer"`
+ DeviceModel string `json:"device_model"`
+ OSBuildNumber string `json:"os_build_number"`
+ } `json:"phone"`
+ Features map[string]interface{} `json:"features"`
+ PushName string `json:"pushname"`
+}
+
+type ConnInfoHandler interface {
+ whatsapp.Handler
+ HandleConnInfo(ConnInfo)
+}
+
+func (ext *ExtendedConn) handleMessageConn(message []byte) {
+ var event ConnInfo
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ for _, handler := range ext.handlers {
+ connInfoHandler, ok := handler.(ConnInfoHandler)
+ if !ok {
+ continue
+ }
+ connInfoHandler.HandleConnInfo(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/jsonmessage.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/jsonmessage.go
new file mode 100644
index 00000000..0b5a791c
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/jsonmessage.go
@@ -0,0 +1,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/matterbridge/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)
+ }
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/msginfo.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/msginfo.go
new file mode 100644
index 00000000..e929ec90
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/msginfo.go
@@ -0,0 +1,90 @@
+// 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"
+ "strings"
+
+ "github.com/matterbridge/go-whatsapp"
+)
+
+type MsgInfoCommand string
+
+const (
+ MsgInfoCommandAck MsgInfoCommand = "ack"
+ MsgInfoCommandAcks MsgInfoCommand = "acks"
+)
+
+type Acknowledgement int
+
+const (
+ AckMessageSent Acknowledgement = 1
+ AckMessageDelivered Acknowledgement = 2
+ AckMessageRead Acknowledgement = 3
+)
+
+type JSONStringOrArray []string
+
+func (jsoa *JSONStringOrArray) UnmarshalJSON(data []byte) error {
+ var str string
+ if json.Unmarshal(data, &str) == nil {
+ *jsoa = []string{str}
+ return nil
+ }
+ var strs []string
+ json.Unmarshal(data, &strs)
+ *jsoa = strs
+ return nil
+}
+
+type MsgInfo struct {
+ Command MsgInfoCommand `json:"cmd"`
+ IDs JSONStringOrArray `json:"id"`
+ Acknowledgement Acknowledgement `json:"ack"`
+ MessageFromJID string `json:"from"`
+ SenderJID string `json:"participant"`
+ ToJID string `json:"to"`
+ Timestamp int64 `json:"t"`
+}
+
+type MsgInfoHandler interface {
+ whatsapp.Handler
+ HandleMsgInfo(MsgInfo)
+}
+
+func (ext *ExtendedConn) handleMessageMsgInfo(msgType JSONMessageType, message []byte) {
+ var event MsgInfo
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ event.MessageFromJID = strings.Replace(event.MessageFromJID, OldUserSuffix, NewUserSuffix, 1)
+ event.SenderJID = strings.Replace(event.SenderJID, OldUserSuffix, NewUserSuffix, 1)
+ event.ToJID = strings.Replace(event.ToJID, OldUserSuffix, NewUserSuffix, 1)
+ if msgType == MessageMsg {
+ event.SenderJID = event.ToJID
+ }
+ for _, handler := range ext.handlers {
+ msgInfoHandler, ok := handler.(MsgInfoHandler)
+ if !ok {
+ continue
+ }
+ go msgInfoHandler.HandleMsgInfo(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/presence.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/presence.go
new file mode 100644
index 00000000..d70a753a
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/presence.go
@@ -0,0 +1,67 @@
+// 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"
+ "strings"
+
+ "github.com/matterbridge/go-whatsapp"
+)
+
+type PresenceType string
+
+const (
+ PresenceUnavailable PresenceType = "unavailable"
+ PresenceAvailable PresenceType = "available"
+ PresenceComposing PresenceType = "composing"
+)
+
+type Presence struct {
+ JID string `json:"id"`
+ SenderJID string `json:"participant"`
+ Status PresenceType `json:"type"`
+ Timestamp int64 `json:"t"`
+ Deny bool `json:"deny"`
+}
+
+type PresenceHandler interface {
+ whatsapp.Handler
+ HandlePresence(Presence)
+}
+
+func (ext *ExtendedConn) handleMessagePresence(message []byte) {
+ var event Presence
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ event.JID = strings.Replace(event.JID, OldUserSuffix, NewUserSuffix, 1)
+ if len(event.SenderJID) == 0 {
+ event.SenderJID = event.JID
+ } else {
+ event.SenderJID = strings.Replace(event.SenderJID, OldUserSuffix, NewUserSuffix, 1)
+ }
+ for _, handler := range ext.handlers {
+ presenceHandler, ok := handler.(PresenceHandler)
+ if !ok {
+ continue
+ }
+ go presenceHandler.HandlePresence(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/props.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/props.go
new file mode 100644
index 00000000..dcfdef9e
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/props.go
@@ -0,0 +1,68 @@
+// 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/matterbridge/go-whatsapp"
+)
+
+type ProtocolProps struct {
+ WebPresence bool `json:"webPresence"`
+ NotificationQuery bool `json:"notificationQuery"`
+ FacebookCrashLog bool `json:"fbCrashlog"`
+ Bucket string `json:"bucket"`
+ GIFSearch string `json:"gifSearch"`
+ Spam bool `json:"SPAM"`
+ SetBlock bool `json:"SET_BLOCK"`
+ MessageInfo bool `json:"MESSAGE_INFO"`
+ MaxFileSize int `json:"maxFileSize"`
+ Media int `json:"media"`
+ GroupNameLength int `json:"maxSubject"`
+ GroupDescriptionLength int `json:"groupDescLength"`
+ MaxParticipants int `json:"maxParticipants"`
+ VideoMaxEdge int `json:"videoMaxEdge"`
+ ImageMaxEdge int `json:"imageMaxEdge"`
+ ImageMaxKilobytes int `json:"imageMaxKBytes"`
+ Edit int `json:"edit"`
+ FwdUIStartTimestamp int `json:"fwdUiStartTs"`
+ GroupsV3 int `json:"groupsV3"`
+ RestrictGroups int `json:"restrictGroups"`
+ AnnounceGroups int `json:"announceGroups"`
+}
+
+type ProtocolPropsHandler interface {
+ whatsapp.Handler
+ HandleProtocolProps(ProtocolProps)
+}
+
+func (ext *ExtendedConn) handleMessageProps(message []byte) {
+ var event ProtocolProps
+ err := json.Unmarshal(message, &event)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+ for _, handler := range ext.handlers {
+ protocolPropsHandler, ok := handler.(ProtocolPropsHandler)
+ if !ok {
+ continue
+ }
+ go protocolPropsHandler.HandleProtocolProps(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/stream.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/stream.go
new file mode 100644
index 00000000..f2b222d5
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/stream.go
@@ -0,0 +1,63 @@
+// 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/matterbridge/go-whatsapp"
+)
+
+type StreamType string
+
+const (
+ StreamUpdate = "update"
+ StreamSleep = "asleep"
+)
+
+type StreamEvent struct {
+ Type StreamType
+ Boolean bool
+ Version string
+}
+
+type StreamEventHandler interface {
+ whatsapp.Handler
+ HandleStreamEvent(StreamEvent)
+}
+
+func (ext *ExtendedConn) handleMessageStream(message []json.RawMessage) {
+ var event StreamEvent
+ err := json.Unmarshal(message[0], &event.Type)
+ if err != nil {
+ ext.jsonParseError(err)
+ return
+ }
+
+ if event.Type == StreamUpdate && len(message) > 4 {
+ json.Unmarshal(message[1], event.Boolean)
+ json.Unmarshal(message[2], event.Version)
+ }
+
+ for _, handler := range ext.handlers {
+ streamHandler, ok := handler.(StreamEventHandler)
+ if !ok {
+ continue
+ }
+ go streamHandler.HandleStreamEvent(event)
+ }
+}
diff --git a/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/whatsapp.go b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/whatsapp.go
new file mode 100644
index 00000000..bd28a06d
--- /dev/null
+++ b/vendor/github.com/matterbridge/mautrix-whatsapp/whatsapp-ext/whatsapp.go
@@ -0,0 +1,132 @@
+// 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"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "strings"
+
+ "github.com/matterbridge/go-whatsapp"
+)
+
+const (
+ OldUserSuffix = "@c.us"
+ NewUserSuffix = "@s.whatsapp.net"
+)
+
+type ExtendedConn struct {
+ *whatsapp.Conn
+
+ handlers []whatsapp.Handler
+}
+
+func ExtendConn(conn *whatsapp.Conn) *ExtendedConn {
+ ext := &ExtendedConn{
+ Conn: conn,
+ }
+ ext.Conn.AddHandler(ext)
+ return ext
+}
+
+type GroupInfo struct {
+ JID string `json:"jid"`
+ OwnerJID string `json:"owner"`
+
+ Name string `json:"subject"`
+ NameSetTime int64 `json:"subjectTime"`
+ NameSetBy string `json:"subjectOwner"`
+
+ Topic string `json:"desc"`
+ TopicID string `json:"descId"`
+ TopicSetAt int64 `json:"descTime"`
+ TopicSetBy string `json:"descOwner"`
+
+ GroupCreated int64 `json:"creation"`
+
+ Status int16 `json:"status"`
+
+ Participants []struct {
+ JID string `json:"id"`
+ IsAdmin bool `json:"isAdmin"`
+ IsSuperAdmin bool `json:"isSuperAdmin"`
+ } `json:"participants"`
+}
+
+func (ext *ExtendedConn) GetGroupMetaData(jid string) (*GroupInfo, error) {
+ data, err := ext.Conn.GetGroupMetaData(jid)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get group metadata: %v", err)
+ }
+ content := <-data
+
+ info := &GroupInfo{}
+ err = json.Unmarshal([]byte(content), info)
+ if err != nil {
+ return info, fmt.Errorf("failed to unmarshal group metadata: %v", err)
+ }
+
+ for index, participant := range info.Participants {
+ info.Participants[index].JID = strings.Replace(participant.JID, OldUserSuffix, NewUserSuffix, 1)
+ }
+ info.NameSetBy = strings.Replace(info.NameSetBy, OldUserSuffix, NewUserSuffix, 1)
+ info.TopicSetBy = strings.Replace(info.TopicSetBy, OldUserSuffix, NewUserSuffix, 1)
+
+ return info, nil
+}
+
+type ProfilePicInfo struct {
+ URL string `json:"eurl"`
+ Tag string `json:"tag"`
+
+ Status int16 `json:"status"`
+}
+
+func (ppi *ProfilePicInfo) Download() (io.ReadCloser, error) {
+ resp, err := http.Get(ppi.URL)
+ if err != nil {
+ return nil, err
+ }
+ return resp.Body, nil
+}
+
+func (ppi *ProfilePicInfo) DownloadBytes() ([]byte, error) {
+ body, err := ppi.Download()
+ if err != nil {
+ return nil, err
+ }
+ defer body.Close()
+ data, err := ioutil.ReadAll(body)
+ return data, err
+}
+
+func (ext *ExtendedConn) GetProfilePicThumb(jid string) (*ProfilePicInfo, error) {
+ data, err := ext.Conn.GetProfilePicThumb(jid)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get avatar: %v", err)
+ }
+ content := <-data
+ info := &ProfilePicInfo{}
+ err = json.Unmarshal([]byte(content), info)
+ if err != nil {
+ return info, fmt.Errorf("failed to unmarshal avatar info: %v", err)
+ }
+ return info, nil
+}