--- googlecode.com/svn/trunk/Meteor/Channel.pm 2007/05/20 19:40:53 25 +++ googlecode.com/svn/trunk/Meteor/Channel.pm 2008/02/27 21:58:56 53 @@ -152,12 +152,25 @@ my $subscriber=shift; my $startId=shift; my $persist=shift; + my $mode=shift || ''; + my $userAgent=shift || ''; # Note: negative $startId means go back that many messages + my $startIndex=$self->indexForMessageID($startId); + my $logStartIndex = $startIndex || $self->lastMsgID() || 0; push(@{$self->{'subscribers'}},$subscriber) if($persist); - my $startIndex=$self->indexForMessageID($startId); + &::syslog('info','', + 'joinchannel', + $subscriber->{'ip'}, + $subscriber->{'subscriberID'}, + $self->{'name'}, + $mode, + $logStartIndex, + $userAgent + ); + return unless(defined($startIndex)); my $msgCount=scalar(@{$self->{'messages'}}); @@ -165,27 +178,21 @@ $startIndex=0 if($startIndex<0); - my $numMsgToSend=0; - while($startIndex<$msgCount) - { - my $message=$self->{'messages'}->[$startIndex++]; - - $txt.=$message->message(); - $numMsgToSend++; + if($startIndex<$msgCount) { + $subscriber->sendMessages(@{$self->{'messages'}}[$startIndex..$msgCount-1]); } - - $subscriber->sendMessage($txt,$numMsgToSend); } sub removeSubscriber { my $self=shift; my $subscriber=shift; + my $reason=shift ||'unknown'; my $idx=undef; - for(my $i=0;$i{'subscribers'}});$i++) - { - if($self->{'subscribers'}->[$i]==$subscriber) - { + my $numsubs = scalar(@{$self->{'subscribers'}}); + + for (my $i=0; $i<$numsubs; $i++) { + if($self->{'subscribers'}->[$i]==$subscriber) { $idx=$i; last; } @@ -194,6 +201,18 @@ if(defined($idx)) { splice(@{$self->{'subscribers'}},$idx,1); + + my $timeConnected = time - $subscriber->{'ConnectionStart'}; + &::syslog('info','', + 'leavechannel', + $subscriber->{'ip'}, + $subscriber->{'subscriberID'}, + $self->{'name'}, + $timeConnected, + $subscriber->{'MessageCount'}, + $subscriber->{'bytesWritten'}, + $reason + ); } $self->checkExpiration(); @@ -213,11 +232,13 @@ $message->setText($messageText); $message->setChannelName($self->{'name'}); push(@{$self->{'messages'}},$message); + &::syslog('debug',"New message ".$message->{"id"}." on channel ".$self->{'name'}); $self->trimMessageStoreBySize(); - my $text=$message->message(); - map { $_->sendMessage($text) } @{$self->{'subscribers'}}; + map { $_->sendMessages($message) } @{$self->{'subscribers'}}; + + $message; } sub messageCount { @@ -282,7 +303,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 ''); @@ -317,5 +338,37 @@ return $low; } +sub lastMsgID { + my $self=shift; + my $numMessages=scalar(@{$self->{'messages'}}); + return undef unless($numMessages>0); + @{$self->{'messages'}}[-1]->id(); +} + +sub descriptionWithTemplate { + my $self=shift; + my $template=shift; + + return '' unless(defined($template) && $template ne ''); + + $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() || 0; + } elsif($1 eq 'name') { + $self->{'name'}; + } else { + ''; + } + /gex; + + $template; +} + 1; ############################################################################EOF \ No newline at end of file