#!/usr/bin/perl -w

####################################
### Temporal Vortex Chat v. 0.2  ###
### Coded by: Matt (Flow) Martin ###
### Released under the GPL v. 2  ###
####################################


###################### INIT STUFF #############################################################

use strict;
use Fcntl qw(:flock);
my $user = $ARGV[0];
my $error = '';
my $brat = '';
my $date = '';
my $line = '';
system('clear');

###################### ERROR HANDLING #########################################################

sub Damn {
    $error = "@_";
    open(ERRLOG, ">>Data/Log/errlog");
    $date = `date`;
    print ERRLOG "$date $error\n";
    print "There has been an internal error. It has been logged and will be dealt with A.S.A.P.\n";
}

sub Oh_Shit {
    $error = "@_";
    open(CRITLOG, ">>Data/Log/critlog");
    $date = `date`;
    print CRITLOG "$date $error\n";
    print "There has been a critical error. Something is very, very broken. Have a nice day ^_^\n";
    Exit();
    die();
}

###################### MISC NEEDED ##########################################################

sub Exit {
    system("kill -TERM $brat");
    wait();
    die("\n");
}

###################### USER COMMANDS ##########################################################

sub Me {
    $_[0] =~ s/^\/me\s//i;
    flock(CFILE, LOCK_EX) || Damn("FLOCK_EX failed! : $!\n");
    print CFILE "\033[1;33m$user $_[0]\033[0m\n";
    flock(CFILE, LOCK_UN) || Damn("FLOCK_UN failed! : $!\n");
}

sub Quit {
    $_[0] =~ s/^\/quit\s//i;
    flock(CFILE, LOCK_EX) || Damn("FLOCK_EX failed! : $!\n");
    print CFILE "\033[36m'$user' QUIT: $_[0]\033[0m\n";
    flock(CFILE, LOCK_UN) || Damn("FLOCK_UN failed! : $!\n");
    Exit();
}

sub Help {
    print "\n\033[1;37mCommands:\033[0m\n /me <action> -- do something\n /quit <reason> -- leave\n";
    print " /who -- list who's online \n";
    print " /page -- Page the Sysop \n";
    print "\n\033[1;37mEmbed Colors:\033[0m\n";
    print "\033[0m ~r -- \033[1;31;40mRed\n";
    print "\033[0m ~g -- \033[1;32;40mGreen\n";
    print "\033[0m ~y -- \033[1;33;40mYellow\n";
    print "\033[0m ~b -- \033[1;34;40mLight Blue\n";
    print "\033[0m ~p -- \033[1;35;40mPurple\n";
    print "\033[0m ~c -- \033[1;36;40mCyan\n";
    print "\033[0m ~w -- \033[1;37;40mWhite\n\n\033[0m";

}

###################### DO WE HAVE A NAME? #######################################################

if(!$user) {
    Oh_Shit("No user name.\n");
}

###################### BREAK US APART (FORK) ####################################################

$brat = fork();

if($brat == -1) {
    Oh_Shit("fork() failed, and I cannot spoon()!");
}

###################### PARENT -- WRITES TO FILE #################################################

if($brat) {     ### I'm the parent
    open(CFILE, ">>chatfile.chat") || Oh_Shit("Cannot open chatfile for appending! : $!\n");
    print "\n\033[1;37mEntering the Temporal Vortex Chatroom...\033[0m\n\n";
    print "Type \033[1;37m/help\033[0m for help.\n\n";
    flock(CFILE, LOCK_EX) || Damn("FLOCK_EX failed! : $!\n");
    print CFILE "\033[36m'$user' has entered the chat room.\033[0m\n";
    flock(CFILE, LOCK_UN) || Damn("FLOCK_UN failed! : $!\n");

    while(<STDIN>) {     ### Any 'commands' go in here     
	chomp($line = $_);     ### This loop should actually wait for input now
	if($line =~ /^\/me\b/i) {
	    Me($line);
	}
	elsif($line =~ /^\/who\b/i) { system "./whosonline"; }

	elsif($line =~ /^\/page\b/i) { system "echo -e '$user is paging you to chat...' > /dev/console"; 	

	print "\n\033[1;32;40mPaging the Sysop... If he's around he'll answer in few...\033[0m\n\n"; }

	elsif($line =~ /^\/quit\b/i) {
	    Quit($line);
	}
	elsif($line =~ /^\/help\b/i) {
	    Help();
	}
	else {

	## ADD COLOR ## - By Jeff Ledger ##
	###################################
	$line =~ s/\~r/\e[1;31;40m/g;     # ~r = red
        $line =~ s/\~g/\e[1;32;40m/g;	  # ~g = green
        $line =~ s/\~y/\e[1;33;40m/g;	  # ~y = yellow
        $line =~ s/\~b/\e[1;34;40m/g;	  # ~b = light blue
        $line =~ s/\~p/\e[1;35;40m/g;	  # ~p = purple
	$line =~ s/\~c/\e[1;36;40m/g;	  # ~c = cyan
	$line =~ s/\~w/\e[1;37;40m/g;	  # ~w = white

	## UPDATE USERLIST -- ADD USER AGAIN ##
        #######################################

	system("touch /bbs/ramdrive/$user");
	########################################

	    flock(CFILE, LOCK_EX) || Damn("FLOCK_EX failed! : $!\n");     ### Probably wanna use LOCK_SH or LOCK_NB instead...
	    print CFILE "\033[0;34m\[\033[1;34m$user\033[0;34m\] \033[1;37m$line\033[0m\n";
	    flock(CFILE, LOCK_UN) || Damn("FLOCK_UN failed! : $!\n");
	}
    }

    Exit();
}

###################### CHILD -- READS FROM FILE ###############################################

else {     ### I'm the brat

    exec('tail -n 0 -f chatfile.chat');


}

#################################################################################################







