public async Task <HttpResponseMessage> Post([FromBody] Activity activity) { string cashOrgMent = ""; //DbConnect db = new DbConnect(); //DButil dbutil = new DButil(); DButil.HistoryLog("db connect !! "); //HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK); HttpResponseMessage response; Activity reply1 = activity.CreateReply(); Activity reply2 = activity.CreateReply(); Activity reply3 = activity.CreateReply(); Activity reply4 = activity.CreateReply(); // Activity 값 유무 확인하는 익명 메소드 Action <Activity> SetActivity = (act) => { if (!(reply1.Attachments.Count != 0 || reply1.Text != "")) { reply1 = act; } else if (!(reply2.Attachments.Count != 0 || reply2.Text != "")) { reply2 = act; } else if (!(reply3.Attachments.Count != 0 || reply3.Text != "")) { reply3 = act; } else if (!(reply4.Attachments.Count != 0 || reply4.Text != "")) { reply4 = act; } else { } }; if (activity.Type == ActivityTypes.ConversationUpdate && activity.MembersAdded.Any(m => m.Id == activity.Recipient.Id)) { startTime = DateTime.Now; //activity.ChannelId = "facebook"; //파라메터 호출 if (LUIS_NM.Count(s => s != null) > 0) { //string[] LUIS_NM = new string[10]; Array.Clear(LUIS_NM, 0, LUIS_NM.Length); } if (LUIS_APP_ID.Count(s => s != null) > 0) { //string[] LUIS_APP_ID = new string[10]; Array.Clear(LUIS_APP_ID, 0, LUIS_APP_ID.Length); } //Array.Clear(LUIS_APP_ID, 0, 10); DButil.HistoryLog("db SelectConfig start !! "); List <ConfList> confList = db.SelectConfig(); DButil.HistoryLog("db SelectConfig end!! "); for (int i = 0; i < confList.Count; i++) { switch (confList[i].cnfType) { case "LUIS_APP_ID": LUIS_APP_ID[LUIS_APP_ID.Count(s => s != null)] = confList[i].cnfValue; LUIS_NM[LUIS_NM.Count(s => s != null)] = confList[i].cnfNm; break; case "LUIS_SUBSCRIPTION": LUIS_SUBSCRIPTION = confList[i].cnfValue; break; case "BOT_ID": BOT_ID = confList[i].cnfValue; break; case "MicrosoftAppId": MicrosoftAppId = confList[i].cnfValue; break; case "MicrosoftAppPassword": MicrosoftAppPassword = confList[i].cnfValue; break; case "QUOTE": QUOTE = confList[i].cnfValue; break; case "TESTDRIVE": TESTDRIVE = confList[i].cnfValue; break; case "LUIS_SCORE_LIMIT": LUIS_SCORE_LIMIT = confList[i].cnfValue; break; case "LUIS_TIME_LIMIT": LUIS_TIME_LIMIT = Convert.ToInt32(confList[i].cnfValue); break; default: //미 정의 레코드 Debug.WriteLine("*conf type : " + confList[i].cnfType + "* conf value : " + confList[i].cnfValue); DButil.HistoryLog("*conf type : " + confList[i].cnfType + "* conf value : " + confList[i].cnfValue); break; } } Debug.WriteLine("* DB conn : " + activity.Type); DButil.HistoryLog("* DB conn : " + activity.Type); //초기 다이얼로그 호출 List <DialogList> dlg = db.SelectInitDialog(activity.ChannelId); ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); foreach (DialogList dialogs in dlg) { Activity initReply = activity.CreateReply(); initReply.Recipient = activity.From; initReply.Type = "message"; initReply.Attachments = new List <Attachment>(); //initReply.AttachmentLayout = AttachmentLayoutTypes.Carousel; Attachment tempAttachment; if (dialogs.dlgType.Equals(CARDDLG)) { Debug.WriteLine("* CARDDLG"); foreach (CardList tempcard in dialogs.dialogCard) { tempAttachment = dbutil.getAttachmentFromDialog(tempcard, activity); initReply.Attachments.Add(tempAttachment); } } else { Debug.WriteLine("* NOT CARDDLG"); if (activity.ChannelId.Equals("facebook") && string.IsNullOrEmpty(dialogs.cardTitle) && dialogs.dlgType.Equals(TEXTDLG)) { Debug.WriteLine("* NOT CARDDLG - 1"); Activity reply_facebook = activity.CreateReply(); reply_facebook.Recipient = activity.From; reply_facebook.Type = "message"; DButil.HistoryLog("facebook card Text : " + dialogs.cardText); reply_facebook.Text = dialogs.cardText; var reply_ment_facebook = connector.Conversations.SendToConversationAsync(reply_facebook); //SetActivity(reply_facebook); } else { Debug.WriteLine("* NOT CARDDLG - 2"); //tempAttachment = dbutil.getAttachmentFromDialog(dialogs, activity); HeroCard plCard = new UserHeroCard() { Title = "Welcome", Text = "반갑습니다. 인천공항공사 챗봇입니다.", Images = null, Buttons = null, Card_division = "", Card_value = "" }; tempAttachment = plCard.ToAttachment(); initReply.Attachments.Add(tempAttachment); } } await connector.Conversations.SendToConversationAsync(initReply); } DateTime endTime = DateTime.Now; Debug.WriteLine("프로그램 수행시간 : {0}/ms", ((endTime - startTime).Milliseconds)); Debug.WriteLine("* activity.Type : " + activity.Type); Debug.WriteLine("* activity.Recipient.Id : " + activity.Recipient.Id); Debug.WriteLine("* activity.ServiceUrl : " + activity.ServiceUrl); DButil.HistoryLog("* activity.Type : " + activity.ChannelData); DButil.HistoryLog("* activity.Recipient.Id : " + activity.Recipient.Id); DButil.HistoryLog("* activity.ServiceUrl : " + activity.ServiceUrl); } else if (activity.Type == ActivityTypes.Message) { //activity.ChannelId = "facebook"; startTime = DateTime.Now; ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); try { Debug.WriteLine("* activity.Type == ActivityTypes.Message "); channelID = activity.ChannelId; string orgMent = activity.Text; // string strDetectLang = DetectLang(orgMent); Debug.WriteLine("* strDetectLang : " + strDetectLang); string qnaMakerRes = ""; qnaMakerRes = GetQnaMakerResult(orgMent, strDetectLang); Debug.WriteLine("*** strDetectLang : " + strDetectLang + " | qnaMakerRes : " + qnaMakerRes); apiFlag = "COMMON"; //대화 시작 시간 startTime = DateTime.Now; long unixTime = ((DateTimeOffset)startTime).ToUnixTimeSeconds(); DButil.HistoryLog("orgMent : " + orgMent); //금칙어 체크 CardList bannedMsg = db.BannedChk(orgMent); Debug.WriteLine("* bannedMsg : " + bannedMsg.cardText);//해당금칙어에 대한 답변 if (bannedMsg.cardText != null) { Activity reply_ment = activity.CreateReply(); reply_ment.Recipient = activity.From; reply_ment.Type = "message"; reply_ment.Text = bannedMsg.cardText; var reply_ment_info = await connector.Conversations.SendToConversationAsync(reply_ment); response = Request.CreateResponse(HttpStatusCode.OK); return(response); } else if (!qnaMakerRes.Equals("")) { string strReplyText = "Sorry"; QnAMakerResult responseQna; responseQna = JsonConvert.DeserializeObject <QnAMakerResult>(qnaMakerRes); if (!responseQna.Score.Equals(0)) { //Convert.ToInt32(responseQna.Score); DateTime endTime = DateTime.Now; Debug.WriteLine("프로그램 수행시간 : {0}/ms", ((endTime - startTime).Milliseconds)); strReplyText = responseQna.Answer + " || score: " + Convert.ToInt32(responseQna.Score) + "p, " + ((endTime - startTime).Milliseconds) + "/ms"; DButil.QnALog(orgMent + " |*| " + responseQna.Answer + " |*| " + Convert.ToInt32(responseQna.Score) + "p," + ((endTime - startTime).Milliseconds) + "/ms"); string logQuestion = orgMent.Replace(" ", ""); string logAnswer = responseQna.Answer.Replace(" ", "").Replace(Environment.NewLine, ""); string strLogQuestion, strLogAnswer; if (logQuestion.Length > 20) { strLogQuestion = logQuestion.Substring(0, 20) + "..."; } else { strLogQuestion = logQuestion; } if (logAnswer.Length > 30) { strLogAnswer = logAnswer.Substring(0, 30) + "..."; } else { strLogAnswer = logAnswer; } DButil.QnALogSub(Convert.ToInt32(responseQna.Score) + "p," + ((endTime - startTime).Milliseconds) + "/ms |*| " + strLogQuestion + " |*| " + strLogAnswer); } Activity reply_ment = activity.CreateReply(); reply_ment.Recipient = activity.From; reply_ment.Type = "message"; //reply_ment.Text = qnaMakerRes; reply_ment.Text = strReplyText; var reply_ment_info = await connector.Conversations.SendToConversationAsync(reply_ment); response = Request.CreateResponse(HttpStatusCode.OK); return(response); } else { queryStr = orgMent; //인텐트 엔티티 검출 //캐시 체크 cashOrgMent = Regex.Replace(orgMent, @"[^a-zA-Z0-9ㄱ-힣]", "", RegexOptions.Singleline); cacheList = db.CacheChk(cashOrgMent.Replace(" ", "")); // 캐시 체크 //캐시에 없을 경우 if (cacheList.luisIntent == null || cacheList.luisEntities == null) { DButil.HistoryLog("cache none : " + orgMent); //루이스 체크 cacheList.luisId = dbutil.GetMultiLUIS(orgMent); } if (cacheList != null && cacheList.luisIntent != null) { if (cacheList.luisIntent.Contains("testdrive") || cacheList.luisIntent.Contains("branch")) { apiFlag = "TESTDRIVE"; } else if (cacheList.luisIntent.Contains("quot")) { apiFlag = "QUOT"; } else if (cacheList.luisIntent.Contains("recommend ")) { apiFlag = "RECOMMEND"; } else { apiFlag = "COMMON"; } DButil.HistoryLog("cacheList.luisIntent : " + cacheList.luisIntent); } luisId = cacheList.luisId; luisIntent = cacheList.luisIntent; luisEntities = cacheList.luisEntities; String fullentity = db.SearchCommonEntities; DButil.HistoryLog("fullentity : " + fullentity); if (!string.IsNullOrEmpty(fullentity) || !fullentity.Equals("")) { if (!String.IsNullOrEmpty(luisEntities)) { //entity 길이 비교 if (fullentity.Length > luisEntities.Length || luisIntent == null || luisIntent.Equals("")) { //DefineTypeChkSpare에서는 인텐트나 루이스아이디조건 없이 엔티티만 일치하면 다이얼로그 리턴 relationList = db.DefineTypeChkSpare(fullentity); } else { relationList = db.DefineTypeChk(MessagesController.luisId, MessagesController.luisIntent, MessagesController.luisEntities); } } else { relationList = db.DefineTypeChkSpare(fullentity); } } else { if (apiFlag.Equals("COMMON")) { relationList = db.DefineTypeChkSpare(cacheList.luisEntities); } else { relationList = null; } } if (relationList != null) //if (relationList.Count > 0) { if (relationList.Count > 0 && relationList[0].dlgApiDefine != null) { if (relationList[0].dlgApiDefine.Equals("api testdrive")) { apiFlag = "TESTDRIVE"; } else if (relationList[0].dlgApiDefine.Equals("api quot")) { apiFlag = "QUOT"; } else if (relationList[0].dlgApiDefine.Equals("api recommend")) { apiFlag = "RECOMMEND"; } else if (relationList[0].dlgApiDefine.Equals("D")) { apiFlag = "COMMON"; } DButil.HistoryLog("relationList[0].dlgApiDefine : " + relationList[0].dlgApiDefine); } } else { if (MessagesController.cacheList.luisIntent == null || apiFlag.Equals("COMMON")) { apiFlag = ""; } else if (MessagesController.cacheList.luisId.Equals("cjchat_luis_01") && MessagesController.cacheList.luisIntent.Contains("quot")) { apiFlag = "QUOT"; } } if (apiFlag.Equals("COMMON") && relationList.Count > 0) { //context.Call(new CommonDialog("", MessagesController.queryStr), this.ResumeAfterOptionDialog); for (int m = 0; m < MessagesController.relationList.Count; m++) { DialogList dlg = db.SelectDialog(MessagesController.relationList[m].dlgId); Activity commonReply = activity.CreateReply(); Attachment tempAttachment = new Attachment(); DButil.HistoryLog("dlg.dlgType : " + dlg.dlgType); if (dlg.dlgType.Equals(CARDDLG)) { foreach (CardList tempcard in dlg.dialogCard) { DButil.HistoryLog("tempcard.card_order_no : " + tempcard.card_order_no); if (tempAttachment != null) { commonReply.Attachments.Add(tempAttachment); } } } else { DButil.HistoryLog("facebook dlg.dlgId : " + dlg.dlgId); tempAttachment = dbutil.getAttachmentFromDialog(dlg, activity); commonReply.Attachments.Add(tempAttachment); } if (commonReply.Attachments.Count > 0) { SetActivity(commonReply); conversationhistory.commonBeforeQustion = orgMent; replyresult = "H"; } } } else { string newUserID = activity.Conversation.Id; string beforeUserID = ""; string beforeMessgaeText = ""; //string messgaeText = ""; Activity intentNoneReply = activity.CreateReply(); Boolean sorryflag = false; if (beforeUserID != newUserID) { beforeUserID = newUserID; MessagesController.sorryMessageCnt = 0; } var message = MessagesController.queryStr; beforeMessgaeText = message.ToString(); Debug.WriteLine("SERARCH MESSAGE : " + message); sorryflag = true; //네이버 기사 검색 if (sorryflag) { Debug.WriteLine("sorryflag : true"); //Sorry Message int sorryMessageCheck = db.SelectUserQueryErrorMessageCheck(activity.Conversation.Id, MessagesController.chatBotID); ++MessagesController.sorryMessageCnt; Activity sorryReply = activity.CreateReply(); sorryReply.Recipient = activity.From; sorryReply.Type = "message"; sorryReply.Attachments = new List <Attachment>(); sorryReply.AttachmentLayout = AttachmentLayoutTypes.Carousel; List <TextList> text = new List <TextList>(); if (sorryMessageCheck == 0) { text = db.SelectSorryDialogText("5"); } else { text = db.SelectSorryDialogText("6"); } for (int i = 0; i < text.Count; i++) { HeroCard plCard = new HeroCard() { Title = text[i].cardTitle, Text = text[i].cardText }; Debug.WriteLine("sorryflag : true | Title : " + text[i].cardTitle + " | Text : " + text[i].cardText); Attachment plAttachment = plCard.ToAttachment(); sorryReply.Attachments.Add(plAttachment); } SetActivity(sorryReply); //await connector.Conversations.SendToConversationAsync(sorryReply); sorryflag = false; replyresult = "D"; } } DateTime endTime = DateTime.Now; //analysis table insert //if (rc != null) //{ int dbResult = db.insertUserQuery(); //} //history table insert db.insertHistory(activity.Conversation.Id, activity.ChannelId, ((endTime - MessagesController.startTime).Milliseconds)); replyresult = ""; recommendResult = ""; } } catch (Exception e) { Debug.Print(e.StackTrace); int sorryMessageCheck = db.SelectUserQueryErrorMessageCheck(activity.Conversation.Id, MessagesController.chatBotID); ++MessagesController.sorryMessageCnt; Activity sorryReply = activity.CreateReply(); sorryReply.Recipient = activity.From; sorryReply.Type = "message"; sorryReply.Attachments = new List <Attachment>(); //sorryReply.AttachmentLayout = AttachmentLayoutTypes.Carousel; List <TextList> text = new List <TextList>(); if (sorryMessageCheck == 0) { text = db.SelectSorryDialogText("5"); } else { text = db.SelectSorryDialogText("6"); } for (int i = 0; i < text.Count; i++) { HeroCard plCard = new HeroCard() { Title = text[i].cardTitle, Text = text[i].cardText }; Attachment plAttachment = plCard.ToAttachment(); sorryReply.Attachments.Add(plAttachment); } SetActivity(sorryReply); DateTime endTime = DateTime.Now; int dbResult = db.insertUserQuery(); db.insertHistory(activity.Conversation.Id, activity.ChannelId, ((endTime - MessagesController.startTime).Milliseconds)); replyresult = ""; recommendResult = ""; } finally { if (reply1.Attachments.Count != 0 || reply1.Text != "") { await connector.Conversations.SendToConversationAsync(reply1); } if (reply2.Attachments.Count != 0 || reply2.Text != "") { await connector.Conversations.SendToConversationAsync(reply2); } if (reply3.Attachments.Count != 0 || reply3.Text != "") { await connector.Conversations.SendToConversationAsync(reply3); } if (reply4.Attachments.Count != 0 || reply4.Text != "") { await connector.Conversations.SendToConversationAsync(reply4); } } } else { HandleSystemMessage(activity); } response = Request.CreateResponse(HttpStatusCode.OK); return(response); }