dispatch/server/irc.go

97 lines
2.0 KiB
Go
Raw Normal View History

2016-01-04 18:26:32 +00:00
package server
import (
2016-01-11 20:04:57 +00:00
"crypto/tls"
2018-04-26 19:32:21 +00:00
"log"
2016-01-14 04:56:53 +00:00
"net"
2016-01-11 20:04:57 +00:00
2016-01-04 18:26:32 +00:00
"github.com/khlieng/dispatch/irc"
"github.com/khlieng/dispatch/storage"
"github.com/spf13/viper"
2016-01-04 18:26:32 +00:00
)
func createNickInUseHandler(i *irc.Client, session *Session) func(string) string {
return func(nick string) string {
newNick := nick + "_"
if newNick == i.GetNick() {
session.sendJSON("nick_fail", NickFail{
Server: i.Host,
})
}
session.printError("Nickname", nick, "is already in use, using", newNick, "instead")
return newNick
}
}
2016-01-04 18:26:32 +00:00
func reconnectIRC() {
for _, user := range storage.LoadUsers() {
2018-04-26 19:32:21 +00:00
session, err := NewSession(user)
if err != nil {
log.Println(err)
continue
}
sessions.set(session)
go session.run()
2016-01-04 18:26:32 +00:00
channels := user.GetChannels()
for _, server := range user.GetServers() {
i := connectIRC(server, session)
2016-01-04 18:26:32 +00:00
var joining []string
for _, channel := range channels {
2016-01-14 04:56:53 +00:00
if channel.Server == server.Host {
2016-01-04 18:26:32 +00:00
joining = append(joining, channel.Name)
}
}
i.Join(joining...)
}
}
}
func connectIRC(server storage.Server, session *Session) *irc.Client {
i := irc.NewClient(server.Nick, server.Username)
i.TLS = server.TLS
i.Realname = server.Realname
i.HandleNickInUse = createNickInUseHandler(i, session)
address := server.Host
if server.Port != "" {
address = net.JoinHostPort(server.Host, server.Port)
}
if i.Username == "" {
i.Username = server.Nick
}
if i.Realname == "" {
i.Realname = server.Nick
}
if server.Password == "" &&
viper.GetString("defaults.password") != "" &&
2018-05-18 01:37:33 +00:00
address == viper.GetString("defaults.host") {
i.Password = viper.GetString("defaults.password")
} else {
i.Password = server.Password
}
if i.TLS {
i.TLSConfig = &tls.Config{
InsecureSkipVerify: !viper.GetBool("verify_certificates"),
}
if cert := session.user.GetCertificate(); cert != nil {
i.TLSConfig.Certificates = []tls.Certificate{*cert}
}
}
session.setIRC(server.Host, i)
i.Connect(address)
go newIRCHandler(i, session).run()
return i
}