--- googlecode.com/svn/trunk/Meteor/Channel.pm 2007/04/30 18:16:17 13 +++ googlecode.com/svn/trunk/Meteor/Channel.pm 2008/02/04 21:06:42 47 @@ -77,6 +77,23 @@ $list; } +sub listChannelsUsingTemplate { + my $class=shift; + my $template=shift; + + return '' unless(defined($template) && $template ne ''); + + my $list=''; + foreach my $channelName (sort keys %Channels) + { + my $channel=$Channels{$channelName}; + + $list.=$channel->descriptionWithTemplate($template); + } + + $list; +} + sub deleteChannel { my $class=shift; my $channelName=shift; @@ -99,6 +116,11 @@ map { $_->clearBuffer() } (values %Channels); } +sub numChannels { + + return scalar(keys %Channels); +} + ############################################################################### # Factory methods ############################################################################### @@ -147,11 +169,22 @@ my $subscriber=shift; my $startId=shift; my $persist=shift; + my $mode=shift || ''; + my $userAgent=shift || ''; # Note: negative $startId means go back that many messages push(@{$self->{'subscribers'}},$subscriber) if($persist); + &::syslog('info','', + 'joinchannel', + $subscriber->{'subscriberID'}, + $self->{'name'}, + $mode, + $startId, + $userAgent + ); + my $startIndex=$self->indexForMessageID($startId); return unless(defined($startIndex)); @@ -160,19 +193,16 @@ $startIndex=0 if($startIndex<0); - while($startIndex<$msgCount) + if($startIndex<$msgCount) { - my $message=$self->{'messages'}->[$startIndex++]; - - $txt.=$message->message(); + $subscriber->sendMessages(@{$self->{'messages'}}[$startIndex,$msgCount-1]); } - - $subscriber->sendMessage($txt); } sub removeSubscriber { my $self=shift; my $subscriber=shift; + my $reason=shift ||'unknown'; my $idx=undef; for(my $i=0;$i{'subscribers'}});$i++) @@ -187,6 +217,16 @@ if(defined($idx)) { splice(@{$self->{'subscribers'}},$idx,1); + + &::syslog('info','', + 'leavechannel', + $subscriber->{'subscriberID'}, + $self->{'name'}, + $subscriber->{'ConnectionStart'}, + $subscriber->{'MessageCount'}, + $subscriber->{'bytesWritten'}, + $reason + ); } $self->checkExpiration(); @@ -203,13 +243,15 @@ my $messageText=shift; my $message=Meteor::Message->newWithID($MessageID++); - $message->setText($messageText); + $message->setText($messageText); + $message->setChannelName($self->{'name'}); push(@{$self->{'messages'}},$message); $self->trimMessageStoreBySize(); - my $text=$message->message(); - map { $_->sendMessage($text) } @{$self->{'subscribers'}}; + map { $_->sendMessages($message) } @{$self->{'subscribers'}}; + + $message; } sub messageCount { @@ -274,7 +316,7 @@ # return undef unless(defined($id)); - my $numMessages=scalar(scalar(@{$self->{'messages'}})); + my $numMessages=scalar(@{$self->{'messages'}}); return undef unless($numMessages); return -1 unless($id ne ''); @@ -309,5 +351,50 @@ return $low; } +sub lastMsgID { + my $self=shift; + + my $numMessages=scalar(@{$self->{'messages'}}); + + return 'undefined' unless($numMessages>0); + + @{$self->{'messages'}}[-1]->id(); +} + +sub descriptionWithTemplate { + my $self=shift; + my $template=shift; + + $template=~s/~([a-zA-Z0-9_]*)~/ + if(!defined($1) || $1 eq '') + { + '~'; + } + elsif($1 eq 'messageCount') + { + $self->messageCount(); + } + elsif($1 eq 'subscriberCount') + { + $self->subscriberCount(); + } + elsif($1 eq 'lastMsgID') + { + $self->lastMsgID(); + } + + elsif(exists($self->{$1})) + { + $self->{$1}; + } + else + { + ''; + } + /gex; + + $template; +} + 1; ############################################################################EOF \ No newline at end of file