hamncheese/hamncheese/main.gd

219 lines
7.7 KiB
GDScript

extends Control
const SERVER_PORT = 10042
const FILE_ID_SETTINGS = 0
const FILE_ID_EXIT = 2
const HELP_ID_ABOUT = 0
const HELP_ID_MANUAL = 1
@onready var online_check_button = %OnlineCheckButton
@onready var my_ip_label = %MyIPLabel
@onready var peers_tree = %PeersTree
@onready var settings_window = %SettingsWindow
@onready var user_name_line_edit = %UserNameLineEdit
@onready var network_name_line_edit = %NetworkNameLineEdit
@onready var network_password_line_edit = %NetworkPasswordLineEdit
@onready var server_line_edit = %ServerLineEdit
@onready var server_port_spin_box = %ServerPortSpinBox
@onready var ip_line_edit = %IPLineEdit
@onready var ip_check_button = %IPCheckButton
@onready var mac_line_edit = %MACLineEdit
@onready var mac_check_button = %MACCheckButton
@onready var compression_check_button = %CompressionCheckButton
@onready var auto_start_check_button = %AutoStartCheckButton
@onready var about_window = %AboutWindow
@onready var manual_window = %ManualWindow
var net;
func _go_offline():
#***TODO*** This can take some time. Show a message.
Peers.stop_server()
net.stop_network()
Peers.clear()
peers_tree.clear()
func _go_online():
net.reset_configuration()
net.set_addresses("" if ip_check_button.button_pressed else ip_line_edit.text, "" if mac_check_button.button_pressed else mac_line_edit.text)
net.set_compression(compression_check_button.button_pressed)
net.set_network(user_name_line_edit.text, network_name_line_edit.text, network_password_line_edit.text)
net.set_supernode(server_line_edit.text, server_port_spin_box.value)
var result = net.start_network()
if result < 0:
# Something is wrong. Cancel starting network.
online_check_button.set_pressed_no_signal(false)
# Tell them what happened.
var message = "An unknown error occurred. Code: " + str(result)
match result:
-1:
message = "Invalid edge confguration."
-2:
message = "Failed to create interface. Are you running as "
if OS.get_name() == "Windows":
message = message + "Administrator?"
else:
message = message + "root?"
-3:
message = "Failed to initialize edge node."
Dialog.alert("Error Starting Network", message)
else:
# Successful connection.
var userInfo = {}
userInfo["user"] = user_name_line_edit.text
Peers.start_server(net.get_ip(), SERVER_PORT, userInfo)
func _notification(what):
# Window manager requested app close.
if what == NOTIFICATION_WM_CLOSE_REQUEST:
_show_exit_dialog()
func _on_about_window_close_requested():
about_window.visible = false
func _on_ip_check_button_toggled(button_pressed):
ip_line_edit.editable = !ip_check_button.button_pressed
func _on_file_id_pressed(id):
match id:
FILE_ID_SETTINGS:
settings_window.visible = true
settings_window.move_to_foreground()
FILE_ID_EXIT:
_show_exit_dialog()
func _on_help_id_pressed(id):
match id:
HELP_ID_ABOUT:
about_window.visible = true
about_window.move_to_foreground()
HELP_ID_MANUAL:
manual_window.visible = true
manual_window.move_to_foreground()
func _on_mac_check_button_toggled(button_pressed):
mac_line_edit.editable = !mac_check_button.button_pressed
func _on_manual_window_close_requested():
manual_window.visible = false
func _on_online_check_button_toggled(button_pressed):
# Go online or offline.
if button_pressed:
_go_online()
else:
_go_offline()
func _on_save_settings_button_pressed():
var config = ConfigFile.new()
config.set_value("settings", "userName", user_name_line_edit.text)
config.set_value("settings", "networkName", network_name_line_edit.text)
config.set_value("settings", "networkPassword", network_password_line_edit.text)
config.set_value("settings", "server", server_line_edit.text)
config.set_value("settings", "serverPort", server_port_spin_box.value)
config.set_value("settings", "ipAddress", ip_line_edit.text)
config.set_value("settings", "ipAutomatic", ip_check_button.button_pressed)
config.set_value("settings", "macAddress", mac_line_edit.text)
config.set_value("settings", "macAutomatic", mac_check_button.button_pressed)
config.set_value("settings", "compression", compression_check_button.button_pressed)
config.set_value("settings", "autoStart", auto_start_check_button.button_pressed)
#config.set_value("settings", "position", DisplayServer.window_get_position())
config.save("user://network.cfg")
settings_window.visible = false
func _on_settings_window_close_requested():
settings_window.visible = false
func _on_timer_timeout():
# Every so often update list of connected users.
if (online_check_button.button_pressed):
# Update our IP.
my_ip_label.text = net.get_ip()
# Update list of known peers.
var peers = net.get_peers()
if Peers.update(peers):
print(Peers.peerArray)
# Redraw peer tree.
peers_tree.clear()
var root = peers_tree.create_item()
for peer in Peers.peerArray:
var child = peers_tree.create_item(root)
child.set_text(0, peer["user"] + " (" + peer["ip"] + ")")
else:
# Clear network information.
my_ip_label.text = ""
func _ready():
# Get our network object.
net = N2NVPN.new()
# Do we have a configuration yet?
var config = ConfigFile.new()
var err = config.load("user://network.cfg")
if err != OK:
# Assign defaults.
user_name_line_edit.text = "Change Me!"
network_name_line_edit.text = "Change Me!"
network_password_line_edit.text = "Change Me!"
server_line_edit.text = "supernode.kangaroopunch.com"
server_port_spin_box.value = 7777
ip_line_edit.text = "10.0.0.10"
ip_check_button.button_pressed = true
ip_line_edit.editable = false
mac_line_edit.text = "DE:AD:BE:EF:00:01"
mac_check_button.button_pressed = true
mac_line_edit.editable = false
compression_check_button.button_pressed = true
auto_start_check_button.button_pressed = false
# Show settings dialog.
settings_window.visible = true
settings_window.move_to_foreground()
else:
# Load settings.
user_name_line_edit.text = config.get_value("settings", "userName")
network_name_line_edit.text = config.get_value("settings", "networkName")
network_password_line_edit.text = config.get_value("settings", "networkPassword")
server_line_edit.text = config.get_value("settings", "server")
server_port_spin_box.value = config.get_value("settings", "serverPort")
ip_line_edit.text = config.get_value("settings", "ipAddress")
ip_check_button.button_pressed = config.get_value("settings", "ipAutomatic")
ip_line_edit.editable = !ip_check_button.button_pressed
mac_line_edit.text = config.get_value("settings", "macAddress")
mac_check_button.button_pressed = config.get_value("settings", "macAutomatic")
mac_line_edit.editable = !mac_check_button.button_pressed
compression_check_button.button_pressed = config.get_value("settings", "compression")
auto_start_check_button.button_pressed = config.get_value("settings", "autoStart")
online_check_button.button_pressed = auto_start_check_button.button_pressed
func _show_exit_dialog():
var message = "Are you sure you wish to exit?"
if online_check_button.button_pressed:
message = message + "\n\nThis will disconnect you from the network!\n"
var result = await Dialog.confirm("Exit", message)
if result:
if online_check_button.button_pressed:
_go_offline()
Engine.get_main_loop().quit()