diff options
author | delthas <delthas@dille.cc> | 2021-07-13 19:26:24 +0200 |
---|---|---|
committer | Hubert Hirtz <hubert@hirtz.pm> | 2021-07-13 21:38:53 +0200 |
commit | 93005741f2fa5c16bed3d7bc325c7d09a6a507da (patch) | |
tree | 2373fbf66cc6987ab7f3c6f1a1f4b0238fea9049 /irc/session.go | |
parent | Clear the input on CTRL+C instead of quitting (diff) |
Switch to the buffer of a new user-requested channel join
Diffstat (limited to '')
-rw-r--r-- | irc/session.go | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/irc/session.go b/irc/session.go index 376015f..33d52fc 100644 --- a/irc/session.go +++ b/irc/session.go @@ -130,30 +130,33 @@ type Session struct { channels map[string]Channel // joined channels. chBatches map[string]HistoryEvent // channel history batches being processed. chReqs map[string]struct{} // set of targets for which history is currently requested. + + pendingChannels map[string]time.Time // set of join requests stamps for channels. } func NewSession(out chan<- Message, params SessionParams) *Session { s := &Session{ - out: out, - typings: NewTypings(), - typingStamps: map[string]typingStamp{}, - nick: params.Nickname, - nickCf: CasemapASCII(params.Nickname), - user: params.Username, - real: params.RealName, - auth: params.Auth, - availableCaps: map[string]string{}, - enabledCaps: map[string]struct{}{}, - casemap: CasemapRFC1459, - chantypes: "#&", - linelen: 512, - historyLimit: 100, - prefixSymbols: "@+", - prefixModes: "ov", - users: map[string]*User{}, - channels: map[string]Channel{}, - chBatches: map[string]HistoryEvent{}, - chReqs: map[string]struct{}{}, + out: out, + typings: NewTypings(), + typingStamps: map[string]typingStamp{}, + nick: params.Nickname, + nickCf: CasemapASCII(params.Nickname), + user: params.Username, + real: params.RealName, + auth: params.Auth, + availableCaps: map[string]string{}, + enabledCaps: map[string]struct{}{}, + casemap: CasemapRFC1459, + chantypes: "#&", + linelen: 512, + historyLimit: 100, + prefixSymbols: "@+", + prefixModes: "ov", + users: map[string]*User{}, + channels: map[string]Channel{}, + chBatches: map[string]HistoryEvent{}, + chReqs: map[string]struct{}{}, + pendingChannels: map[string]time.Time{}, } s.out <- NewMessage("CAP", "LS", "302") @@ -272,6 +275,8 @@ func (s *Session) SendRaw(raw string) { } func (s *Session) Join(channel, key string) { + channelCf := s.Casemap(channel) + s.pendingChannels[channelCf] = time.Now() if key == "" { s.out <- NewMessage("JOIN", channel) } else { @@ -685,9 +690,13 @@ func (s *Session) handleRegistered(msg Message) Event { if c, ok := s.channels[channelCf]; ok && !c.complete { c.complete = true s.channels[channelCf] = c - return SelfJoinEvent{ + ev := SelfJoinEvent{ Channel: c.Name, } + if stamp, ok := s.pendingChannels[channelCf]; ok && time.Now().Sub(stamp) < 5*time.Second { + ev.Requested = true + } + return ev } case rplTopic: channelCf := s.Casemap(msg.Params[1]) |