From ccfa85e44aed45b43c89495837b417df0e551842 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 26 Aug 2018 00:39:36 +0300 Subject: [PATCH] Handle user avatar changes --- ROADMAP.md | 7 ++++- puppet.go | 21 +++++++++---- user.go | 8 +++++ whatsapp-ext/cmd.go | 59 +++++++++++++++++++++++++++++++++++++ whatsapp-ext/jsonmessage.go | 3 ++ 5 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 whatsapp-ext/cmd.go diff --git a/ROADMAP.md b/ROADMAP.md index c5cae8d..764219f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -42,7 +42,12 @@ * [ ] Avatar * [ ] Description * [x] Initial group metadata - * [x] User metadata (displayname/avatar) + * [ ] User metadata changes + * [ ] Display name + * [x] Avatar + * [x] Initial user metadata + * [x] Display name + * [x] Avatar * Misc * [x] Automatic portal creation * [x] At startup diff --git a/puppet.go b/puppet.go index d59e59c..90313c8 100644 --- a/puppet.go +++ b/puppet.go @@ -146,17 +146,26 @@ func (puppet *Puppet) Intent() *appservice.IntentAPI { return puppet.bridge.AppService.Intent(puppet.MXID) } -func (puppet *Puppet) UpdateAvatar() bool { - avatar, err := puppet.user.Conn.GetProfilePicThumb(puppet.JID) - if err != nil { - puppet.log.Errorln(err) - return false +func (puppet *Puppet) UpdateAvatar(avatar *whatsapp_ext.ProfilePicInfo) bool { + if avatar == nil { + var err error + avatar, err = puppet.user.Conn.GetProfilePicThumb(puppet.JID) + if err != nil { + puppet.log.Errorln(err) + return false + } } if avatar.Tag == puppet.Avatar { return false } + if len(avatar.URL) == 0 { + puppet.Intent().SetAvatarURL("") + puppet.Avatar = avatar.Tag + return true + } + data, err := avatar.DownloadBytes() if err != nil { puppet.log.Errorln("Failed to download avatar:", err) @@ -189,7 +198,7 @@ func (puppet *Puppet) Sync(contact whatsapp.Contact) { } } - if puppet.UpdateAvatar() { + if puppet.UpdateAvatar(nil) { puppet.Update() } } diff --git a/user.go b/user.go index 98b8c86..78fdd08 100644 --- a/user.go +++ b/user.go @@ -291,6 +291,14 @@ func (user *User) HandleMsgInfo(info whatsapp_ext.MsgInfo) { } } +func (user *User) HandleCommand(cmd whatsapp_ext.Command) { + switch cmd.Type { + case whatsapp_ext.CommandPicture: + puppet := user.GetPuppetByJID(cmd.JID) + puppet.UpdateAvatar(cmd.ProfilePicInfo) + } +} + func (user *User) HandleJsonMessage(message string) { user.log.Debugln("JSON message:", message) } diff --git a/whatsapp-ext/cmd.go b/whatsapp-ext/cmd.go new file mode 100644 index 0000000..3a4bcf5 --- /dev/null +++ b/whatsapp-ext/cmd.go @@ -0,0 +1,59 @@ +// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge. +// Copyright (C) 2018 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 . + +package whatsapp_ext + +import ( + "encoding/json" + "strings" + + "github.com/Rhymen/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(msgType JSONMessageType, 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/whatsapp-ext/jsonmessage.go b/whatsapp-ext/jsonmessage.go index b0c156f..cd7e602 100644 --- a/whatsapp-ext/jsonmessage.go +++ b/whatsapp-ext/jsonmessage.go @@ -33,6 +33,7 @@ const ( MessageStream JSONMessageType = "Stream" MessageConn JSONMessageType = "Conn" MessageProps JSONMessageType = "Props" + MessageCmd JSONMessageType = "Cmd" ) func (ext *ExtendedConn) AddHandler(handler whatsapp.Handler) { @@ -83,6 +84,8 @@ func (ext *ExtendedConn) HandleJsonMessage(message string) { ext.handleMessageProps(msg[1]) case MessageMsgInfo, MessageMsg: ext.handleMessageMsgInfo(msgType, msg[1]) + case MessageCmd: + ext.handleMessageCommand(msgType, msg[1]) default: for _, handler := range ext.handlers { ujmHandler, ok := handler.(UnhandledJSONMessageHandler)