/// <summary> /// テンプレート表示 /// </summary> /// <param name="context"></param> /// <param name="argument"></param> /// <returns></returns> public async Task TemplateDisplay(IDialogContext context, IAwaitable <IMessageActivity> argument) { var message = await argument; issueModel.Labels = message.Text; //操作キャンセル確認メソッド await dialog.TryCatch(context, issueModel.Labels, async() => { //引数のラベルでEntityを検索する TemplateEntity entity = entityOperation_Template.RetrieveEntityResult(issueModel.Labels, "label", string.Empty).Result as TemplateEntity; //ラベルのテンプレートが未設定だったら if (entity == null) { //テンプレートが未設定の旨をメッセージで表示 await context.PostAsync("テンプレートが未設定です。テンプレートを設定してください"); //issue作成操作を終了する context.Done <object>(context); } else { var input = "タイトル" + Environment.NewLine + entity.Template; await context.PostAsync("下記のテンプレートを用いて本文を作成してください(タイトルのみも可)"); await context.PostAsync(ConvertToSlackFormat(input, "```")); context.Wait(IssueCreate); } }); }
/// <summary> /// 入力に対して応答を返す /// </summary> /// <param name="context">入力コンテンツ</param> /// <param name="argument">入力文字列</param> /// <returns></returns> public async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> argument) { //入力文字列取得 var message = await argument; await TryCatch(context, message.Text, async() => { activity = message as Connector.Activity; //チャンネル名を取得 channelName = message.Conversation.Name; //チャンネルIDを取得 channelId = message.Conversation.Id.Split(':')[2]; //アクセストークンセット SetCredencial(message.From.Id, message.From.Name, github); //行数毎の文字列リストを生成 List <string> rowList = new List <string>(); //行毎に文字列分割し、リストに格納 if (!string.IsNullOrEmpty(message.Text)) { string[] temp = message.Text.Split('\n'); rowList.AddRange(temp); } #region 【条件式】1行目が~なら //リポジトリ設定(1行目がset ripository) if (String.Compare(rowList[0], "set repository", true) == 0) { RepositoryDialog repositoryDialog = new RepositoryDialog(); //リポジトリ変更メソッド呼び出し await repositoryDialog.RepositorySet(context, rowList[1]); context.Wait(MessageReceivedAsync); } //ユーザ設定(1行目がset user) if (String.Compare(rowList[0], "set user", true) == 0) { //認証本体 context.Wait(MessageReceivedAsync); } //操作一覧(1行目がcall) if (String.Compare(rowList[0], "call", true) == 0) { //操作一覧を出す CALL_GUIDE(context); } //issueの簡易作成(1行目がラベル名) if (rowList[0].IsAny("bug", "question", "task", "課題", "運用", "保守", "バグ") && !string.IsNullOrEmpty(rowList[1])) { //作成完了のメッセージをbot送信する await context.PostAsync("issueの作成が完了しました"); //引数のラベルでEntityを検索する TemplateEntity entity = entityOperation_Template.RetrieveEntityResult(rowList[0], "label", string.Empty).Result as TemplateEntity; //ラベルのテンプレートが未設定だったら if (entity == null) { //テンプレートが未設定の旨をメッセージで表示 await context.PostAsync("テンプレートが未設定です。テンプレートを設定してください"); //入力待機 context.Wait(MessageReceivedAsync); } else { //issue作成実行用クラス IssueCreateDialog createDialog = new IssueCreateDialog(); //2行目以降、1行ずつでループ処理 for (int i = 1; i < rowList.Count; i++) { //指定行の2文字目からタイトルとして格納(1文字目は・のため) issueModel.Title = rowList[i].Substring(1); //ラベル格納 issueModel.Labels = rowList[0]; //本文格納(本文は入力されないためテンプレートのみ) issueModel.Body = entity.Template; //issue作成 await createDialog.IssueCreate(context); } //メッセージ待機状態に戻る context.Wait(MessageReceivedAsync); } } #endregion 【条件式】1行目が~なら }); }
/// <summary> /// project出力 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task OutputIssue(IDialogContext context, List <IReadOnlyList <Issue> > issueListForLabels, List <string> labelNameList) { //try //{ //出力するExcelファイルの一時保存パス string filePath = @"D:\home\Excel\" + repository.Split('/')[1] + "(issue).xlsx"; //出力する旨をbotで表示 await context.PostAsync("project「" + repository.Split('/')[1] + "(issue)」を出力しています..."); //ワークブックに書き込む using (var book = new XLWorkbook(XLEventTracking.Disabled)) { //ラベル名前リストのインデックス用変数 int i = 0; //ラベル別issueリストの各issueリストに対する処理 foreach (var issueList in issueListForLabels) { //ワークシートを用意 IXLWorksheet ws = null; //issueが一つでもあったらエクセルファイルに書き込み if (issueList != null) { ws = book.AddWorksheet(labelNameList[i]); } //issueがひとつもなかったら次のループ処理に移る else { continue; } //初期位置を2行目2列目に定める int row = 2; int col = 2; //テンプレート大見出し格納リスト List <string> HeadingList = new List <string>(); //ラベルのEntityを取得 TemplateEntity entity = entityOperation.RetrieveEntityResult(labelNameList[i], "label", string.Empty).Result as TemplateEntity; if (entity != null) { //改行毎に区切る string[] templateColumn = entity.Template.Split('\n'); foreach (var tempCol in templateColumn) { int index = tempCol.IndexOf("##"); if (index != -1) { HeadingList.Add(tempCol.Substring(index + 3)); } } } //ラベル別の列幅とフォントサイズの指定 ws = GitHubDialog.convinient.ColumnWidthAndFontSize(ws, "task"); row++; ws.Cell(row, col).Value = "No"; col++; ws.Cell(row, col).Value = "タイプ"; col++; ws.Cell(row, col).Value = "タイトル"; col++; foreach (string header in HeadingList) { ws.Cell(row, col).Value = header; col++; } ws.Cell(row, col).Value = "担当者"; col++; ws.Cell(row, col).Value = "着手日"; col++; ws.Cell(row, col).Value = "完了日"; //ヘッダーのセルを範囲指定 IXLCell headerCell = ws.Cell(row, 2); IXLRange ExcelRange = ws.Range(ws.Cell(row, 2), ws.Cell(row, col)); //指定範囲の背景色をオリーブに変更 ExcelRange.Style.Fill.BackgroundColor = XLColor.Olivine; //指定行を1行下げ、列を2列目に戻す row++; col = 2; //issueリストの各issueに対する処理 foreach (var issue in issueList) { //issueの番号を指定セルに格納 ws.Cell(row, col).Value = issue.Number; col++; //issueのラベル名を指定セルに格納 ws.Cell(row, col).Value = string.Join("", issue.Labels.ToList().ConvertAll(x => x.Name)); col++; //issueのタイトルを指定セルに格納 ws.Cell(row, col).Value = issue.Title; col++; //本文の見出し部分を除き、リストで格納 List <string> tempList = new List <string>(); tempList.AddRange(issue.Body.Split(new string[] { "##" }, StringSplitOptions.RemoveEmptyEntries)); //本文(見出し除く)を見出しごとにセルに格納 for (int c = 0; c < tempList.Count; c++) { int index = tempList[c].IndexOf('\n'); ws.Cell(row, col).Value = tempList[c].Substring(index + 1); col++; } //issueにアサインしている人がひとりでもいたら if (issue.Assignees.Count != 0) { //アサインしているアカウント名を指定セルに格納 ws.Cell(row, col).Value = issue.Assignees[0].Login; } col++; //issueが作成された日付を指定セルに格納 ws.Cell(row, col).Value = issue.CreatedAt.DateTime.ToString(); col++; //issueが更新されたことがあったら if (issue.UpdatedAt.HasValue) { //issueの更新日付を指定セルに格納 ws.Cell(row, col).Value = ((DateTimeOffset)issue.UpdatedAt).DateTime.ToString(); } //現在issueがcloseされていたら if (issue.ClosedAt.HasValue) { //指定セルの行の背景色を灰色にする IXLRange range = ws.Range(ws.Cell(row, 2), ws.Cell(row, col)); range.Style.Fill.BackgroundColor = XLColor.Gray; // 灰色 } //リストの最後尾だったら if (issueList.Last().Equals(issue)) { //表形式にするため罫線をつける IXLRange range = ws.Range(headerCell, ws.Cell(row, col)); range.Style .Border.SetOutsideBorder(XLBorderStyleValues.Thin) .Border.SetInsideBorder(XLBorderStyleValues.Hair) .Border.SetLeftBorder(XLBorderStyleValues.Thin) .Border.SetRightBorder(XLBorderStyleValues.Thin); } //次の行に行く row++; col = 2; } //検索用フィルターをつける ws.RangeUsed().SetAutoFilter(); row++; i++; } //引数のパスにExcelファイルを保存する book.SaveAs(filePath); } //ファイル送信用slackAPIのURl string url = baseUrl + "files.upload?channels=" + GitHubDialog.channelName; //指定パスのファイルでファイル送信APIを送る Encoding.UTF8.GetString(fileUpload(url, filePath)); //出力完了のメッセージを送信する await context.PostAsync("出力が完了しました"); //context.Wait(MessageReceivedAsync); //} //catch (Exception e) //{ // await context.PostAsync(e.Message); // context.Wait(MessageReceivedAsync); //} }