77 |
$list; |
$list; |
78 |
} |
} |
79 |
|
|
80 |
|
sub listChannelsUsingTemplate { |
81 |
|
my $class=shift; |
82 |
|
my $template=shift; |
83 |
|
|
84 |
|
return '' unless(defined($template) && $template ne ''); |
85 |
|
|
86 |
|
my $list=''; |
87 |
|
foreach my $channelName (sort keys %Channels) |
88 |
|
{ |
89 |
|
my $channel=$Channels{$channelName}; |
90 |
|
|
91 |
|
$list.=$channel->descriptionWithTemplate($template); |
92 |
|
} |
93 |
|
|
94 |
|
$list; |
95 |
|
} |
96 |
|
|
97 |
sub deleteChannel { |
sub deleteChannel { |
98 |
my $class=shift; |
my $class=shift; |
99 |
my $channelName=shift; |
my $channelName=shift; |
116 |
map { $_->clearBuffer() } (values %Channels); |
map { $_->clearBuffer() } (values %Channels); |
117 |
} |
} |
118 |
|
|
119 |
|
sub numChannels { |
120 |
|
|
121 |
|
return scalar(keys %Channels); |
122 |
|
} |
123 |
|
|
124 |
############################################################################### |
############################################################################### |
125 |
# Factory methods |
# Factory methods |
126 |
############################################################################### |
############################################################################### |
154 |
my $self=shift; |
my $self=shift; |
155 |
|
|
156 |
my @subscribers=@{$self->{'subscribers'}}; |
my @subscribers=@{$self->{'subscribers'}}; |
157 |
map { $_->close() } @subscribers; |
map { $_->closeChannel($self->{'name'}) } @subscribers; |
158 |
} |
} |
159 |
|
|
160 |
############################################################################### |
############################################################################### |
169 |
my $subscriber=shift; |
my $subscriber=shift; |
170 |
my $startId=shift; |
my $startId=shift; |
171 |
my $persist=shift; |
my $persist=shift; |
172 |
|
my $mode=shift || ''; |
173 |
|
my $userAgent=shift || ''; |
174 |
|
|
175 |
# Note: negative $startId means go back that many messages |
# Note: negative $startId means go back that many messages |
176 |
|
|
177 |
push(@{$self->{'subscribers'}},$subscriber) if($persist); |
push(@{$self->{'subscribers'}},$subscriber) if($persist); |
178 |
|
|
179 |
|
&::syslog('info','', |
180 |
|
'joinchannel', |
181 |
|
$subscriber->{'subscriberID'}, |
182 |
|
$self->{'name'}, |
183 |
|
$mode, |
184 |
|
$startId, |
185 |
|
$userAgent |
186 |
|
); |
187 |
|
|
188 |
my $startIndex=$self->indexForMessageID($startId); |
my $startIndex=$self->indexForMessageID($startId); |
189 |
return unless(defined($startIndex)); |
return unless(defined($startIndex)); |
190 |
|
|
193 |
|
|
194 |
$startIndex=0 if($startIndex<0); |
$startIndex=0 if($startIndex<0); |
195 |
|
|
196 |
while($startIndex<$msgCount) |
if($startIndex<$msgCount) |
197 |
{ |
{ |
198 |
my $message=$self->{'messages'}->[$startIndex++]; |
$subscriber->sendMessages(@{$self->{'messages'}}[$startIndex,$msgCount-1]); |
|
|
|
|
$txt.=$message->message(); |
|
199 |
} |
} |
|
|
|
|
$subscriber->sendMessage($txt); |
|
200 |
} |
} |
201 |
|
|
202 |
sub removeSubscriber { |
sub removeSubscriber { |
203 |
my $self=shift; |
my $self=shift; |
204 |
my $subscriber=shift; |
my $subscriber=shift; |
205 |
|
my $reason=shift ||'unknown'; |
206 |
|
|
207 |
my $idx=undef; |
my $idx=undef; |
208 |
for(my $i=0;$i<scalar(@{$self->{'subscribers'}});$i++) |
for(my $i=0;$i<scalar(@{$self->{'subscribers'}});$i++) |
217 |
if(defined($idx)) |
if(defined($idx)) |
218 |
{ |
{ |
219 |
splice(@{$self->{'subscribers'}},$idx,1); |
splice(@{$self->{'subscribers'}},$idx,1); |
220 |
|
|
221 |
|
&::syslog('info','', |
222 |
|
'leavechannel', |
223 |
|
$subscriber->{'subscriberID'}, |
224 |
|
$self->{'name'}, |
225 |
|
$subscriber->{'ConnectionStart'}, |
226 |
|
$subscriber->{'MessageCount'}, |
227 |
|
$subscriber->{'bytesWritten'}, |
228 |
|
$reason |
229 |
|
); |
230 |
} |
} |
231 |
|
|
232 |
$self->checkExpiration(); |
$self->checkExpiration(); |
243 |
my $messageText=shift; |
my $messageText=shift; |
244 |
|
|
245 |
my $message=Meteor::Message->newWithID($MessageID++); |
my $message=Meteor::Message->newWithID($MessageID++); |
246 |
$message->setText($messageText); |
$message->setText($messageText); |
247 |
|
$message->setChannelName($self->{'name'}); |
248 |
push(@{$self->{'messages'}},$message); |
push(@{$self->{'messages'}},$message); |
249 |
|
|
250 |
$self->trimMessageStoreBySize(); |
$self->trimMessageStoreBySize(); |
251 |
|
|
252 |
my $text=$message->message(); |
map { $_->sendMessages($message) } @{$self->{'subscribers'}}; |
253 |
map { $_->sendMessage($text) } @{$self->{'subscribers'}}; |
|
254 |
|
$message; |
255 |
} |
} |
256 |
|
|
257 |
sub messageCount { |
sub messageCount { |
316 |
# |
# |
317 |
return undef unless(defined($id)); |
return undef unless(defined($id)); |
318 |
|
|
319 |
my $numMessages=scalar(scalar(@{$self->{'messages'}})); |
my $numMessages=scalar(@{$self->{'messages'}}); |
320 |
|
|
321 |
return undef unless($numMessages); |
return undef unless($numMessages); |
322 |
return -1 unless($id ne ''); |
return -1 unless($id ne ''); |
351 |
return $low; |
return $low; |
352 |
} |
} |
353 |
|
|
354 |
|
sub lastMsgID { |
355 |
|
my $self=shift; |
356 |
|
|
357 |
|
my $numMessages=scalar(@{$self->{'messages'}}); |
358 |
|
|
359 |
|
return 'undefined' unless($numMessages>0); |
360 |
|
|
361 |
|
@{$self->{'messages'}}[-1]->id(); |
362 |
|
} |
363 |
|
|
364 |
|
sub descriptionWithTemplate { |
365 |
|
my $self=shift; |
366 |
|
my $template=shift; |
367 |
|
|
368 |
|
$template=~s/~([a-zA-Z0-9_]*)~/ |
369 |
|
if(!defined($1) || $1 eq '') |
370 |
|
{ |
371 |
|
'~'; |
372 |
|
} |
373 |
|
elsif($1 eq 'messageCount') |
374 |
|
{ |
375 |
|
$self->messageCount(); |
376 |
|
} |
377 |
|
elsif($1 eq 'subscriberCount') |
378 |
|
{ |
379 |
|
$self->subscriberCount(); |
380 |
|
} |
381 |
|
elsif($1 eq 'lastMsgID') |
382 |
|
{ |
383 |
|
$self->lastMsgID(); |
384 |
|
} |
385 |
|
|
386 |
|
elsif(exists($self->{$1})) |
387 |
|
{ |
388 |
|
$self->{$1}; |
389 |
|
} |
390 |
|
else |
391 |
|
{ |
392 |
|
''; |
393 |
|
} |
394 |
|
/gex; |
395 |
|
|
396 |
|
$template; |
397 |
|
} |
398 |
|
|
399 |
1; |
1; |
400 |
############################################################################EOF |
############################################################################EOF |