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}); } =item $channel->event_join =cut sub event_join { my ($self) = @_; $self->{joined} = 1; } =item $channel->event_part =cut 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); } =item $channel->event_update_users ($add, $update, $remove) =cut sub event_update_users {} 1;