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 )