App-MatrixClient
view release on metacpan or search on metacpan
lib/App/MatrixClient/RoomTab.pm view on Meta::CPAN
$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 ) = @_;
$self->prepend_line( $self->format_message( $content, $member ),
indent => 10,
time => ( $event->{origin_server_ts} // $content->{hsob_ts} ) / 1000,
);
},
on_membership => sub {
my ( undef, $action_member, $event, $target_member, %changes ) = @_;
$self->update_member_presence( $target_member );
if( $changes{membership} and ( $changes{membership}[1] // "" ) eq "invite" ) {
$self->append_line( format_invite( $action_member, $target_member ),
time => ( $event->{origin_server_ts} // $event->{ts} ) / 1000,
);
}
elsif( $changes{membership} ) {
# On a LEAVE event they no longer have a displayname
$target_member->displayname = $changes{displayname}[0] if !defined $changes{membership}[1];
$self->append_line( format_membership( $changes{membership}[1] // "leave", $target_member ),
time => ( $event->{origin_server_ts} // $event->{ts} ) / 1000,
);
}
elsif( $changes{displayname} ) {
$self->append_line( format_displayname_change( $target_member, @{ $changes{displayname} } ) );
}
elsif( $changes{level} ) {
$self->append_line( format_memberlevel_change( $action_member, $target_member, $changes{level}[1] ),
time => ( $event->{origin_server_ts} // $event->{ts} ) / 1000,
);
}
$presence_summary->set_text(
sprintf "Total: %d users", scalar $room->joined_members
);
},
( run in 1.853 second using v1.01-cache-2.11-cpan-e1769b4cff6 )