App-MatrixClient
view release on metacpan or search on metacpan
lib/App/MatrixClient/RoomTab.pm view on Meta::CPAN
package App::MatrixClient::RoomTab;
use 5.014; # s///r
use strict;
use warnings;
use base qw( Tickit::Console::Tab );
use List::Util 1.33 qw( any );
use POSIX qw( strftime );
use Convert::Color::XTerm;
use Future;
use Image::ExifTool;
use IO::Async::Timer::Countdown;
use Net::Async::Matrix::Utils qw( parse_formatted_message );
use Tickit::Widgets qw( Frame GridBox ScrollBox Static VBox );
Tickit::Widget::Frame->VERSION( '0.31' ); # bugfix to linetypes in constructor
use constant TYPING_GRACE_SECONDS => 5;
my %PRESENCE_STATE_TO_COLOUR = (
offline => "grey",
unavailable => "orange",
online => "green",
);
sub _setup
{
my $self = shift;
my %args = @_;
my $room = $self->{room} = $args{room};
my $floatbox = $args{floatbox};
$self->{$_} = $args{$_} for qw( dist url_base );
$self->{headline} = $args{headline};
$self->{presence_table} = my $presence_table = Tickit::Widget::GridBox->new(
col_spacing => 1,
);
$self->{presence_userids} = \my @presence_userids;
$presence_table->add( 0, 0, Tickit::Widget::Static->new( text => "Name" ) );
$presence_table->add( 0, 1, Tickit::Widget::Static->new( text => "Since" ) );
$presence_table->add( 0, 2, Tickit::Widget::Static->new( text => "Lvl" ) );
# Create an abstract widget tree during initial loading to avoid the
# O(n^2) overhead of resizing the gridbox after -every- user is added.
my $vbox = Tickit::Widget::VBox->new;
$vbox->add(
Tickit::Widget::ScrollBox->new(
child => $presence_table,
vertical => "on_demand",
horizontal => 0,
),
expand => 1,
);
$vbox->add(
my $presence_summary = Tickit::Widget::Static->new( text => "" )
);
my $presence_float;
my $visible = 0;
$self->bind_key( 'F2' => sub {
$visible ? ( $presence_float->hide, $visible = 0 )
: ( $presence_float->show, $visible = 1 );
});
$room->configure(
on_synced_state => sub {
$self->set_name( $room->name );
$self->update_headline;
# Fetch initial presence state of users
foreach my $member ( $room->joined_members ) {
$self->update_member_presence( $member );
}
$presence_summary->set_text(
sprintf "Total: %d users", scalar $room->joined_members
);
$room->paginate_messages( limit => 150 );
# Only now should we add the presence table to the floatbox
$presence_float = $floatbox->add_float(
child => Tickit::Widget::Frame->new(
style => {
linetype => "none",
linetype_left => "single",
frame_fg => "white", frame_bg => "purple",
},
child => $vbox,
),
top => 0, bottom => -1, right => -1,
left => -44,
# Initially hidden
hidden => 1,
);
},
on_message => sub {
my ( undef, $member, $content, $event ) = @_;
$self->append_line( $self->format_message( $content, $member ),
indent => 10,
time => ( $event->{origin_server_ts} // $content->{hsob_ts} ) / 1000,
);
},
on_back_message => sub {
my ( undef, $member, $content, $event ) = @_;
( run in 0.494 second using v1.01-cache-2.11-cpan-5b529ec07f3 )