All pastes #349737 Raw Edit

Something

public text v1 · immutable
·published 2007-02-11 00:51 UTC
rendered paste body
 #!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper::Simple;
use File::Basename;
use Module::Load;
use POE;
use POE::Component::Client::TCP;
use POE::Filter::Stream;

use SM::Constants;

# Recursively load all Packet:: modules
# Get a list of modules that we need loaded
my $modules = load_modules("SM::Server::Packet");

# Start them
foreach my $module (@$modules) {
    load $module;
}

my $port = 9500;
my $host  = "localhost";                        # The host to test.

POE::Component::Client::TCP->new(
    RemoteAddress => $host,
    RemotePort    => $port,
    Filter        => "POE::Filter::Stream",

    # The client has connected.  Display some status and prepare to
    # gather information.  Start a timer that will send ENTER if the
    # server does not talk to us for a while.

    Connected => sub {
        print "connected to $host:$port ...\n";
        my $heap = $_[HEAP];
	$_[KERNEL]->delay("send", 1);
    },

    # The connection failed.

    ConnectError => sub {
        print "could not connect to $host:$port ...\n";
    },

    # The server has sent us something.  Save the information.  Stop
    # the ENTER timer, and begin (or refresh) an input timer.  The
    # input timer will go off if the server becomes idle.

    ServerInput => sub {
        my ( $kernel, $heap, $input ) = @_[ KERNEL, HEAP, ARG0 ];
        print "got input from $host:$port ...\n";
	my ($data_type, $sub_type) = unpack "nn", $input;

	#print Dumper($data_type, $sub_type);
	#print Dumper(AVATAR, AVATAR_LOCATION);

        if ( ( $data_type == AVATAR ) && ( $sub_type == AVATAR_INITIAL ) ) {
            my @packet = unpack "nnaa", $input;
            print Dumper(@packet);
        }
	else {
            my @packet = unpack "nnnaa", $input;
            print Dumper(@packet);
	}




    },

    # These are handlers for additional events not included in the
    # default Server::TCP module.  In this example, they handle
    # timers that have gone off.
    InlineStates =>
       {    # The server has not sent us anything yet.  Send an ENTER
            # keystroke (really a network newline, \x0D\x0A), and wait
            # some more.

            send_packet => sub {
                print "sending enter on $host:$port ...\n";
		my $out_packet =  pack "nnnaa", AVATAR, AVATAR_LOCATION, 3, 1, 1;
		$_[HEAP]->{server}->put($out_packet);
            },

       }
);


# Run the clients until the last one has shut down.
$poe_kernel->run();
exit 0;

# Dynamic module loader
sub load_modules {
    my @modules_to_load = @_;
    my @modules;
    my @module_paths;

    my @already_done;

    foreach my $module_name (@modules_to_load) {
        push @already_done, ($module_name);
        foreach my $inc_path (@INC) {

            my $path    = $module_name;
            my @counter = split /::/, $path;
            my $count   = scalar @counter;

            $path =~ s/::/\//g;

            my $full_path = $inc_path . "/" . $path . "/";
            if ( -e $full_path ) {
                foreach my $module ( glob "$full_path*.pm" ) {

                    # print $module_name;
                    #require $module;
                    my $full_module_name = $module_name . "::"
                        . ( fileparse( $module, ".pm" ) );
                    push @modules_to_load, ($full_module_name);
                }

            }

        }
    }
    push @modules, @already_done;
    return \@modules;
}