diff --git a/cache/cache_servers.go b/cache/cache_servers.go index 017e752..32b6dff 100644 --- a/cache/cache_servers.go +++ b/cache/cache_servers.go @@ -55,6 +55,7 @@ func (c *Cache) FlushServers(data map[string]string) { new_servers[mapping_item_name].Port = s.Server.Port new_servers[mapping_item_name].Name = s.Server.Name new_servers[mapping_item_name].Players = s.Server.Players + new_servers[mapping_item_name].Bots = s.Server.Bots new_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers new_servers[mapping_item_name].Ping = s.Server.Ping new_servers[mapping_item_name].Map = s.Server.Map @@ -71,6 +72,7 @@ func (c *Cache) FlushServers(data map[string]string) { cached_servers[mapping_item_name].Port = s.Server.Port cached_servers[mapping_item_name].Name = s.Server.Name cached_servers[mapping_item_name].Players = s.Server.Players + cached_servers[mapping_item_name].Bots = s.Server.Bots cached_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers cached_servers[mapping_item_name].Ping = s.Server.Ping cached_servers[mapping_item_name].Map = s.Server.Map @@ -90,12 +92,12 @@ func (c *Cache) FlushServers(data map[string]string) { fmt.Println("Adding new servers...") if len(new_servers) > 0 { for _, srv := range new_servers { - tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info, is_private, favorite, profile_to_use) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info, :is_private, :favorite, :profile_to_use)", srv) + tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info, is_private, favorite, profile_to_use, bots) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info, :is_private, :favorite, :profile_to_use, :bots)", srv) } } fmt.Println("Updating cached servers...") for _, srv := range cached_servers { - _, err := tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, favorite=:favorite, password=:password, players_info=:players_info, is_private=:is_private, profile_to_use=:profile_to_use WHERE ip=:ip AND port=:port", &srv) + _, err := tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, favorite=:favorite, password=:password, players_info=:players_info, is_private=:is_private, profile_to_use=:profile_to_use, bots=:bots WHERE ip=:ip AND port=:port", &srv) if err != nil { fmt.Println(err.Error()) } @@ -125,6 +127,7 @@ func (c *Cache) LoadServers(data map[string]string) { c.Servers[key].Server.Ip = server.Ip c.Servers[key].Server.Port = server.Port c.Servers[key].Server.Players = server.Players + c.Servers[key].Server.Bots = server.Bots c.Servers[key].Server.Maxplayers = server.Maxplayers c.Servers[key].Server.Ping = server.Ping c.Servers[key].Server.Gamemode = server.Gamemode diff --git a/database/migrations.go b/database/migrations.go index 226dd89..23c4157 100644 --- a/database/migrations.go +++ b/database/migrations.go @@ -48,6 +48,7 @@ func migrate_full(db *Database, version int) { if version == 6 {six_to_seven(db); version = 7} if version == 7 {seven_to_eight(db); version = 8} if version == 8 {eight_to_nine(db); version = 9} + if version == 9 {nine_to_ten(db); version = 10} } // Initial database structure. @@ -115,3 +116,10 @@ func eight_to_nine(db *Database) { db.Db.MustExec("ALTER TABLE servers ADD is_private VARCHAR(1) NOT NULL DEFAULT '0'") db.Db.MustExec("UPDATE database SET version=9") } + +// Bots count. +func nine_to_ten(db *Database) { + fmt.Println("Upgrading database from 9 to 10...") + db.Db.MustExec("ALTER TABLE servers ADD bots VARCHAR(2) NOT NULL DEFAULT '0'") + db.Db.MustExec("UPDATE database SET version=10") +} diff --git a/datamodels/server.go b/datamodels/server.go index 01f269c..32e22d3 100644 --- a/datamodels/server.go +++ b/datamodels/server.go @@ -18,6 +18,8 @@ type Server struct { Name string `db:"name"` // Current players count Players string `db:"players"` + // Bots count + Bots string `db:"bots"` // Maximum players Maxplayers string `db:"maxplayers"` // Ping diff --git a/requester/pooler.go b/requester/pooler.go index 0dd80d4..fbd4666 100644 --- a/requester/pooler.go +++ b/requester/pooler.go @@ -234,13 +234,34 @@ func (p *Pooler) UpdateSpecificServer(server *datamodels.Server) error { if len(received_lines) >= 2 { // Here we go, players information. players := received_lines[2:] + var real_players int = 0 + var bots int = 0 // Calculate players! if len(players) == 1 && len(players[0]) > 255 { server.Players = "0" + server.Bots = "0" } else { // Looks like we have last element to be empty, due to // strings.Split() call before. - server.Players = strconv.Itoa(len(players) - 1) + for i := range players { + // Get slice with data for bots-humans parsing. + player_data := strings.Split(string(players[i]), " ") + // If slice length isn't equal 3 - this is not what + // we want. + if len(player_data) != 3 { + continue + } + + if player_data[1] == "0" { + bots++ + } else { + real_players++ + } + } + //server.Players = strconv.Itoa(len(players) - 1) + server.Players = strconv.Itoa(real_players) + server.Bots = strconv.Itoa(bots) + fmt.Println(server.Players, server.Bots) } server.PlayersInfo = strings.Join(received_lines[2:], "\\") } diff --git a/ui/mainwindow.go b/ui/mainwindow.go index d4c260c..8571e3d 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -409,7 +409,7 @@ func (m *MainWindow) loadAllServers(data map[string]string) { m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Name"], server_name) m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Mode"], m.getGameModeName(server.Server.Gamemode)) m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Map"], server.Server.Map) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Players"], server.Server.Players + "/" + server.Server.Maxplayers) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Players"], server.Server.Players + "/" + server.Server.Bots + "/" + server.Server.Maxplayers) m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Ping"], server.Server.Ping) m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["Version"], server.Server.Version) m.all_servers_store.SetValue(iter, m.column_pos["Servers"]["IP"], server.Server.Ip + ":" + server.Server.Port) @@ -482,7 +482,7 @@ func (m *MainWindow) loadFavoriteServers(data map[string]string) { m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Name"], server_name) m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Mode"], m.getGameModeName(server.Server.Gamemode)) m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Map"], server.Server.Map) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Players"], server.Server.Players + "/" + server.Server.Maxplayers) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Players"], server.Server.Players + "/" + server.Server.Bots + "/" + server.Server.Maxplayers) m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Ping"], server.Server.Ping) m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["Version"], server.Server.Version) m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"]["IP"], server.Server.Ip + ":" + server.Server.Port) @@ -611,7 +611,7 @@ func (m *MainWindow) showShortServerInformation() { iter = new(gtk.TreeIter) m.server_info_store.Append(iter) m.server_info_store.SetValue(iter, 0, "Players") - m.server_info_store.SetValue(iter, 1, server_info.Players + " of " + parsed_general_data["sv_maxclients"]) + m.server_info_store.SetValue(iter, 1, server_info.Players + " of " + parsed_general_data["sv_maxclients"] + " (" + server_info.Bots + " bots)") delete(parsed_general_data, "sv_maxclients") // Ping