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

第37回 Live Messenger Web Toolkit──WebサイトにLive Messenger機能を追加(5)

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

メッセージの送信

続いて,インスタントメッセージの送信です。オンラインのメンバーをひとり選択し,その相手にメッセージを送信します。メッセージの送信はメールのように特定の相手へ向けた発信のように思えますが,実際は少し異なります。メッセージを送るには,まず自分と相手との会話(Conversationオブジェクト)を作成し,その会話に対してメッセージを送信します。今回のアプリケーションは複数人で一緒の会話には対応していませんが,複数のメンバーとの会話は,ふたりの会話に新たにメンバーを追加して,その会話に対してメッセージを送信することで実現します。

メッセージを送信するコードは次のようになります。ここでは,送信相手のCIDと送信するテキストを受け取る関数を定義しています。

function sendMessage(cid, text) {
    if (!cid || !text) return;

    var contact = User.get_onlineContacts().findByCid(cid);
    if (!contact) return;

    // メッセージの作成
    var message = new Microsoft.Live.Messenger.TextMessage(text);

    // 会話の作成とメッセージの送信
    var conv = User.get_conversations().create(contact);
    conv.sendMessage(message);

    // メッセージの表示
    var userCid = User.get_presence().get_imAddress().get_cid(); // サインインユーザーの CID
    showMessage(userCid, text);
}

送信するメッセージは文字列からTextMessageオブジェクトを生成して使います。TextMessageクラス以外にもシェイクを表すNudeMessageクラスやアプリケーション独自のメッセージを定義できるApplicationMessageクラスがライブラリーには用意されています。

会話はConversationクラスで表します。User.Conversationsプロパティからサインインユーザーの現在のConversationコレクションを参照でき,Createメソッドで指定したユーザーとの会話を新たに作成します。メッセージの送信は,ConversationオブジェクトのSendMessageメソッドを使います。

同じユーザー相手へのメッセージでも毎回新たに会話を作成するように見えますが,Createメソッドは既に送信相手との会話が作成されていた場合,既存のConversationオブジェクトを返すので問題ありません。メッセージ送信後のコードにあるshowMessage関数は,後で作成します。

送信ボタンをクリックすると上記の関数を実行するようにしておきましょう。

$(function () {            
    $("#sendButton").click(
        function () {
            if (!User) return false;

            var cid = $("#onlineContacts").val();
            var text = $("#text").val();

            // メッセージの送信
            sendMessage(cid, text);

            // 入力されたテキストから検索
            search(text, cid);
            $("#text").val("");
            return false;
        });
});

メッセージの受信

次はインスタントメッセージの受信です。これも送信と同じくConversationオブジェクトを使います。メッセージを受信するとConversationクラスのMessageReceivedイベントが起きるので,そのイベント引数から受信メッセージを得ます。これを実現するには,まずUserオブジェクトのConversationオブジェクトのコレクションの変更を監視し,新しいオブジェクトが追加されたときMessageReceivedイベントを関数に関連付けておきます。

コレクションの変更イベントは,onSignedIn関数内に次のように記述し,関連付けていました。

User.get_conversations().add_collectionChanged(conversationCollectionChanged);

関連付けたconversationCollectionChanged関数は次のように追記します。

function conversationCollectionChanged(sender, e) {
    // 追加された Conversation オブジェクト取得
    var items = e.get_newItems();

    // MessageReceived イベントと関連付け
    $.each(items, function () {
        if (!this.get_closed()) {
            this.add_messageReceived(messageReceived);
        }
    });
}

そしてMessageReceivedイベントで呼ばれる関数は次のように記述します。

function messageReceived(sender, e) {
    switch (e.get_message().get_type()) {
        case Microsoft.Live.Messenger.MessageType.textMessage:
            // Message オブジェクト参照
            var message = e.get_message();

            // 送信者の Contact オブジェクト取得
            var contact = User.get_contacts().findByAddress(message.get_sender());
            if (contact) {                        
                var cid = contact.get_cid(); // 送信者の CID
                var text = message.get_text(); // 受信メッセージのテキスト

                // 受信メッセージの表示
                showMessage(cid, text);

                // メッセージのテキストから検索
                search(text, cid);
            }
            break;
        default:
            break;
    }
}

受信したメッセージの種類を調べ,TextMessageオブジェクトのみ処理しています。Messageオブジェクトには上記のSenderプロパティやTextプロパティ以外にも,オフラインメッセージかどうかを示すIsOfflineMessageプロパティやタイムスタンプのTimestampプロパティなどがあります。

著者プロフィール

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

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

URL:http://katamari.jp