Browse Source

fix #829

also, handle nickname targets in znc.in/playback
tags/v2.0.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
1dc93bbb9f
3 changed files with 42 additions and 8 deletions
  1. 1
    1
      irc/channel.go
  2. 1
    1
      irc/client.go
  3. 40
    6
      irc/znc.go

+ 1
- 1
irc/channel.go View File

@@ -773,7 +773,7 @@ func (channel *Channel) autoReplayHistory(client *Client, rb *ResponseBuffer, sk
773 773
 	var items []history.Item
774 774
 
775 775
 	var after, before time.Time
776
-	if rb.session.zncPlaybackTimes != nil && (rb.session.zncPlaybackTimes.targets == nil || rb.session.zncPlaybackTimes.targets.Has(channel.NameCasefolded())) {
776
+	if rb.session.zncPlaybackTimes.ValidFor(channel.NameCasefolded()) {
777 777
 		after, before = rb.session.zncPlaybackTimes.after, rb.session.zncPlaybackTimes.before
778 778
 	} else if !rb.session.autoreplayMissedSince.IsZero() {
779 779
 		// we already checked for history caps in `playReattachMessages`

+ 1
- 1
irc/client.go View File

@@ -668,7 +668,7 @@ func (client *Client) playReattachMessages(session *Session) {
668 668
 	}
669 669
 	if !session.autoreplayMissedSince.IsZero() && !hasHistoryCaps {
670 670
 		rb := NewResponseBuffer(session)
671
-		zncPlayPrivmsgs(client, rb, session.autoreplayMissedSince, time.Time{})
671
+		zncPlayPrivmsgs(client, rb, "*", session.autoreplayMissedSince, time.Time{})
672 672
 		rb.Send(true)
673 673
 	}
674 674
 	session.autoreplayMissedSince = time.Time{}

+ 40
- 6
irc/znc.go View File

@@ -12,6 +12,11 @@ import (
12 12
 	"github.com/oragono/oragono/irc/history"
13 13
 )
14 14
 
15
+const (
16
+	// #829, also see "Case 2" in the "three cases" below:
17
+	zncPlaybackCommandExpiration = time.Second * 30
18
+)
19
+
15 20
 type zncCommandHandler func(client *Client, command string, params []string, rb *ResponseBuffer)
16 21
 
17 22
 var zncHandlers = map[string]zncCommandHandler{
@@ -52,6 +57,23 @@ type zncPlaybackTimes struct {
52 57
 	after   time.Time
53 58
 	before  time.Time
54 59
 	targets StringSet // nil for "*" (everything), otherwise the channel names
60
+	setAt   time.Time
61
+}
62
+
63
+func (z *zncPlaybackTimes) ValidFor(target string) bool {
64
+	if z == nil {
65
+		return false
66
+	}
67
+
68
+	if time.Now().Sub(z.setAt) > zncPlaybackCommandExpiration {
69
+		return false
70
+	}
71
+
72
+	if z.targets == nil {
73
+		return true
74
+	}
75
+
76
+	return z.targets.Has(target)
55 77
 }
56 78
 
57 79
 // https://wiki.znc.in/Playback
@@ -74,6 +96,7 @@ func zncPlaybackHandler(client *Client, command string, params []string, rb *Res
74 96
 	}
75 97
 
76 98
 	var targets StringSet
99
+	var nickTargets []string
77 100
 
78 101
 	// three cases:
79 102
 	// 1. the user's PMs get played back immediately upon receiving this
@@ -92,13 +115,18 @@ func zncPlaybackHandler(client *Client, command string, params []string, rb *Res
92 115
 	//          channels; redundant JOIN is a complete no-op so we won't replay twice
93 116
 
94 117
 	if params[1] == "*" {
95
-		zncPlayPrivmsgs(client, rb, after, before)
118
+		zncPlayPrivmsgs(client, rb, "*", after, before)
96 119
 	} else {
97 120
 		targets = make(StringSet)
98
-		// TODO actually handle nickname targets
99 121
 		for _, targetName := range strings.Split(targetString, ",") {
100
-			if cfTarget, err := CasefoldChannel(targetName); err == nil {
101
-				targets.Add(cfTarget)
122
+			if strings.HasPrefix(targetName, "#") {
123
+				if cfTarget, err := CasefoldChannel(targetName); err == nil {
124
+					targets.Add(cfTarget)
125
+				}
126
+			} else {
127
+				if cfNick, err := CasefoldName(targetName); err == nil {
128
+					nickTargets = append(nickTargets, cfNick)
129
+				}
102 130
 			}
103 131
 		}
104 132
 	}
@@ -107,6 +135,7 @@ func zncPlaybackHandler(client *Client, command string, params []string, rb *Res
107 135
 		after:   after,
108 136
 		before:  before,
109 137
 		targets: targets,
138
+		setAt:   time.Now().UTC(),
110 139
 	}
111 140
 
112 141
 	for _, channel := range client.Channels() {
@@ -115,10 +144,15 @@ func zncPlaybackHandler(client *Client, command string, params []string, rb *Res
115 144
 			rb.Flush(true)
116 145
 		}
117 146
 	}
147
+
148
+	for _, cfNick := range nickTargets {
149
+		zncPlayPrivmsgs(client, rb, cfNick, after, before)
150
+		rb.Flush(true)
151
+	}
118 152
 }
119 153
 
120
-func zncPlayPrivmsgs(client *Client, rb *ResponseBuffer, after, before time.Time) {
121
-	_, sequence, _ := client.server.GetHistorySequence(nil, client, "*")
154
+func zncPlayPrivmsgs(client *Client, rb *ResponseBuffer, target string, after, before time.Time) {
155
+	_, sequence, _ := client.server.GetHistorySequence(nil, client, target)
122 156
 	if sequence == nil {
123 157
 		return
124 158
 	}

Loading…
Cancel
Save