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にしか対応していないのはかなりのネックですよ( ノ゚Д゚)

【VSTO】選択中のメールアイテムを取得する

(VSTO Outlook selected mail item)
OutlookのメールをCSVに出力したいって話が出たのでやってみました。

その話は突如やってきた要件
Outlookで受信したメールをCSVに出力してExcelで管理したい」

(゚Д゚;)

(;つД⊂)ゴシゴシ

(゚Д゚)え?

なんか、いろいろ間違った業務設計をされているようですが、面倒なのでスルー
とりあえず、選択したメールをCSVに出力するものを作りました。

実装(ビジュアルデザイナ)

ビジュアルデザイナで簡単にボタンイベントを実装しました。

private void button1_Click(object sender, RibbonControlEventArgs e)
{
  var explorer = base.Context as Microsoft.Office.Interop.Outlook.Explorer;
  foreach (var item in explorer.Selection)
  {
    if (item is MailItem)
    {
      var mail = item as MailItem;
      
      //mailオブジェクトから必要な項目をCSVファイルに出力する処理
    }
  }
}

実装(XML

XMLでやる場合には、Explorerの取得方法が異なるので注意

private void OnSelectedSave(Office.IRibbonControl control)
{
  var explorer = Globals.ThisAddIn.Application.ActiveExplorer();
  foreach (var item in explorer.Selection)
  {
    if (item is MailItem)
    {
      var mail = item as MailItem;
      
      //mailオブジェクトから必要な項目をCSVファイルに出力する処理
    }
  }
}

(∩´∀`)∩ワーイ
簡単につくれるけど、なんだろ。
高確率でこれを使うような業務か負けな気がする。
なんだよ、メールをCSVに出力してExcelで管理するって・・・