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 )