aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--connector/xmpp/xmpp.go33
1 files changed, 26 insertions, 7 deletions
diff --git a/connector/xmpp/xmpp.go b/connector/xmpp/xmpp.go
index 483c75e..a25a31b 100644
--- a/connector/xmpp/xmpp.go
+++ b/connector/xmpp/xmpp.go
@@ -35,7 +35,8 @@ type XMPP struct {
conn *gxmpp.Client
- isMUC map[string]bool
+ isMUC map[string]bool
+ joinedMUC map[string]bool
}
func (xm *XMPP) SetHandler(h Handler) {
@@ -86,6 +87,7 @@ func (xm *XMPP) Configure(c Configuration) error {
if xm.isMUC == nil {
xm.isMUC = make(map[string]bool)
}
+ xm.joinedMUC = make(map[string]bool)
xm.connectorLoopNum += 1
go xm.connectLoop(xm.connectorLoopNum)
@@ -106,7 +108,7 @@ func (xm *XMPP) connectLoop(num int) {
return
}
tc := &tls.Config{
- ServerName: strings.Split(xm.jid, "@")[1],
+ ServerName: xm.server,
InsecureSkipVerify: true,
}
options := gxmpp.Options{
@@ -132,12 +134,23 @@ func (xm *XMPP) connectLoop(num int) {
} else {
xm.connected = true
xm.timeout = 10
- err = xm.handleXMPP()
- if err != nil {
- xm.connected = false
- log.Debugf("XMPP disconnected: %s\n", err)
- log.Debugf("Reconnecting.\n")
+
+ for muc, joined := range xm.joinedMUC {
+ if joined {
+ _, err := xm.conn.JoinMUCNoHistory(muc, xm.nickname)
+ if err != nil {
+ log.Warnf("Could not rejoin MUC %s after reconnection: %s", muc, err)
+ xm.handler.Left(RoomID(muc))
+ delete(xm.joinedMUC, muc)
+ }
+ }
}
+
+ err = xm.handleXMPP()
+
+ xm.connected = false
+ log.Debugf("XMPP disconnected: %s\n", err)
+ log.Debugf("Reconnecting.\n")
}
}
}
@@ -289,6 +302,11 @@ func (xm *XMPP) Join(roomId RoomID) error {
log.Tracef("Join %s with nick %s\n", roomId, xm.nickname)
_, err := xm.conn.JoinMUCNoHistory(string(roomId), xm.nickname)
+
+ if err == nil {
+ xm.joinedMUC[string(roomId)] = true
+ }
+
return err
}
@@ -304,6 +322,7 @@ func (xm *XMPP) Invite(userId UserID, roomId RoomID) error {
func (xm *XMPP) Leave(roomId RoomID) {
xm.conn.LeaveMUC(string(roomId))
+ delete(xm.joinedMUC, string(roomId))
}
func (xm *XMPP) SearchForUsers(query string) ([]UserSearchResult, error) {