package main import ( "flag" "fmt" "net/http" _ "net/http/pprof" "os" "os/signal" "dev.narayana.im/narayana/telegabber/config" "dev.narayana.im/narayana/telegabber/xmpp" log "github.com/sirupsen/logrus" goxmpp "gosrc.io/xmpp" ) var version string = "1.4.0" var commit string var sm *goxmpp.StreamManager var component *goxmpp.Component var err error var cleanupDone chan struct{} var sigintChannel chan os.Signal func main() { if commit != "" { version = fmt.Sprintf("%v-%v", version, commit) } var profilingPort = flag.Int("profiling-port", 0, "The port for pprof server") // YAML config, compatible with the format of Zhabogram 2.0.0 var configPath = flag.String("config", "config.yml", "Config file path") // JSON schema (not for editing by a user) var schemaPath = flag.String("schema", "./config_schema.json", "Schema file path") var versionFlag = flag.Bool("version", false, "Print the version and exit") flag.Parse() if *versionFlag { fmt.Printf("%v\n", version) os.Exit(0) } if *profilingPort > 0 { go func() { log.Println(http.ListenAndServe(fmt.Sprintf("localhost:%v", *profilingPort), nil)) }() } cleanupDone = make(chan struct{}) sigintChannel = make(chan os.Signal, 1) signal.Notify(sigintChannel, os.Interrupt) config, err := config.ReadConfig(*configPath, *schemaPath) if err != nil { log.Fatal(err) } SetLogrusLevel(config.XMPP.Loglevel) log.Infof("Starting telegabber version %v", version) sm, component, err = xmpp.NewComponent(config.XMPP, config.Telegram) if err != nil { log.Fatal(err) } go func() { <-sigintChannel log.Error("Interrupting...") exit() os.Exit(0) }() // reconnect automatically err = sm.Run() exit() if err != nil { <-cleanupDone log.Fatal(err) // bye os.Exit(-1) } } func exit() { xmpp.Close(component) close(cleanupDone) }