使ってみよう! Windows Live SDK/API

第12回 Live Messenger Library ―― オリジナルLive Messengerの作成(中編)

この記事を読むのに必要な時間:およそ 9 分

メンバーの表示

ユーザのプレゼンスの表示の次は,ユーザが登録しているメンバーの一覧を表示できるようにしましょう。コンタクトリストとも呼ばれます。手順は次のとおりです。

  1. UserオブジェクトのContactsプロパティ(ContactCollectionクラス型)を参照し,ユーザごとにContactオブジェクトを取得
  2. 各ContactオブジェクトのCurrentAddressプロパティ(IMAddressクラス型)のPropertyChanged イベントの関連付け
  3. Contact.CurrentAddress.Presenceプロパティ(IMAddressPresenceクラス型)の各プロパティ値の取得

メンバーはContactクラスで表されています。メンバーもユーザ同様にIMAddressPresenceオブジェクトがありプレゼンスの取得が可能です。ただし,ユーザがオフラインの場合は取得できません。また表示アイコンの情報は常に取得できないようです。

Contactsプロパティは列挙フィールド(コレクション)として扱えます。GetEnumeratorメソッドにより列挙子を取得して,コレクション内の各アイテムの操作が可能です。列挙子の指す現在のコレクションアイテムはGetCurrentメソッドを使用します。一連の操作は次のコードを参考にしてください。コレクションのGetEnumerator,列挙子のMoveNext,GetCurrentメソッドの組み合わせはこの後もよく出てきます。

Gihyo.LiveSample.signInCompletedメソッド内に処理を追加していきます。すべてのメンバーに対してGihyo.LiveSample.memberPresencePropertyChangedメソッドにPropertyChangedイベントを関連付けています。

var contacts = Gihyo.LiveSample.User.get_contacts().getEnumerator();
while (contacts.moveNext()) {
    var c = contacts.get_current();
    var address = c.get_currentAddress();
    address.get_presence().add_propertyChanged(Delegate.create(null, Gihyo.LiveSample.memberPresencePropertyChanged));
}

Gihyo.LiveSample.memberPresencePropertyChangedメソッドを記述します。ここで実際にメンバー全員のプレゼンスを取得し,ページに表示名と状態をリスト表示します。メンバーがオフラインだった場合は表示名の代わりにContact.CurrentAddress.Addressプロパティからアカウントアドレスを表示することにします。

Gihyo.LiveSample.memberPresencePropertyChanged = function(sender, e) {
    var contacts = Gihyo.LiveSample.User.get_contacts().getEnumerator();
    var sb = new StringBuilder();

    while (contacts.moveNext()) {
        var c = contacts.get_current();
        var address = c.get_currentAddress();
        var presence = address.get_presence();

        var status = presence.get_status();
        var displayName = presence.get_displayName();

        sb.append('<li>');
        sb.append((displayName != '') ? displayName : address.get_address());
        sb.append('(' + Enum.toString(Microsoft.Live.Messenger.PresenceStatus, status) + ')');
        sb.append('</li>');
    }
    $('contacts').innerHTML = '<ul>' + sb.toString() + '</ul>';
}

ここまでを実行すると図3のようになります。メンバーの情報が変更されるたびに表示が更新されると思います。ふたつのアカウントを用いて確認してみてください。

図3 メンバーの表示

図3 メンバーの表示

会話の管理

各メンバーとの会話は,会話ごとにMicrosoft.Live.Messenger.Conversationオブジェクトを用いて管理します。少なくとも以下の処理が必要になります。

  • 会話ごとにConversationオブジェクトの生成(メッセージ受信により新たに会話が発生した場合は自動で作成される)
  • ConversationオブジェクトのSendMessageメソッドによるメッセージの送信
  • ConversationオブジェクトのMessageReceivedイベントにメソッドを関連付け,メッセージ受信の処理

今回作成するアプリケーションでは,現在のアクティブな会話を一覧表示するようにします。メンバーをクリックすると新たに会話を作成し一覧を更新します。またメッセージ受信により新たな会話が発生した場合も一覧を更新します。メッセージの表示は一覧から選択した会話のみページに表示するようにします。メッセージの送信も選択した会話に対して行います。

以上の点について順に説明していきます。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp