commit 54ee468

Valentin Lorentz  ·  2023-05-28 16:14:35 +0000 UTC
parent ee425b3
Use 'CHATHISTORY LATEST' instead of 'CHATHISTORY BEFORE' when possible

1. it works on servers which don't support timestamp= anchors
2. it will make it easier to add support for msgid= anchors in a future commit
   (it's not possible to use 'CHATHISTORY BEFORE' if we don't already have a msgid)
3. It avoids duplicating or missing messages if the server's clock differs from the
   client's.
3 files changed,  +33, -13
M app.go
M app.go
+26, -12
 1@@ -517,7 +517,7 @@ func (app *App) handleMouseEvent(ev *tcell.EventMouse) {
 2 						if added {
 3 							s.MonitorAdd(buffer)
 4 							s.ReadGet(buffer)
 5-							s.NewHistoryRequest(buffer).WithLimit(500).Before(time.Now())
 6+							s.NewHistoryRequest(buffer).WithLimit(500).Latest()
 7 						}
 8 					}
 9 				}
10@@ -672,13 +672,15 @@ func (app *App) requestHistory() {
11 		return
12 	}
13 	if app.win.IsAtTop() && buffer != "" {
14-		t := time.Now()
15 		if bound, ok := app.messageBounds[boundKey{netID, buffer}]; ok {
16-			t = bound.first
17+			s.NewHistoryRequest(buffer).
18+				WithLimit(200).
19+				Before(bound.first)
20+		} else {
21+			s.NewHistoryRequest(buffer).
22+				WithLimit(200).
23+				Latest()
24 		}
25-		s.NewHistoryRequest(buffer).
26-			WithLimit(200).
27-			Before(t)
28 	}
29 }
30 
31@@ -785,9 +787,15 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) {
32 		i, added := app.win.AddBuffer(netID, "", ev.Channel)
33 		bounds, ok := app.messageBounds[boundKey{netID, ev.Channel}]
34 		if added || !ok {
35-			s.NewHistoryRequest(ev.Channel).
36-				WithLimit(500).
37-				Before(msg.TimeOrNow())
38+			if t, ok := msg.Time(); ok {
39+				s.NewHistoryRequest(ev.Channel).
40+					WithLimit(500).
41+					Before(t)
42+			} else {
43+				s.NewHistoryRequest(ev.Channel).
44+					WithLimit(500).
45+					Latest()
46+			}
47 		} else {
48 			s.NewHistoryRequest(ev.Channel).
49 				WithLimit(1000).
50@@ -866,9 +874,15 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) {
51 				app.monitor[netID][buffer] = struct{}{}
52 				s.MonitorAdd(buffer)
53 				s.ReadGet(buffer)
54-				s.NewHistoryRequest(buffer).
55-					WithLimit(500).
56-					Before(msg.TimeOrNow())
57+				if t, ok := msg.Time(); ok {
58+					s.NewHistoryRequest(buffer).
59+						WithLimit(500).
60+						Before(t)
61+				} else {
62+					s.NewHistoryRequest(buffer).
63+						WithLimit(500).
64+						Latest()
65+				}
66 			}
67 		}
68 		app.win.AddLine(netID, buffer, line)
+1, -1
1@@ -509,7 +509,7 @@ func commandDoQuery(app *App, args []string) (err error) {
2 	if added {
3 		s.MonitorAdd(target)
4 		s.ReadGet(target)
5-		s.NewHistoryRequest(target).WithLimit(200).Before(time.Now())
6+		s.NewHistoryRequest(target).WithLimit(200).Latest()
7 	}
8 	return nil
9 }
+6, -0
 1@@ -574,6 +574,12 @@ func (r *HistoryRequest) Before(t time.Time) {
 2 	r.doRequest()
 3 }
 4 
 5+func (r *HistoryRequest) Latest() {
 6+	r.command = "LATEST"
 7+	r.bounds = []string{"*"}
 8+	r.doRequest()
 9+}
10+
11 func (r *HistoryRequest) Targets(start time.Time, end time.Time) {
12 	r.command = "TARGETS"
13 	r.bounds = []string{formatTimestamp(start), formatTimestamp(end)}