+ my $self = shift;
+ my $line = shift;
+ my $isolate = shift;
+ my $to = shift;
+ my $target = shift;
+ my $text = shift;
+ my ($filter, $hops);
+
+ if (!$self->{ann_talk} && $to ne $self->{call}) {
+ my $call = AnnTalk::is_talk_candidate($_[0], $text);
+ return if $call;
+ }
+
+ if ($self->{annfilter}) {
+ ($filter, $hops) = $self->{annfilter}->it(@_ );
+ return unless $filter;
+ }
+
+ unless ($self->{ann}) {
+ return if $_[0] ne $main::myalias && $_[0] ne $main::mycall;
+ }
+ return if $target eq 'SYSOP' && $self->{priv} < 5;
+ my $buf = "$to$target de $_[0]: $text";
+ $buf =~ s/\%5E/^/g;
+ $buf .= "\a\a" if $self->{beep};
+ $self->local_send($target eq 'WX' ? 'W' : 'N', $buf);
+}
+
+# send a chat
+sub chat
+{
+ my $self = shift;
+ my $line = shift;
+ my $isolate = shift;
+ my $target = shift;
+ my $to = shift;
+ my $text = shift;
+ my ($filter, $hops);
+
+ return unless grep uc $_ eq $target, @{$self->{user}->{group}};
+
+ $text =~ s/^\#\d+ //;
+ my $buf = "$target de $_[0]: $text";
+ $buf =~ s/\%5E/^/g;
+ $buf .= "\a\a" if $self->{beep};
+ $self->local_send('C', $buf);
+}
+
+
+sub wwv
+{
+ my $self = shift;
+ my $line = shift;
+ my $isolate = shift;
+ my ($filter, $hops);
+
+ return unless $self->{wwv};
+
+ if ($self->{wwvfilter}) {
+ ($filter, $hops) = $self->{wwvfilter}->it(@_ );
+ return unless $filter;
+ }
+
+ my $buf = "WWV de $_[6] <$_[1]>: SFI=$_[2], A=$_[3], K=$_[4], $_[5]";
+ $buf .= "\a\a" if $self->{beep};
+ $self->local_send('V', $buf);
+}
+
+sub wcy
+{
+ my $self = shift;
+ my $line = shift;
+ my $isolate = shift;
+ my ($filter, $hops);
+
+ return unless $self->{wcy};
+
+ if ($self->{wcyfilter}) {
+ ($filter, $hops) = $self->{wcyfilter}->it(@_ );
+ return unless $filter;
+ }
+
+ my $buf = "WCY de $_[10] <$_[1]> : K=$_[4] expK=$_[5] A=$_[3] R=$_[6] SFI=$_[2] SA=$_[7] GMF=$_[8] Au=$_[9]";
+ $buf .= "\a\a" if $self->{beep};
+ $self->local_send('Y', $buf);
+}