Parcourir la source

Merge pull request #1961 from slingamn/readmarker

fix critical bugs in draft/read-marker
tags/v2.10.0-rc2
Shivaram Lingamneni il y a 2 ans
Parent
révision
ae55a4c660
Aucun compte lié à l'adresse e-mail de l'auteur
4 fichiers modifiés avec 16 ajouts et 13 suppressions
  1. 4
    3
      irc/accounts.go
  2. 8
    7
      irc/client.go
  3. 2
    1
      irc/getters.go
  4. 2
    2
      irc/handlers.go

+ 4
- 3
irc/accounts.go Voir le fichier

130
 			am.server.AddAlwaysOnClient(
130
 			am.server.AddAlwaysOnClient(
131
 				account,
131
 				account,
132
 				am.loadChannels(accountName),
132
 				am.loadChannels(accountName),
133
-				am.loadLastSeen(accountName),
133
+				am.loadTimeMap(keyAccountLastSeen, accountName),
134
+				am.loadTimeMap(keyAccountReadMarkers, accountName),
134
 				am.loadModes(accountName),
135
 				am.loadModes(accountName),
135
 				am.loadRealname(accountName),
136
 				am.loadRealname(accountName),
136
 			)
137
 			)
675
 	}
676
 	}
676
 }
677
 }
677
 
678
 
678
-func (am *AccountManager) loadLastSeen(account string) (lastSeen map[string]time.Time) {
679
-	key := fmt.Sprintf(keyAccountLastSeen, account)
679
+func (am *AccountManager) loadTimeMap(baseKey, account string) (lastSeen map[string]time.Time) {
680
+	key := fmt.Sprintf(baseKey, account)
680
 	var lsText string
681
 	var lsText string
681
 	am.server.store.Update(func(tx *buntdb.Tx) error {
682
 	am.server.store.Update(func(tx *buntdb.Tx) error {
682
 		lsText, _ = tx.Get(key)
683
 		lsText, _ = tx.Get(key)

+ 8
- 7
irc/client.go Voir le fichier

389
 	client.run(session)
389
 	client.run(session)
390
 }
390
 }
391
 
391
 
392
-func (server *Server) AddAlwaysOnClient(account ClientAccount, channelToStatus map[string]alwaysOnChannelStatus, lastSeen map[string]time.Time, uModes modes.Modes, realname string) {
392
+func (server *Server) AddAlwaysOnClient(account ClientAccount, channelToStatus map[string]alwaysOnChannelStatus, lastSeen, readMarkers map[string]time.Time, uModes modes.Modes, realname string) {
393
 	now := time.Now().UTC()
393
 	now := time.Now().UTC()
394
 	config := server.Config()
394
 	config := server.Config()
395
 	if lastSeen == nil && account.Settings.AutoreplayMissed {
395
 	if lastSeen == nil && account.Settings.AutoreplayMissed {
407
 	}
407
 	}
408
 
408
 
409
 	client := &Client{
409
 	client := &Client{
410
-		lastSeen:   lastSeen,
411
-		lastActive: now,
412
-		channels:   make(ChannelSet),
413
-		ctime:      now,
414
-		languages:  server.Languages().Default(),
415
-		server:     server,
410
+		lastSeen:    lastSeen,
411
+		readMarkers: readMarkers,
412
+		lastActive:  now,
413
+		channels:    make(ChannelSet),
414
+		ctime:       now,
415
+		languages:   server.Languages().Default(),
416
+		server:      server,
416
 
417
 
417
 		username:        username,
418
 		username:        username,
418
 		cloakedHostname: cloakedHostname,
419
 		cloakedHostname: cloakedHostname,

+ 2
- 1
irc/getters.go Voir le fichier

4
 package irc
4
 package irc
5
 
5
 
6
 import (
6
 import (
7
+	"fmt"
7
 	"net"
8
 	"net"
8
 	"sync/atomic"
9
 	"sync/atomic"
9
 	"time"
10
 	"time"
493
 	t, ok := client.readMarkers[cfname]
494
 	t, ok := client.readMarkers[cfname]
494
 	client.stateMutex.RUnlock()
495
 	client.stateMutex.RUnlock()
495
 	if ok {
496
 	if ok {
496
-		return t.Format(IRCv3TimestampFormat)
497
+		return fmt.Sprintf("timestamp=%s", t.Format(IRCv3TimestampFormat))
497
 	}
498
 	}
498
 	return "*"
499
 	return "*"
499
 }
500
 }

+ 2
- 2
irc/handlers.go Voir le fichier

2770
 	}
2770
 	}
2771
 
2771
 
2772
 	// "MARKREAD client set command": MARKREAD <target> <timestamp>
2772
 	// "MARKREAD client set command": MARKREAD <target> <timestamp>
2773
-	readTimestamp := msg.Params[1]
2773
+	readTimestamp := strings.TrimPrefix(msg.Params[1], "timestamp=")
2774
 	readTime, err := time.Parse(IRCv3TimestampFormat, readTimestamp)
2774
 	readTime, err := time.Parse(IRCv3TimestampFormat, readTimestamp)
2775
 	if err != nil {
2775
 	if err != nil {
2776
 		rb.Add(nil, server.name, "FAIL", "MARKREAD", "INVALID_PARAMS", utils.SafeErrorParam(readTimestamp), client.t("Invalid timestamp"))
2776
 		rb.Add(nil, server.name, "FAIL", "MARKREAD", "INVALID_PARAMS", utils.SafeErrorParam(readTimestamp), client.t("Invalid timestamp"))
2777
 		return
2777
 		return
2778
 	}
2778
 	}
2779
 	result := client.SetReadMarker(cftarget, readTime)
2779
 	result := client.SetReadMarker(cftarget, readTime)
2780
-	readTimestamp = result.Format(IRCv3TimestampFormat)
2780
+	readTimestamp = fmt.Sprintf("timestamp=%s", result.Format(IRCv3TimestampFormat))
2781
 	// inform the originating session whether it was a success or a no-op:
2781
 	// inform the originating session whether it was a success or a no-op:
2782
 	rb.Add(nil, server.name, "MARKREAD", unfoldedTarget, readTimestamp)
2782
 	rb.Add(nil, server.name, "MARKREAD", unfoldedTarget, readTimestamp)
2783
 	if result.Equal(readTime) {
2783
 	if result.Equal(readTime) {

Chargement…
Annuler
Enregistrer