メッセージ配信に関するイベントはMessageイベントカテゴリとなり、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 ]を参照して下さい。 |
| html | HTMLバージョンの本文。プロトコルガイド - 拡張 [ XHTML IM ]を参照して下さい。 |
一般的には、適切な相手に、そのままメッセージを配信するだけの処理になります。Ocean::Stanza::DeliveryRequestBuilder::ChatMessageを利用するとよいでしょう。
| セッター名 | 概要 |
|---|---|
| from | 送信者のJID |
| to | 宛先のFull JID |
| body | メッセージ本文 |
| subject | メッセージタイトル |
| thread | スレッドコード |
| state | ステートタイプ。プロトコルガイド - 拡張 [ Chat State ]を参照して下さい。 |
| html | HTMLバージョンの本文。プロトコルガイド - 拡張 [ XHTML IM ]を参照して下さい。 |