App-MatrixClient

 view release on metacpan or  search on metacpan

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


   * on_room_new( $room )
   * on_room_del( $room )

=head1 CONSUMED SIGNALS

   start

   * do_upload( file => $file, content_type => $type )

   * do_get_displayname( ?$user_id ) => $displayname
   * do_set_displayname( $displayname )

   * do_set_presence( $state, ?$msg )

   * do_add_alias( $alias, $room_id )
   * do_del_alias( $alias )

   * do_room_create( $name ) => $event
   * do_room_join( $name )
   * do_room_leave( $room_id )
   * do_room_msg( $room_id, $message )

=cut

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

   my $loop = $args{loop};
   my $dist = $args{dist};

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

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

   $dist->declare_signal( $_ ) for
      qw( on_invite on_user_displayname on_user_presence on_room_new on_room_del );

   $dist->declare_action( $_ ) for qw(
      do_upload do_get_displayname do_set_displayname do_set_presence
      do_add_alias do_del_alias
      do_room_create do_room_join do_room_leave do_room_msg
   );

   $dist->subscribe_async( $_ => $self->${\"curry::$_"} ) for qw(
      start
      do_upload do_get_displayname do_set_displayname do_set_presence
      do_add_alias do_del_alias
      do_room_create do_room_join do_room_leave do_room_msg
   );

   $self->{matrix} = Net::Async::Matrix->new(
      server => $args{server},
      ( $args{ssl} ? (
         SSL             => 1,
         SSL_verify_mode => 0,
      ) : () ),

      on_log => $dist->curry::fire_sync( 'log' ),

      on_presence => sub {
         my ( undef, $user, %changes ) = @_;

         if( exists $changes{presence} ) {
            $dist->fire_sync( on_user_presence => $user );
         }
         elsif( exists $changes{displayname} ) {
            $dist->fire_sync( on_user_displayname => $user, $changes{username}[0] );
         }
      },
      on_room_new => sub {
         my ( undef, $room ) = @_;
         $dist->fire_sync( on_room_new => $room );
      },
      on_room_del => sub {
         my ( undef, $room ) = @_;
         $dist->fire_sync( on_room_del => $room );
      },
      on_error => sub {
         my ( undef, $failure, $name ) = @_;

         $dist->fire_sync( logerr => "Error: $failure" );

         if( $name eq "http" ) {
            my ( undef, undef, undef, $response, $request ) = @_;
            $dist->fire_sync( logerr => "  ".$request->uri->path_query );
            $dist->fire_sync( logerr => "  ".$response->content );
         }
      },

      on_invite => sub {
         my ( undef, $event ) = @_;
         $dist->fire_sync( on_invite => $event );
      },
   );

   $loop->add( $self->{matrix} );

   return $self;
}

# Signal handlers

sub start
{
   my $self = shift;

   defined $self->{user_id} or
      return Future->done;

   print STDERR "Logging in as $self->{user_id}...\n";
   $self->{matrix}->login(
      map { $_ => $self->{$_} } qw( user_id password )
   );
}



( run in 1.971 second using v1.01-cache-2.11-cpan-98e64b0badf )