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";
-}
+}