クライアントからのロスター要求に答えるために、このイベントハンドラを実装します。
ロスター要求について詳しくは、ログインからログアウトまでのケーススタディ [ ロスター要求 ]を参照するとよいでしょう。
sub on_roster_request { my ($self, $ctx, $args) = @_; my $sender_jid = $args->from; my $sender = $ctx->get('db')->find_user_by_username( $sender_jid->node ); my %relations; my @followers = $ctx->get('db')->search_followers_of( $sender ); for my $follower_id ( @followers ) { $relations{ $follower_id } = Ocean::Constants::SubscriptionType::FROM; } my @followees = $ctx->get('db')->search_followees_of( $sender ); for my $followee_id ( @followees ) { if (exists $relations{ $followee_id }) { $relations{ $followee_id } = Ocean::Constants::SubscriptionType::BOTH; } else { $relations{ $followee_id } = Ocean::Constants::SubscriptionType::TO; } } my $builder = Ocean::Stanza::DeliveryRequestBuilder::Roster->new; $builder->to($sender_jid); $builder->request_id($args->id); for my $user_id ( sort keys %relations ) { my $user = $ctx->get('db')->find_user_by_id($user_id); next unless $user; my $item_jid = Ocean::JID->build( $user->username, $self->domain ); my $item_builder = Ocean::Stanza::DeliveryRequestBuilder::RosterItem->new; $item_builder->jid($item_jid); $item_builder->nickname($user->nickname); $item_builder->subscription($relations{ $user_id }); $item_builder->photo_url($user->profile_img_url || '') if $args->want_photo_url; $builder->add_item_builder($item_builder); } $ctx->deliver($builder->build()); }
引数としてOcean::HandlerArgs::RosterRequestを受け取ります。このオブジェクトは次のアクセサを持ちます。
アクセサ名 | 概要 |
---|---|
from | 送信者のFull JID |
id | リクエストID |
want_photo_url | (拡張仕様)プロフィール画像のURLを要求するかどうか |
セッター名 | 概要 |
---|---|
to | 送信者のFull JID |
request_id | リクエストID |
セッター名 | 概要 |
---|---|
jid | Bare JID |
nickname | ニックネーム |
subscription | ロスター所有者のこのアイテムで表現されるユーザーの関係性 |
photo_url | プロフィール画像URL |
vCard要求のIQに対して適切にレスポンスを返します。
ロスター要求について詳しくは、ログインからログアウトまでのケーススタディ [ ロスター要求 ]を参照するとよいでしょう。
また、vCard拡張については、プロトコルガイド - 拡張 [ vCard Based Avatar ]を参照して下さい。
SYNOPSISsub on_vcard_request { my ($self, $ctx, $args) = @_; my $sender_jid = $args->from; my $sender = $ctx->get('db')->find_user_by_username( $sender_jid->node ); my $owner_jid = $args->to; my $owner = $ctx->get('db')->find_user_by_username( $owner_jid->node ); unless ($owner) { return; } my $builder = Ocean::Stanza::DeliveryRequestBuilder::vCard->new; $builder->to($sender_jid); $builder->request_id($args->id); $builder->jid($owner_jid); $builder->nickname($owner->nickname); if ($args->want_photo_url) { $builder->photo_url($owner->profile_img_url); } else { $builder->photo_content_type('image/jpeg'); $builder->photo($owner->profile_img_b64); } $ctx->deliver($builder->build()); }
引数としてOcean::HandlerArgs::vCardRequestを受け取ります。このオブジェクトは次のアクセサを持ちます。
アクセサ名 | 概要 |
---|---|
from | 送信者のFull JID |
to | vCardのオーナーのBare JID |
id | リクエストID |
want_photo_url | 拡張仕様によって、プロフィール画像をバイナリ値のBase64エンコード文字列ではなく、URLで取得したいかどうか |
セッター名 | 概要 |
---|---|
to | 送信者のFull JID |
request_id | リクエストID |
jid | Bare JID |
nickname | ニックネーム |
photo_url | プロフィール画像のURL |
photo_content_type | プロフィール画像のMIME Type |
photo | プロフィール画像のバイナリをBase64エンコードした文字列 |