From 75fb2b8156e939385f5163215a9eee0e5fe17dee Mon Sep 17 00:00:00 2001 From: Wim Date: Sun, 18 Jun 2017 00:13:10 +0200 Subject: Make reconnection more robust (irc). #153 --- bridge/irc/irc.go | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'bridge') diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go index 2e94d30b..feb88a55 100644 --- a/bridge/irc/irc.go +++ b/bridge/irc/irc.go @@ -15,14 +15,15 @@ import ( ) type Birc struct { - i *irc.Connection - Nick string - names map[string][]string - Config *config.Protocol - Remote chan config.Message - connected chan struct{} - Local chan config.Message // local queue for flood control - Account string + i *irc.Connection + Nick string + names map[string][]string + Config *config.Protocol + Remote chan config.Message + connected chan struct{} + Local chan config.Message // local queue for flood control + Account string + FirstConnection bool } var flog *log.Entry @@ -49,6 +50,7 @@ func New(cfg config.Protocol, account string, c chan config.Message) *Birc { if b.Config.MessageLength == 0 { b.Config.MessageLength = 400 } + b.FirstConnection = true return b } @@ -74,6 +76,8 @@ func (b *Birc) Connect() error { i.SASLLogin = b.Config.NickServNick i.SASLPassword = b.Config.NickServPassword i.TLSConfig = &tls.Config{InsecureSkipVerify: b.Config.SkipTLSVerify} + i.KeepAlive = time.Minute + i.PingFreq = time.Minute if b.Config.Password != "" { i.Password = b.Config.Password } @@ -90,6 +94,14 @@ func (b *Birc) Connect() error { return fmt.Errorf("connection timed out") } i.Debug = false + // clear on reconnects + i.ClearCallback(ircm.RPL_WELCOME) + i.AddCallback(ircm.RPL_WELCOME, func(event *irc.Event) { + b.Remote <- config.Message{Username: "system", Text: "rejoin", Channel: "", Account: b.Account, Event: config.EVENT_REJOIN_CHANNELS} + // set our correct nick on reconnect if necessary + b.Nick = event.Nick + }) + go i.Loop() go b.doSend() return nil } @@ -217,6 +229,11 @@ func (b *Birc) handleOther(event *irc.Event) { } func (b *Birc) handlePrivMsg(event *irc.Event) { + b.Nick = b.i.GetNick() + // freenode doesn't send 001 as first reply + if event.Code == "NOTICE" { + return + } // don't forward queries to the bot if event.Arguments[0] == b.Nick { return -- cgit v1.2.3