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. "fmt"
  4. "github.com/deckarep/golang-set"
  5. "github.com/fsnotify/fsnotify"
  6. "github.com/irccloud/go-ircevent"
  7. "github.com/irccloud/irccat/httplistener"
  8. "github.com/irccloud/irccat/tcplistener"
  9. "github.com/juju/loggo"
  10. "github.com/spf13/viper"
  11. "os"
  12. "os/signal"
  13. "syscall"
  14. )
  15. var log = loggo.GetLogger("main")
  16. var branch string
  17. var revision string
  18. type IRCCat struct {
  19. auth_channel string
  20. channels mapset.Set
  21. auth_users map[string]bool
  22. irc *irc.Connection
  23. tcp *tcplistener.TCPListener
  24. signals chan os.Signal
  25. }
  26. func main() {
  27. loggo.ConfigureLoggers("<root>=INFO")
  28. log.Infof("IRCCat %s (%s) starting...", branch, revision)
  29. viper.SetConfigName("irccat")
  30. viper.AddConfigPath("/etc")
  31. viper.AddConfigPath(".")
  32. var err error
  33. err = viper.ReadInConfig()
  34. if err != nil {
  35. log.Errorf("Error reading config file - exiting. I'm looking for irccat.[json|yaml|toml|hcl] in . or /etc")
  36. return
  37. }
  38. irccat := IRCCat{auth_users: map[string]bool{},
  39. signals: make(chan os.Signal, 1),
  40. channels: mapset.NewSet(),
  41. auth_channel: viper.GetString("commands.auth_channel")}
  42. viper.WatchConfig()
  43. viper.OnConfigChange(irccat.handleConfigChange)
  44. signal.Notify(irccat.signals, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
  45. go irccat.signalHandler()
  46. irccat.tcp, err = tcplistener.New()
  47. if err != nil {
  48. log.Criticalf("Error starting TCP listener: %s", err)
  49. return
  50. }
  51. err = irccat.connectIRC()
  52. if err != nil {
  53. log.Criticalf("Error connecting to IRC server: %s", err)
  54. return
  55. }
  56. if viper.IsSet("http") {
  57. httplistener.New(irccat.irc)
  58. }
  59. irccat.tcp.Run(irccat.irc)
  60. irccat.irc.Loop()
  61. }
  62. func (i *IRCCat) signalHandler() {
  63. sig := <-i.signals
  64. log.Infof("Exiting on %s", sig)
  65. i.irc.QuitMessage = fmt.Sprintf("Exiting on %s", sig)
  66. i.irc.Quit()
  67. }
  68. func (i *IRCCat) handleConfigChange(e fsnotify.Event) {
  69. log.Infof("Reloaded config")
  70. new_channels := mapset.NewSet()
  71. for _, channel := range viper.GetStringSlice("irc.channels") {
  72. new_channels.Add(channel)
  73. if !i.channels.Contains(channel) {
  74. log.Infof("Joining new channel %s", channel)
  75. i.irc.Join(channel)
  76. i.channels.Add(channel)
  77. }
  78. }
  79. it := i.channels.Difference(new_channels).Iterator()
  80. for channel := range it.C {
  81. log.Infof("Leaving channel %s", channel)
  82. i.irc.Part(channel.(string))
  83. i.channels.Remove(channel)
  84. }
  85. }