diff options
Diffstat (limited to 'scripts/irc_chess.pl')
| -rw-r--r-- | scripts/irc_chess.pl | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/scripts/irc_chess.pl b/scripts/irc_chess.pl new file mode 100644 index 0000000..3c46e8a --- /dev/null +++ b/scripts/irc_chess.pl @@ -0,0 +1,212 @@ +# +#Irssi script to complement chess backend server +# +use Irssi; +use Irssi::Irc; +use IO::Socket; +use vars qw($VERSION %IRSSI); + +$VERSION="0.1"; +%IRSSI = +( + authors => "kodgehopper (kodgehopper\@netscape.net)", + contact => "kodgehopper\@netscape.net", + name => "IRC-Chess", + description => "Chess server for IRC. Allows for multiple 2-player games to be played simultaneously", + license => "GNU GPL", + url => "none as yet", +); + +sub processColors +{ + $_=$_[0]; + + #replace foreground/background colors + my @fgbg; + my $numFgBg=(@fgbg=/(<B\w+?><b\w+?>)/g); + + for (my $j=0; $j < $numFgBg; $j++) + { + my $t=$fgbg[$j]; + my ($background, $foreground)=($t=~/(<B\w+?>)(<b\w+?>)/); + my $orig=$background.$foreground; + + $foreground=~s/<bBLACK>/\\cc1/g; + $foreground=~s/<bWHITE>/\\cc0/g; + + $background=~s/<BBLUE>/,2/g; + $background=~s/<BYELLOW>/,7/g; + + my $result=$foreground.$background; + + s/$orig/$result/; + + } + + #replace background-only colors + s/<BBLUE>/\\cc0,2/g; + s/<BYELLOW>/\\cc0,7/g; + + #replace rest of colors + s/<NORMAL>/\\co/g; + + return $_; +}#processColors + +# +#message formats: +#1. simple format: +#[username]Message +# +#2. complex format: +#[user1]msg1<:=:>[user2]msg2<:=:>commonMessage +# +sub processMsgFromServer +{ + ($server, $msg, $nick)=@_; + $delimiter="<:=:>"; + $_=$msg; + + #determine the type of message from the number of delimiters + $numDelims=(@list=/$delimiter/g); + + if ($numDelims==0) + { + #simple message + my ($username, $message)=/^\s*\[(.+?)\](.*?)$/; + + $message=processColors($message); + + #send message to player + $server->command("eval msg $nick $message"); + } + else + { + #complex message + my ($user1, $msg1, $user2, $msg2, $commonMessage)=/^\s*\[(.+?)\](.*?)$delimiter\[(.+?)\](.*?)$delimiter(.*)$/s; + + #split message into seperate lines + my @commonMessageList=split(/\n/, $commonMessage); + + #send common message to both users + Irssi::print("Sending common message to both users"); + my $numStrings; + my @list; + + #print out blank lines since the string was split on newlines so + #now they're lost. an extra space == blank line + $server->command("eval msg $user1 \\co"); + $server->command("eval msg $user2 \\co"); + + my $commonListSize=@commonMessageList; + for (my $j=0; $j<$commonListSize; $j++) + { + $commonMessageList[$j]=processColors($commonMessageList[$j]); + + $server->command("eval msg $user1 $commonMessageList[$j]"); + $server->command("eval msg $user2 $commonMessageList[$j]"); + } + $server->command("eval msg $user1 \\co"); + $server->command("eval msg $user2 \\co"); + + #send messages for each user + my @msg1List=split(/\n/, $msg1); + my $msg1ListSize=@msg1List; + + for ($j=0; $j<$msg1ListSize; $j++) + { + $server->command("eval msg $user1 \\cb$msg1List[$j]\\co"); + } + + my @msg2List=split(/\n/, $msg2); + my $msg2ListSize=@msg2List; + + for ($j=0; $j<$msg2ListSize; $j++) + { + $server->command("eval msg $user2 \\cb$msg2List[$j]\\co"); + } + } #else +}#processOutput + +# +#process a message received from the user. +#this will be something like "game start k" +#this will have to be changed to something like +#"game start k k1", where k1 is the user. +#if the format of the message is not correct, +#return INVALID. format checking is minimal. +#basically, if the first word is "game", then +#slap on the nickname and send it to the server. +# + +sub processMsgFromClient +{ + ($server, $msg, $nick)=@_; + + #Irssi::print("msg from client:\n$msg\n"); + $msg=lc($msg); + + if ($msg=~/^game\b/) + { + $msg = $msg." $nick"; + return $msg; + } + else + { + Irssi::print("sending: msg $nick Error: Invalid Message"); + $server->command("msg $nick Error: Invalid Message"); + return "INVALID"; + } +}#processMsgFromClient + +# +#private messages received from other users eg. if they want to +#register a new game +sub sig_processPvt +{ + my($server, $msg, $nick, $address)=@_; + + $msgToSend=processMsgFromClient($server, $msg, $nick); + + if ($msgToSend !~ /^INVALID$/) + { + Irssi::print("Sending message now"); + send(SOCKET,$msgToSend,0); + Irssi::print("Waiting for message from server\n"); + recv(SOCKET,$buffer,32678,0); #read a max of 32k. + processMsgFromServer($server, $buffer, $nick); + } +}#sig_processPvt + +# +#function to terminate game. it basically just closes +#the connection to the server +# +sub cmd_endGame +{ + shutdown(SOCKET,2); + close(SOCKET); + Irssi::print("Game ended. Socket shut down"); + $gameRunning=0; +}#cmd_endGame + +BEGIN +{ + $PORT=1234; + + Irssi::print("connecting to server\n"); + $tcpProtocolNumber = getprotobyname('tcp') || 6; + + socket(SOCKET, PF_INET(), SOCK_STREAM(), $tcpProtocolNumber) + or die("socket: $!"); + + $internetPackedAddress = pack('S na4 x8', AF_INET(), $PORT, 127.0.0.1); + connect(SOCKET, $internetPackedAddress) or die("connect: $!"); + + Irssi::print("Game is now running"); + $gameRunning=1; +} + + +Irssi::signal_add("message private","sig_processPvt"); +Irssi::command_bind("end_game", "cmd_endGame"); |
