summaryrefslogtreecommitdiffstats
path: root/bridge
diff options
context:
space:
mode:
authorWim <wim@42.be>2017-06-18 00:13:10 +0200
committerWim <wim@42.be>2017-06-18 00:13:10 +0200
commit75fb2b8156e939385f5163215a9eee0e5fe17dee (patch)
treeb683fb6b024510b44f40f89ca190830d58f22578 /bridge
parent2a403f8b85aec092eef9216d717984aa5fdfd0b9 (diff)
downloadmatterbridge-msglm-75fb2b8156e939385f5163215a9eee0e5fe17dee.tar.gz
matterbridge-msglm-75fb2b8156e939385f5163215a9eee0e5fe17dee.tar.bz2
matterbridge-msglm-75fb2b8156e939385f5163215a9eee0e5fe17dee.zip
Make reconnection more robust (irc). #153
Diffstat (limited to 'bridge')
-rw-r--r--bridge/irc/irc.go33
1 files changed, 25 insertions, 8 deletions
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