Changeset 489 in code for trunk/user.go
- Timestamp:
- Mar 31, 2021, 4:04:13 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/user.go
r487 r489 90 90 for _, entry := range ds.m.innerMap { 91 91 f(entry.originalKey) 92 } 93 } 94 95 func (ds deliveredStore) ForEachClient(f func(clientName string)) { 96 clients := make(map[string]struct{}) 97 for _, entry := range ds.m.innerMap { 98 delivered := entry.value.(deliveredClientMap) 99 for clientName := range delivered { 100 clients[clientName] = struct{}{} 101 } 102 } 103 104 for clientName := range clients { 105 f(clientName) 92 106 } 93 107 } … … 299 313 } 300 314 315 func (net *network) storeClientDeliveryReceipts(clientName string) { 316 if !net.user.hasPersistentMsgStore() { 317 return 318 } 319 320 var receipts []DeliveryReceipt 321 net.delivered.ForEachTarget(func(target string) { 322 msgID := net.delivered.LoadID(target, clientName) 323 if msgID == "" { 324 return 325 } 326 receipts = append(receipts, DeliveryReceipt{ 327 Target: target, 328 InternalMsgID: msgID, 329 }) 330 }) 331 332 if err := net.user.srv.db.StoreClientDeliveryReceipts(net.ID, clientName, receipts); err != nil { 333 net.user.srv.Logger.Printf("failed to store delivery receipts for user %q, client %q, network %q: %v", net.user.Username, clientName, net.GetName(), err) 334 } 335 } 336 301 337 type user struct { 302 338 User … … 309 345 downstreamConns []*downstreamConn 310 346 msgStore messageStore 311 clientNames map[string]struct{}312 347 313 348 // LIST commands in progress … … 330 365 331 366 return &user{ 332 User: *record, 333 srv: srv, 334 events: make(chan event, 64), 335 done: make(chan struct{}), 336 msgStore: msgStore, 337 clientNames: make(map[string]struct{}), 367 User: *record, 368 srv: srv, 369 events: make(chan event, 64), 370 done: make(chan struct{}), 371 msgStore: msgStore, 338 372 } 339 373 } … … 407 441 network := newNetwork(u, &record, channels) 408 442 u.networks = append(u.networks, network) 443 444 if u.hasPersistentMsgStore() { 445 receipts, err := u.srv.db.ListDeliveryReceipts(record.ID) 446 if err != nil { 447 u.srv.Logger.Printf("failed to load delivery receipts for user %q, network %q: %v", u.Username, network.GetName(), err) 448 return 449 } 450 451 for _, rcpt := range receipts { 452 network.delivered.StoreID(rcpt.Target, rcpt.Client, rcpt.InternalMsgID) 453 } 454 } 409 455 410 456 go network.run() … … 490 536 uc.updateAway() 491 537 }) 492 493 u.clientNames[dc.clientName] = struct{}{}494 538 case eventDownstreamDisconnected: 495 539 dc := e.dc … … 501 545 } 502 546 } 547 548 dc.forEachNetwork(func(net *network) { 549 net.storeClientDeliveryReceipts(dc.clientName) 550 }) 503 551 504 552 u.forEachUpstream(func(uc *upstreamConn) { … … 525 573 for _, n := range u.networks { 526 574 n.stop() 575 576 n.delivered.ForEachClient(func(clientName string) { 577 n.storeClientDeliveryReceipts(clientName) 578 }) 527 579 } 528 580 return … … 666 718 <-u.done 667 719 } 720 721 func (u *user) hasPersistentMsgStore() bool { 722 if u.msgStore == nil { 723 return false 724 } 725 _, isMem := u.msgStore.(*memoryMessageStore) 726 return !isMem 727 }
Note:
See TracChangeset
for help on using the changeset viewer.