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 )