You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

irc.go 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "github.com/irccloud/go-ircevent"
  6. "github.com/spf13/viper"
  7. "strings"
  8. )
  9. func (i *IRCCat) connectIRC(debug bool) error {
  10. irccon := irc.IRC(viper.GetString("irc.nick"), viper.GetString("irc.realname"))
  11. i.irc = irccon
  12. irccon.Debug = debug
  13. irccon.RequestCaps = []string{"away-notify", "account-notify", "draft/message-tags-0.2"}
  14. irccon.UseTLS = viper.GetBool("irc.tls")
  15. if viper.IsSet("irc.sasl_pass") && viper.GetString("irc.sasl_pass") != "" {
  16. if viper.IsSet("irc.sasl_login") && viper.GetString("irc.sasl_login") != "" {
  17. irccon.SASLLogin = viper.GetString("irc.sasl_login")
  18. } else {
  19. irccon.SASLLogin = viper.GetString("irc.nick")
  20. }
  21. irccon.SASLPassword = viper.GetString("irc.sasl_pass")
  22. irccon.UseSASL = true
  23. }
  24. if viper.GetBool("irc.tls_skip_verify") {
  25. irccon.TLSConfig = &tls.Config{InsecureSkipVerify: true}
  26. }
  27. irccon.Password = viper.GetString("irc.server_pass")
  28. err := irccon.Connect(viper.GetString("irc.server"))
  29. if err != nil {
  30. return err
  31. }
  32. irccon.AddCallback("001", i.handleWelcome)
  33. irccon.AddCallback("PRIVMSG", func(event *irc.Event) {
  34. msg := event.Message()
  35. if (msg[0] == '?' || msg[0] == '!') && len(msg) > 1 {
  36. go i.handleCommand(event)
  37. }
  38. })
  39. irccon.AddCallback("353", i.handleNames)
  40. irccon.AddCallback("JOIN", i.handleJoin)
  41. irccon.AddCallback("PART", i.handlePart)
  42. irccon.AddCallback("QUIT", i.handleQuit)
  43. irccon.AddCallback("KILL", i.handleQuit)
  44. irccon.AddCallback("NICK", i.handleNick)
  45. return nil
  46. }
  47. func (i *IRCCat) handleWelcome(e *irc.Event) {
  48. log.Infof("Negotiated IRCv3 capabilities: %v", i.irc.AcknowledgedCaps)
  49. if viper.IsSet("irc.identify_pass") && viper.GetString("irc.identify_pass") != "" {
  50. i.irc.SendRawf("NICKSERV IDENTIFY %s", viper.GetString("irc.identify_pass"))
  51. }
  52. log.Infof("Connected, joining channels...")
  53. for _, channel := range viper.GetStringSlice("irc.channels") {
  54. key_var := fmt.Sprintf("irc.keys.%s", channel)
  55. if strings.ContainsAny(channel, " \t") {
  56. log.Errorf("Channel name '%s' contains whitespace. Set a channel key by setting the config variable irc.keys.#channel",
  57. channel)
  58. continue
  59. }
  60. if viper.IsSet(key_var) {
  61. i.irc.Join(channel + " " + viper.GetString(key_var))
  62. } else {
  63. i.irc.Join(channel)
  64. }
  65. i.channels.Add(channel)
  66. }
  67. }