Microsoft Bot FrameworkとLuisとGoogleCalendar使って、LUISに自分のご飯を決めさせたい

# gloops AdventCalendar 12日目

[gloops advent calendar](http://qiita.com/advent-calendar/2016/gloops) 12日目です:relaxed:
誕生日です:birthday:
家に早く帰ってケーキを食べる予定がこんな時間になってしました

11日目は @m_nabeta さんの「[これまでに世に送り出してしまって後から猛省したPythonのパターン](http://qiita.com/m_nabeta/items/0a8efc30d8d9a5808b91)」でした。
いいねがたくさんつきましたね。

私はWebアプリケーションエンジニアのMgrをやっていて普段コードを触る機会が少ないのと、
ダイエットをしているので、両方を満たしてくれる趣味アプリケーションつくっています。
まだ未完成なので、それぞれのAPI連携コードを載せさせていただきます。
<font color="Thistle">※まだ作成中です。アップデート次第更新させていただきます</font>

# Google Calendar API
C#にて、特定ユーザーのGoogleCalendar情報を取得してみました

```C#:GetGoogleAsync

public  async Task<List<Calendar>> GetGoogleAsync(DateTime Today)
{
　　var CalendarList = new List<Calendar>();
　　try
　　{
　　　　const string calendarId = "取得したいカレンダーのID";
　　　　const string apiKey = "GoogleCalendarAPIで発行したAPIKey";
　　　　const string apiUrl = "https://www.googleapis.com/calendar/v3/calendars/" + calendarId + "/events?key=" + apiKey + "&singleEvents=true";

　　　　//スケジュールstartTime順　上限15件
　　　　var paramList = "orderBy=startTime&maxResults=15";
　　　　//日付のスタート設定
　　　　paramList += "&timeMin=" + Today.ToString("yyyy-MM-dd") + "T00:00:00%2b0900";
　　　　//日付のエンド設定
　　　　paramList += "&timeMax=" + Today.AddDays(1).ToString("yyyy-MM-dd") + "T00:00:00%2b0900";
　　　　var url = apiUrl + "&" + paramList;

　　　　var httpClient = new HttpClient();
　　　　var clientResponse = await httpClient.GetAsync(url);
　　　　//APIのデータを成形
　　　　CalendarList.AddRange(JsonConvert.DeserializeObject<GoogleCalendarList>(await clientResponse.Content.ReadAsStringAsync())
                    .items.Select(item => new Calendar
                {
                    summary = item.summary,
                    start = item.start.dateTime == null ? new DateTime(1901, 1, 1) : DateTime.Parse(item.start.dateTime),
                    end = item.end.dateTime == null ? new DateTime(1901, 1, 1) : DateTime.Parse(item.end.dateTime)
                }));
　　　　}
　　　　catch (AggregateException ex)
　　　　{
　　　　
　　　　}
            return CalendarList;

}

public class GoogleCalendarList
{
        public GoogleCalendar[] items { get; set; }
}

public class GoogleCalendar
{
        public string summary { get; set; }
        public start start { get; set; }
        public end end { get; set; }
}

public class start
{
        public string dateTime { get; set; }
}

public class end
{
        public string dateTime { get; set; }
}

public class Calendar
{
        public string summary { get; set; }
        public DateTime start { get; set; }

        public DateTime end { get; set; }
}
```

参考サイト)http://blog.howdylikes.jp/entry/20120806/1344265078

# BotFramework と LUISの連携
夜のカレンダーのデータを取得して飲み会かどうか判定

```C#:Post

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
　　if (activity.Type == ActivityTypes.Message || activity.Text.Contains("夜"))｛
     var text = activity.Text;
     var calendarList = await GetGoogleAsync();
     var nightSchedule = "なし";
     //　19時半以降の予定取得
     var night = calendarList.FirstOrDefault(
                    x => x.start >= new DateTime(Today.Year, Today.Month, Today.Day, 19, 30, 0));
     if (night?.summary != null)
        nightSchedule = night.summary;
     var baseurl = $"https://api.projectoxford.ai/luis/v2.0/apps/AppのId?subscription-key=AppのKey&q=";
     var url = $"{baseurl + text}&verbose=true";
     var httpClient = new HttpClient();
     var clientResponse = await httpClient.GetAsync(url);
     var content = await clientResponse.Content.ReadAsStringAsync();
        
     // メッセージを返答
     ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
     Activity reply = activity.CreateReply(content);
     await connector.Conversations.ReplyToActivityAsync(reply);
　　｝
   var response = Request.CreateResponse(HttpStatusCode.OK);
   return response;
}
```

参考サイト)https://bita.jp/dml/luis_1
## LUIS側のデータ状況
![luis.PNG](https://qiita-image-store.s3.amazonaws.com/0/51651/a626de12-9e13-6b27-a8fc-531ad9f3d492.png)

## LUIS側にGoogleカレンダーのデータを送ったレスポンスデータ
なかなか正確なレスポンスを返してくれます。
忘年会が飲み会になったり、ジムがなぜか飲み会に判定されるので、
これからもLUISに学習させていきたいと思います。


![飲み会の判定.PNG](https://qiita-image-store.s3.amazonaws.com/0/51651/2e314d18-907b-7913-fcba-ddd5371d8ee6.png)
![jikokensan.PNG](https://qiita-image-store.s3.amazonaws.com/0/51651/83a58d00-0e92-7bee-f767-8cee322cac3b.png)




# 今後の実装予定
・昼のgoogleカレンダーデータと夜の飲み会状況を加味して、お昼・夜ごはんを決定してくれるようにする


# まとめ
LUISを初めて使ってみて、育成させたいという愛着がわきました。
今後教育を継続して行い、私の体調管理を管理してくれる子に育てて行きたいと思います。