Search code examples
perlmatrix-synapse

Perl: Issue with blessed object


I am creating a bot that connects to a Matrix server. For that I use Net::Async::Matrix.

The code:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Async::Matrix;
use Net::Async::Matrix::Utils qw ( parse_formatted_message );
use IO::Async::Loop;
use Data::Dumper;


my $loop = IO::Async::Loop->new;

my $matrix = Net::Async::Matrix->new(
server => 'matrix.server.net',
    on_error => sub {
            my ( undef, $message ) = @_;
            warn "error: $message\n";
    },
);
$loop->add( $matrix );

$matrix->login(
    user_id  => '@bot:matrix.server.net',
    password => 'password',
)->get;

my $room = $matrix->join_room( '#Lobby:matrix.server.net' )->get;

$room->configure(
    on_message => sub {
            my ( undef, $member, $content, $event ) = @_;
            my $msg = parse_formatted_message( $content );
            my $sendername = $member->displayname;
print Dumper $sendername;
            &sendmsg("$sendername said: $msg");
    },
);

my $stream = $matrix->start;

sub sendmsg {
        my $input = shift;
        if ($input) {
                $room->send_message(
                        type => "m.text",
                        body => $input,
                 ),
        }
}

$loop->run;

Basically, I want the bot to echo what was said.

I get following output:

$VAR1 = 'm1ndgames'; Longpoll failed - encountered object 'm1ndgames said: test', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at /usr/local/share/perl/5.24.1/Net/Async/Matrix.pm line 292.

and I don't understand it. When I enter a string like test into the body, it gets sent to the room.


Solution

  • parse_formatted_message returns a String::Tagged object. This class overloads concatenation so that "$sendername said: $msg" also returns a String::Tagged object. This object is passed to sendmsg which tries to serialize it into JSON, but it refuses to serialize objects.

    Fix: Replace

    my $msg = parse_formatted_message( $content );
    

    with

    my $msg = parse_formatted_message( $content )->str;