diff --git a/cache/cache_object.go b/cache/cache_object.go
index 555f600..0d1d241 100644
--- a/cache/cache_object.go
+++ b/cache/cache_object.go
@@ -26,7 +26,6 @@ type Cache struct {
func (c *Cache) CreateServer(addr string) {
_, ok := c.Servers[addr]
if !ok {
- fmt.Println("Creating cached server " + addr)
c.Servers[addr] = &cachemodels.Server{}
c.Servers[addr].Server = &datamodels.Server{}
} else {
@@ -56,7 +55,19 @@ func (c *Cache) FlushServers() {
_, ok := cached_servers[mapping_item_name]
if !ok {
fmt.Println(mapping_item_name + " not found!")
- new_servers[mapping_item_name] = s.Server
+ new_servers[mapping_item_name] = &datamodels.Server{}
+ new_servers[mapping_item_name].Ip = s.Server.Ip
+ 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].Maxplayers = s.Server.Maxplayers
+ new_servers[mapping_item_name].Ping = s.Server.Ping
+ new_servers[mapping_item_name].Map = s.Server.Map
+ new_servers[mapping_item_name].Gamemode = s.Server.Gamemode
+ new_servers[mapping_item_name].Version = s.Server.Version
+ new_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig
+ new_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo
+ new_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate
} else {
cached_servers[mapping_item_name].Ip = s.Server.Ip
cached_servers[mapping_item_name].Port = s.Server.Port
@@ -69,17 +80,18 @@ func (c *Cache) FlushServers() {
cached_servers[mapping_item_name].Version = s.Server.Version
cached_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig
cached_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo
+ cached_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate
}
}
tx := Database.Db.MustBegin()
fmt.Println("Adding new servers...")
for _, srv := range new_servers {
- tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info)", srv)
+ tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info, is_private) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info, :is_private)", srv)
}
fmt.Println("Updating cached servers...")
for _, srv := range cached_servers {
- tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, players_info=:players_info WHERE ip=:ip AND port=:port", &srv)
+ tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, players_info=:players_info is_private=:is_private WHERE ip=:ip AND port=:port", &srv)
}
tx.Commit()
@@ -129,6 +141,7 @@ func (c *Cache) LoadServers() {
c.Servers[key].Server.ProfileToUse = server.ProfileToUse
c.Servers[key].Server.ExtendedConfig = server.ExtendedConfig
c.Servers[key].Server.PlayersInfo = server.PlayersInfo
+ c.Servers[key].Server.IsPrivate = server.IsPrivate
}
fmt.Println("Load completed.")
}
diff --git a/database/database_object.go b/database/database_object.go
index a6011bd..0c00efa 100644
--- a/database/database_object.go
+++ b/database/database_object.go
@@ -88,53 +88,3 @@ func (d *Database) Migrate() {
migrate_full(d, dbver)
}
-func (d *Database) UpdateServers(data map[string]*datamodels.Server) {
- fmt.Println("Updating servers information in database...")
- raw_cached := []datamodels.Server{}
- d.Db.Select(&raw_cached, "SELECT * FROM servers")
-
- // Create map[string]*datamodels.Server once, so we won't iterate
- // over slice of datamodels.Server everytime.
- cached_servers := make(map[string]*datamodels.Server)
- for s := range raw_cached {
- mapping_item_name := raw_cached[s].Ip + ":" + raw_cached[s].Port
- cached_servers[mapping_item_name] = &raw_cached[s]
- }
-
- new_servers := make(map[string]*datamodels.Server)
-
- // Update our cached mapping.
- for _, s := range data {
- mapping_item_name := s.Ip + ":" + s.Port
- _, ok := cached_servers[mapping_item_name]
- if !ok {
- fmt.Println(mapping_item_name + " not found!")
- new_servers[mapping_item_name] = s
- } else {
- cached_servers[mapping_item_name].Ip = s.Ip
- cached_servers[mapping_item_name].Port = s.Port
- cached_servers[mapping_item_name].Name = s.Name
- cached_servers[mapping_item_name].Players = s.Players
- cached_servers[mapping_item_name].Maxplayers = s.Maxplayers
- cached_servers[mapping_item_name].Ping = s.Ping
- cached_servers[mapping_item_name].Map = s.Map
- cached_servers[mapping_item_name].Gamemode = s.Gamemode
- cached_servers[mapping_item_name].Version = s.Version
- cached_servers[mapping_item_name].ExtendedConfig = s.ExtendedConfig
- cached_servers[mapping_item_name].PlayersInfo = s.PlayersInfo
- }
- }
-
- tx := d.Db.MustBegin()
- fmt.Println("Adding new servers...")
- for _, srv := range new_servers {
- tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info)", srv)
- }
- fmt.Println("Updating cached servers...")
- for _, srv := range cached_servers {
- tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, players_info=:players_info WHERE ip=:ip AND port=:port", &srv)
- }
-
- tx.Commit()
- fmt.Println("Done")
-}
diff --git a/database/migrations.go b/database/migrations.go
index df70b6c..226dd89 100644
--- a/database/migrations.go
+++ b/database/migrations.go
@@ -47,6 +47,7 @@ func migrate_full(db *Database, version int) {
if version == 5 {five_to_six(db); version = 6 }
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}
}
// Initial database structure.
@@ -107,3 +108,10 @@ func seven_to_eight(db *Database) {
db.Db.MustExec("ALTER TABLE servers ADD players_info VARCHAR(8192) NOT NULL DEFAULT ''")
db.Db.MustExec("UPDATE database SET version=8")
}
+
+// Is server private flag.
+func eight_to_nine(db *Database) {
+ fmt.Println("Upgrading database from 8 to 9...")
+ db.Db.MustExec("ALTER TABLE servers ADD is_private VARCHAR(1) NOT NULL DEFAULT '0'")
+ db.Db.MustExec("UPDATE database SET version=9")
+}
diff --git a/datamodels/server.go b/datamodels/server.go
index 82e36ca..01f269c 100644
--- a/datamodels/server.go
+++ b/datamodels/server.go
@@ -38,4 +38,6 @@ type Server struct {
ExtendedConfig string `db:"extended_config"`
// Players information.
PlayersInfo string `db:"players_info"`
+ // Is server private?
+ IsPrivate string `db:"is_private"`
}
diff --git a/requester/pooler.go b/requester/pooler.go
index a9bf1c5..01cde52 100644
--- a/requester/pooler.go
+++ b/requester/pooler.go
@@ -39,6 +39,19 @@ func (p *Pooler) Initialize() {
fmt.Println("Pooler initialized")
}
+func (p *Pooler) PingOneServer(server_address string) {
+ var wait sync.WaitGroup
+
+ server := Cache.Servers[server_address].Server
+
+ wait.Add(1)
+ go func(srv *datamodels.Server) {
+ defer wait.Done()
+ p.pingServersExecutor(srv)
+ }(server)
+ wait.Wait()
+}
+
// Servers pinging pooler. Should be started as goroutine to prevent
// UI blocking.
func (p *Pooler) PingServers(servers_type string) {
@@ -106,6 +119,25 @@ func (p *Pooler) pingServersExecutor(server *datamodels.Server) error {
return nil
}
+func (p *Pooler) UpdateOneServer(server_address string) {
+ var wait sync.WaitGroup
+
+ server := Cache.Servers[server_address].Server
+
+ wait.Add(1)
+ go func(server *datamodels.Server) {
+ defer wait.Done()
+ p.updateSpecificServer(server)
+ }(server)
+ wait.Wait()
+ p.PingOneServer(server_address)
+ Eventer.LaunchEvent("flushServers")
+
+ Eventer.LaunchEvent("loadAllServers")
+ Eventer.LaunchEvent("loadFavoriteServers")
+ Eventer.LaunchEvent("serversUpdateCompleted")
+}
+
func (p *Pooler) UpdateServers(servers_type string) {
var wait sync.WaitGroup
@@ -189,6 +221,13 @@ func (p *Pooler) updateSpecificServer(server *datamodels.Server) error {
if srv_config[i] == "sv_hostname" {
server.Name = srv_config[i + 1]
}
+ if srv_config[i] == "g_needpass" {
+ if srv_config[i + 1] == "0" {
+ server.IsPrivate = "0"
+ } else {
+ server.IsPrivate = "1"
+ }
+ }
server.ExtendedConfig = received_lines[1]
}
if len(received_lines) >= 2 {
diff --git a/requester/requester_object.go b/requester/requester_object.go
index 3c5b8b1..7925beb 100644
--- a/requester/requester_object.go
+++ b/requester/requester_object.go
@@ -133,3 +133,7 @@ func (r *Requester) UpdateFavoriteServers() {
r.pooler.UpdateServers("favorites")
}
+func (r *Requester) UpdateOneServer(server_address string) {
+ fmt.Println("Updating server " + server_address)
+ r.pooler.UpdateOneServer(server_address)
+}
diff --git a/ui/favorite.go b/ui/favorite.go
index 6ef7c88..cfec219 100644
--- a/ui/favorite.go
+++ b/ui/favorite.go
@@ -205,23 +205,13 @@ func (f *FavoriteDialog) saveFavorite() error {
fmt.Println("Saving favorite server...")
- server := datamodels.Server{}
- server.Ip = strings.Split(f.server_address.GetText(), ":")[0]
- server.Port = port
- server.Name = f.server_name.GetText()
- server.Password = f.server_password.GetText()
- server.ProfileToUse = f.profile.GetActiveText()
- server.Favorite = "1"
-
- if f.update {
- q := "UPDATE servers SET name=:name, ip=:ip, port=:port, password=:password, favorite=:favorite, profile_to_use=:profile_to_use WHERE ip='" + f.server.Ip + "' AND port='" + f.server.Port + "'"
- fmt.Println("Query: " + q)
- ctx.Database.Db.NamedExec(q, &server)
- } else {
- q := "INSERT INTO servers (name, ip, port, password, favorite, profile_to_use) VALUES (:name, :ip, :port, :password, \"1\", :profile_to_use)"
- fmt.Println(q)
- ctx.Database.Db.NamedExec(q, &server)
- }
+ key := strings.Split(f.server_address.GetText(), ":")[0] + ":" + port
+ ctx.Cache.Servers[key].Server.Ip = strings.Split(f.server_address.GetText(), ":")[0]
+ ctx.Cache.Servers[key].Server.Port = port
+ ctx.Cache.Servers[key].Server.Name = f.server_name.GetText()
+ ctx.Cache.Servers[key].Server.Password = f.server_password.GetText()
+ ctx.Cache.Servers[key].Server.ProfileToUse = f.profile.GetActiveText()
+ ctx.Cache.Servers[key].Server.Favorite = "1"
ctx.Eventer.LaunchEvent("loadFavoriteServers")
f.window.Destroy()
diff --git a/ui/mainwindow.go b/ui/mainwindow.go
index 91fc4a6..1e919e6 100644
--- a/ui/mainwindow.go
+++ b/ui/mainwindow.go
@@ -136,7 +136,7 @@ func (m *MainWindow) addToFavorites() {
// Getting server address.
var srv_addr string
srv_addr_gval := glib.ValueFromNative(srv_addr)
- model.GetValue(iter, 7, srv_addr_gval)
+ model.GetValue(iter, 8, srv_addr_gval)
server_address := srv_addr_gval.GetString()
// Getting server from database.
@@ -203,21 +203,13 @@ func (m *MainWindow) deleteFromFavorites() {
// Getting server address.
var srv_addr string
srv_addr_gval := glib.ValueFromNative(srv_addr)
- model.GetValue(iter, 7, srv_addr_gval)
+ model.GetValue(iter, 8, srv_addr_gval)
server_address := srv_addr_gval.GetString()
var not_favorited bool = false
if len(server_address) > 0 {
- address := strings.Split(server_address, ":")[0]
- port := strings.Split(server_address, ":")[1]
- srv := []datamodels.Server{}
- err := ctx.Database.Db.Select(&srv, ctx.Database.Db.Rebind("SELECT * FROM servers WHERE ip=? AND port=?"), address, port)
- if err != nil {
- fmt.Println(err.Error())
- }
- if srv[0].Favorite == "1" {
- ctx.Database.Db.MustExec(ctx.Database.Db.Rebind("UPDATE servers SET favorite='0' WHERE ip=? AND port=?"), address, port)
- ctx.Eventer.LaunchEvent("loadFavoriteServers")
+ if ctx.Cache.Servers[server_address].Server.Favorite == "1" {
+ ctx.Cache.Servers[server_address].Server.Favorite = "0"
} else {
not_favorited = true
}
@@ -233,6 +225,8 @@ func (m *MainWindow) deleteFromFavorites() {
})
d.Run()
}
+
+ ctx.Eventer.LaunchEvent("loadFavoriteServers")
}
// Drop database data.
@@ -277,19 +271,12 @@ func (m *MainWindow) editFavorite() {
// Getting server address.
var srv_addr string
srv_addr_gval := glib.ValueFromNative(srv_addr)
- model.GetValue(iter, 7, srv_addr_gval)
+ model.GetValue(iter, 8, srv_addr_gval)
server_address := srv_addr_gval.GetString()
if len(server_address) > 0 {
- address := strings.Split(server_address, ":")[0]
- port := strings.Split(server_address, ":")[1]
- srv := []datamodels.Server{}
- err := ctx.Database.Db.Select(&srv, ctx.Database.Db.Rebind("SELECT * FROM servers WHERE ip=? AND port=?"), address, port)
- if err != nil {
- fmt.Println(err.Error())
- }
- m.favorite_dialog = &FavoriteDialog{}
- m.favorite_dialog.InitializeUpdate(&srv[0])
+ srv := ctx.Cache.Servers[server_address].Server
+ m.favorite_dialog.InitializeUpdate(srv)
}
}
@@ -605,11 +592,11 @@ func (m *MainWindow) initializeStorages() {
// Servers tab list view storage.
// Structure:
// Server status icon|Server name|Mode|Map|Players|Ping|Version
- m.all_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING)
+ m.all_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING)
m.all_servers_store_sortable = gtk.NewTreeSortable(m.all_servers_store)
// Same as above, but for favorite servers.
- m.fav_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING)
+ m.fav_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING)
// Server's information store. Used for quick preview in main window.
m.server_info_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING)
@@ -636,39 +623,40 @@ func (m *MainWindow) InitializeTabs() {
m.all_servers.SetModel(m.all_servers_store)
m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes("Status", gtk.NewCellRendererPixbuf(), "pixbuf", 0))
+ m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes("Private", gtk.NewCellRendererPixbuf(), "pixbuf", 1))
- all_srv_name_column := gtk.NewTreeViewColumnWithAttributes("Name", gtk.NewCellRendererText(), "markup", 1)
- all_srv_name_column.SetSortColumnId(1)
+ all_srv_name_column := gtk.NewTreeViewColumnWithAttributes("Name", gtk.NewCellRendererText(), "markup", 2)
+ all_srv_name_column.SetSortColumnId(2)
m.all_servers.AppendColumn(all_srv_name_column)
- all_gamemode_column := gtk.NewTreeViewColumnWithAttributes("Mode", gtk.NewCellRendererText(), "text", 2)
- all_gamemode_column.SetSortColumnId(2)
+ all_gamemode_column := gtk.NewTreeViewColumnWithAttributes("Mode", gtk.NewCellRendererText(), "text", 3)
+ all_gamemode_column.SetSortColumnId(3)
m.all_servers.AppendColumn(all_gamemode_column)
- all_map_column := gtk.NewTreeViewColumnWithAttributes("Map", gtk.NewCellRendererText(), "text", 3)
- all_map_column.SetSortColumnId(3)
+ all_map_column := gtk.NewTreeViewColumnWithAttributes("Map", gtk.NewCellRendererText(), "text", 4)
+ all_map_column.SetSortColumnId(4)
m.all_servers.AppendColumn(all_map_column)
// ToDo: custom sorting function.
- all_players_column := gtk.NewTreeViewColumnWithAttributes("Players", gtk.NewCellRendererText(), "text", 4)
- all_players_column.SetSortColumnId(4)
+ all_players_column := gtk.NewTreeViewColumnWithAttributes("Players", gtk.NewCellRendererText(), "text", 5)
+ all_players_column.SetSortColumnId(5)
m.all_servers.AppendColumn(all_players_column)
- all_ping_column := gtk.NewTreeViewColumnWithAttributes("Ping", gtk.NewCellRendererText(), "text", 5)
- all_ping_column.SetSortColumnId(5)
+ all_ping_column := gtk.NewTreeViewColumnWithAttributes("Ping", gtk.NewCellRendererText(), "text", 6)
+ all_ping_column.SetSortColumnId(6)
m.all_servers.AppendColumn(all_ping_column)
- all_version_column := gtk.NewTreeViewColumnWithAttributes("Version", gtk.NewCellRendererText(), "text", 6)
- all_version_column.SetSortColumnId(6)
+ all_version_column := gtk.NewTreeViewColumnWithAttributes("Version", gtk.NewCellRendererText(), "text", 7)
+ all_version_column.SetSortColumnId(7)
m.all_servers.AppendColumn(all_version_column)
- all_ip_column := gtk.NewTreeViewColumnWithAttributes("IP", gtk.NewCellRendererText(), "text", 7)
- all_ip_column.SetSortColumnId(7)
+ all_ip_column := gtk.NewTreeViewColumnWithAttributes("IP", gtk.NewCellRendererText(), "text", 8)
+ all_ip_column.SetSortColumnId(8)
m.all_servers.AppendColumn(all_ip_column)
// Sorting.
// By default we are sorting by server name.
// ToDo: remembering it to configuration storage.
- m.all_servers_store_sortable.SetSortColumnId(1, gtk.SORT_ASCENDING)
+ m.all_servers_store_sortable.SetSortColumnId(2, gtk.SORT_ASCENDING)
// Selection changed signal, which will update server's short info pane.
m.all_servers.Connect("cursor-changed", m.showShortServerInformation)
@@ -700,33 +688,34 @@ func (m *MainWindow) InitializeTabs() {
m.tab_widget.AppendPage(tab_fav_srv_hbox, gtk.NewLabel("Favorites"))
m.fav_servers.SetModel(m.fav_servers_store)
m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes("Status", gtk.NewCellRendererPixbuf(), "pixbuf", 0))
+ m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes("Private", gtk.NewCellRendererPixbuf(), "pixbuf", 1))
- fav_name_column := gtk.NewTreeViewColumnWithAttributes("Name", gtk.NewCellRendererText(), "markup", 1)
- fav_name_column.SetSortColumnId(1)
+ fav_name_column := gtk.NewTreeViewColumnWithAttributes("Name", gtk.NewCellRendererText(), "markup", 2)
+ fav_name_column.SetSortColumnId(2)
m.fav_servers.AppendColumn(fav_name_column)
- fav_mode_column := gtk.NewTreeViewColumnWithAttributes("Mode", gtk.NewCellRendererText(), "text", 2)
- fav_mode_column.SetSortColumnId(2)
+ fav_mode_column := gtk.NewTreeViewColumnWithAttributes("Mode", gtk.NewCellRendererText(), "text", 3)
+ fav_mode_column.SetSortColumnId(3)
m.fav_servers.AppendColumn(fav_mode_column)
- fav_map_column := gtk.NewTreeViewColumnWithAttributes("Map", gtk.NewCellRendererText(), "text", 3)
- fav_map_column.SetSortColumnId(3)
+ fav_map_column := gtk.NewTreeViewColumnWithAttributes("Map", gtk.NewCellRendererText(), "text", 4)
+ fav_map_column.SetSortColumnId(4)
m.fav_servers.AppendColumn(fav_map_column)
- fav_players_column := gtk.NewTreeViewColumnWithAttributes("Players", gtk.NewCellRendererText(), "text", 4)
- fav_players_column.SetSortColumnId(4)
+ fav_players_column := gtk.NewTreeViewColumnWithAttributes("Players", gtk.NewCellRendererText(), "text", 5)
+ fav_players_column.SetSortColumnId(5)
m.fav_servers.AppendColumn(fav_players_column)
- fav_ping_column := gtk.NewTreeViewColumnWithAttributes("Ping", gtk.NewCellRendererText(), "text", 5)
- fav_ping_column.SetSortColumnId(5)
+ fav_ping_column := gtk.NewTreeViewColumnWithAttributes("Ping", gtk.NewCellRendererText(), "text", 6)
+ fav_ping_column.SetSortColumnId(6)
m.fav_servers.AppendColumn(fav_ping_column)
- fav_version_column := gtk.NewTreeViewColumnWithAttributes("Version", gtk.NewCellRendererText(), "text", 6)
- fav_version_column.SetSortColumnId(6)
+ fav_version_column := gtk.NewTreeViewColumnWithAttributes("Version", gtk.NewCellRendererText(), "text", 7)
+ fav_version_column.SetSortColumnId(7)
m.fav_servers.AppendColumn(fav_version_column)
- fav_ip_column := gtk.NewTreeViewColumnWithAttributes("IP", gtk.NewCellRendererText(), "text", 7)
- fav_ip_column.SetSortColumnId(7)
+ fav_ip_column := gtk.NewTreeViewColumnWithAttributes("IP", gtk.NewCellRendererText(), "text", 8)
+ fav_ip_column.SetSortColumnId(8)
m.fav_servers.AppendColumn(fav_ip_column)
// Selection changed signal, which will update server's short info pane.
@@ -765,39 +754,45 @@ func (m *MainWindow) InitializeToolbar() {
button_update_all_servers.OnClicked(m.UpdateServers)
m.toolbar.Insert(button_update_all_servers, 0)
+ button_update_one_server := gtk.NewToolButtonFromStock(gtk.STOCK_UNDO)
+ button_update_one_server.SetLabel("Update all servers")
+ button_update_one_server.SetTooltipText("Update only selected server")
+ button_update_one_server.OnClicked(m.updateOneServer)
+ m.toolbar.Insert(button_update_one_server, 1)
+
// Separator.
separator := gtk.NewSeparatorToolItem()
- m.toolbar.Insert(separator, 1)
+ m.toolbar.Insert(separator, 2)
// Add server to favorites button.
fav_button := gtk.NewToolButtonFromStock(gtk.STOCK_ADD)
fav_button.SetLabel("Add to favorites")
fav_button.SetTooltipText("Add selected server to favorites")
fav_button.OnClicked(m.addToFavorites)
- m.toolbar.Insert(fav_button, 2)
+ m.toolbar.Insert(fav_button, 3)
fav_edit_button := gtk.NewToolButtonFromStock(gtk.STOCK_EDIT)
fav_edit_button.SetLabel("Edit favorite")
fav_edit_button.SetTooltipText("Edit selected favorite server")
fav_edit_button.OnClicked(m.editFavorite)
- m.toolbar.Insert(fav_edit_button, 3)
+ m.toolbar.Insert(fav_edit_button, 4)
// Remove server from favorites button.
fav_delete_button := gtk.NewToolButtonFromStock(gtk.STOCK_REMOVE)
fav_delete_button.SetLabel("Remove from favorites")
fav_delete_button.SetTooltipText("Remove selected server from favorites")
fav_delete_button.OnClicked(m.deleteFromFavorites)
- m.toolbar.Insert(fav_delete_button, 4)
+ m.toolbar.Insert(fav_delete_button, 5)
// Separator for toolbar's label and buttons.
toolbar_separator_toolitem := gtk.NewToolItem()
toolbar_separator_toolitem.SetExpand(true)
- m.toolbar.Insert(toolbar_separator_toolitem, 5)
+ m.toolbar.Insert(toolbar_separator_toolitem, 6)
// Toolbar's label.
m.toolbar_label = gtk.NewLabel("URTrator is ready")
toolbar_label_toolitem := gtk.NewToolItem()
toolbar_label_toolitem.Add(m.toolbar_label)
- m.toolbar.Insert(toolbar_label_toolitem, 6)
+ m.toolbar.Insert(toolbar_label_toolitem, 7)
}
// Tray icon initialization.
@@ -857,19 +852,19 @@ func (m *MainWindow) launchGame() error {
// Getting server name.
var srv_name string
srv_name_gval := glib.ValueFromNative(srv_name)
- model.GetValue(iter, 1, srv_name_gval)
+ model.GetValue(iter, 2, srv_name_gval)
server_name := srv_name_gval.GetString()
// Getting server address.
var srv_addr string
srv_address_gval := glib.ValueFromNative(srv_addr)
- model.GetValue(iter, 7, srv_address_gval)
+ model.GetValue(iter, 8, srv_address_gval)
srv_address := srv_address_gval.GetString()
// Getting server's game version.
var srv_game_ver_raw string
srv_game_ver_gval := glib.ValueFromNative(srv_game_ver_raw)
- model.GetValue(iter, 6, srv_game_ver_gval)
+ model.GetValue(iter, 7, srv_game_ver_gval)
srv_game_ver := srv_game_ver_gval.GetString()
// Check for proper server name. If length == 0: server is offline,
@@ -974,7 +969,7 @@ func (m *MainWindow) loadAllServers() {
server.AllServersIterInList = true
}
- if m.all_servers_hide_offline.GetActive() && server.Server.Players == "" && server.Server.Maxplayers == "" {
+ if m.all_servers_hide_offline.GetActive() && server.Server.Players == "" && server.Server.Maxplayers == "" && server.AllServersIterInList {
m.all_servers_store.Remove(iter)
server.AllServersIterInList = false
continue
@@ -982,17 +977,22 @@ func (m *MainWindow) loadAllServers() {
if server.Server.Name == "" && server.Server.Players == "" && server.Server.Maxplayers == "" {
m.all_servers_store.SetValue(iter, 0, gtk.NewImage().RenderIcon(gtk.STOCK_NO, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
- m.all_servers_store.SetValue(iter, 7, server.Server.Ip + ":" + server.Server.Port)
+ m.all_servers_store.SetValue(iter, 8, server.Server.Ip + ":" + server.Server.Port)
} else {
m.all_servers_store.SetValue(iter, 0, gtk.NewImage().RenderIcon(gtk.STOCK_OK, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ if server.Server.IsPrivate == "1" {
+ m.all_servers_store.SetValue(iter, 1, gtk.NewImage().RenderIcon(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ } else {
+ m.all_servers_store.SetValue(iter, 1, gtk.NewImage().RenderIcon(gtk.STOCK_OK, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ }
server_name := ctx.Colorizer.Fix(server.Server.Name)
- m.all_servers_store.SetValue(iter, 1, server_name)
- m.all_servers_store.SetValue(iter, 2, m.getGameModeName(server.Server.Gamemode))
- m.all_servers_store.SetValue(iter, 3, server.Server.Map)
- m.all_servers_store.SetValue(iter, 4, server.Server.Players + "/" + server.Server.Maxplayers)
- m.all_servers_store.SetValue(iter, 5, server.Server.Ping)
- m.all_servers_store.SetValue(iter, 6, server.Server.Version)
- m.all_servers_store.SetValue(iter, 7, server.Server.Ip + ":" + server.Server.Port)
+ m.all_servers_store.SetValue(iter, 2, server_name)
+ m.all_servers_store.SetValue(iter, 3, m.getGameModeName(server.Server.Gamemode))
+ m.all_servers_store.SetValue(iter, 4, server.Server.Map)
+ m.all_servers_store.SetValue(iter, 5, server.Server.Players + "/" + server.Server.Maxplayers)
+ m.all_servers_store.SetValue(iter, 6, server.Server.Ping)
+ m.all_servers_store.SetValue(iter, 7, server.Server.Version)
+ m.all_servers_store.SetValue(iter, 8, server.Server.Ip + ":" + server.Server.Port)
}
}
}
@@ -1000,6 +1000,11 @@ func (m *MainWindow) loadAllServers() {
func (m *MainWindow) loadFavoriteServers() {
fmt.Println("Loading favorite servers...")
for _, server := range ctx.Cache.Servers {
+ if server.Server.Favorite != "1" && server.FavServersIterSet && server.FavServersIterInList {
+ m.fav_servers_store.Remove(server.FavServersIter)
+ server.FavServersIterInList = false
+ }
+
if server.Server.Favorite != "1" {
continue
}
@@ -1018,7 +1023,7 @@ func (m *MainWindow) loadFavoriteServers() {
server.FavServersIterInList = true
}
- if m.fav_servers_hide_offline.GetActive() && server.Server.Players == "" && server.Server.Maxplayers == "" {
+ if m.fav_servers_hide_offline.GetActive() && server.Server.Players == "" && server.Server.Maxplayers == "" && server.FavServersIterInList {
m.fav_servers_store.Remove(iter)
server.FavServersIterInList = false
continue
@@ -1026,17 +1031,22 @@ func (m *MainWindow) loadFavoriteServers() {
if server.Server.Name == "" && server.Server.Players == "" {
m.fav_servers_store.SetValue(iter, 0, gtk.NewImage().RenderIcon(gtk.STOCK_NO, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
- m.fav_servers_store.SetValue(iter, 7, server.Server.Ip + ":" + server.Server.Port)
+ m.fav_servers_store.SetValue(iter, 8, server.Server.Ip + ":" + server.Server.Port)
} else {
m.fav_servers_store.SetValue(iter, 0, gtk.NewImage().RenderIcon(gtk.STOCK_OK, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ if server.Server.IsPrivate == "1" {
+ m.fav_servers_store.SetValue(iter, 1, gtk.NewImage().RenderIcon(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ } else {
+ m.fav_servers_store.SetValue(iter, 1, gtk.NewImage().RenderIcon(gtk.STOCK_OK, gtk.ICON_SIZE_SMALL_TOOLBAR, "").GPixbuf)
+ }
server_name := ctx.Colorizer.Fix(server.Server.Name)
- m.fav_servers_store.SetValue(iter, 1, server_name)
- m.fav_servers_store.SetValue(iter, 2, m.getGameModeName(server.Server.Gamemode))
- m.fav_servers_store.SetValue(iter, 3, server.Server.Map)
- m.fav_servers_store.SetValue(iter, 4, server.Server.Players + "/" + server.Server.Maxplayers)
- m.fav_servers_store.SetValue(iter, 5, server.Server.Ping)
- m.fav_servers_store.SetValue(iter, 6, server.Server.Version)
- m.fav_servers_store.SetValue(iter, 7, server.Server.Ip + ":" + server.Server.Port)
+ m.fav_servers_store.SetValue(iter, 2, server_name)
+ m.fav_servers_store.SetValue(iter, 3, m.getGameModeName(server.Server.Gamemode))
+ m.fav_servers_store.SetValue(iter, 4, server.Server.Map)
+ m.fav_servers_store.SetValue(iter, 5, server.Server.Players + "/" + server.Server.Maxplayers)
+ m.fav_servers_store.SetValue(iter, 6, server.Server.Ping)
+ m.fav_servers_store.SetValue(iter, 7, server.Server.Version)
+ m.fav_servers_store.SetValue(iter, 8, server.Server.Ip + ":" + server.Server.Port)
}
}
}
@@ -1100,7 +1110,7 @@ func (m *MainWindow) showShortServerInformation() {
// Getting server address.
var srv_addr string
srv_address_gval := glib.ValueFromNative(srv_addr)
- model.GetValue(iter, 7, srv_address_gval)
+ model.GetValue(iter, 8, srv_address_gval)
srv_address := srv_address_gval.GetString()
// Getting server information from cache.
@@ -1159,11 +1169,10 @@ func (m *MainWindow) showShortServerInformation() {
m.server_info_store.Append(iter)
m.server_info_store.SetValue(iter, 0, "Passworded")
passworded_status := "No"
- if parsed_general_data["g_needpass"] == "1" {
+ if server_info.IsPrivate == "1" {
passworded_status = "Yes"
}
m.server_info_store.SetValue(iter, 1, passworded_status)
- delete(parsed_general_data, "g_needpass")
// Just a separator.
iter = new(gtk.TreeIter)
@@ -1212,6 +1221,28 @@ func (m *MainWindow) unlockInterface() {
m.toolbar_label.SetLabel("URTrator is ready.")
}
+func (m *MainWindow) updateOneServer() {
+ current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage()))
+ sel := m.all_servers.GetSelection()
+ model := m.all_servers.GetModel()
+ if strings.Contains(current_tab, "Favorites") {
+ sel = m.fav_servers.GetSelection()
+ model = m.fav_servers.GetModel()
+ }
+ iter := new(gtk.TreeIter)
+ _ = sel.GetSelected(iter)
+
+ // Getting server address.
+ var srv_addr string
+ srv_address_gval := glib.ValueFromNative(srv_addr)
+ model.GetValue(iter, 8, srv_address_gval)
+ srv_address := srv_address_gval.GetString()
+
+ if len(srv_address) > 0 {
+ go ctx.Requester.UpdateOneServer(srv_address)
+ }
+}
+
// Triggered when "Update all servers" button is clicked.
func (m *MainWindow) UpdateServers() {
m.statusbar.Push(m.statusbar_context_id, "Updating servers...")