ソースを参照

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.
Jörg Sommer 6 年 前
コミット
a626d14a3f
3 ファイル変更46 行追加23 行削除
  1. 44 0
      commands.go
  2. 1 1
      main.go
  3. 1 22
      user.go

+ 44 - 0
commands.go

@@ -19,9 +19,12 @@ package main
 import (
 import (
 	"strings"
 	"strings"
 
 
+	"github.com/Rhymen/go-whatsapp"
 	"maunium.net/go/maulogger"
 	"maunium.net/go/maulogger"
 	"maunium.net/go/mautrix-appservice"
 	"maunium.net/go/mautrix-appservice"
+	"maunium.net/go/mautrix-whatsapp/database"
 	"maunium.net/go/mautrix-whatsapp/types"
 	"maunium.net/go/mautrix-whatsapp/types"
+	"maunium.net/go/mautrix-whatsapp/whatsapp-ext"
 )
 )
 
 
 type CommandHandler struct {
 type CommandHandler struct {
@@ -74,6 +77,8 @@ func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, mes
 		handler.CommandLogout(ce)
 		handler.CommandLogout(ce)
 	case "help":
 	case "help":
 		handler.CommandHelp(ce)
 		handler.CommandHelp(ce)
+	case "import":
+		handler.CommandImport(ce)
 	default:
 	default:
 		ce.Reply("Unknown Command")
 		ce.Reply("Unknown Command")
 	}
 	}
@@ -121,5 +126,44 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) {
 		cmdPrefix + cmdHelpHelp,
 		cmdPrefix + cmdHelpHelp,
 		cmdPrefix + cmdLoginHelp,
 		cmdPrefix + cmdLoginHelp,
 		cmdPrefix + cmdLogoutHelp,
 		cmdPrefix + cmdLogoutHelp,
+		cmdPrefix + cmdImportHelp,
 	}, "\n"))
 	}, "\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)
+	}
+}

+ 1 - 1
main.go

@@ -185,7 +185,7 @@ func (bridge *Bridge) UpdateBotProfile() {
 
 
 func (bridge *Bridge) StartUsers() {
 func (bridge *Bridge) StartUsers() {
 	for _, user := range bridge.GetAllUsers() {
 	for _, user := range bridge.GetAllUsers() {
-		go user.Start()
+		go user.Connect(false)
 	}
 	}
 }
 }
 
 

+ 1 - 22
user.go

@@ -132,12 +132,6 @@ func (user *User) SetSession(session *whatsapp.Session) {
 	user.Update()
 	user.Update()
 }
 }
 
 
-func (user *User) Start() {
-	if user.Connect(false) {
-		user.Sync()
-	}
-}
-
 func (user *User) Connect(evenIfNoSession bool) bool {
 func (user *User) Connect(evenIfNoSession bool) bool {
 	if user.Conn != nil {
 	if user.Conn != nil {
 		return true
 		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.JID = strings.Replace(user.Conn.Info.Wid, whatsappExt.OldUserSuffix, whatsappExt.NewUserSuffix, 1)
 	user.Session = &session
 	user.Session = &session
 	user.Update()
 	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) {
 func (user *User) HandleError(err error) {