Circle-Net-Matrix
view release on metacpan or search on metacpan
lib/Circle/Net/Matrix/Room.pm view on Meta::CPAN
# You may distribute under the terms of the GNU General Public License
#
# (C) Paul Evans, 2014-2017 -- leonerd@leonerd.org.uk
package Circle::Net::Matrix::Room;
use strict;
use warnings;
use base qw( Tangence::Object Circle::WindowItem );
our $VERSION = '0.03';
use Data::Dump qw( pp );
use Scalar::Util qw( weaken );
use Net::Async::Matrix::Utils qw( parse_formatted_message build_formatted_message );
use Circle::TaggedString;
use Circle::Net::Matrix::Utils qw( parse_markdownlike );
# To allow for out-of-tree development, use an inline Tangence class
# declaration instead of a .tan file
#
# class Circle.Net.Matrix.Room {
# isa Circle.WindowItem;
#
# smashed prop name = str;
# smashed prop topic = str;
# }
sub DECLARE_TANGENCE
{
Tangence::Class->declare( __PACKAGE__,
props => {
name => {
dim => Tangence::Constants::DIM_SCALAR,
type => 'str',
},
},
superclasses => [qw( Circle::WindowItem )],
);
}
sub WEAKSELF_EVAL
{
my ( $self, $method ) = @_;
my $code = $self->can( $method ) or return sub {};
weaken( $self );
return sub {
my @args = @_;
eval { $self->$code( @args ); 1 } or
warn $@;
};
}
sub init_prop_topic { "" }
sub new
{
my $class = shift;
my %args = @_;
my $self = $class->SUPER::new( @_ );
my $room = $self->{room} = $args{room};
$self->set_prop_name( $room->room_id );
$self->set_prop_tag( $room->room_id );
$self->{root} = $args{root};
$self->{net} = $args{net};
weaken( my $weakself = $self );
$room->configure(
on_synced_state => $self->WEAKSELF_EVAL( 'on_synced_state' ),
on_message => $self->WEAKSELF_EVAL( 'on_message' ),
on_membership => $self->WEAKSELF_EVAL( 'on_membership' ),
on_state_changed => $self->WEAKSELF_EVAL( 'on_state_changed' ),
on_members_typing => $self->WEAKSELF_EVAL( 'on_members_typing' ),
on_read_receipt => $self->WEAKSELF_EVAL( 'on_read_receipt' ),
);
# TODO: this entire state-watching system likely wants to be migrated into
# NaMatrix itself
$self->{state_watches} = {
'm.room.name' => $self->can( 'on_state_name' ),
'm.room.topic' => $self->can( 'on_state_topic' ),
'm.room.member*' => $self->can( 'on_state_members' ),
'm.room.join_rules' => $self->can( 'on_state_permission' ),
'm.room.history_visibility' => $self->can( 'on_state_permission' ),
};
return $self;
}
# Convenience accessor
sub name
{
my $self = shift;
return $self->get_prop_name;
}
sub enumerable_name
{
my $self = shift;
return $self->name;
}
sub get_prop_tag
{
my $self = shift;
return $self->name;
}
sub parent
{
my $self = shift;
return $self->{net};
}
sub commandable_parent
{
my $self = shift;
return $self->parent;
}
sub on_synced_state
{
my $self = shift;
my $room = $self->{room};
( run in 0.809 second using v1.01-cache-2.11-cpan-39bf76dae61 )