App-MatrixClient

 view release on metacpan or  search on metacpan

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

   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( "-" );
   }
}

sub format_message
{
   my $self = shift;
   my ( $content, $member ) = @_;

   my $s = String::Tagged->new;

   my $formatted_body = parse_formatted_message( $content );
   my $msgtype = $content->{msgtype};

   # Convert $body into something Tickit::Widget::Scoller will understand
   my $body = String::Tagged->clone( $formatted_body,
      only_tags => [qw( bold under italic reverse fg bg )],
      convert_tags => {
         bold    => "b",
         under   => "u",
         italic  => "i",
         reverse => "rv",
         fg      => sub { fg => $_[1]->as_xterm->index },
         bg      => sub { bg => $_[1]->as_xterm->index },
      },
   );

   my $content_url;
   if( $content->{url} ) {
      my $uri = URI->new( $content->{url} );
      if( $uri->scheme eq "mxc" ) {
         $content_url = $self->{url_base} . "/_matrix/media/v1/download/" . $uri->authority . $uri->path;
      }
      else {
         $content_url = "$uri";
      }
   }

   if( $msgtype eq "m.text" ) {
      return $s
         ->append_tagged( "<", fg => "magenta" )
         ->append( format_displayname( $member ) )
         ->append_tagged( "> ", fg => "magenta" )
         ->append       ( $body );
   }
   elsif( $msgtype eq "m.emote" ) {
      return $s
         ->append_tagged( "* ", fg => "magenta" )
         ->append( format_displayname( $member ) )
         ->append_tagged( " " )
         ->append       ( $body );
   }
   elsif( $msgtype eq "m.notice" ) {
      return $s
         ->append_tagged( "--", fg => "red" )
         ->append( format_displayname( $member ) )
         ->append_tagged( "-- ", fg => "red" )
         ->append       ( $body );
   }
   # Handle all the four attachment-style messages similarly
   elsif( any { $msgtype eq $_ } qw( m.image m.audio m.video m.file ) ) {
      my $info = $content->{info} // $content->{body}; # cope with older message format

      $s->append_tagged( "[" )
        ->append( format_displayname( $member ) )
        ->append_tagged( "] " )
        ->append_tagged( $msgtype =~ s/^m\.//r, fg => "yellow" );

      if( defined $info->{mimetype} ) {
         $s->append_tagged( "; $info->{mimetype}", fg => "grey" );
      }
      if( defined( my $bytes = $info->{size} ) ) {
         $s->append_tagged( "; " . format_bytes( $bytes ), fg => "grey" );
      }

      if( $msgtype eq "m.image" ) {
          $s->append_tagged( " ($info->{w}x$info->{h})", fg => "grey" );
      }
      elsif( $msgtype eq "m.audio" ) {



( run in 1.491 second using v1.01-cache-2.11-cpan-98e64b0badf )