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) } }