Net-Async-Matrix
view release on metacpan or search on metacpan
lib/Net/Async/Matrix/Room.pm view on Meta::CPAN
$self->_handle_event( ephemeral => $event );
}
if( $initial ) {
$self->await_synced->done;
$self->maybe_invoke_event( on_synced_state => );
}
}
sub _incoming_sync_leave
{
my $self = shift;
my ( $sync ) = @_;
# don't care for now
}
sub await_synced
{
my $self = shift;
return $self->{synced_future} //= $self->loop->new_future;
}
=head2 live_state
$state = $room->live_state
Returns a L<Net::Async::Matrix::Room::State> instance representing the current
live-tracking state of the room.
This instance will mutate and change as new state events are received.
=cut
sub live_state
{
my $self = shift;
return $self->{live_state};
}
sub _handle_state_event
{
my $self = shift;
my ( $old_event, $new_event, $state ) = @_;
my $old_content = $old_event->{content};
my $new_content = $new_event->{content};
my %changes;
$changes{$_}->[0] = $old_content->{$_} for keys %$old_content;
$changes{$_}->[1] = $new_content->{$_} for keys %$new_content;
$_->[1] //= undef for values %changes; # Ensure deleted key values become undef
_delete_null_changes \%changes;
my $member = $state->member( $new_event->{sender} );
my $type = $new_event->{type};
$type =~ m/^m\.room\.(.*)$/;
my $method = $1 ? "_handle_state_event_" . join( "_", split m/\./, $1 ) : undef;
if( $method and my $code = $self->can( $method ) ) {
$self->$code( $member, $new_event, $state, %changes );
}
else {
$self->maybe_invoke_event( on_state_changed =>
$member, $new_event, %changes
);
}
}
sub _handle_event
{
my $self = shift;
my ( $direction, $event ) = @_;
$event->{type} =~ m/^(m\.room\.)?(.*)$/ or return;
my $base = $1 ? "_handle_roomevent_" : "_handle_event_";
my $method = $base . join( "_", split( m/\./, $2 ), $direction );
if( my $code = $self->can( $method ) ) {
$code->( $self, $event );
}
else {
warn "TODO: $direction event $event->{type}\n";
}
}
sub _handle_state_backward
{
my $self = shift;
my ( $field, $event ) = @_;
my $newvalue = $event->{content}{$field};
my $oldvalue = $event->{prev_content}{$field};
$self->maybe_invoke_event( on_back_state_changed =>
$self->{back_members_by_userid}{$event->{user_id}}, $event,
$field => [ $newvalue, $oldvalue ]
);
}
=head2 room_id
$id = $room->room_id
Returns the opaque room ID string for the room. Usually this would not be
required, except for long-term persistence uniqueness purposes, or for
inclusion in direct protocol URLs.
=cut
sub room_id
{
my $self = shift;
return $self->{room_id};
}
=head2 name
( run in 2.080 seconds using v1.01-cache-2.11-cpan-71847e10f99 )