Messageイベントハンドラ

メッセージ配信に関するイベントはMessageイベントカテゴリとなり、Messageイベントハンドラで実装します。


on_message

メッセージの送信リクエストのイベントです。

実装例は次のようになります。ここではそのまま配送するのみになっていますが、「スパム対策などのため、友人にしかメッセージを送らせないようにする」というような仕様にしたい場合には、検証処理を入れておくとよいでしょう。

SYNOPSIS
sub on_message {
    my ($self, $ctx, $args) = @_;

    my $sender_jid   = $args->from;
    my $receiver_jid = $args->to;

    my $receiver = 
        $ctx->get('db')->find_user_by_username($receiver_jid->node);
    return unless $receiver;

    my @conns = $ctx->get('db')->search_available_connection_by_username( 
        $receiver_jid->node );

    for my $conn ( @conns ) {

        my $builder = 
            Ocean::Stanza::DeliveryRequestBuilder::ChatMessage->new;

        my $to_jid = Ocean::JID->build(
            $conn->username,
            $self->domain,
            $conn->resource,
        );

        $builder->to($to_jid);
        $builder->from($sender_jid);
        $builder->body($args->body);
        $builder->html($args->html);
        $builder->thread($args->thread);
        $builder->state($args->state);

        $ctx->deliver($builder->build());

    }
}

引数としてOcean::HandlerArgs::Messageを受け取ります。このオブジェクトは次のアクセサを持ちます。

アクセサ名 概要
from送信者のFull JID
to宛先のJID。Bare JIDの場合とFull JIDの場合があります。
bodyメッセージ本文
threadスレッドコード
stateステートタイプ。プロトコルガイド - 拡張 [ Chat State ]を参照して下さい。
htmlHTMLバージョンの本文。プロトコルガイド - 拡張 [ XHTML IM ]を参照して下さい。

一般的には、適切な相手に、そのままメッセージを配信するだけの処理になります。Ocean::Stanza::DeliveryRequestBuilder::ChatMessageを利用するとよいでしょう。

Ocean::Stanza::DeliveryRequestBuilder::ChatMessage

セッター名 概要
from送信者のJID
to宛先のFull JID
bodyメッセージ本文
subjectメッセージタイトル
threadスレッドコード
stateステートタイプ。プロトコルガイド - 拡張 [ Chat State ]を参照して下さい。
htmlHTMLバージョンの本文。プロトコルガイド - 拡張 [ XHTML IM ]を参照して下さい。