From f9c3e99d10725dd9744a91346974988bf9638ce8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 23 May 2019 20:09:13 +0300 Subject: [PATCH] Fix/change things --- commands.go | 35 ++++++++++++++++++++++++++++++++--- portal.go | 6 +----- puppet.go | 6 +----- whatsapp-ext/jsonmessage.go | 5 ----- whatsapp-ext/whatsapp.go | 22 ++++++++++++++++++++++ 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/commands.go b/commands.go index 9500b7a..ddff8a2 100644 --- a/commands.go +++ b/commands.go @@ -76,6 +76,7 @@ func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, mes User: user, Args: args[1:], } + handler.log.Debugfln("%s sent '%s' in %s", user.MXID, message, roomID) switch cmd { case "login": handler.CommandLogin(ce) @@ -83,11 +84,15 @@ func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, mes handler.CommandHelp(ce) case "reconnect": handler.CommandReconnect(ce) + case "disconnect": + handler.CommandDisconnect(ce) + case "delete-connection": + handler.CommandDeleteConnection(ce) case "delete-session": handler.CommandDeleteSession(ce) case "delete-portal": handler.CommandDeletePortal(ce) - case "logout", "disconnect", "sync", "list", "open", "pm": + case "logout", "sync", "list", "open", "pm": if ce.User.Conn == nil { ce.Reply("You are not logged in. Use the `login` command to log into WhatsApp.") return @@ -99,8 +104,6 @@ func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, mes switch cmd { case "logout": handler.CommandLogout(ce) - case "disconnect": - handler.CommandDisconnect(ce) case "sync": handler.CommandSync(ce) case "list": @@ -147,6 +150,7 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) { ce.User.log.Warnln("Error while disconnecting after logout:", err) } ce.User.Connected = false + ce.User.Conn.RemoveHandlers() ce.User.Conn = nil ce.User.SetSession(nil) ce.Reply("Logged out successfully.") @@ -163,6 +167,7 @@ func (handler *CommandHandler) CommandDeleteSession(ce *CommandEvent) { ce.User.Connected = false if ce.User.Conn != nil { _, _ = ce.User.Conn.Disconnect() + ce.User.Conn.RemoveHandlers() ce.User.Conn = nil } ce.Reply("Session information purged") @@ -171,6 +176,11 @@ func (handler *CommandHandler) CommandDeleteSession(ce *CommandEvent) { const cmdReconnectHelp = `reconnect - Reconnect to WhatsApp` func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) { + if ce.User.Conn == nil { + ce.Reply("No existing connection, creating one...") + ce.User.Connect(false) + return + } err := ce.User.Conn.Restore() if err == whatsapp.ErrInvalidSession { if ce.User.Session != nil { @@ -211,9 +221,28 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) { go ce.User.PostLogin() } +func (handler *CommandHandler) CommandDeleteConnection(ce *CommandEvent) { + if ce.User.Conn == nil { + ce.Reply("You don't have a WhatsApp connection.") + return + } + sess, err := ce.User.Conn.Disconnect() + if err == nil && len(sess.Wid) > 0 { + ce.User.SetSession(&sess) + } + ce.User.Connected = false + ce.User.Conn.RemoveHandlers() + ce.User.Conn = nil + ce.Reply("Successfully disconnected. Use the `reconnect` command to reconnect.") +} + const cmdDisconnectHelp = `disconnect - Disconnect from WhatsApp (without logging out)` func (handler *CommandHandler) CommandDisconnect(ce *CommandEvent) { + if ce.User.Conn == nil { + ce.Reply("You don't have a WhatsApp connection.") + return + } sess, err := ce.User.Conn.Disconnect() ce.User.Connected = false if err == whatsapp.ErrNotConnected { diff --git a/portal.go b/portal.go index 4f7be1a..1d1b730 100644 --- a/portal.go +++ b/portal.go @@ -326,11 +326,7 @@ func (portal *Portal) UpdateAvatar(user *User, avatar *whatsappExt.ProfilePicInf } } - if avatar.Status != 0 && avatar.Status != 404 { - // 401s can happen a lot so let's not log those. - if avatar.Status != 401 { - portal.log.Warnln("Unexpected avatar update status code, not updating.", avatar) - } + if avatar.Status != 0 { return false } diff --git a/puppet.go b/puppet.go index 6ad656f..e72919a 100644 --- a/puppet.go +++ b/puppet.go @@ -136,11 +136,7 @@ func (puppet *Puppet) UpdateAvatar(source *User, avatar *whatsappExt.ProfilePicI } } - if avatar.Status != 0 && avatar.Status != 404 { - // 401s can happen a lot so let's not log those. - if avatar.Status != 401 { - puppet.log.Warnln("Unexpected avatar update status code, not updating.", avatar) - } + if avatar.Status != 0 { return false } diff --git a/whatsapp-ext/jsonmessage.go b/whatsapp-ext/jsonmessage.go index 8c95a0f..be6fb15 100644 --- a/whatsapp-ext/jsonmessage.go +++ b/whatsapp-ext/jsonmessage.go @@ -37,11 +37,6 @@ const ( 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 { diff --git a/whatsapp-ext/whatsapp.go b/whatsapp-ext/whatsapp.go index f3d0b84..9f0448e 100644 --- a/whatsapp-ext/whatsapp.go +++ b/whatsapp-ext/whatsapp.go @@ -46,6 +46,28 @@ func ExtendConn(conn *whatsapp.Conn) *ExtendedConn { return ext } +func (ext *ExtendedConn) AddHandler(handler whatsapp.Handler) { + ext.Conn.AddHandler(handler) + ext.handlers = append(ext.handlers, handler) +} + + +func (ext *ExtendedConn) RemoveHandler(handler whatsapp.Handler) bool { + ext.Conn.RemoveHandler(handler) + for i, v := range ext.handlers { + if v == handler { + ext.handlers = append(ext.handlers[:i], ext.handlers[i+1:]...) + return true + } + } + return false +} + +func (ext *ExtendedConn) RemoveHandlers() { + ext.Conn.RemoveHandlers() + ext.handlers = make([]whatsapp.Handler, 0) +} + func (ext *ExtendedConn) shouldCallSynchronously(handler whatsapp.Handler) bool { sh, ok := handler.(whatsapp.SyncHandler) return ok && sh.ShouldCallSynchronously()