Peopleイベントハンドラ


on_roster_request

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

SYNOPSIS
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を要求するかどうか

Ocean::Stanza::DeliveryRequestBuilder::Roster

セッター名 概要
to送信者のFull JID
request_idリクエストID

Ocean::Stanza::DeliveryRequestBuilder::RosterItem

セッター名 概要
jidBare JID
nicknameニックネーム
subscriptionロスター所有者のこのアイテムで表現されるユーザーの関係性
photo_urlプロフィール画像URL

on_vcard_request

vCard要求のIQに対して適切にレスポンスを返します。

ロスター要求について詳しくは、ログインからログアウトまでのケーススタディ [ ロスター要求 ]を参照するとよいでしょう。

また、vCard拡張については、プロトコルガイド - 拡張 [ vCard Based Avatar ]を参照して下さい。

SYNOPSIS
sub 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
tovCardのオーナーのBare JID
idリクエストID
want_photo_url拡張仕様によって、プロフィール画像をバイナリ値のBase64エンコード文字列ではなく、URLで取得したいかどうか

Ocean::Stanza::DeliveryRequestBuilder::vCard

セッター名 概要
to送信者のFull JID
request_idリクエストID
jidBare JID
nicknameニックネーム
photo_urlプロフィール画像のURL
photo_content_typeプロフィール画像のMIME Type
photoプロフィール画像のバイナリをBase64エンコードした文字列