#!/usr/bin/perl
use IO::Socket;
use strict;

my $username = '';
use sigtrap 'handler' => \&disconnect, 'INT', 'ABRT', 'QUIT', 'TERM';

sub disconnect {
	request("disconnect\n".$username."\n") if ($username ne '');
	print("\n");
	exit;
}

sub request {
	#send request to server
	my $text = $_[0];
	my $sock = new IO::Socket::INET (
		PeerAddr => 'waffl.in',
		PeerPort => '7000',
		Proto => 'tcp',
	);
	die "Could not connect: $!\n" unless $sock;
	print $sock $text;
	print $sock "end\n";
	#get server response
	my $response;
	while (<$sock>) {
		if ($_ ne "end\n") {
			$response = $response.$_;
		} else {
			last;
		}
	}
	close($sock);
	chomp($response);
	return $response;
}

#check if user has requested view mode
if ($ARGV[0] eq "--view") {
	print "You are now viewing the chatroom, ^C to end.\n------------------------------------------------------\n";
	my $curmessage = request("curmessage\n");
	while (1) {
		my $messages = request("messages\n".$curmessage."\n");
		my @messages = split("\n",$messages);
		foreach (@messages) {
			print $_;
			print "\n";
			$curmessage++;
		}
		sleep 2;
	}
	exit;
}
#ask user for their name, and check with the sever to make sure it isn't taken
my $request = 0;
while ($request != 1) {
	print "User name: ";
	$username = <>;
	chomp($username);
	$request = request("requestuser\n".$username."\n");
	unless ($request) {
		print "Sorry, that name is taken. \n";
	}
}
undef $request;

#get list of online users from the server
print "\nUsers currently online: \n";
print request("onlineusers\n"),"\n\n";

print "You are now talking in the chatroom, type 'exit' to end.\n------------------------------------------------------\n";
#give user opportunity to talk
while ($request != 1) {
	print "Say: ";
	my $message = <>;
	chomp($message);
	unless ($message eq 'exit') {
		request("message\n".$username.": ".$message."\n");
	} else {
		request("disconnect\n".$username."\n");
		last;
	}
}

