Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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