Browse Source

Merge pull request #1961 from slingamn/readmarker

fix critical bugs in draft/read-marker
tags/v2.10.0-rc2
Shivaram Lingamneni 2 years ago
parent
commit
ae55a4c660
No account linked to committer's email address
4 changed files with 16 additions and 13 deletions
  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 View File

@@ -130,7 +130,8 @@ func (am *AccountManager) createAlwaysOnClients(config *Config) {
130 130
 			am.server.AddAlwaysOnClient(
131 131
 				account,
132 132
 				am.loadChannels(accountName),
133
-				am.loadLastSeen(accountName),
133
+				am.loadTimeMap(keyAccountLastSeen, accountName),
134
+				am.loadTimeMap(keyAccountReadMarkers, accountName),
134 135
 				am.loadModes(accountName),
135 136
 				am.loadRealname(accountName),
136 137
 			)
@@ -675,8 +676,8 @@ func (am *AccountManager) saveTimeMap(account, key string, timeMap map[string]ti
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 681
 	var lsText string
681 682
 	am.server.store.Update(func(tx *buntdb.Tx) error {
682 683
 		lsText, _ = tx.Get(key)

+ 8
- 7
irc/client.go View File

@@ -389,7 +389,7 @@ func (server *Server) RunClient(conn IRCConn) {
389 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 393
 	now := time.Now().UTC()
394 394
 	config := server.Config()
395 395
 	if lastSeen == nil && account.Settings.AutoreplayMissed {
@@ -407,12 +407,13 @@ func (server *Server) AddAlwaysOnClient(account ClientAccount, channelToStatus m
407 407
 	}
408 408
 
409 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 418
 		username:        username,
418 419
 		cloakedHostname: cloakedHostname,

+ 2
- 1
irc/getters.go View File

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

+ 2
- 2
irc/handlers.go View File

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

Loading…
Cancel
Save