Author: dylan
Date: 2005-06-16 04:52:51 -0400 (Thu, 16 Jun 2005)
New Revision: 768

Removed:
   trunk/main/server/lib/Haver/Server/Container.pm
Modified:
   trunk/
   trunk/main/server/NEWS
   trunk/main/server/bin/haverd.pl
   trunk/main/server/lib/Haver/Server/Avatar.pm
   trunk/main/server/lib/Haver/Server/Entity/Channel.pm
   trunk/main/server/lib/Haver/Server/Entity/User.pm
   trunk/main/server/lib/Haver/Server/Listener.pm
   trunk/main/server/lib/Haver/Server/Talker.pm
Log:
 [EMAIL PROTECTED]:  dylan | 2005-06-16 04:38:50 -0400
 Let's see. Users are not containers...
 The containers mixin is dead, merged the code into Channel.
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43057
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1040
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43050
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1072
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Modified: trunk/main/server/NEWS
===================================================================
--- trunk/main/server/NEWS      2005-06-15 04:21:11 UTC (rev 767)
+++ trunk/main/server/NEWS      2005-06-16 08:52:51 UTC (rev 768)
@@ -1,5 +1,3 @@
 
-* We're using the fourth version of the protocol...
-* Error names are now saner.
-* There's an INFO (like whois) command!
-
+* We're using the fifth version of the protocol...
+* Error names are now saner but we need to work on them.

Modified: trunk/main/server/bin/haverd.pl
===================================================================
--- trunk/main/server/bin/haverd.pl     2005-06-15 04:21:11 UTC (rev 767)
+++ trunk/main/server/bin/haverd.pl     2005-06-16 08:52:51 UTC (rev 768)
@@ -27,7 +27,10 @@
 POE::Session->create(
        inline_states => {
                _start => sub {
-                       $_[KERNEL]->post('Listener', 'listen', '7777');
+                       $_[KERNEL]->post('Listener', 'listen', {
+                                       host => 'hardison.net',
+                                       port => 7070,
+                               });
                },
        });
 

Modified: trunk/main/server/lib/Haver/Server/Avatar.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Avatar.pm        2005-06-15 04:21:11 UTC 
(rev 767)
+++ trunk/main/server/lib/Haver/Server/Avatar.pm        2005-06-16 08:52:51 UTC 
(rev 768)
@@ -11,8 +11,10 @@
 
 
 sub put {
+       my $msg = shift;
+
        if (my $w = $self->wheel) {
-               $w->put([EMAIL PROTECTED]);
+               $w->put($msg);
                return 1;
        } else {
                return undef;

Deleted: trunk/main/server/lib/Haver/Server/Container.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Container.pm     2005-06-15 04:21:11 UTC 
(rev 767)
+++ trunk/main/server/lib/Haver/Server/Container.pm     2005-06-16 08:52:51 UTC 
(rev 768)
@@ -1,58 +0,0 @@
-# vim: set ts=4 sw=4 expandtab si ai sta tw=100:
-# This module is copyrighted, see end of file for details.
-# This is a mixin class.
-package Haver::Server::Container;
-use Haver::Base '-Base';
-
-our $VERSION = 0.04;
-
-field _contents => {};
-stub 'can_contain';
-
-sub add {
-    my ($object) = @_;
-
-    my $ns = $object->namespace;
-    my $name = $object->name;
-
-    croak ref($self) . " can't contain $object!" unless 
$self->can_contain($object);
-    
-    $self->{_contents}{$ns}{lc $name} = $object;
-}
-
-sub fetch {
-    my ($ns, $name) = @_;
-    $name = lc $name;
-
-    return undef unless exists $self->{_contents}{$ns};
-    return undef unless exists $self->{_contents}{$ns}{$name};
-    return $self->{_contents}{$ns}{$name};
-}
-
-sub remove {
-    my ($ns, $name) = @_;
-    $name = lc $name; 
-
-    return undef unless exists $self->{_contents}{$ns};
-    return undef unless exists $self->{_contents}{$ns}{$name};
-    return delete $self->{_contents}{$ns}{$name};
-}
-
-sub contents {
-    my ($ns) = @_;
-    my @values = ();
-    
-    if (exists $self->{_contents}{$ns}) {
-        @values = values %{ $self->{_contents}{$ns} };
-    }
-    
-    return wantarray ? @values : [EMAIL PROTECTED];
-}
-
-sub contains {
-    my ($ns, $name) = @_;
-    
-    return undef unless exists $self->{_contents}{$ns};
-    return exists $self->{_contents}{$ns}{lc $name};
-}
-

Modified: trunk/main/server/lib/Haver/Server/Entity/Channel.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Entity/Channel.pm        2005-06-15 
04:21:11 UTC (rev 767)
+++ trunk/main/server/lib/Haver/Server/Entity/Channel.pm        2005-06-16 
08:52:51 UTC (rev 768)
@@ -2,13 +2,73 @@
 # This module is copyrighted, see end of file for details.
 package Haver::Server::Entity::Channel;
 use Haver::Server::Entity    qw( -Base );
-use Haver::Server::Container qw( -mixin );
 
-our $VERSION = 0.12;
+our $VERSION = 0.20;
 
 const namespace => 'channel';
+field _contents  => {};
 
 sub can_contain {
     my $object = shift;
     $object->namespace eq 'user';
 }
+
+sub put {
+    my ($msg) = @_;
+
+    foreach my $user ($self->contents('user')) {
+        $user->put($msg);
+    }
+}
+
+sub add {
+    my ($object) = @_;
+
+    my $ns   = $object->namespace;
+    my $name = lc $object->name;
+
+    croak ref($self) . " can't contain $object!" unless 
$self->can_contain($object);
+    
+    
+    $self->{_contents}{$ns}{$name} = $object;
+    if ($self->weakref) {
+        Scalar::Util::weaken( $self->{_contents}{$ns}{$name} );
+    }
+}
+
+sub fetch {
+    my ($ns, $name) = @_;
+    $name = lc $name;
+
+    return undef unless exists $self->{_contents}{$ns};
+    return undef unless exists $self->{_contents}{$ns}{$name};
+    return $self->{_contents}{$ns}{$name};
+}
+
+sub remove {
+    my ($ns, $name) = @_;
+    $name = lc $name; 
+
+    return undef unless exists $self->{_contents}{$ns};
+    return undef unless exists $self->{_contents}{$ns}{$name};
+    return delete $self->{_contents}{$ns}{$name};
+}
+
+sub contents {
+    my ($ns) = @_;
+    my @values = ();
+    
+    if (exists $self->{_contents}{$ns}) {
+        @values = values %{ $self->{_contents}{$ns} };
+    }
+    
+    return wantarray ? @values : [EMAIL PROTECTED];
+}
+
+sub contains {
+    my ($ns, $name) = @_;
+    
+    return undef unless exists $self->{_contents}{$ns};
+    return exists $self->{_contents}{$ns}{lc $name};
+}
+

Modified: trunk/main/server/lib/Haver/Server/Entity/User.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Entity/User.pm   2005-06-15 04:21:11 UTC 
(rev 767)
+++ trunk/main/server/lib/Haver/Server/Entity/User.pm   2005-06-16 08:52:51 UTC 
(rev 768)
@@ -2,15 +2,49 @@
 # This module is copyrighted, see end of file for details.
 package Haver::Server::Entity::User;
 use Haver::Server::Entity qw( -Base );
-use Haver::Server::Container qw( -mixin );
 use Haver::Server::Avatar qw( -mixin );
 
-field idd => 'foobar';
 const namespace => 'user';
+field _channels => {};
+field _friends  => {};
 
-sub can_contain {
-    my $object = shift;
-    $object->namespace eq 'user'
-        or $object->namespace eq 'channel';
+
+sub join {
+       my ($chan) = @_;
+       $chan->add($self);
+       $self->add_channel($chan->name);
 }
 
+sub part {
+       my ($chan) = @_;
+       $chan->remove($self->namespace, $self->name);
+       $self->remove_channel($chan->name);
+}
+
+{
+       no strict 'refs';
+       foreach my $word (qw( channel friend )) {
+               my $field = "_$word";
+               
+               *{"add_$word"} = sub {
+                       my ($self, $name) = @_;
+                       $self->{$field}{$name} = 1;
+               };
+               *{"remove_$word"} = sub {
+                       my ($self, $name) = @_;
+                       delete $self->{$field}{$name};
+               };
+               *{"has_$word"} = sub {
+                       my ($self, $name) = @_;
+                       exists $self->{$field}{$name};
+               };
+               *{$word.'s'} = sub {
+                       my ($self, $name) = @_;
+                       my @list = keys %{ $self->{$field} };
+                       wantarray ? @list : [EMAIL PROTECTED];
+               };
+       }
+}
+
+
+1;

Modified: trunk/main/server/lib/Haver/Server/Listener.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Listener.pm      2005-06-15 04:21:11 UTC 
(rev 767)
+++ trunk/main/server/lib/Haver/Server/Listener.pm      2005-06-16 08:52:51 UTC 
(rev 768)
@@ -51,17 +51,18 @@
 
 
 sub listen {
-       my ($kernel, $heap, $port) = @_[KERNEL, HEAP, ARG0];
-       Log('notice', "Listening on port $port.");
+       my ($kernel, $heap, $hash) = @_[KERNEL, HEAP, ARG0];
+       Log('notice', "Listening on port $hash->{port} with host 
$hash->{host}");
        
        my $wheel = POE::Wheel::SocketFactory->new(
                #BindAddress => $addr,
-               BindPort     => $port,
+               BindPort     => $hash->{port},
                Reuse        => 1,
                SuccessEvent => 'socket_birth',
                FailureEvent => 'socket_fail',
        );
        $heap->{wheels}{$wheel->ID} = $wheel;
+       $heap->{info}{$wheel->ID}   = $hash;
 }
 
 sub socket_birth {
@@ -70,9 +71,10 @@
        
        Log('Socket birth.');
        create Haver::Server::Talker (
-               sock    => $socket,
-               address => Socket::inet_ntoa($address),
-               port    => $port,
+               sock      => $socket,
+               address   => Socket::inet_ntoa($address),
+               port      => $port,
+               sockinfo  => $heap->{info}{$wid},
        );
 }
 

Modified: trunk/main/server/lib/Haver/Server/Talker.pm
===================================================================
--- trunk/main/server/lib/Haver/Server/Talker.pm        2005-06-15 04:21:11 UTC 
(rev 767)
+++ trunk/main/server/lib/Haver/Server/Talker.pm        2005-06-16 08:52:51 UTC 
(rev 768)
@@ -13,14 +13,11 @@
 use POE::Wheel::ReadWrite;
 use POE::Driver::SysRW;
 
-
-
 our $VERSION = '0.08';
-our $Lobby = new Haver::Server::Entity::Lobby (name => '&lobby');
+our $Lobby = new Haver::Server::Entity::Lobby;
 
 my $NamePattern = qr/&?[a-z][a-z0-9_.'@-]+/i;
 
-
 sub valid_name {
        my $name = shift;
        return $name =~ $NamePattern;
@@ -32,9 +29,6 @@
        }
 }
 
-
-
-
 states qw(
        _start _stop _default
        input error flush
@@ -60,7 +54,7 @@
 
        %$heap = (
                %$opt,
-               client => $client,
+               client   => $client,
        );
 }
 
@@ -167,7 +161,8 @@
        my ($version) = @$args;
 
        Log('notice', 'Client is ' . $version);
-       $heap->{client}->put(['HAVER', 
"Haver::Server/$Haver::Server::VERSION"]);
+       $heap->{client}->put(
+               ['HAVER', $heap->{sockinfo}{host}, 
"Haver::Server/$Haver::Server::VERSION"]);
        $heap->{version} = $version;
        
        $kernel->state('msg_IDENT', __PACKAGE__);
@@ -194,7 +189,7 @@
                $heap->{user} = $user;
                $heap->{client}->put(['HELLO', $name]);
                $kernel->state('msg_IDENT');
-               foreach (qw( TO BYE IN )) {
+               foreach (qw( TO BYE IN JOIN PART OPEN )) {
                        $kernel->state("msg_$_", __PACKAGE__);
                }
        }
@@ -208,7 +203,7 @@
 
 
        unless (valid_name($name)) {
-               $kernel->yield('fail', "invalid.user", $name);
+               $kernel->yield('fail', "invalid.name", $name);
                return;
        }
        unless ($targ) {
@@ -221,7 +216,7 @@
        }
 
 
-       $targ->put('FROM', $user->name, $type, @$args);
+       $targ->put(['FROM', $user->name, $type, @$args]);
 }
 
 sub msg_IN {
@@ -230,8 +225,13 @@
        my $user   = $heap->{user};
        my $chan   = $Lobby->fetch('channel', $name);
 
+
+       unless (valid_name($name)) {
+               $kernel->yield('fail', "invalid.name", $name);
+               return;
+       }
        unless ($chan) {
-               $kernel->yield('fail', 'unknown.user');
+               $kernel->yield('fail', 'unknown.channel');
                return;
        }
        unless (defined $type) {
@@ -239,13 +239,80 @@
                return;
        }
 
-       $name = $chan->name;
+       $chan->put(['IN', $chan->name, $user->name, $type, @$args]);
+}
+
+sub msg_JOIN {
+       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
+       my ($name) = @$args;
+       my $user   = $heap->{user};
+       my $chan   = $Lobby->fetch('channel', $name);
+
+       unless (valid_name($name)) {
+               $kernel->yield('fail', "invalid.name", $name);
+               return;
+       }
+       unless ($chan) {
+               $kernel->yield('fail', 'unknown.channel');
+               return;
+       }
+       if ($chan->contains('user', $user->name)) {
+               $kernel->yield('fail', 'moron');
+               return;
+       }
+
+       $user->join($chan);
+       $chan->put(['JOIN', $chan->name, $user->name]);
+}
+
+sub msg_OPEN {
+       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
+       my ($name) = @$args;
        
-       foreach my $targ ($chan->contents('user')) {
-               $targ->put('IN', $name, $user->name, $type, @$args);
+       unless (valid_name($name)) {
+               $kernel->yield('fail', "invalid.name", $name);
+               return;
        }
+       if ($Lobby->contains('channel', $name)) {
+               $kernel->yield('fail', 'exists.channel');
+               return;
+       }
+
+       $Lobby->add(
+               new Haver::Server::Entity::Channel (
+                       name => $name
+               )
+       );
+       $heap->{client}->put(['OPEN', $name]);
+       $kernel->yield('msg_JOIN', [$name]);
+
 }
 
+sub msg_PART {
+       my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
+       my ($name) = @$args;
+       my $user   = $heap->{user};
+       my $chan   = $Lobby->fetch('channel', $name);
+
+       unless (valid_name($name)) {
+               $kernel->yield('fail', 'invalid.name', $name);
+               return;
+       }
+       unless ($chan) {
+               $kernel->yield('fail', 'unknown.channel');
+               return;
+       }
+       unless ($chan->contains('user', $user->name)) {
+               $kernel->yield('fail', 'moron');
+               return;
+       }
+
+       $chan->put(['PART', $chan->name, $user->name]);
+       $user->part($chan);
+}
+
+
+
 sub msg_BYE {
        my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG0];
        $kernel->yield('shutdown', 'bye', $args->[0]);


Reply via email to