App-MatrixClient

 view release on metacpan or  search on metacpan

lib/App/MatrixClient/RoomTab.pm  view on Meta::CPAN

            $self->set_typing_line( undef ), return;

         my $s = String::Tagged->new
            ->append_tagged( " # currently typing: ", fg => "magenta" );

         my $last_member = pop @members;
         $s->append_tagged( format_displayname( $_ ) )
           ->append( ", " ) for @members;
         $s->append_tagged( format_displayname( $last_member ) );

         $self->set_typing_line( $s );
      },
   );

   $room->add_child( $self->{typing_grace_timer} = IO::Async::Timer::Countdown->new(
      delay => TYPING_GRACE_SECONDS,
      on_expire => sub { $room->typing_stop },
   ) );
}

sub append_line
{
   my $self = shift;

   if( $self->{typing_line} ) {
      my @after = $self->{scroller}->pop;
      $self->SUPER::append_line( @_ );
      $self->{scroller}->push( @after );
   }
   else {
      $self->SUPER::append_line( @_ );
   }
}

sub set_typing_line
{
   my $self = shift;
   my ( $line ) = @_;

   $self->{scroller}->pop if delete $self->{typing_line};

   # No timestamp
   local $self->{timestamp_format};
   $self->SUPER::append_line( $self->{typing_line} = $line ) if $line;
}

sub still_typing
{
   my $self = shift;

   my $timer = $self->{typing_grace_timer};
   if( $timer->is_running ) {
      $timer->reset;
   }
   else {
      $self->{room}->typing_start;
      $timer->start;
   }
}

sub update_headline
{
   my $self = shift;
   my $room = $self->{room};

   $self->{headline}->set_text( $room->topic // "" );
}

sub update_member_presence
{
   my $self = shift;
   my ( $member ) = @_;

   return; # TODO

   my $user = $member->user;
   my $user_id = $user->user_id;

   my $presence_userids = $self->{presence_userids};

   # Find an existing row if we can
   my $rowidx;
   $presence_userids->[$_] eq $user_id and $rowidx = $_, last
      for 0 .. $#$presence_userids;

   my $presence_table = $self->{presence_table};

   if( defined $rowidx and !defined $member->membership ) {
      splice @$presence_userids, $rowidx, 1, ();
      $presence_table->delete_row( $rowidx+1 );
      return;
   }

   my ( $w_name, $w_since, $w_power );
   if( defined $rowidx ) {
      ( $w_name, $w_since, $w_power ) = $presence_table->get_row( $rowidx+1 );
   }
   else {
      $presence_table->append_row( [
         $w_name  = Tickit::Widget::Static->new( text => "" ),
         $w_since = Tickit::Widget::Static->new( text => "" ),
         $w_power = Tickit::Widget::Static->new( text => "-", class => "level" ),
      ] );
      push @$presence_userids, $user_id;
   }

   $w_name->set_style( fg => $PRESENCE_STATE_TO_COLOUR{$user->presence} )
      if defined $user->presence;

   my $dname = defined $member->displayname ? $member->displayname : "[".$user->user_id."]";
   $dname = substr( $dname, 0, 17 ) . "..." if length $dname > 20;
   $w_name->set_text( $dname );

   if( defined $user->last_active ) {
      $w_since->set_text( strftime "%Y/%m/%d %H:%M", localtime $user->last_active );
   }
   else {
      $w_since->set_text( "    --    " );
   }

   if( defined( my $level = $self->{room}->member_level( $user_id ) ) ) {
      $w_power->set_text( $level );
      $w_power->set_style( fg => ( $level > 0 ) ? "yellow" : undef );
   }
   else {
      $w_power->set_text( "-" );
   }
}



( run in 2.479 seconds using v1.01-cache-2.11-cpan-98e64b0badf )