2017-09-19 15 views
1

私はMatrixサーバに接続するボットを作成しています。そのために私はNet::Async::Matrixを使用します。Perl:祝福されたオブジェクトの問題

コード:

#!/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に失敗しました - オブジェクト 'm1ndgamesが見つかりました :test'、allow_blessed、convert_blessedも allow_tags設定が有効(またはTO_JSON/FREEZEメソッドがありません) /usr/local/share/perl/5.24.1/Net/Async/Matrix.pm行292

と私はそれを理解していません。体にtestのような文字列を入力すると、部屋に送られます。

答えて

2

parse_formatted_messageは、String :: Taggedオブジェクトを返します。このクラスは連結をオーバーロードし、"$sendername said: $msg"もString :: Taggedオブジェクトを返すようにします。このオブジェクトはsendmsgに渡され、JSONにシリアル化しようとしますが、オブジェクトのシリアル化は拒否されます。

修正:

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

おかげで

my $msg = parse_formatted_message($content); 

交換してください!これが原因でした! – m1ndgames

0

私はこれが引用エラーであると思います。あなたは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あなたはこのサブによって処理されて送信され、その後、実際のメッセージが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を期待していますが、実際にはそれを取得していません。

あなたのメッセージで:を削除してみてください。悪い引用が起こっていると思います。しかし、サーバー側のコードを見ることなく、私はかなり伝えることはできません。

関連する問題