pztrn
a64c842e19
Fixed all messageboxes that can use struct object as self name (e.g. m for messageboxes in mainwindow). Should help to avoid some errors. Added possibility to copy server's credentials into clipboard for ease of sharing.
111 lines
3.4 KiB
Go
111 lines
3.4 KiB
Go
// URTator - Urban Terror server browser and game launcher, written in
|
|
// Go.
|
|
//
|
|
// Copyright (c) 2016, Stanslav N. a.k.a pztrn (or p0z1tr0n)
|
|
// All rights reserved.
|
|
//
|
|
// Licensed under Terms and Conditions of GNU General Public License
|
|
// version 3 or any higher.
|
|
// ToDo: put full text of license here.
|
|
package clipboardwatcher
|
|
|
|
import (
|
|
// stdlib
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
// other
|
|
"github.com/mattn/go-gtk/gdk"
|
|
"github.com/mattn/go-gtk/gtk"
|
|
)
|
|
|
|
type ClipboardWatcher struct {
|
|
// Clipboard.
|
|
clipboard *gtk.Clipboard
|
|
// PRIMARY clipboard.
|
|
prim_clipboard *gtk.Clipboard
|
|
|
|
// Flags.
|
|
// We have just copy connect string to clipboard.
|
|
// Used to ignore clipboard data in check*Input()
|
|
just_set bool
|
|
}
|
|
|
|
func (cw *ClipboardWatcher) checkInput() {
|
|
if !cw.just_set {
|
|
text := cw.clipboard.WaitForText()
|
|
cw.parseData(text)
|
|
}
|
|
}
|
|
|
|
func (cw *ClipboardWatcher) checkPrimaryInput() {
|
|
if !cw.just_set {
|
|
text := cw.prim_clipboard.WaitForText()
|
|
cw.parseData(text)
|
|
}
|
|
}
|
|
|
|
func (cw *ClipboardWatcher) CopyServerData(server_address string) error {
|
|
server, ok := Cache.Servers[server_address]
|
|
if !ok {
|
|
// ToDo: show message box?
|
|
return errors.New("Server wasn't selected")
|
|
}
|
|
|
|
// Composing connection string.
|
|
var connect_string string = ""
|
|
connect_string += "/connect " + server.Server.Ip + ":" + server.Server.Port
|
|
if len(server.Server.Password) >= 1 {
|
|
connect_string += ";password " + server.Server.Password
|
|
}
|
|
fmt.Println("Connect string: ", connect_string)
|
|
cw.just_set = true
|
|
cw.clipboard.SetText(connect_string)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (cw *ClipboardWatcher) Initialize() {
|
|
fmt.Println("Initializing clipboard watcher...")
|
|
|
|
cw.just_set = false
|
|
|
|
cw.clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_CLIPBOARD)
|
|
cw.clipboard.Connect("owner-change", cw.checkInput)
|
|
|
|
cw.prim_clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_PRIMARY)
|
|
cw.prim_clipboard.Connect("owner-change", cw.checkPrimaryInput)
|
|
}
|
|
|
|
func (cw *ClipboardWatcher) parseData(data string) {
|
|
// We should check only first string.
|
|
data = strings.Split(data, "\n")[0]
|
|
// Checking if we have connection string here.
|
|
if strings.Contains(data, "ct ") {
|
|
fmt.Println("Connection string detected!")
|
|
var server string = ""
|
|
var password string = ""
|
|
conn_string := strings.Split(data, ";")
|
|
if len(conn_string) > 0 {
|
|
srv_string := strings.Split(data, ";")[0]
|
|
srv_splitted := strings.Split(srv_string, "ct ")
|
|
if len(srv_splitted) > 1 {
|
|
server_raw := strings.Split(srv_splitted[1], " ")[0]
|
|
// Get rid of spaces.
|
|
server = strings.TrimSpace(server_raw)
|
|
}
|
|
}
|
|
if len(conn_string) > 1 && strings.Contains(data, "password") {
|
|
pw_string := strings.Split(data, ";")[1]
|
|
pw_splitted := strings.Split(pw_string, "password ")
|
|
if len(pw_splitted) > 1 {
|
|
password_raw := strings.Split(pw_splitted[1], " ")[0]
|
|
// Get rid of spaces.
|
|
password = strings.TrimSpace(password_raw)
|
|
}
|
|
}
|
|
Eventer.LaunchEvent("setQuickConnectDetails", map[string]string{"server": server, "password": password})
|
|
}
|
|
}
|