func queryChannelsOnServer(server string, channels []string) { defer func() { err, isErr := recover().(error) if isErr { fmt.Fprintf(os.Stderr, "Error occurred when querying channels on %s: %s.\n", server, err.Error()) } }() var debugIRC io.Writer = nil if confDebugIRC { debugIRC = os.Stderr } bot, err := irc.Connect(server, confNickname, confUsername, debugIRC) if err != nil { panic(err) } defer bot.Disconnect() for i, ch := range channels { errs := []error{} for _, method := range confQueryMethods { res, err := method.Query(bot, ch) if err != nil { errs = append(errs, err) continue } fmt.Printf("%s\t%d\t%s\t%s\n", res.Name, res.NumberOfUsers, method.Name(), res.Topic) goto next } fmt.Fprintf(os.Stderr, "Failed to query %s@%s,\n", ch, server) for _, err := range errs { fmt.Fprintf(os.Stderr, " %s\n", err.Error()) } next: if i+1 != len(channels) { time.Sleep(confTimeout) } } }
func channelCheckServer(ctx *mainContext, db *sql.DB, network *dbNetwork, chs []channel) { defer func() { err, isErr := recover().(error) if isErr { log.Printf("Error occurred while checking channels on '%s': %s\n", network.network, err.Error()) } }() network_chs := []channel{} for _, ch := range chs { if ch.Network() != network.network { continue } if ch.Checked() { dur := time.Now().Sub(ch.CheckTime()) if dur < time.Hour*24*7 { continue } } network_chs = append(network_chs, ch) } if len(network_chs) == 0 { return } log.Printf("Checking channels on %s.\n", network.network) var bot *irc.Conn var err error for _, server := range network.servers { bot, err = irc.Connect(server, ctx.conf.IRCBotNickname(), ctx.conf.IRCBotRealname(), nil) if err != nil { log.Printf("Failed to connect to %s: %s.\n", server, err.Error()) continue } defer bot.Disconnect() break } if bot == nil { log.Printf("Could not connect to any address associated with %s.\n", network.network) return } for _, ch := range network_chs { if ch.Network() != network.network { continue } log.Printf("Checking %s@%s.\n", ch.Name(), ch.Network()) status, method, err := channelCheck(bot, ch.Name()) str := "" if err != nil { str = err.Error() err = dbUpdateStatus(db, ch.Name(), ch.Network(), 0, "", "fail", str, time.Now()) } else { log.Printf("%s@%s %d Topic: %s\n", ch.Name(), ch.Network(), status.NumberOfUsers, status.Topic) err = dbUpdateStatus(db, ch.Name(), ch.Network(), status.NumberOfUsers, status.Topic, method, str, time.Now()) } if err != nil { log.Fatalf("Database error when updating channel status: %s.\n", err.Error()) } time.Sleep(5 * time.Second) } }