App-MatrixClient

 view release on metacpan or  search on metacpan

lib/App/MatrixClient.pm  view on Meta::CPAN

=back

=cut

sub new
{
   my $class = shift;
   my %args = @_;

   my $loop = $args{loop} // IO::Async::Loop->new;
   my $dist = $args{dist} // Event::Distributor->new;

   $dist->declare_signal( $_ ) for
      qw( start log logerr );

   my $console = Tickit::Console->new(
      timestamp_format => String::Tagged->new_tagged( "%H:%M ", fg => undef )
         ->apply_tag( 0, 5, fg => "hi-blue" ),
      datestamp_format => String::Tagged->new_tagged( "-- day is now %Y/%m/%d --",
         fg => "grey" ),
   );

   my $self = bless {
      loop    => $loop,
      dist    => $dist,
      console => $console,

      ( map { $_ => $args{$_} } qw( server ssl ) ),
   }, $class;

   $dist->subscribe_sync( log => sub {
      shift;
      $self->log( @_ );
   });

   $dist->subscribe_sync( logerr => sub {
      shift;
      $self->append_line_colour( red => join " ", @_ );
   });

   $dist->subscribe_sync( $_ => $self->${\"curry::$_"} ) for
      qw( on_invite on_user_displayname on_user_presence on_room_new on_room_del );

   my $globaltab = $self->{globaltab} = $console->add_tab(
      name => "Global",
      on_line => sub {
         my ( $tab, $line ) = @_;
         $self->do_command( $line, $tab );
      },
   );

   $self->{tickit} = Tickit::Async->new( root => $console );
   $loop->add( $self->{tickit} );

   my %tabs_by_roomid;

   push @{ $self->{components} }, App::MatrixClient::Matrix->new(
      loop => $loop,
      dist => $dist,

      ( map { $_ => $args{$_} } qw( server ssl user_id password ) ),
   );

   {
      # Much hackery in here...
      my $entry = $console->{entry};

      my $old_on_key = Tickit::Widget::Entry->can( 'on_key' );
      no warnings 'redefine';
      *Tickit::Widget::Entry::on_key = sub {
         my $ret = $old_on_key->( @_ );
         if( $ret and $_[0] == $entry ) {
            my $tab = $console->active_tab;
            $tab->still_typing if $tab->can( 'still_typing' );
         }
         return $ret;
      };
   }

   return $self;
}

sub run
{
   my $self = shift;

   local $SIG{__WARN__} = sub {
      my $msg = join " ", @_;
      $self->append_line_colour( orange => join " ", @_ );
   };

   $self->{dist}->fire_sync( start => );

   $self->{tickit}->run;
}


# Signal handlers

sub on_invite
{
   my $self = shift;
   my ( undef, $event ) = @_;

   $self->{globaltab}->append_line( String::Tagged->new
      ->append_tagged( " ** " )
      ->append_tagged( $event->{inviter}, fg => "grey" )
      ->append_tagged( " invites you to " )
      ->append_tagged( $event->{room_id}, fg => "cyan" )
   );

   # TODO: consider whether we should look up user displayname, room name,
   # etc...
}

sub on_user_displayname
{
   my $self = shift;
   my ( undef, $user, $oldname ) = @_;

   $self->append_line_colour( yellow => " * $oldname is now called " . make_username($user) );



( run in 2.058 seconds using v1.01-cache-2.11-cpan-5b529ec07f3 )