Perl:有福对象的问题
Perl: Issue with blessed object
我正在创建一个连接到 Matrix server. For that I use Net::Async::Matrix 的机器人。
代码:
#!/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;
基本上,我希望机器人回应所说的内容。
我得到以下输出:
$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.
而且我不明白。当我在正文中输入 test
之类的字符串时,它会发送到房间。
我猜这是一个引用错误。如果你看 Net::Async::Matrix::Room
:
sub send_message
{
my $self = shift;
my %args = ( @_ == 1 ) ? ( type => "m.text", body => shift ) : @_;
my $type = $args{msgtype} = delete $args{type} or
croak "Require a 'type' field";
$MSG_REQUIRED_FIELDS{$type} or
croak "Unrecognised message type '$type'";
foreach (@{ $MSG_REQUIRED_FIELDS{$type} } ) {
$args{$_} or croak "'$type' messages require a '$_' field";
}
if( defined( my $txn_id = $args{txn_id} ) ) {
$self->_do_PUT_json( "/send/m.room.message/$txn_id", \%args )
->then_done()
}
else {
$self->_do_POST_json( "/send/m.room.message", \%args )
->then_done()
}
}
你发送的 type
由这个 sub 处理,然后实际的消息被移交给 Net::Async::Matrix
中的 _do_POST_json
。
但是您发送了一个包含 :
的字符串。
所以我认为正在发生的事情是这样编码的:
use JSON;
use Data::Dumper;
my $json = encode_json ( {body => "m1ndgames: said test"});
print Dumper $json;
但是第 292 行返回的响应是:
if( length $content and $content ne q("") ) {
eval {
$content = decode_json( $content );
1;
} or
return Future->fail( "Unable to parse JSON response $content" );
return Future->done( $content, $response );
}
所以我 认为 正在发生的事情是远程服务器向您发送了损坏的错误代码,而模块没有正确处理它 - 它期待 JSON
但它实际上并没有得到它。
我最好的猜测是 - 尝试从您的消息中删除 :
,因为我猜可能会发生一些错误的引用。但是没有看到服务器端的代码,我不太清楚。
parse_formatted_message
returns 一个 String::Tagged 对象。此 class 重载连接,因此 "$sendername said: $msg"
也 returns 一个 String::Tagged 对象。此对象被传递给 sendmsg
,它试图将其序列化为 JSON,但它拒绝序列化对象。
修复:替换
my $msg = parse_formatted_message( $content );
和
my $msg = parse_formatted_message( $content )->str;
我正在创建一个连接到 Matrix server. For that I use Net::Async::Matrix 的机器人。
代码:
#!/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;
基本上,我希望机器人回应所说的内容。
我得到以下输出:
$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.
而且我不明白。当我在正文中输入 test
之类的字符串时,它会发送到房间。
我猜这是一个引用错误。如果你看 Net::Async::Matrix::Room
:
sub send_message
{
my $self = shift;
my %args = ( @_ == 1 ) ? ( type => "m.text", body => shift ) : @_;
my $type = $args{msgtype} = delete $args{type} or
croak "Require a 'type' field";
$MSG_REQUIRED_FIELDS{$type} or
croak "Unrecognised message type '$type'";
foreach (@{ $MSG_REQUIRED_FIELDS{$type} } ) {
$args{$_} or croak "'$type' messages require a '$_' field";
}
if( defined( my $txn_id = $args{txn_id} ) ) {
$self->_do_PUT_json( "/send/m.room.message/$txn_id", \%args )
->then_done()
}
else {
$self->_do_POST_json( "/send/m.room.message", \%args )
->then_done()
}
}
你发送的 type
由这个 sub 处理,然后实际的消息被移交给 Net::Async::Matrix
中的 _do_POST_json
。
但是您发送了一个包含 :
的字符串。
所以我认为正在发生的事情是这样编码的:
use JSON;
use Data::Dumper;
my $json = encode_json ( {body => "m1ndgames: said test"});
print Dumper $json;
但是第 292 行返回的响应是:
if( length $content and $content ne q("") ) {
eval {
$content = decode_json( $content );
1;
} or
return Future->fail( "Unable to parse JSON response $content" );
return Future->done( $content, $response );
}
所以我 认为 正在发生的事情是远程服务器向您发送了损坏的错误代码,而模块没有正确处理它 - 它期待 JSON
但它实际上并没有得到它。
我最好的猜测是 - 尝试从您的消息中删除 :
,因为我猜可能会发生一些错误的引用。但是没有看到服务器端的代码,我不太清楚。
parse_formatted_message
returns 一个 String::Tagged 对象。此 class 重载连接,因此 "$sendername said: $msg"
也 returns 一个 String::Tagged 对象。此对象被传递给 sendmsg
,它试图将其序列化为 JSON,但它拒绝序列化对象。
修复:替换
my $msg = parse_formatted_message( $content );
和
my $msg = parse_formatted_message( $content )->str;