KGS::Listener::Channel
package KGS::Listener::Channel;
use base KGS::Listener;
sub add_users {
my ($self, $users) = @_;
my (@added, @updated, $user);
for (@$users) {
if ($user = $self->{users}{$_->{name}}) {
push @updated, $user;
} else {
$user = $self->{users}{$_->{name}} = bless {}, ref $_;
push @added, $user;
}
while (my ($k, $v) = each %$_) { $user->{$k} = $v };
$self->event_join if !$self->{joined} && $_->{name} eq $self->{conn}{name};
}
$self->event_update_users (\@added, \@updated, []);
}
sub del_users {
my ($self, $users) = @_;
return unless $self->{joined};
my (@deleted, $part);
for (@$users) {
$part ||= $_->{name} eq $self->{conn}{name};
push @deleted, delete $self->{users}{$_->{name}};
}
$self->event_update_users ([], [], \@deleted);
$self->event_part if $part;
}
sub join {
my ($self, $type) = @_;
return if $self->{joined};
delete $self->{users};
$self->send ($type => channel => $self->{channel}, user => { name => $self->{conn}->{name} });
}
sub part {
my ($self, $type) = @_;
return unless $self->{joined};
$self->send ($type => channel => $self->{channel}, name => $self->{conn}->{name});
}
sub event_join {
my ($self) = @_;
$self->{joined} = 1;
}
sub event_part {
my ($self) = @_;
delete $self->{joined};
$self->event_update_users ([], [], [values %{(delete $self->{users}) || {}}]);
}
sub event_quit {
my ($self) = @_;
$self->SUPER::event_quit;
event_part ($self);
}
sub event_update_users {}
1;