|
@@ -30,6 +30,7 @@ type Channel struct {
|
30
|
30
|
key string
|
31
|
31
|
members MemberSet
|
32
|
32
|
membersCache []*Client // allow iteration over channel members without holding the lock
|
|
33
|
+ memberJoinTimes map[*Client]time.Time
|
33
|
34
|
name string
|
34
|
35
|
nameCasefolded string
|
35
|
36
|
server *Server
|
|
@@ -57,11 +58,12 @@ func NewChannel(s *Server, name, casefoldedName string, registered bool) *Channe
|
57
|
58
|
config := s.Config()
|
58
|
59
|
|
59
|
60
|
channel := &Channel{
|
60
|
|
- createdTime: time.Now().UTC(), // may be overwritten by applyRegInfo
|
61
|
|
- members: make(MemberSet),
|
62
|
|
- name: name,
|
63
|
|
- nameCasefolded: casefoldedName,
|
64
|
|
- server: s,
|
|
61
|
+ createdTime: time.Now().UTC(), // may be overwritten by applyRegInfo
|
|
62
|
+ members: make(MemberSet),
|
|
63
|
+ memberJoinTimes: make(map[*Client]time.Time),
|
|
64
|
+ name: name,
|
|
65
|
+ nameCasefolded: casefoldedName,
|
|
66
|
+ server: s,
|
65
|
67
|
}
|
66
|
68
|
|
67
|
69
|
channel.initializeLists()
|
|
@@ -550,6 +552,16 @@ func (channel *Channel) ClientModeStrings(client *Client) []string {
|
550
|
552
|
}
|
551
|
553
|
}
|
552
|
554
|
|
|
555
|
+func (channel *Channel) ClientJoinTime(client *Client) *time.Time {
|
|
556
|
+ channel.stateMutex.RLock()
|
|
557
|
+ defer channel.stateMutex.RUnlock()
|
|
558
|
+ time, present := channel.memberJoinTimes[client]
|
|
559
|
+ if present {
|
|
560
|
+ return &time
|
|
561
|
+ }
|
|
562
|
+ return nil
|
|
563
|
+}
|
|
564
|
+
|
553
|
565
|
func (channel *Channel) ClientHasPrivsOver(client *Client, target *Client) bool {
|
554
|
566
|
channel.stateMutex.RLock()
|
555
|
567
|
founder := channel.registeredFounder
|
|
@@ -726,6 +738,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
|
726
|
738
|
defer channel.stateMutex.Unlock()
|
727
|
739
|
|
728
|
740
|
channel.members.Add(client)
|
|
741
|
+ channel.memberJoinTimes[client] = time.Now()
|
729
|
742
|
firstJoin := len(channel.members) == 1
|
730
|
743
|
newChannel := firstJoin && channel.registeredFounder == ""
|
731
|
744
|
if newChannel {
|
|
@@ -1364,6 +1377,7 @@ func (channel *Channel) Quit(client *Client) {
|
1364
|
1377
|
|
1365
|
1378
|
channel.stateMutex.Lock()
|
1366
|
1379
|
channel.members.Remove(client)
|
|
1380
|
+ delete(channel.memberJoinTimes, client)
|
1367
|
1381
|
channelEmpty := len(channel.members) == 0
|
1368
|
1382
|
channel.stateMutex.Unlock()
|
1369
|
1383
|
channel.regenerateMembersCache()
|