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.

main.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package main
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "github.com/irccloud/irccat/httplistener"
  6. "github.com/irccloud/irccat/tcplistener"
  7. "github.com/juju/loggo"
  8. "github.com/spf13/viper"
  9. "github.com/thoj/go-ircevent"
  10. "os"
  11. "os/signal"
  12. "syscall"
  13. )
  14. var log = loggo.GetLogger("main")
  15. type IRCCat struct {
  16. control_chan string
  17. auth_users map[string]bool
  18. irc *irc.Connection
  19. tcp *tcplistener.TCPListener
  20. signals chan os.Signal
  21. }
  22. func main() {
  23. loggo.ConfigureLoggers("<root>=DEBUG")
  24. log.Infof("IRCCat starting...")
  25. viper.SetConfigName("irccat")
  26. viper.AddConfigPath("/etc")
  27. viper.AddConfigPath(".")
  28. var err error
  29. err = viper.ReadInConfig()
  30. if err != nil {
  31. log.Errorf("Error reading config file - exiting. I'm looking for irccat.[json|yaml|toml|hcl] in . or /etc")
  32. return
  33. }
  34. irccat := IRCCat{auth_users: map[string]bool{}, signals: make(chan os.Signal, 1)}
  35. signal.Notify(irccat.signals, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
  36. go irccat.signalHandler()
  37. irccat.tcp, err = tcplistener.New()
  38. if err != nil {
  39. return
  40. }
  41. err = irccat.connectIRC()
  42. if err != nil {
  43. log.Criticalf("Error connecting to IRC server: %s", err)
  44. return
  45. }
  46. if viper.IsSet("http") {
  47. httplistener.New(irccat.irc)
  48. }
  49. irccat.tcp.Run(irccat.irc)
  50. irccat.irc.Loop()
  51. }
  52. func (i *IRCCat) signalHandler() {
  53. sig := <-i.signals
  54. log.Infof("Exiting on %s", sig)
  55. i.irc.QuitMessage = fmt.Sprintf("Exiting on %s", sig)
  56. i.irc.Quit()
  57. }
  58. func (i *IRCCat) connectIRC() error {
  59. irccon := irc.IRC(viper.GetString("irc.nick"), viper.GetString("irc.realname"))
  60. irccon.UseTLS = viper.GetBool("irc.tls")
  61. if viper.GetBool("irc.tls_skip_verify") {
  62. irccon.TLSConfig = &tls.Config{InsecureSkipVerify: true}
  63. }
  64. err := irccon.Connect(viper.GetString("irc.server"))
  65. if err != nil {
  66. return err
  67. }
  68. irccon.AddCallback("001", i.handleWelcome)
  69. irccon.AddCallback("PRIVMSG", func(event *irc.Event) {
  70. if event.Message()[0] == '?' || event.Message()[0] == '!' {
  71. go i.handleCommand(event)
  72. }
  73. })
  74. irccon.AddCallback("353", i.handleNames)
  75. irccon.AddCallback("JOIN", i.handleJoin)
  76. irccon.AddCallback("PART", i.handlePart)
  77. irccon.AddCallback("QUIT", i.handlePart)
  78. i.irc = irccon
  79. return nil
  80. }
  81. func (i *IRCCat) handleWelcome(e *irc.Event) {
  82. log.Infof("Connected, joining channels...")
  83. for _, channel := range viper.GetStringSlice("irc.channels") {
  84. i.irc.Join(channel)
  85. }
  86. }