【LyncSDK】IMの受信をキャプチャしてみる

(Lync SDK received text)
前に、相手を指定して、新しい会話を始めるサンプルを作成しました。
会話作成後に交わされたIMをキャプチャしてみます。

準備

LyncSDKをインストールすると、WPFSilverlightのプロジェクトテンプレートが作成されますが、それを使わずにCosnoleApplicationで実装します。

UIフレームワークは不要なでの参照するアセンブリは2つです。
Microsoft.Lync.Model
Microsoft.Lync.Utilities
が参照追加のダイヤログには出てきません。
f:id:orzmakoto:20150628134528p:plain

アセンブリを直接参照して追加する必要があります。
C:\Program Files (x86)\Microsoft Office\Office15\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.dll
C:\Program Files (x86)\Microsoft Office\Office15\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Utilities.dll

実装

IM画面を新しい会話でスタート

Automation automation = LyncClient.GetAutomation();

// IMを送る相手を設定する。
// 複数人に送る場合にはその人数だけリストに追加
List<string> inviteeList = new List<string>();
inviteeList.Add("ninomiya@sample.com");

// IM送信時のオプション設定を構築
var modalitySettings = new Dictionary<AutomationModalitySettings, object>();
modalitySettings.Add(AutomationModalitySettings.SendFirstInstantMessageImmediately, true);

// 呼び出し
IAsyncResult ar = automation.BeginStartConversation(
  AutomationModalities.InstantMessage
  , inviteeList
  , modalitySettings
  , null
  , null);

//新しく開いたウィンドを取得
ConversationWindow conversationWindow = automation.EndStartConversation(ar);

ConversationWindow
新しく開いたIM画面を操作するためのウィンドです。
参加者の情報取得や追加退席、各種変更イベント登録はConversationWindowに行います。

IM受信イベント登録

//メッセージ受信の処理を、IM参加者ごとにイベントを登録
foreach (Participant participant in conversationWindow.Conversation.Participants)
{
  // IM を取得
  InstantMessageModality im = participant.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality;

  // IM 受信の際のイベント処理を登録
  im.InstantMessageReceived += ImModality_InstantMessageReceived;
}

ModalityTypes
IM画面には、IM送受信以外にもファイル共有や音声ビデオなど複数の機能が含まれています。
その機能毎に、Modalityが分かれています。
ModalityTypes enumeration (Microsoft.Lync.Model.Conversation)

定義名 和訳
InstantMessage インスタントメッセージングのモダリティ
AudioVideo オーディオ/ビデオモダリティ
ApplicationSharing アプリケーション共有のモダリティ
ContentSharing コンテンツ共有のモダリティ

メッセージ受信のイベント(ImModality_InstantMessageReceived)

private void ImModality_InstantMessageReceived(object sender, MessageSentEventArgs e)
{
  //IM取得
  InstantMessageModality instantMessageModality = sender as Microsoft.Lync.Model.Conversation.InstantMessageModality;
  //送信者の名前を取得
  var senderName = instantMessageModality.Participant.Contact.GetContactInformation(ContactInformationType.DisplayName);
  //画面に表示
  Console.WriteLine(senderName + ":" + e.Text);
}

(∩´∀`)∩ワーイ
IM参加者ごとにイベント登録が必要な件と送信者情報の取得する件で若干悩みましたが無事にできましま。

LyncSDKを使ってみた

(Lync SDK 2013)
Skype for Businessに対応している、LyncSDK2013をやっとこささわり始めました。
特にこれといって作りたい物があるわけではなく、こんなことできるんだーレベルで触っています。

Officeアプリの拡張ができるVSTOと違って、Skype for Businessが使える環境でないとSDKがつかえないので始めるにはハードルが少々高く感じます。

LyncSDK2013

Download Microsoft Lync 2013 SDK from Official Microsoft Download Center

英語版のみとなっていますが↑から取得可能です。

Lync SDK のプログラム コードを使用した開発 - 松崎 剛 Blog - Site Home - MSDN Blogs

バージョンが2010と一つ古いですが大変わかり易く参考になりました。

LyncSDKで特定のコンタクト状態を取得する

(LyncSDK get contact state)
先日から使い始めたLyncSDKほとんど、使い込んでないですが、とりあえずやりたかったコンタクトの状態取得が出来ました。

思ったよりSDKのI/Fがわかりやすく調べなくてもメンバ情報をみてればわかるレベルになっています。

実装

LyncClient client = LyncClient.GetClient();
Contact contact = client.ContactManager.GetContactByUri("ninomiya@sample.com");

IDictionary<ContactInformationType, object> info = contact.GetContactInformation(
  new ContactInformationType[]
      {
        //表示名
        ContactInformationType.DisplayName,
        //状態
        ContactInformationType.Activity,
        //コメント(ノート)
        ContactInformationType.DefaultNote,
        //メールアドレス
        ContactInformationType.PrimaryEmailAddress,
        //離席時間
        ContactInformationType.IdleStartTime,
      });

//コンタクトの状態変更イベントを登録
contact.ContactInformationChanged += (sender, arg) =>
{
  //コンタクトの状態が変わった場合に呼ばれるイベント
  //senderには、変更のあったコンタクト(Microsoft.Lync.Model.Contact)が入っています
};

GetContactInformationの関数に取得を行いたい項目を渡してその結果が返ってきます。
戻りは、Dictionaryですが取得できなかった項目はキーに含まれなので、Dictionaryから取得時にキーが含まれているかの確認は必要です。

f:id:orzmakoto:20150616181152p:plain
※↑のスクショでは、IdleStartTimeが結果に含まれていません。

ContactInformationTypeMSDNに一覧があります。

ContactInformationType Enumeration (Microsoft.Lync.Model)

定数名 翻訳
Availability 連絡先のアベイラビリティ。連絡先情報項目の値型はAvailabilityType列挙です。
ActivityId 現在の連絡先の活動を説明するトークン。連絡先情報項目の値の型はStringです。
LocationName 連絡先の場所の名前。連絡先情報項目の値の型はStringです。
TimeZone タイムゾーン。連絡先情報項目の値の型はStringです。
TimeZoneBias タイムゾーンバイアス。連絡先の情報項目の値の型はint32です。
MeetingSubject 対象の会議。連絡先情報項目の値の型はStringです。
MeetingLocation 場所を満たします。連絡先情報項目の値の型はStringです。
Activity (たとえば、電話機の、会議中、または使用可能な)連絡先の現在の活動。連絡先情報項目の値の型はStringです。
CustomActivity カスタマイズされたアクティビティの文字列。連絡先情報項目の値の型はStringです。
IdleStartTime 接触がアイドルになった時。連絡先の情報項目の値の型はDateTime型です。 DateTime値は、UTC値として返されます。あなたはDateTime.ToLocalTime()を呼び出すことによって、ローカル時間に変換する必要があります。
DisplayName 連絡先の表示名。連絡先情報項目の値の型はStringです。
InstantMessageAddresses 連絡先のインスタント·メッセージング·アドレスの集合。連絡先の情報項目の値の型は文字列の配列です。
PrimaryEmailAddress プライマリ電子メールアドレス。連絡先情報項目の値の型はStringです。
EmailAddresses 連絡先の電子メールアドレスの収集は、最初の要素は、プライマリ電子メールアドレスです。連絡先の情報項目の値の型は文字列の配列です。
Title 連絡先のタイトル。連絡先情報項目の値の型はStringです。
Company 連絡先の会社。連絡先情報項目の値の型はStringです。
Department 連絡先の部署。連絡先情報項目の値の型はStringです。
Office 連絡先のオフィスの場所。連絡先情報項目の値の型はStringです。
HomePageUrl 連絡先のホームページのURL
Photo 連絡先の写真。情報項目の値の型がStreamオブジェクトで連絡してください。
DefaultNote 他のノートが設定されていない場合は表示されるデフォルトのノート、。連絡先情報項目の値の型はStringです。
DefaultNoteType デフォルトのノート型(例えば、個人的または不在)。連絡先の情報項目の値型はDefaultNoteTypeの列挙です。
PersonalNote 個人的なメモ。連絡先情報項目の値の型はStringです。
OutOfficeNote 不在時のメモ。連絡先情報項目の値の型はStringです。
SourceNetwork 連絡先ソースネットワーク。連絡先情報項目の値型はSourceNetworkType列挙です。
IconUrl フェデレーテッド·公衆網からのコンタクトに関連付けられたアイコンのURL。連絡先情報項目の値の型はStringです。
IconStream フェデレーテッド·公衆網からのコンタクトに関連付けられているアイコン。情報項目の値の型がStreamオブジェクトで連絡してください。
ContactEndpoints 連絡先のコラボレーションエンドポイント(SIPまたはTELエンドポイント)の集まり。連絡先情報項目の値型はCollaborationEndpointオブジェクトの配列です。
CurrentCalendarState 連絡先の現在のカレンダーの状態(例えば、無料、忙しい、またはオフィスの外)。連絡先の情報項目の値型はContactCalendarState列挙です
NextCalendarState 連絡先の隣のカレンダー(例えば、無料、忙しい、またはオフィスの外)状態。連絡先の情報項目の値型はContactCalendarState列挙です
NextCalendarStateStartTime 次のカレンダーの状態の時間を開始します。連絡先情報の項目値の型は、DateTimeオブジェクトです。 DateTime値は、UTC値として返されます。あなたはDateTime.ToLocalTime()を呼び出すことによって、ローカル時間に変換する必要があります。
Reserved1 将来の使用のために予約されています。
CapabilityString 現在の連絡先機能。 (例えば、唯一の音声のみ、またはIM)。連絡先情報項目の値の型はStringです。
Capabilities 接触力の組合せ。連絡先情報項目の値型はContactCapabilitiesの列挙です。
ContactType 連絡先のタイプ。連絡先の情報項目の値型はContactPresentityTypeの列挙です。
Description 連絡先の説明。連絡先情報の項目値の型はStringです。
Reserved2 将来の使用のために予約されています。
FirstName 連絡先の名前。連絡先情報項目の値の型はStringです。
LastName 連絡先の姓。連絡先情報項目の値の型はStringです。
Reserved3 将来の使用のために予約されています。
Reserved4 将来の使用のために予約されています。
Reserved5 将来の使用のために予約されています。
Reserved6 将来の使用のために予約されています。
Reserved7 将来の使用のために予約されています。

(∩´∀`)∩ワーイ

特定のコンタクト情報ではなく、自分がお気に入り登録している一覧の取得なども次にやってみよう。

とりあえず目的は達成

Lync SDK 2013使ってみた。

LyncSDKを使ってみたいと思って1ヶ月ぐらい経ったことでしょう。

やってみよう。
LyncSDKは、MSが提供しているSDKの中ではかなりわかりやすい、面白いと感じました。

開発の概要はSlideShareにいい感じのがありました。

UIの部分はWPFコンポーネントとして提供されているので、ペタペタ貼り付けるだけでそれなりに楽しく動きます。

今回は、IMの送信画面をWPFで作ったアプリから呼び出してみようかと思います。

プロジェクトの作成(VisualStudio2012)

SDKがVisualStudio2012にしか対応していません。VS2012を使用します。
ファイル > 新規作成 > プロジェクト
f:id:orzmakoto:20150612013758p:plain

SDKをインストールしたのでLyncWPFApplicationLyncSilverlightApplicationが増えていますね。

WPFで呼び出し画面作成

なんかいい感じにこんな感じで
f:id:orzmakoto:20150612014640p:plain
(WindowsFormでも良かった気がする)

ボタンを押した時にLyncを呼ぶ実装

usingに追加

using Microsoft.Lync.Model;
using Microsoft.Lync.Model.Extensibility;

呼び出しボタン押下イベント

var 宛先 = text_相手.Text;
var 件名 = text_件名.Text;
var 一言 = text_一言.Text;
// 自動化?オブジェクト取得
var automation = LyncClient.GetAutomation();

// IMを送る相手を設定する。
// 複数人に送る場合にはその人数だけリストに追加
List<string> inviteeList = new List<string>();
inviteeList.Add(宛先);

// IM送信時のオプション設定を構築
var modalitySettings = new Dictionary<AutomationModalitySettings, object>();
modalitySettings.Add(AutomationModalitySettings.FirstInstantMessage, 一言);
modalitySettings.Add(AutomationModalitySettings.SendFirstInstantMessageImmediately, true);
modalitySettings.Add(AutomationModalitySettings.Subject, 件名);

// 呼び出し
IAsyncResult ar = automation.BeginStartConversation(
    AutomationModalities.InstantMessage
    , inviteeList
    , modalitySettings
    , null
    , null);
automation.EndStartConversation(ar);

実行

f:id:orzmakoto:20150612022004p:plain
新しくウィンドが呼ばれました。
(∩´∀`)∩ワーイ

簡単に呼び出せます。
ただし、これはLyncクライアントがローカル環境で起動している必要があります。

上のコードではログイン状態を見ていないので、以下のように状態を見てIM送信の可否を判定する必要があります。

if (LyncClient.GetClient().State != ClientState.SignedIn)
{
  //ログインしていないため送信出来ません
  return;
}

想像より開発のハードルは低く感じましたが、開発環境を揃えるのが超難しいですね。
既に、Lyncを使っているなら簡単ですが・・・
未導入でちょっと試してみたい!ってのは不可能に近いので開発者が少ないのかしら・・・
あと、VS2012にしか対応していないのはかなりのネックですよ( ノ゚Д゚)