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]);