From a626d14a3ffd5872fd33061466b12047c80d02f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Sommer?= Date: Fri, 7 Dec 2018 14:42:57 +0100 Subject: [PATCH] No sync on startup; new command `import contacts` Having an import of all contacts on each startup and after login is very annoying, if you have a big list of contacts. If you choose to not join a room with all contacts, you get the invitation over and over on each restart of the service. Better is to have a command for the management room to explicitly start the import. --- commands.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 2 +- user.go | 23 +---------------------- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/commands.go b/commands.go index 213c4e1..6f467a8 100644 --- a/commands.go +++ b/commands.go @@ -19,9 +19,12 @@ package main import ( "strings" + "github.com/Rhymen/go-whatsapp" "maunium.net/go/maulogger" "maunium.net/go/mautrix-appservice" + "maunium.net/go/mautrix-whatsapp/database" "maunium.net/go/mautrix-whatsapp/types" + "maunium.net/go/mautrix-whatsapp/whatsapp-ext" ) type CommandHandler struct { @@ -74,6 +77,8 @@ func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, mes handler.CommandLogout(ce) case "help": handler.CommandHelp(ce) + case "import": + handler.CommandImport(ce) default: ce.Reply("Unknown Command") } @@ -121,5 +126,44 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) { cmdPrefix + cmdHelpHelp, cmdPrefix + cmdLoginHelp, cmdPrefix + cmdLogoutHelp, + cmdPrefix + cmdImportHelp, }, "\n")) } + +const cmdImportHelp = `import JID|contacts - Open up a room for JID or for each WhatsApp contact` + +// CommandImport handles import command +func (handler *CommandHandler) CommandImport(ce *CommandEvent) { + // ensure all messages go to the management room + ce.RoomID = ce.User.ManagementRoom + + user := ce.User + + if ce.Args[0] == "contacts" { + handler.log.Debugln("Importing all contacts of", user) + _, err := user.Conn.Contacts() + if err != nil { + handler.log.Errorln("Error on update of contacts of user", user, ":", err) + return + } + + for jid, contact := range user.Conn.Store.Contacts { + if strings.HasSuffix(jid, whatsappExt.NewUserSuffix) { + puppet := user.bridge.GetPuppetByJID(contact.Jid) + puppet.Sync(user, contact) + } else { + portal := user.bridge.GetPortalByJID(database.GroupPortalKey(contact.Jid)) + portal.Sync(user, contact) + } + } + + ce.Reply("Importing all contacts done") + } else { + jid := ce.Args[0] + whatsappExt.NewUserSuffix + handler.log.Debugln("Importing", jid, "for", user) + puppet := user.bridge.GetPuppetByJID(jid) + + contact := whatsapp.Contact { Jid: jid } + puppet.Sync(user, contact) + } +} diff --git a/main.go b/main.go index 5594e2c..9965727 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func (bridge *Bridge) UpdateBotProfile() { func (bridge *Bridge) StartUsers() { for _, user := range bridge.GetAllUsers() { - go user.Start() + go user.Connect(false) } } diff --git a/user.go b/user.go index 0c44f5a..6f9129f 100644 --- a/user.go +++ b/user.go @@ -132,12 +132,6 @@ func (user *User) SetSession(session *whatsapp.Session) { user.Update() } -func (user *User) Start() { - if user.Connect(false) { - user.Sync() - } -} - func (user *User) Connect(evenIfNoSession bool) bool { if user.Conn != nil { return true @@ -210,22 +204,7 @@ func (user *User) Login(roomID types.MatrixRoomID) { user.JID = strings.Replace(user.Conn.Info.Wid, whatsappExt.OldUserSuffix, whatsappExt.NewUserSuffix, 1) user.Session = &session user.Update() - bot.SendNotice(roomID, "Successfully logged in. Synchronizing chats...") - go user.Sync() -} - -func (user *User) Sync() { - user.log.Debugln("Syncing...") - user.Conn.Contacts() - for jid, contact := range user.Conn.Store.Contacts { - if strings.HasSuffix(jid, whatsappExt.NewUserSuffix) { - puppet := user.bridge.GetPuppetByJID(contact.Jid) - puppet.Sync(user, contact) - } else { - portal := user.bridge.GetPortalByJID(database.GroupPortalKey(contact.Jid)) - portal.Sync(user, contact) - } - } + bot.SendNotice(roomID, "Successfully logged in. Now, you may ask for `import contacts`.") } func (user *User) HandleError(err error) {