package DC::MessageDistributor; use strict; no warnings; sub new { my $this = shift; my $class = ref($this) || $this; my $self = { @_ }; bless $self, $class; $self->{dockbar}->add_dock ( $self->{log} = DC::UI::ChatView->new ( expand => 1, can_close => 0, can_undock => 0, info => { title => "Log", tooltip => "Server Log. This text viewer contains all recent message sent by the server.", entry_tooltip => "Command Entry. If you enter something and press return/enter here, " ."the line you entered will be sent to the server as a command.", reply => '' } ) ); return $self } # called by MAPWIDGET activate console event sub activate_console { } # adding channel sub add_channel { my ($self, $chaninfo) = @_; $self->{info}->{$chaninfo->{id}} = $chaninfo; $self->touch_channel ($chaninfo->{id}); } # set max paragraphs sub set_max_para { } # set fontsize for all chatviews sub set_fontsize { my ($self, $s) = @_; for ($self->{log}, values %{$self->{chatview}}) { $_->set_fontsize ($s); } } # push message in sub message { my ($self, $para) = @_; my $id = $para->{type}; if (exists $self->{info}->{$id}) { unless (exists $self->{chatview}->{$id}) { $self->touch_channel ($id); } my $cv = $self->{chatview}->{$id}; unless ($cv) { warn "message couldn't be delivered to chatview with " ."id '$id', sending it to main log."; $self->{log}->message ($para); return; } $cv->message ($para); } else { $self->{log}->message ($para); } } sub touch_channel { my ($self, $id) = @_; if (exists $self->{chatview}->{$id}) { $self->update_chat ($id); } else { $self->init_chat ($id); } } sub update_chat { my ($self, $id) = @_; $self->{chatview}->{$id}->update_info ($self->{info}->{$id}); } sub init_chat { my ($self, $id) = @_; my $chaninfo = $self->{info}->{$id}; my $dock = $self->{chatview}->{$id} = DC::UI::ChatView->new ( expand => 1, info => $chaninfo, ); $dock->connect (close_dock => sub { delete $self->{chatview}->{$id}; 0 }); $self->{dockbar}->add_dock ($dock); } 1;