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 )