summaryrefslogtreecommitdiff
path: root/irc/session.go
diff options
context:
space:
mode:
Diffstat (limited to 'irc/session.go')
-rw-r--r--irc/session.go88
1 files changed, 82 insertions, 6 deletions
diff --git a/irc/session.go b/irc/session.go
index 8467f2c..bbf01f6 100644
--- a/irc/session.go
+++ b/irc/session.go
@@ -58,6 +58,7 @@ var SupportedCapabilities = map[string]struct{}{
"setname": {},
"draft/chathistory": {},
+ "draft/event-playback": {},
"soju.im/bouncer-networks": {},
}
@@ -527,18 +528,23 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
}
s.targetsBatch.Targets[target] = t
} else if b, ok := s.chBatches[id]; ok {
- ev, err := s.newMessageEvent(msg)
+ ev, err := s.handleMessageRegistered(msg, true)
if err != nil {
return nil, err
}
- s.chBatches[id] = HistoryEvent{
- Target: b.Target,
- Messages: append(b.Messages, ev),
+ if ev != nil {
+ s.chBatches[id] = HistoryEvent{
+ Target: b.Target,
+ Messages: append(b.Messages, ev),
+ }
+ return nil, nil
}
- return nil, nil
}
}
+ return s.handleMessageRegistered(msg, false)
+}
+func (s *Session) handleMessageRegistered(msg Message, playback bool) (Event, error) {
switch msg.Command {
case "AUTHENTICATE":
if s.auth == nil {
@@ -663,6 +669,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return UserJoinEvent{
+ User: msg.Prefix.Name,
+ Channel: channel,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
nickCf := s.Casemap(msg.Prefix.Name)
channelCf := s.Casemap(channel)
@@ -685,6 +699,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return UserJoinEvent{
User: msg.Prefix.Name,
Channel: c.Name,
+ Time: msg.TimeOrNow(),
}, nil
}
case "PART":
@@ -697,6 +712,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return UserPartEvent{
+ User: msg.Prefix.Name,
+ Channel: channel,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
nickCf := s.Casemap(msg.Prefix.Name)
channelCf := s.Casemap(channel)
@@ -718,6 +741,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return UserPartEvent{
User: u.Name.Name,
Channel: c.Name,
+ Time: msg.TimeOrNow(),
}, nil
}
}
@@ -727,6 +751,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return UserPartEvent{
+ User: nick,
+ Channel: channel,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
nickCf := s.Casemap(nick)
channelCf := s.Casemap(channel)
@@ -748,6 +780,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return UserPartEvent{
User: nick,
Channel: c.Name,
+ Time: msg.TimeOrNow(),
}, nil
}
}
@@ -756,6 +789,13 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, errMissingPrefix
}
+ if playback {
+ return UserQuitEvent{
+ User: msg.Prefix.Name,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
nickCf := s.Casemap(msg.Prefix.Name)
if u, ok := s.users[nickCf]; ok {
@@ -771,6 +811,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return UserQuitEvent{
User: u.Name.Name,
Channels: channels,
+ Time: msg.TimeOrNow(),
}, nil
}
case rplNamreply:
@@ -864,6 +905,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return TopicChangeEvent{
+ Channel: channel,
+ Topic: topic,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
channelCf := s.Casemap(channel)
if c, ok := s.channels[channelCf]; ok {
@@ -874,6 +923,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return TopicChangeEvent{
Channel: c.Name,
Topic: c.Topic,
+ Time: msg.TimeOrNow(),
}, nil
}
case "MODE":
@@ -882,6 +932,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return ModeChangeEvent{
+ Channel: channel,
+ Mode: mode,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
channelCf := s.Casemap(channel)
if c, ok := s.channels[channelCf]; ok {
@@ -917,7 +975,8 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
s.channels[channelCf] = c
return ModeChangeEvent{
Channel: c.Name,
- Mode: strings.Join(msg.Params[1:], " "),
+ Mode: mode,
+ Time: msg.TimeOrNow(),
}, nil
}
case "INVITE":
@@ -966,12 +1025,20 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return s.newMessageEvent(msg)
+ }
+
targetCf := s.casemap(target)
nickCf := s.casemap(msg.Prefix.Name)
s.typings.Done(targetCf, nickCf)
return s.newMessageEvent(msg)
case "TAGMSG":
+ if playback {
+ return nil, nil
+ }
+
if msg.Prefix == nil {
return nil, errMissingPrefix
}
@@ -1048,6 +1115,14 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return nil, err
}
+ if playback {
+ return UserNickEvent{
+ User: nick,
+ FormerNick: msg.Prefix.Name,
+ Time: msg.TimeOrNow(),
+ }, nil
+ }
+
nickCf := s.Casemap(msg.Prefix.Name)
newNick := nick
newNickCf := s.Casemap(newNick)
@@ -1070,6 +1145,7 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
return UserNickEvent{
User: nick,
FormerNick: msg.Prefix.Name,
+ Time: msg.TimeOrNow(),
}, nil
}
case "BOUNCER":