#!/usr/bin/perl

use strict;
#use warnings FATAL=>'all';
use XML::Simple;
use HTML::Entities;


#### CONFIG ########################

# path to the file to store servers
my $serverfile = "$ENV{'HOME'}/.config/openbox/scripts/et-servers.txt";



sub gtk2_connect {
	sub delete_event {
		Gtk2->main_quit;
		return 0;
	}

	sub connect {
		my $entry = $_[1];
		my $ip = $entry->get_text;
		my $et = `which et`;
		$et =~ s/\n//g;
		system("$et +connect $ip");
		delete_event;
	}

	sub add {
		$_[0]->set_sensitive(0);
		my $entry = $_[1];
		my $ip = $entry->get_text;
		open my $file, ">>$serverfile";
		print $file "$ip\n";
	}

	my $window = Gtk2::Window->new('toplevel');
	$window->set_title("ob3-et connect");
	$window->signal_connect(delete_event => \&delete_event);
	$window->set_border_width(3);

	my $box = Gtk2::HBox->new(0, 3);
	$window->add($box);

	my $entry = Gtk2::Entry->new;
	$box->pack_start($entry, 0, 0, 0);

	my $button = Gtk2::Button->new("connect");
	$button->signal_connect(clicked => \&connect, $entry);
	$box->pack_start($button, 0, 0, 0);

	my $add = Gtk2::Button->new("add");
	$add->signal_connect(clicked => \&add, $entry);
	$box->pack_start($add, 0, 0, 0);

	$entry->show;
	$button->show;
	$box->show;
	$add->show;

	$window->show;

	Gtk2->main;
	return 0;
}

if ($ARGV[0]) {
	use Gtk2 '-init';
	exit gtk2_connect;
}

sub playerinfo {
	my ($server) = @_;
	print "\t<menu id=\"players-$server->{'address'}\" label=\"players ($server->{'numplayers'}[0]/$server->{'maxplayers'}[0])\" >\n";
		if ($server->{'players'}[0]->{'player'}[0]) {
			for (my $x = 0; $x < $server->{'numplayers'}[0]; $x++) {
				encode_entities($server->{'players'}[0]->{'player'}[$x]{'name'}[0]);
				print "\t\t<item label=\"$server->{'players'}[0]->{'player'}[$x]{'name'}[0]\" />\n";
			}
		}
	print "\t</menu>\n";
}

sub printinfo {
	my ($server) = @_;
	my $game;
	$game = "et +connect $server->{'address'}" if $server->{'type'} eq "RWS";
	$game = "steam -applaunch 240 +connect $server->{'address'}" if $server->{'type'} eq "HL2S";
	encode_entities($server->{'name'}[0]);
	if ($server->{'status'} eq "UP" && $server->{'name'}[0] ne "?") {
		print "<menu id=\"$server->{'address'}\" label=\"$server->{'name'}[0]\">\n";
			print "\t<item label=\"ip: $server->{'address'}\" />\n";
			print "\t<item label=\"type: \L$server->{'type'}\" />\n";
			print "\t<item label=\"map: $server->{'map'}[0]\" />\n";
			print "\t<item label=\"ping: $server->{'ping'}[0]\" />\n";
		
			if ($server->{'numplayers'}[0] > 0) {
				playerinfo($server);
			}
			else {
				print "\t<item label=\"empty\" />\n";
			}
	
		print "\t<separator />\n";
		print "\t<item label=\"connect\">\n";
			print "\t\t<action name=\"execute\"><execute>$game +connect $server->{'address'}</execute></action>\n";
		print "\t</item>\n";
		print "</menu>\n\n";
	}
	elsif ($server->{'name'}[0] eq "?") {
		print "<item label=\"$server->{'address'} - NR\" />\n\n";
	}
	else {
		print "<item label=\"$server->{'address'} - $server->{'status'}\" />\n\n";
	}
}

sub readfile {
	open my $file, $_[0];

	my @lines;
	while (<$file>) {
		chomp;
		next if /^#/;
		push (@lines, $_);
	}
	
	my $output = "@lines";
	return $output;
}

if (-f $serverfile) {
	my $servers = readfile("$serverfile");
	my $qstat = "qstat -nocfg -sort l -nh -P -retry 3 -timeout 1 -maxsim 10 -xml $servers";
	my $output = `$qstat`;

	my $xml = new XML::Simple;
	my $data = $xml->XMLin($output, forcearray=>1);

	print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
	print "<openbox_pipe_menu>\n";

	for (my $x = 0; $x < scalar(@{$data->{'server'}}); $x++) {
		printinfo($data->{'server'}[$x]);
	}
	print "<separator />\n";
	print "<item label=\"new server\">\n\t<action name=\"execute\"><execute>$0 -connect</execute></action>\n</item>\n";

	print "</openbox_pipe_menu>\n";
}

else {
	print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
	print "<openbox_pipe_menu>\n";
		print "<item label=\"new server\">\n\t<action name=\"execute\"><execute>$0 -connect</execute></action>\n</item>\n";
	print "</openbox_pipe_menu>\n";
}
