diff --git a/README.md b/README.md index 46dc93c..ce9a4ce 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,17 @@ # URTrator -[![Join the chat at https://gitter.im/urtrator/Lobby](https://badges.gitter.im/urtrator/Lobby.svg)](https://gitter.im/urtrator/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -Chat on Matrix: #gitter_urtrator=2Flobby:matrix.org (Gitter bridge). - ![Main Window](/doc/screenshots/0.2-main_window.png) -URTrator is a desktop application that should (eventually) replace -Urban Terror's and IRC client interfaces for you, because they're -pretty shitty :). +URTrator is a desktop application that should (eventually) replace Urban Terror's and IRC client interfaces for you, because they're pretty shitty :). -*Disclaimer: This software isn't written nor supported (for now) by FrozenSand. -All code is a community effort.* +*Disclaimer: This software isn't written nor supported (for now) by FrozenSand. All code is a community effort.* Right now it can: -* Obtaining list of Urban Terror servers from master server and -updating information about them. +* Obtaining list of Urban Terror servers from master server and updating information about them. * Local caching of whole data (in SQLite3 database). -* Extended Urban Terror launching capabilities (e.g. launching game -in another X session). -* Supporting of multiple profiles with multiple game versions. -When you're launching Urban Terror URTrator will check profile you're -trying to use and, if version incompatability found, will not launch -the game. +* Extended Urban Terror launching capabilities (e.g. launching game in another X session). +* Supporting of multiple profiles with multiple game versions. When you're launching Urban Terror URTrator will check profile you're trying to use and, if version incompatability found, will not launch the game. * Favorites servers. * Updating single server. * Automatically update servers information. @@ -37,23 +25,20 @@ Planning: * Game updating (not from official servers yet, sorry). * Pickup/matchmaking interfaces. * All kinds of notifications. -* Extended profile editor, so every profile could have own configuration -files, etc. +* Extended profile editor, so every profile could have own configuration files, etc. * ...maybe more :) # Installation ## Precautions -Due to Go's GC bugs, it is required to use devel version of Go -compiler! +There is no precautions for latest source with Golang 1.11.2 and GTK+2 2.24.32. ## Release -You don't need to install anything, thanks to Go's. -URTrator executable contains everything we need. Just download -approriate binary and launch it! :) The only thing is to make -sure you have GTK2 and sqlite3 installed. +You don't need to install anything, thanks to Go's. URTrator executable contains everything we need. Just download approriate binary and launch it! :) The only thing is to make sure you have GTK2 and sqlite3 installed. + +Windows and macOS users will receive full distribution that is ready to be launched OOB, no need to additionally install anything. ## Distro-and-OS specific instructions @@ -63,60 +48,46 @@ sure you have GTK2 and sqlite3 installed. ## Development version -URTrator written in Go and GTK2, so you should have them installed. -Make sure your ``GOPATH`` variable is defined. +URTrator written in Go and GTK2, so you should have them installed. Make sure your ``GOPATH`` variable is defined. Then execute: ``` -go get -d github.com/pztrn/urtrator -go install github.com/pztrn/urtrator +go get -d gitlab.com/pztrn/urtrator +go install gitlab.com/pztrn/urtrator ``` -First command will get sources of URTrator and dependencies, second -command will build executable for you and place it in ``$GOROOT/bin``. +First command will get sources of URTrator and dependencies, second command will build executable for you and place it in ``$GOROOT/bin``. ### Updating -``go get`` will do initial repo clone for you, but flag ``-u`` is -required to get updated URTrator source. So, for updating sources -just issue: +``go get`` will do initial repo clone for you, but flag ``-u`` is required to get updated URTrator source. So, for updating sources just issue: ``` -go get -d -u github.com/pztrn/urtrator +go get -d -u gitlab.com/pztrn/urtrator ``` -Again, this will only update sources. To build executable you have to -issue: +Again, this will only update sources. To build executable you have to issue: ``` -go install github.com/pztrn/urtrator +go install gitlab.com/pztrn/urtrator ``` # Important information ## Translation -Feel free to ping me everywhere you can and ask for adding a language -for translation, if not already added [here](https://www.transifex.com/issuewarrior/urtrator/dashboard/). +Feel free to ping me everywhere you can and ask for adding a language for translation, if not already added [here](https://www.transifex.com/issuewarrior/urtrator/dashboard/). -Also, if you're testing (or using) URTrator from source tree with `go run` -you should also specify `URTRATOR_BINDIR` variable. This variable tells -URTrator where it sources is and from where translations should be taken. +Also, if you're testing (or using) URTrator from source tree with `go run` you should also specify `URTRATOR_BINDIR` variable. This variable tells URTrator where it sources is and from where translations should be taken. ## GTK warnings in console -Many GTK warnings in console may appear while using URTrator. Unfortunately, -they are out of control, because they are related to Go GTK+2 bindings -and nothing can be done on URTrator side. +Many GTK warnings in console may appear while using URTrator. Unfortunately, they are out of control, because they are related to Go GTK+2 bindings and nothing can be done on URTrator side. ## Why GTK+2? -Because GTK+3 going on "stable api nonsense" way. And also it have some -troubles with integrating with current popular WM/DE (like XFCE4, -Openbox, etc.). And also I already tired of that shitty Adwaita and -Cantarella. +Because GTK+3 going on "stable api nonsense" way. And also it have some troubles with integrating with current popular WM/DE (like XFCE4, Openbox, etc.). And also I already tired of that shitty Adwaita and Cantarella. -If you want to use GTK+3, well, you can write UI for yourself, Go -bindings exist. +If you want to use GTK+3, well, you can write UI for yourself, Go bindings exist. diff --git a/common/const.go b/common/const.go index 4990dee..70a8438 100644 --- a/common/const.go +++ b/common/const.go @@ -10,12 +10,12 @@ package common const ( - URTRATOR_VERSION = "0.2.0-devel" + URTRATOR_VERSION = "0.2.0-devel" ) // Self-named. var SUPPORTED_URT_VERSIONS []string = []string{ - "4.2.023", - "4.3.1", - "4.3.2", + "4.2.023", + "4.3.3", + "4.3.4", } diff --git a/doc/installation/macos/make-app.sh b/doc/installation/macos/make-app.sh index 9096b16..b139d44 100755 --- a/doc/installation/macos/make-app.sh +++ b/doc/installation/macos/make-app.sh @@ -50,13 +50,6 @@ if [ $? -ne 0 ]; then fi # Okay, let's compile. -echo "Getting URTrator (and dependencies) sources" -go get -u -v -d gitlab.com/pztrn/urtrator -if [ $? -ne 0 ]; then - echo "Failed to get URTrator sources" - exit 1 -fi - echo "Building URTrator..." go install -v gitlab.com/pztrn/urtrator if [ $? -ne 0 ]; then @@ -108,11 +101,12 @@ echo -e '#!/bin/bash\ncd "${0%/*}"\nexport GTK_PATH="../lib/gtk-2.0/"\nexport GT chmod +x ./URTrator.app/Contents/MacOS/urtrator.sh ##################################################################### # Copying helper binaries. -cp /usr/local/Cellar/gdk-pixbuf/2.36.0_2/bin/gdk-pixbuf-query-loaders ./URTrator.app/Contents/MacOS/ +cp /usr/local/Cellar/gdk-pixbuf/2.38.0/bin/gdk-pixbuf-query-loaders ./URTrator.app/Contents/MacOS/ # Copy GTK engines as needed for default theme. cp /usr/local/lib/gtk-2.0/2.10.0/engines/* ./URTrator.app/Contents/Framework/ -cp /usr/local/Cellar/gdk-pixbuf/2.36.0_2/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so ./URTrator.app/Contents/Framework/ +cp /usr/local/lib/gtk-2.0/modules/* ./URTrator.app/Contents/Framework/ +cp /usr/local/Cellar/gdk-pixbuf/2.38.0/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so ./URTrator.app/Contents/Framework/ chmod -R 0644 ./URTrator.app/Contents/Framework/* chmod -R 0755 ./URTrator.app/Contents/MacOS/* diff --git a/requester/requester_object.go b/requester/requester_object.go index 0855d63..709dd99 100644 --- a/requester/requester_object.go +++ b/requester/requester_object.go @@ -10,160 +10,160 @@ package requester import ( - // stdlib - "bytes" - "errors" - "fmt" - "net" - "strconv" - "strings" - "time" + // stdlib + "bytes" + "errors" + "fmt" + "net" + "strconv" + "strings" + "time" ) type Requester struct { - // Pooler. - Pooler *Pooler - // Packet prefix. - pp string - // Showstopper for delimiting IP addresses. - // As we are receiving bytes, we will put bytes representation of "\" - // character. - ip_delimiter int + // Pooler. + Pooler *Pooler + // Packet prefix. + pp string + // Showstopper for delimiting IP addresses. + // As we are receiving bytes, we will put bytes representation of "\" + // character. + ip_delimiter int } // Requester's initialization. func (r *Requester) Initialize() { - fmt.Println("Initializing Requester...") - r.pp = "\377\377\377\377" - r.ip_delimiter = 92 - r.Pooler = &Pooler{} - r.Pooler.Initialize() + fmt.Println("Initializing Requester...") + r.pp = "\377\377\377\377" + r.ip_delimiter = 92 + r.Pooler = &Pooler{} + r.Pooler.Initialize() } // Gets all available servers from master server. // This isn't in pooler, because it have no need to be pooled. func (r *Requester) getServers() error { - // Get master server address and port from configuration. - var master_server string = "" - var master_server_port string = "" - master_server_raw, ok := Cfg.Cfg["/servers_updating/master_server"] - if ok { - master_server = strings.Split(master_server_raw, ":")[0] - master_server_port = strings.Split(master_server_raw, ":")[1] - } else { - master_server = "master.urbanterror.info" - master_server_port = "27900" - } - fmt.Println("Using master server address: " + master_server + ":" + master_server_port) - // IP addresses we will compose to return. - conn, err1 := net.Dial("udp", master_server + ":" + master_server_port) - if err1 != nil { - fmt.Println("Error dialing to master server!") - Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "Failed to connect to master server!"}) - return errors.New("Failed to connect to master server!") - } - defer conn.Close() + // Get master server address and port from configuration. + var master_server string = "" + var master_server_port string = "" + master_server_raw, ok := Cfg.Cfg["/servers_updating/master_server"] + if ok { + master_server = strings.Split(master_server_raw, ":")[0] + master_server_port = strings.Split(master_server_raw, ":")[1] + } else { + master_server = "master.urbanterror.info" + master_server_port = "27900" + } + fmt.Println("Using master server address: " + master_server + ":" + master_server_port) + // IP addresses we will compose to return. + conn, err1 := net.Dial("udp", master_server+":"+master_server_port) + if err1 != nil { + fmt.Println("Error dialing to master server!") + Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "Failed to connect to master server!"}) + return errors.New("Failed to connect to master server!") + } + defer conn.Close() - // Set deadline, so we won't wait forever. - ddl := time.Now() - // This should be enough. Maybe, you should'n run URTrator on modem - // connections? :) - ddl = ddl.Add(time.Second * 2) - conn.SetDeadline(ddl) - fmt.Println("Master server connection deadline set: " + ddl.String()) + // Set deadline, so we won't wait forever. + ddl := time.Now() + // This should be enough. Maybe, you should'n run URTrator on modem + // connections? :) + ddl = ddl.Add(time.Second * 2) + conn.SetDeadline(ddl) + fmt.Println("Master server connection deadline set: " + ddl.String()) - // Request. - // 68 - protocol version for 4.3 - // 70 - protocol version for 4.2.x - msg := []byte(r.pp + "getservers 68 full empty") - conn.Write(msg) + // Request. + // 68 - protocol version for 4.3 + // 70 - protocol version for 4.2.x + msg := []byte(r.pp + "getservers 68 full empty") + conn.Write(msg) - // UDP Buffer. - var received_buf []byte = make([]byte, 4096) - // Received buffer. - var raw_received []byte - // Received IP addresses. - //var received []string - fmt.Println("Receiving servers list...") - for { - _, err := conn.Read(received_buf) - raw_received = append(raw_received, received_buf...) - fmt.Println("Received " + strconv.Itoa(len(raw_received)) + " bytes") + // UDP Buffer. + var received_buf []byte = make([]byte, 4096) + // Received buffer. + var raw_received []byte + // Received IP addresses. + //var received []string + fmt.Println("Receiving servers list...") + for { + _, err := conn.Read(received_buf) + raw_received = append(raw_received, received_buf...) + fmt.Println("Received " + strconv.Itoa(len(raw_received)) + " bytes") - if err != nil { - // A bit hacky - if we have received data length lower or - // equal to 4k - we have an error. Looks like conn.Read() - // reads by 4k. - if len(raw_received) < 4097 { - fmt.Println("Error dialing to master server!") - Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "Failed to connect to master server!"}) - return errors.New("Failed to connect to master server!") - } - break - } - } + if err != nil { + // A bit hacky - if we have received data length lower or + // equal to 4k - we have an error. Looks like conn.Read() + // reads by 4k. + if len(raw_received) < 4097 { + fmt.Println("Error dialing to master server!") + Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "Failed to connect to master server!"}) + return errors.New("Failed to connect to master server!") + } + break + } + } - // Obtaining list of slices. - var raw_received_slices [][]byte = bytes.Split(raw_received, []byte("\\")) + // Obtaining list of slices. + var raw_received_slices [][]byte = bytes.Split(raw_received, []byte("\\")) - // Every ip-port pair contains: - // 1. IP as first 4 bytes - // 2. Port as last 2 bytes. - // Every package is a 7-bytes sequence, which starts with "\" - // (code 92), which we used before to obtain list of slices. - for _, slice := range raw_received_slices { - // We need only 6-bytes slices. All other aren't represent - // server's address. - if len(slice) != 6 { - continue - } - // Generate IP. - ip := strconv.Itoa(int(slice[0])) + "." + strconv.Itoa(int(slice[1])) + "." + strconv.Itoa(int(slice[2])) + "." + strconv.Itoa(int(slice[3])) - // Generate port from last two bytes. - // This is a very shitty thing. Don't do this in real world. - // Maybe bitshifting will help here, but I can't get it to work :( - // Get first byte as integer and multiply it on 256 and summing with - // second byte. - p1 := int(slice[4]) * 256 - port := strconv.Itoa(p1 + int(slice[5])) - addr := ip + ":" + port + // Every ip-port pair contains: + // 1. IP as first 4 bytes + // 2. Port as last 2 bytes. + // Every package is a 7-bytes sequence, which starts with "\" + // (code 92), which we used before to obtain list of slices. + for _, slice := range raw_received_slices { + // We need only 6-bytes slices. All other aren't represent + // server's address. + if len(slice) != 6 { + continue + } + // Generate IP. + ip := strconv.Itoa(int(slice[0])) + "." + strconv.Itoa(int(slice[1])) + "." + strconv.Itoa(int(slice[2])) + "." + strconv.Itoa(int(slice[3])) + // Generate port from last two bytes. + // This is a very shitty thing. Don't do this in real world. + // Maybe bitshifting will help here, but I can't get it to work :( + // Get first byte as integer and multiply it on 256 and summing with + // second byte. + p1 := int(slice[4]) * 256 + port := strconv.Itoa(p1 + int(slice[5])) + addr := ip + ":" + port - // Check if we already have this server added previously. If so - do nothing. - _, ok := Cache.Servers[addr] - if !ok { - // Create cached server. - Cache.CreateServer(addr) - Cache.ServersMutex.Lock() - Cache.Servers[addr].Server.Ip = ip - Cache.Servers[addr].Server.Port = port - Cache.ServersMutex.Unlock() - } - } + // Check if we already have this server added previously. If so - do nothing. + _, ok := Cache.Servers[addr] + if !ok { + // Create cached server. + Cache.CreateServer(addr) + Cache.ServersMutex.Lock() + Cache.Servers[addr].Server.Ip = ip + Cache.Servers[addr].Server.Port = port + Cache.ServersMutex.Unlock() + } + } - return nil + return nil } // Updates information about all available servers from master server and // parses it to usable format. func (r *Requester) UpdateAllServers(task bool) { - fmt.Println("Starting all servers updating procedure...") - err := r.getServers() - if err != nil { - return - } - r.Pooler.UpdateServers("all") + fmt.Println("Starting all servers updating procedure...") + err := r.getServers() + if err != nil { + return + } + r.Pooler.UpdateServers("all") - if task { - Eventer.LaunchEvent("taskDone", map[string]string{"task_name": "Server's autoupdating"}) - } + if task { + Eventer.LaunchEvent("taskDone", map[string]string{"task_name": "Server's autoupdating"}) + } } func (r *Requester) UpdateFavoriteServers() { - fmt.Println("Updating favorites servers...") - r.Pooler.UpdateServers("favorites") + fmt.Println("Updating favorites servers...") + r.Pooler.UpdateServers("favorites") } func (r *Requester) UpdateOneServer(server_address string) { - fmt.Println("Updating server " + server_address) - r.Pooler.UpdateOneServer(server_address) + fmt.Println("Updating server " + server_address) + r.Pooler.UpdateOneServer(server_address) } diff --git a/ui/gtk2/mainwindow_init_mac.go b/ui/gtk2/mainwindow_init_mac.go index 44bf0a1..79431a9 100644 --- a/ui/gtk2/mainwindow_init_mac.go +++ b/ui/gtk2/mainwindow_init_mac.go @@ -1,32 +1,32 @@ package ui import ( - // stdlib - "os" - "path/filepath" - "runtime" + // stdlib + "os" + "path/filepath" + "runtime" - // other - "github.com/mattn/go-gtk/gtk" + // other + "github.com/mattn/go-gtk/gtk" ) func (m *MainWindow) initializeMac() { - if runtime.GOOS == "darwin" { - dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) + if runtime.GOOS == "darwin" { + dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) - gtk.RCParse(dir + "/../Resources/themes/gtkrc-keybindings") + gtk.RCParse(dir + "/../Resources/themes/gtkrc-keybindings") - // ToDo: theming support and theme seletion in settings. - gtk.RCParse(dir + "/../Resources/themes/ClearlooksBrave/gtk-2.0/gtkrc") - } + // ToDo: theming support and theme seletion in settings. + gtk.RCParse(dir + "/../Resources/themes/ClearlooksBrave/gtk-2.0/gtkrc") + } } func (m *MainWindow) initializeMacAfter() { - m.toolbar.SetStyle(gtk.TOOLBAR_ICONS) + m.toolbar.SetStyle(gtk.TOOLBAR_ICONS) } func (m *MainWindow) initializeMacMenu() { - // This is a placeholder, in future we will use native mac menu. - // For now it launches default menu initialization. - m.InitializeMainMenu() + // This is a placeholder, in future we will use native mac menu. + // For now it launches default menu initialization. + m.InitializeMainMenu() } diff --git a/ui/gtk2/mainwindow_init_win.go b/ui/gtk2/mainwindow_init_win.go index db998d3..541fc1b 100644 --- a/ui/gtk2/mainwindow_init_win.go +++ b/ui/gtk2/mainwindow_init_win.go @@ -1,24 +1,24 @@ package ui import ( - // stdlib - "os" - "path/filepath" + // stdlib + "os" + "path/filepath" - // other - "github.com/mattn/go-gtk/gtk" - "github.com/couchbase/goutils/platform" + // other + "github.com/couchbase/goutils/platform" + "github.com/mattn/go-gtk/gtk" ) func (m *MainWindow) closeWin() { - platform.HideConsole(false) + platform.HideConsole(false) } func (m *MainWindow) initializeWin() { - platform.HideConsole(true) + platform.HideConsole(true) - dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) + dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) - // ToDo: theming support and theme seletion in settings. - gtk.RCParse(dir + "/themes/MS-Windows/gtk-2.0/gtkrc") + // ToDo: theming support and theme seletion in settings. + gtk.RCParse(dir + "/themes/MS-Windows/gtk-2.0/gtkrc") }