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 )