- Timestamp:
- Mar 29, 2021, 2:55:57 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r480 r482 991 991 // Only send history if we're the first connected client with that name 992 992 // for the network 993 if _, ok := net.offlineClients[dc.clientName]; ok { 993 firstClient := true 994 dc.user.forEachDownstream(func(c *downstreamConn) { 995 if c != dc && c.clientName == dc.clientName && c.network == dc.network { 996 firstClient = false 997 } 998 }) 999 if firstClient { 994 1000 dc.sendNetworkBacklog(net) 995 delete(net.offlineClients, dc.clientName)996 1001 } 997 1002 -
trunk/upstream.go
r480 r482 1741 1741 } 1742 1742 1743 detached := false1744 if ch := uc.network.channels.Value(entity); ch != nil {1745 detached = ch.Detached1746 }1747 1748 1743 delivered := uc.network.delivered.Value(entity) 1749 1744 entityCM := uc.network.casemap(entity) 1750 1745 if delivered == nil { 1746 // This is the first message we receive from this target. Save the last 1747 // message ID in delivery receipts, so that we can send the new message 1748 // in the backlog if an offline client reconnects. 1751 1749 lastID, err := uc.user.msgStore.LastMsgID(uc.network, entityCM, time.Now()) 1752 1750 if err != nil { … … 1758 1756 uc.network.delivered.SetValue(entity, delivered) 1759 1757 1760 for clientName, _ := range uc.network. offlineClients {1758 for clientName, _ := range uc.network.clients { 1761 1759 delivered[clientName] = lastID 1762 }1763 1764 if detached {1765 // If the channel is detached, online clients act as offline1766 // clients too1767 uc.forEachDownstream(func(dc *downstreamConn) {1768 delivered[dc.clientName] = lastID1769 })1770 1760 } 1771 1761 } -
trunk/user.go
r480 r482 63 63 stopped chan struct{} 64 64 65 conn 66 channels 67 delivered 68 offlineClientsmap[string]struct{} // indexed by client name69 lastError 70 casemap 65 conn *upstreamConn 66 channels channelCasemapMap 67 delivered deliveredCasemapMap 68 clients map[string]struct{} // indexed by client name 69 lastError error 70 casemap casemapping 71 71 } 72 72 … … 79 79 80 80 return &network{ 81 Network: 82 user: 83 stopped: 84 channels: 85 delivered: 86 offlineClients:make(map[string]struct{}),87 casemap: 81 Network: *record, 82 user: user, 83 stopped: make(chan struct{}), 84 channels: m, 85 delivered: deliveredCasemapMap{newCasemapMap(0)}, 86 clients: make(map[string]struct{}), 87 casemap: casemapRFC1459, 88 88 } 89 89 } … … 197 197 198 198 net.forEachDownstream(func(dc *downstreamConn) { 199 net.offlineClients[dc.clientName] = struct{}{}200 201 199 dc.SendMessage(&irc.Message{ 202 200 Prefix: dc.prefix(), … … 449 447 450 448 dc.forEachNetwork(func(network *network) { 449 network.clients[dc.clientName] = struct{}{} 451 450 if network.lastError != nil { 452 451 sendServiceNOTICE(dc, fmt.Sprintf("disconnected from %s: %v", network.GetName(), network.lastError)) … … 466 465 } 467 466 } 468 469 // Save history if we're the last client with this name470 skipHistory := make(map[*network]bool)471 u.forEachDownstream(func(conn *downstreamConn) {472 if dc.clientName == conn.clientName {473 skipHistory[conn.network] = true474 }475 })476 477 dc.forEachNetwork(func(net *network) {478 if skipHistory[net] || skipHistory[nil] {479 return480 }481 482 net.offlineClients[dc.clientName] = struct{}{}483 })484 467 485 468 u.forEachUpstream(func(uc *upstreamConn) {
Note:
See TracChangeset
for help on using the changeset viewer.