Author: muffin
Date: 2005-11-18 20:28:45 -0500 (Fri, 18 Nov 2005)
New Revision: 929

Added:
   trunk/perl/client/bin/haver_passcode.pl
Removed:
   trunk/perl/client/bin/passcode.pl
Modified:
   trunk/perl/client/lib/Haver/Client.pm
   trunk/perl/server/lib/Haver/Server/Talker.pm
Log:
Add AUTH support to Haver::Client, tidy it up, add AUTH stuff to POD.  Fix 
small typo in Haver::Server::Talker that I noticed.  Rename passcode.pl to 
haver_passcode.pl. 


Copied: trunk/perl/client/bin/haver_passcode.pl (from rev 928, 
trunk/perl/client/bin/passcode.pl)

Deleted: trunk/perl/client/bin/passcode.pl
===================================================================
--- trunk/perl/client/bin/passcode.pl   2005-11-18 23:45:10 UTC (rev 928)
+++ trunk/perl/client/bin/passcode.pl   2005-11-19 01:28:45 UTC (rev 929)
@@ -1,35 +0,0 @@
-# vim: set ft=perl ts=4 sw=4:
-# passcode.pl - generate a passcode for use in any Haver client according
-# to Haver::Spec::Auth.
-#
-# Copyright (C) 2005 Eric Goodwin.
-#
-# This module is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This module is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this module; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-use strict;
-
-use Digest::SHA1 qw( sha1_base64 );
-
-if (!defined $ARGV[2]) {
-       print "Usage: $0 <user> <host> <password>\n";
-       exit 0;
-}
-
-print "Passcode for $ARGV[0] on $ARGV[1] with password $ARGV[2] - ";
-print sha1_base64($ARGV[2] . lc("$ARGV[1]$ARGV[2]"))."\n";
-       
-
-
-

Modified: trunk/perl/client/lib/Haver/Client.pm
===================================================================
--- trunk/perl/client/lib/Haver/Client.pm       2005-11-18 23:45:10 UTC (rev 
928)
+++ trunk/perl/client/lib/Haver/Client.pm       2005-11-19 01:28:45 UTC (rev 
929)
@@ -1,7 +1,7 @@
 # vim: set ft=perl ts=4 sw=4:
 # Haver::Client - A POE::Component for haver clients.
 # 
-# Copyright (C) 2004, 2005 Bryan Donlan, Dylan Hardison.
+# Copyright (C) 2004, 2005 Bryan Donlan, Dylan Hardison, Eric Goodwin.
 # 
 # This module is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
 #   version => client version
 #   name => user name,
 #   reg  => {
-#     event name => { session ID => 1 }
+#       event name => { session ID => 1 }
 #   },
 #   wheel => active wheel,
 #   state => see below constants,
@@ -39,20 +39,22 @@
 use POE::Wheel::ReadWrite;
 use POE::Wheel::SocketFactory;
 use Haver::Protocol::Filter;
+use Digest::MD5 qw( md5_base64 );
+use Digest::SHA1 qw( sha1_base64 );
 
 use constant {
-    S_IDLE   => 0, # not connected, not connecting
-    S_CONN   => 1, # establishing socket connection
-    S_INIT   => 2, # C: HAVER sent
-    S_LOGIN  => 3, # S: HAVER recieved, C: IDENT sent
-    S_ONLINE => 4, # S: HELLO received
-    S_DYING  => 5, # C: BYE sent, socket still open
+       S_IDLE   => 0, # not connected, not connecting
+       S_CONN   => 1, # establishing socket connection
+       S_INIT   => 2, # C: HAVER sent
+       S_LOGIN  => 3, # S: HAVER recieved, C: IDENT sent
+       S_ONLINE => 4, # S: HELLO received
+       S_DYING  => 5, # C: BYE sent, socket still open
 };
 
 our $VERSION = 0.09;
 
 sub dispatch {
-    call('dispatch', @_);
+       call('dispatch', @_);
 }
 
 ### SETUP
@@ -91,21 +93,21 @@
                        IN FROM
                        PING BYE
                        FAIL
-                       AUTH:TYPES AUTH:BASIC
+                       AUTH_TYPES AUTH_BASIC
                ))
        };
 }
 
 sub on__start {
-    my ($kernel, $heap, $opt) = @_[KERNEL, HEAP, ARG0];
-    croak "No alias" unless $opt->{alias};
-    $heap->{reg}      = {};
-    $heap->{state}    = S_IDLE;
-    $heap->{alias}    = $opt->{alias};
-    $heap->{resolver} = $opt->{resolver};
-    $heap->{version}  = $opt->{version} || "Haver::Client/$VERSION";
-    
-    $kernel->alias_set($opt->{alias});
+       my ($kernel, $heap, $opt) = @_[KERNEL, HEAP, ARG0];
+       croak "No alias" unless $opt->{alias};
+       $heap->{reg}      = {};
+       $heap->{state}  = S_IDLE;
+       $heap->{alias}  = $opt->{alias};
+       $heap->{resolver} = $opt->{resolver};
+       $heap->{version}  = $opt->{version} || "Haver::Client/$VERSION";
+       
+       $kernel->alias_set($opt->{alias});
 }
 
 sub on__default {
@@ -119,262 +121,264 @@
 ### SESSION MANAGEMENT
 
 sub on_connect {
-    my ($kernel, $heap, %opts) = @_[KERNEL,HEAP,ARG0..$#_];
-    $opts{port} ||= 7575;
-    
-    # TODO: handle arg errors
-    if ($heap->{state} == S_DYING) {
-        $heap->{pending} = \%opts;
-        return;
-    } elsif ($heap->{state} != S_IDLE) {
-        call('disconnect');
-        $heap->{pending} = \%opts;
-    } else {
-        $heap->{state} = S_CONN;
-        $heap->{name}  = $opts{name};
-        $heap->{port}  = $opts{port};
-        if (!$heap->{resolver}) {
-            call('do_connect', $opts{host});
-        } else {
-            my $resp = $heap->{resolver}->resolve(
-                host  => $opts{host},
-                context => {},
-                event => 'dns_response',
-            );
-            if ($resp) {
-                call('dns_response', $resp);
-            }
-        }
-    }
+       my ($kernel, $heap, %opts) = @_[KERNEL,HEAP,ARG0..$#_];
+       $opts{port} ||= 7575;
+       
+       # TODO: handle arg errors
+       if ($heap->{state} == S_DYING) {
+               $heap->{pending} = \%opts;
+               return;
+       } elsif ($heap->{state} != S_IDLE) {
+               call('disconnect');
+               $heap->{pending} = \%opts;
+       } else {
+               $heap->{state} = S_CONN;
+               $heap->{name}  = $opts{name};
+               $heap->{host} = $opts{host};
+               $heap->{port}  = $opts{port};
+               $heap->{password} = $opts{password} || "";
+               if (!$heap->{resolver}) {
+                       call('do_connect', $opts{host});
+               } else {
+                       my $resp = $heap->{resolver}->resolve(
+                               host  => $opts{host},
+                               context => {},
+                               event => 'dns_response',
+                       );
+                       if ($resp) {
+                               call('dns_response', $resp);
+                       }
+               }
+       }
 }
 
 sub on_do_connect {
-    my ($heap, $addr) = @_[HEAP,ARG0];
-    my $port = delete $heap->{port};
-    if ($heap->{state} == S_DYING) {
-        call('cleanup');
-        return;
-    }
-    $heap->{wheel} = POE::Wheel::SocketFactory->new(
-        RemoteAddress => $addr,
-        RemotePort    => $port,
-        SuccessEvent  => 'connect_ok',
-        FailureEvent  => 'connect_fail',
-    );
+       my ($heap, $addr) = @_[HEAP,ARG0];
+       my $port = delete $heap->{port};
+       if ($heap->{state} == S_DYING) {
+               call('cleanup');
+               return;
+       }
+       $heap->{wheel} = POE::Wheel::SocketFactory->new(
+               RemoteAddress => $addr,
+               RemotePort      => $port,
+               SuccessEvent  => 'connect_ok',
+               FailureEvent  => 'connect_fail',
+       );
 }
 
 BEGIN {
-    eval {
-        require List::Util;
-        List::Util->import(qw(shuffle));
-    };
-    eval {
-        shuffle();
-    };
-    if ($@) {
-        *shuffle = sub { return @_; }
-    }
+       eval {
+               require List::Util;
+               List::Util->import(qw(shuffle));
+       };
+       eval {
+               shuffle();
+       };
+       if ($@) {
+               *shuffle = sub { return @_; }
+       }
 }
 
 sub on_dns_response {
-    my ($heap, $packet) = @_[HEAP,ARG0];
-    if ($packet->{response}) {
-        my $resp = $packet->{response};
-        my @answer = shuffle($resp->answer);
-        foreach my $record (@answer) {
-            if ($record->type eq 'A') {
-                # XXX: ipv6 support
-                $poe_kernel->yield('do_connect', $record->address);
-                return;
-            }
-        }
-        # dns fail
-        dispatch('connect_fail', 'dns');
-        call('cleanup');
-    } else {
-        dispatch('connect_fail', 'dns', $packet->{error});
-    }
+       my ($heap, $packet) = @_[HEAP,ARG0];
+       if ($packet->{response}) {
+               my $resp = $packet->{response};
+               my @answer = shuffle($resp->answer);
+               foreach my $record (@answer) {
+                       if ($record->type eq 'A') {
+                               # XXX: ipv6 support
+                               $poe_kernel->yield('do_connect', 
$record->address);
+                               return;
+                       }
+               }
+               # dns fail
+               dispatch('connect_fail', 'dns');
+               call('cleanup');
+       } else {
+               dispatch('connect_fail', 'dns', $packet->{error});
+       }
 }
 
 sub on_connect_fail {
-    my $heap = $_[HEAP];
-    dispatch('connect_fail', @_[ARG0..ARG2]);
-    call('cleanup');
+       my $heap = $_[HEAP];
+       dispatch('connect_fail', @_[ARG0..ARG2]);
+       call('cleanup');
 }
 
 sub on_connect_ok {
-    my ($kernel, $heap, $sock) = @_[KERNEL,HEAP,ARG0];
-    if ($heap->{state} == S_DYING) {
-        call('cleanup');
-        return;
-    }
-    dispatch('connected');
-    $heap->{state} = S_INIT;
-    $heap->{wheel} = new POE::Wheel::ReadWrite(
-        Handle => $sock,
-        Filter => new Haver::Protocol::Filter,
-        InputEvent => 'input',
-        ErrorEvent => 'error',
-    );
-    $heap->{wheel}->put( ['HAVER', $heap->{version}] );
-    # XXX: timeout
+       my ($kernel, $heap, $sock) = @_[KERNEL,HEAP,ARG0];
+       if ($heap->{state} == S_DYING) {
+               call('cleanup');
+               return;
+       }
+       dispatch('connected');
+       $heap->{state} = S_INIT;
+       $heap->{wheel} = new POE::Wheel::ReadWrite(
+               Handle => $sock,
+               Filter => new Haver::Protocol::Filter,
+               InputEvent => 'input',
+               ErrorEvent => 'error',
+       );
+       $heap->{wheel}->put( ['HAVER', $heap->{version}, 'auth'] );
+       # XXX: timeout
 }
 
 sub on_input {
-    my ($kernel, $heap, $arg) = @_[KERNEL,HEAP,ARG0];
-    return if (ref $arg ne 'ARRAY' || @$arg == 0);
-    
-    if (DEBUG) {
-           print STDERR "S: ", join "\t", @$arg;
-           print STDERR "\n";
+       my ($kernel, $heap, $arg) = @_[KERNEL,HEAP,ARG0];
+       return if (ref $arg ne 'ARRAY' || @$arg == 0);
+       
+       if (DEBUG) {
+               print STDERR "S: ", join "\t", @$arg;
+               print STDERR "\n";
        }
 
-    dispatch('raw_in', @$arg);
-    my $cmd = $arg->[0];
-    $cmd =~ tr/:/_/;
-    $kernel->yield("msg_$cmd", @$arg);
+       dispatch('raw_in', @$arg);
+       my $cmd = $arg->[0];
+       $cmd =~ tr/:/_/;
+       $kernel->yield("msg_$cmd", @$arg);
 }
 
 sub on_error {
-    dispatch('disconnected', @_[ARG0..ARG2]);
-    call('cleanup');
+       dispatch('disconnected', @_[ARG0..ARG2]);
+       call('cleanup');
 }
 
 
 sub on_disconnect {
-    my $heap = $_[HEAP];
-    call('send_raw', 'BYE');
-    $heap->{state} = S_DYING;
-    $poe_kernel->delay('force_down', 5);
+       my $heap = $_[HEAP];
+       call('send_raw', 'BYE');
+       $heap->{state} = S_DYING;
+       $poe_kernel->delay('force_down', 5);
 }
 
 sub on_force_down {
-    my $heap = $_[HEAP];
-    $heap->{state} = S_IDLE;
-    call('cleanup');
+       my $heap = $_[HEAP];
+       $heap->{state} = S_IDLE;
+       call('cleanup');
 }
 
 sub on_cleanup {
-    my $heap = $_[HEAP];
-    $poe_kernel->delay('force_down');
-    if ($heap->{pending}) {
-        my @opts = %{delete $heap->{pending}};
-        $poe_kernel->yield('connect', @opts);
-    }
-    delete $heap->{wheel};
-    delete $heap->{name};
-    $heap->{state} = S_IDLE;
+       my $heap = $_[HEAP];
+       $poe_kernel->delay('force_down');
+       if ($heap->{pending}) {
+               my @opts = %{delete $heap->{pending}};
+               $poe_kernel->yield('connect', @opts);
+       }
+       delete $heap->{wheel};
+       delete $heap->{name};
+       $heap->{state} = S_IDLE;
 }
 
 sub on_send_raw {
-    my ($heap, @args) = @_[HEAP,ARG0..$#_];
-    if ($heap->{state} == S_IDLE || $heap->{state} == S_CONN ||
-        $heap->{state} == S_DYING) {
-        return;
-    }
-    if (DEBUG) {
-           print STDERR "C: ", join("\t", @args), "\n";
+       my ($heap, @args) = @_[HEAP,ARG0..$#_];
+       if ($heap->{state} == S_IDLE || $heap->{state} == S_CONN ||
+               $heap->{state} == S_DYING) {
+               return;
        }
-    $heap->{wheel}->put([EMAIL PROTECTED]);
+       if (DEBUG) {
+               print STDERR "C: ", join("\t", @args), "\n";
+       }
+       $heap->{wheel}->put([EMAIL PROTECTED]);
 }
 
 sub on_send {
-    my ($kernel, @args) = @_[KERNEL,ARG0..$#_];
-    call('send_raw', @args);
+       my ($kernel, @args) = @_[KERNEL,ARG0..$#_];
+       call('send_raw', @args);
 }
 
 sub on_join {
-    my $channel = $_[ARG0];
-    call('send', 'JOIN', $channel);
+       my $channel = $_[ARG0];
+       call('send', 'JOIN', $channel);
 }
 
 sub on_part {
-    my $channel = $_[ARG0];
-    call('send', 'PART', $channel);
+       my $channel = $_[ARG0];
+       call('send', 'PART', $channel);
 }
 
 sub on_public {
-    my ($kernel, $heap, $c, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
-    call('send', 'IN', $c, $t, @a);
+       my ($kernel, $heap, $c, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
+       call('send', 'IN', $c, $t, @a);
 }
 
 sub on_private {
-    my ($kernel, $heap, $d, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
-    call('send', 'TO', $d, $t, @a);
+       my ($kernel, $heap, $d, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
+       call('send', 'TO', $d, $t, @a);
 }
 
 sub on_list {
-    my ($chan, $type) = @_[ARG0, ARG1];
-    $type = defined $type ? $type : 'user';
-    call('send', 'LIST', $chan, $type);
+       my ($chan, $type) = @_[ARG0, ARG1];
+       $type = defined $type ? $type : 'user';
+       call('send', 'LIST', $chan, $type);
 }
 
 sub on_destroy {
        my ($kernel, $heap) = @_[KERNEL,HEAP];
-    dispatch('destroyed');
-    delete $heap->{pending};
-    my $reg = $heap->{reg};
-    foreach my $ehash (values %$reg) {
-        foreach my $id (keys %$ehash) {
-            $poe_kernel->refcount_decrement($id, $ehash->{$id});
-        }
-    }
-    $heap->{reg} = {};
-    call('disconnect');
-    $kernel->alias_remove($heap->{alias});
+       dispatch('destroyed');
+       delete $heap->{pending};
+       my $reg = $heap->{reg};
+       foreach my $ehash (values %$reg) {
+               foreach my $id (keys %$ehash) {
+                       $poe_kernel->refcount_decrement($id, $ehash->{$id});
+               }
+       }
+       $heap->{reg} = {};
+       call('disconnect');
+       $kernel->alias_remove($heap->{alias});
 }
 
 ## server-response stuff
 
 sub msg_HAVER {
-    my ($kernel, $heap) = @_[KERNEL,HEAP];
-    return if ($heap->{state} != S_INIT); # should never happen, unless the
-                                          # server is non-compliant
-    $kernel->yield('send_raw', 'IDENT', $heap->{name});
-    $heap->{state} = S_LOGIN;
+       my ($kernel, $heap) = @_[KERNEL,HEAP];
+       return if ($heap->{state} != S_INIT); # should never happen, unless the
+                                                                               
  # server is non-compliant
+       $kernel->yield('send_raw', 'IDENT', $heap->{name});
+       $heap->{state} = S_LOGIN;
 }
 
 sub msg_HELLO {
-    my $heap = $_[HEAP];
-    $heap->{state} = S_ONLINE;
-    dispatch('ready');
+       my $heap = $_[HEAP];
+       $heap->{state} = S_ONLINE;
+       dispatch('ready');
 }
 
 sub msg_JOIN {
-    my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
-    if ($name eq $heap->{name}) {
-        dispatch('ijoined', $chan);
-    } else {
-        dispatch('join', $chan, $name);
-    }
+       my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
+       if ($name eq $heap->{name}) {
+               dispatch('ijoined', $chan);
+       } else {
+               dispatch('join', $chan, $name);
+       }
 }
 
 sub msg_PART {
-    my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
-    if ($name eq $heap->{name}) {
-        dispatch('iparted', $chan);
-    } else {
-        dispatch('part', $chan, $name);
-    }
+       my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
+       if ($name eq $heap->{name}) {
+               dispatch('iparted', $chan);
+       } else {
+               dispatch('part', $chan, $name);
+       }
 }
 
 sub msg_LIST {
-    my ($heap, $chan, $ns, @things) = @_[HEAP,ARG1..$#_];
-    return unless defined $ns;
-    dispatch('list', $chan, $ns, @things);
+       my ($heap, $chan, $ns, @things) = @_[HEAP,ARG1..$#_];
+       return unless defined $ns;
+       dispatch('list', $chan, $ns, @things);
 }
 
 sub msg_IN {
-    dispatch('public', @_[ARG1..$#_]);
+       dispatch('public', @_[ARG1..$#_]);
 }
 
 sub msg_FROM {
-    dispatch('private', @_[ARG1..$#_]);
+       dispatch('private', @_[ARG1..$#_]);
 }
 
 sub msg_AUTH_TYPES {
        my ($kernel, $heap, @types) = @_[KERNEL, HEAP, ARG0 .. $#_];
-       
+
        if (grep(/^AUTH:BASIC$/, @types)) {
                call('send_raw', qw( AUTH:TYPE AUTH:BASIC ));
        } else {
@@ -383,72 +387,85 @@
 }
 
 sub msg_AUTH_BASIC {
-       my ($kernel, $heap, $nonce, @types) = @_[KERNEL, HEAP, ARG0 .. $#_];
+       my ($kernel, $heap, $nonce, @types) = @_[KERNEL, HEAP, ARG1 .. $#_];
+       my ($type, $response);
 
+       my $passcode = sha1_base64($heap->{password} . 
lc("$heap->{host}$heap->{name}"));
+
+       if (grep(/^sha1$/, @types)) {
+               $type = "sha1";
+               $response = sha1_base64($nonce . $passcode);
+       } else {
+               #Surely, *surely* the server has MD5 if nothing else...
+               $type = "md5";
+               $response = md5_base64($nonce . $passcode);
+       }   
+       
+       $kernel->yield('send_raw', 'AUTH:BASIC', $type, $response);             
                
 }
 
 sub msg_PING {
-    call('send_raw', 'PONG', @_[ARG1..$#_]);
+       call('send_raw', 'PONG', @_[ARG1..$#_]);
 }
 
 sub msg_BYE {
-    my ($type, $detail) = @_[ARG2,ARG3];
-    dispatch('bye', $detail);
-    call('cleanup');
+       my ($type, $detail) = @_[ARG2,ARG3];
+       dispatch('bye', $detail);
+       call('cleanup');
 }
 
 sub msg_FAIL {
        my ($kernel, $heap, $cmd, $code, @args) = @_[KERNEL, HEAP, ARG0 .. $#_];
        
-    dispatch('fail', $cmd, $code, [EMAIL PROTECTED]);
-    $code =~ tr/./_/;
-    dispatch("fail_$code", $cmd, [EMAIL PROTECTED]);
+       dispatch('fail', $cmd, $code, [EMAIL PROTECTED]);
+       $code =~ tr/./_/;
+       dispatch("fail_$code", $cmd, [EMAIL PROTECTED]);
 }
 
 sub on_register {
        my ($kernel, $heap, $sender, @events) = 
@_[KERNEL,HEAP,SENDER,ARG0..$#_];
-    my $reg = $heap->{reg};
-    my $id  = $sender->ID;
-    
-    foreach my $event (@events) {
-        $event = uc $event;
-        next if exists $reg->{$event}{$id};
-        # Tags don't need to be anything special...
-        #my $tag = '1' . $reg->{$event} . '\0' . $id . '\0' . rand;
-        my $tag = __PACKAGE__;
-        $reg->{$event}{$id} = $tag;
-        $kernel->refcount_increment( $id, $tag );
-    }
+       my $reg = $heap->{reg};
+       my $id  = $sender->ID;
+       
+       foreach my $event (@events) {
+               $event = uc $event;
+               next if exists $reg->{$event}{$id};
+               # Tags don't need to be anything special...
+               #my $tag = '1' . $reg->{$event} . '\0' . $id . '\0' . rand;
+               my $tag = __PACKAGE__;
+               $reg->{$event}{$id} = $tag;
+               $kernel->refcount_increment( $id, $tag );
+       }
 }
 
 sub on_unregister {
        my ($kernel, $heap, $sender, @events) = @_[KERNEL, HEAP, SENDER, 
ARG0..$#_];
-    my $reg = $heap->{reg};
-    my $id  = $sender->ID;
-    
-    foreach my $event (@events) {
-        $event = uc $event;
-        my $tag;
-        next unless $tag = delete $reg->{$event}{$id};
-        $kernel->refcount_decrement( $id, $tag );
-    }
+       my $reg = $heap->{reg};
+       my $id  = $sender->ID;
+       
+       foreach my $event (@events) {
+               $event = uc $event;
+               my $tag;
+               next unless $tag = delete $reg->{$event}{$id};
+               $kernel->refcount_decrement( $id, $tag );
+       }
 }
 
 
 sub on_dispatch {
-    my ($kernel, $heap, $evname, @args) = @_[KERNEL,HEAP,ARG0..$#_];
-    $evname = uc $evname;
-    my $reg = $heap->{reg};
-    $reg->{$evname} ||= {};
-    $reg->{ALL}     ||= {};
-    my %targ = (%{$reg->{$evname}}, %{$reg->{ALL}});
-    my @ids  = keys %targ;
+       my ($kernel, $heap, $evname, @args) = @_[KERNEL,HEAP,ARG0..$#_];
+       $evname = uc $evname;
+       my $reg = $heap->{reg};
+       $reg->{$evname} ||= {};
+       $reg->{ALL}      ||= {};
+       my %targ = (%{$reg->{$evname}}, %{$reg->{ALL}});
+       my @ids  = keys %targ;
 
-    unshift @args, [$heap->{alias}];
+       unshift @args, [$heap->{alias}];
 
-    foreach my $id (@ids) {
-        $kernel->post($id, "haver_$evname", @args);
-    }
+       foreach my $id (@ids) {
+               $kernel->post($id, "haver_$evname", @args);
+       }
 }
 
 1;
@@ -468,13 +485,15 @@
       version  => "WackyClient/1.20",
   );
 
+  $kernel->post('haver', 'register', 'all');
+
   $kernel->post('haver', 'connect',
       host => 'hardison.net',
-      name => ucfirst($ENV{USER}),
+      name => 'WackyUser',
       port => 7575,
+      password => 'offmyrocker',
   );
 
-     
 =head1 DESCRIPTION
 
 This module eases the creation of Haver clients. It provides a POE::Component 
in the style of 
@@ -492,25 +511,29 @@
 If given, $resolver should be a L<POE::Component::Client::DNS> object.
 
 Finally, $version is what we will advertize as the client name and version 
number to the
-server. It defaults to C<Haver::Client/0.08>.
+server. It defaults to C<Haver::Client/0.09>.
 
 =head1 STATES
 
 While these are listed just like methods, you must post() to them, and not 
call them
 directly.
 
-=head2 connect(host => $host, name => $name, [ port => 7575 ])
+=head2 connect(host => $host, name => $name, [ port => 7575 ], [ password => 
$password ])
 
 Connect to $host on port $port (defaults to 7575) with the user name $name.
 If already connected to a server, Haver::Client will disconnect and re-connect 
using the
 new settings.
 
-=head2 register(@events)
+You may specify a password if the account requires authentication (which will 
be
+handled automatically by the module).  If not given the password will default 
to
+a blank string.
 
-This summons the sun god Ra and makes him eat your liver.
+=head2 register(Z<>@eventsZ<>)
 
-FIXME: This is inaccurate.
+This will register events with the module.
 
+FIXME: Be more specific.
+
 =head1 BUGS
 
 None known. Bug reports are welcome. Please use our bug tracker at
@@ -519,7 +542,8 @@
 =head1 AUTHOR
 
 Bryan Donlan E<lt>[EMAIL PROTECTED]<gt>,
-Dylan Hardison E<lt>[EMAIL PROTECTED]<gt>.
+Dylan Hardison E<lt>[EMAIL PROTECTED]<gt>,
+Eric Goodwin E<lt>[EMAIL PROTECTED]<gt>.
 
 =head1 SEE ALSO
 
@@ -527,7 +551,7 @@
 
 =head1 COPYRIGHT and LICENSE
 
-Copyright (C) 2004, 2005 by Bryan Donlan, Dylan Hardison. All Rights Reserved.
+Copyright (C) 2004, 2005 by Bryan Donlan, Dylan Hardison, and Eric Goodwin. 
All Rights Reserved.
 
 This module is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by

Modified: trunk/perl/server/lib/Haver/Server/Talker.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Talker.pm        2005-11-18 23:45:10 UTC 
(rev 928)
+++ trunk/perl/server/lib/Haver/Server/Talker.pm        2005-11-19 01:28:45 UTC 
(rev 929)
@@ -67,7 +67,7 @@
                        $heap->{client} = undef;
                        call('shutdown');
                } else {
-                       Log('warning', "Client isseud unknown command $cmd");
+                       Log('warning', "Client issued unknown command $cmd");
                        call('fail', 'unknown.cmd');
                }
        }


Reply via email to