Browse Source

Merge pull request #830 from slingamn/issue829_zncexpire

fix #829
tags/v2.0.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
faf6e513d2
No account linked to committer's email address
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
 	var items []history.Item
773
 	var items []history.Item
774
 
774
 
775
 	var after, before time.Time
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
 		after, before = rb.session.zncPlaybackTimes.after, rb.session.zncPlaybackTimes.before
777
 		after, before = rb.session.zncPlaybackTimes.after, rb.session.zncPlaybackTimes.before
778
 	} else if !rb.session.autoreplayMissedSince.IsZero() {
778
 	} else if !rb.session.autoreplayMissedSince.IsZero() {
779
 		// we already checked for history caps in `playReattachMessages`
779
 		// we already checked for history caps in `playReattachMessages`

+ 1
- 1
irc/client.go View File

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

+ 40
- 6
irc/znc.go View File

12
 	"github.com/oragono/oragono/irc/history"
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
 type zncCommandHandler func(client *Client, command string, params []string, rb *ResponseBuffer)
20
 type zncCommandHandler func(client *Client, command string, params []string, rb *ResponseBuffer)
16
 
21
 
17
 var zncHandlers = map[string]zncCommandHandler{
22
 var zncHandlers = map[string]zncCommandHandler{
52
 	after   time.Time
57
 	after   time.Time
53
 	before  time.Time
58
 	before  time.Time
54
 	targets StringSet // nil for "*" (everything), otherwise the channel names
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
 // https://wiki.znc.in/Playback
79
 // https://wiki.znc.in/Playback
74
 	}
96
 	}
75
 
97
 
76
 	var targets StringSet
98
 	var targets StringSet
99
+	var nickTargets []string
77
 
100
 
78
 	// three cases:
101
 	// three cases:
79
 	// 1. the user's PMs get played back immediately upon receiving this
102
 	// 1. the user's PMs get played back immediately upon receiving this
92
 	//          channels; redundant JOIN is a complete no-op so we won't replay twice
115
 	//          channels; redundant JOIN is a complete no-op so we won't replay twice
93
 
116
 
94
 	if params[1] == "*" {
117
 	if params[1] == "*" {
95
-		zncPlayPrivmsgs(client, rb, after, before)
118
+		zncPlayPrivmsgs(client, rb, "*", after, before)
96
 	} else {
119
 	} else {
97
 		targets = make(StringSet)
120
 		targets = make(StringSet)
98
-		// TODO actually handle nickname targets
99
 		for _, targetName := range strings.Split(targetString, ",") {
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
 		after:   after,
135
 		after:   after,
108
 		before:  before,
136
 		before:  before,
109
 		targets: targets,
137
 		targets: targets,
138
+		setAt:   time.Now().UTC(),
110
 	}
139
 	}
111
 
140
 
112
 	for _, channel := range client.Channels() {
141
 	for _, channel := range client.Channels() {
115
 			rb.Flush(true)
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
 	if sequence == nil {
156
 	if sequence == nil {
123
 		return
157
 		return
124
 	}
158
 	}

Loading…
Cancel
Save