Răsfoiți Sursa

Handle user avatar changes

Tulir Asokan 6 ani în urmă
părinte
comite
ccfa85e44a
5 a modificat fișierele cu 91 adăugiri și 7 ștergeri
  1. 6 1
      ROADMAP.md
  2. 15 6
      puppet.go
  3. 8 0
      user.go
  4. 59 0
      whatsapp-ext/cmd.go
  5. 3 0
      whatsapp-ext/jsonmessage.go

+ 6 - 1
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

+ 15 - 6
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()
 	}
 }

+ 8 - 0
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)
 }

+ 59 - 0
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 <https://www.gnu.org/licenses/>.
+
+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)
+	}
+}

+ 3 - 0
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)