クライアントからのロスター要求に答えるために、このイベントハンドラを実装します。
ロスター要求について詳しくは、ログインからログアウトまでのケーススタディ [ ロスター要求 ]を参照するとよいでしょう。
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エンコードした文字列 |