summaryrefslogtreecommitdiffstats
path: root/scripts/irc_chess.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/irc_chess.pl')
-rw-r--r--scripts/irc_chess.pl212
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");