Esempio n. 1
0
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)
	}

}