Author: muffin
Date: 2005-01-06 18:53:34 -0500 (Thu, 06 Jan 2005)
New Revision: 528

Modified:
   trunk/clients/havirc/havirc.pl
Log:
More stuff added to HavIRC.  We create a Haver session for the client and send 
HAVER now.  More to come.


Modified: trunk/clients/havirc/havirc.pl
===================================================================
--- trunk/clients/havirc/havirc.pl      2005-01-06 04:36:53 UTC (rev 527)
+++ trunk/clients/havirc/havirc.pl      2005-01-06 23:53:34 UTC (rev 528)
@@ -35,10 +35,11 @@
 use Haver::Config;
 use Haver::Protocol::Filter;
 
+use Data::Dumper;
+
 ## Global vars
-my $user = {};
+my %User;
 
-
 ## Initialize config file
 
 my $config_obj = Haver::Config->new(
@@ -52,44 +53,137 @@
 );
 
 my $config = $config_obj->config;
+
+#Shorten the server name to a variable for convenience.
+my $sname = $config->{ServerName};
+
 msg("start", "Config file loaded successfully.");
 
 ## TCP server initialization
 
-POE::Component::Server::TCP->new (
-       Alias        => "havirc",
-       Port         => $config->{Port},
+POE::Component::Server::TCP->new(
+       Port => $config->{Port},
        InlineStates => {
-            send => \&handle_send,
-        },
-        ClientConnected       => \&server_connect,
-        ClientError           => \&server_error,
-        ClientDisconnected    => \&server_disconnect,
-        ClientInput           => \&server_input,
-    );
-msg("start", "Server initialized on port $config->{Port}.");
+               send_client => sub {
+                       my ( $heap, $message ) = @_[ HEAP, ARG0 ];
+                       $heap->{client}->put($message);
+               },
+               _child => sub {
+                       my ( $heap, $child_op, $child ) = @_[ HEAP, ARG0, ARG1 
];
+                       if ( $child_op eq "create" ) {
+                               $heap->{client_id} = $child->ID;
+                       }
+               },
+       },
+       ClientConnected         => \&client_connect,
+       ClientError             => \&client_error,
+       ClientDisconnected      => \&client_disconnect,
+       ClientInput             => \&client_input,
+);
 
+msg("start", "Server started on port $config->{Port}.");
+
 ##Start
 $poe_kernel->run();
 exit 0;
 
-####### HANDLERS #######
+####### SERVERSIDE HANDLERS #######
 
 ## Server handlers
 
-sub server_connect { }
+sub client_connect {
+       my ($heap, $session) = @_[HEAP, SESSION];
+       my ($session_id, $r_ip, $r_port) = ($session->ID, $heap->{remote_ip}, 
$heap->{remote_port});
+       msg("client", "Incoming connection from $r_ip\:$r_port.");
 
-sub server_error { }
+       #Set some info about the user.
+       $User{$session_id}{loggedin} = 0;
+       $User{$session_id}{ip} = $r_ip;
+       create_haver_client();
+}
 
-sub server_disconnect { }
+sub client_error {
+       my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
+       my $session_id = $session->ID;
+       msg("client", "Socket error to client $User{$session_id}{ip}.");
+       
+       $kernel->post($heap->{client_id} => "shutdown");
+       delete $User{$session_id};
+       $kernel->post($session_id, "shutdown");
+}
 
-sub server_input { }
+sub client_disconnect {
+       my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
+       my $session_id = $session->ID;
+       msg("client", "Session $session_id closed.");
+       
+       if (defined $User{$session_id}) {
+               $kernel->post($heap->{client_id} => "shutdown");
+               delete $User{$session_id};
+       }
+}
 
+sub client_input { 
+       my ($kernel, $heap, $session, $input) = @_[KERNEL, HEAP, SESSION, ARG0];
+       my $session_id = $session->ID;
+       $input = split(/\s+/, $input);
+}
 
+####### HAVER CLIENT INIT & HANDLERS #######
+
+## Haver client creation
+
+sub create_haver_client() {
+       POE::Component::Client::TCP->new(
+               RemoteAddress   => $config->{RemoteServer},
+               RemotePort      => $config->{RemotePort},
+               Filter          => "Haver::Protocol::Filter",
+
+               Started => sub {
+                       $_[HEAP]->{server_id} = $_[SENDER]->ID;
+                       $poe_kernel->post( $_[HEAP]->{server_id} => send_client 
=> ":$sname NOTICE AUTH :Welcome to the HavIRC gateway.");
+                       $poe_kernel->post( $_[HEAP]->{server_id} => send_client 
=> ":$sname NOTICE AUTH :Connecting to server...")
+               },
+
+               Connected       => \&haver_connected,
+               ConnectError    => \&haver_cfail,
+               ServerInput     => \&haver_input, 
+               Disconnected    => \&haver_discon,
+       );
+}
+
+sub haver_connected {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+       $kernel->post($heap->{server_id} => send_client => ":$sname NOTICE AUTH 
Connected.  Logging in...");
+       $heap->{server}->put(['HAVER', 'HavIRC/0.01']);
+}
+
+sub haver_cfail {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+       $kernel->post( $heap->{server_id} => send_client => ":$sname NOTICE 
ERROR :The connection to the Haver server has failed.  Please try again later." 
);
+       $kernel->post( $heap->{server_id} => send_client => "ERROR :Haver 
connection failed." );
+       $kernel->post( $heap->{server_id} => "shutdown" );
+}
+
+sub haver_input {
+       my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];
+       print Dumper \$input;
+}
+
+sub haver_discon {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+       $kernel->post( $heap->{server_id} => send_client => ":$sname NOTICE 
ERROR :The connection to the Haver server has been closed." );
+       $kernel->post( $heap->{server_id} => send_client => "ERROR :Haver 
connection lost." );
+       $kernel->post( $heap->{server_id} => "shutdown" );
+}
+
+
+
+
 ####### MISC #######
 
 ## Utils
 sub msg {
        my ($type, $message) = @_;
        warn "[$type\t] $message\n";
-}
+}        


Reply via email to