public async Task <IList <IRequestMessage> > GetReplyMessagesAsync() { var columns = new List <CarouselColumnMultipleAction>(); // column A var columna_actions = new List <IAction>() { new MessageAction("button A") }; columns.Add(new CarouselColumnMultipleAction("column A", columna_actions) { ThumbnailImageUrl = "https://via.placeholder.com/200x150/333.png/fff" }); // column B var columnb_actions = new List <IAction>() { new MessageAction("button B") }; columns.Add(new CarouselColumnMultipleAction("column B", columnb_actions) { ThumbnailImageUrl = "https://via.placeholder.com/200x150/333.png/fff" }); var msg = new CarouselTemplate(columns); await Task.CompletedTask; return(new List <IRequestMessage> { msg }); }
public void Convert_TemplateMessageWithCustomICarouselTemplate_ConvertedToCarouselTemplate() { TestTemplateMessage message = new TestTemplateMessage() { Template = new TestCarouselTemplate() }; ISendMessage[] messages = MessageConverter.Convert(new ISendMessage[] { message }); Assert.AreEqual(1, messages.Length); Assert.AreNotEqual(message, messages[0]); TemplateMessage templateMessage = messages[0] as TemplateMessage; Assert.AreEqual("AlternativeText", templateMessage.AlternativeText); CarouselTemplate template = templateMessage.Template as CarouselTemplate; CarouselColumn column = template.Columns.First() as CarouselColumn; Assert.AreEqual(new Uri("https://carousel.url"), column.ThumbnailUrl); Assert.AreEqual("CarouselTitle", column.Title); Assert.AreEqual("CarouselText", column.Text); ITemplateAction[] actions = column.Actions.ToArray(); MessageAction action = actions[0] as MessageAction; Assert.AreEqual("MessageLabel", action.Label); Assert.AreEqual("MessageText", action.Text); }
public async Task ReplyTemplateMessageAsync(string replyToken, CarouselTemplate template) { using (var httpClient = new HttpClient()) { using (var request = new HttpRequestMessage(new HttpMethod("POST"), $"{lineMessageReplyApiBaseUrl}")) { request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}"); LineMessageReq req = new LineMessageReq(); req.ReplyToken = replyToken; req.Messages.Add(new TemplateMessageBase() { Template = template }); var postJson = JsonConvert.SerializeObject(req, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }, Formatting = Formatting.Indented }); request.Content = new StringContent(postJson); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); var response = await httpClient.SendAsync(request); var result = await response.Content.ReadAsStringAsync(); } } }
public void ShouldPreserveInstanceWhenValueIsCarouselTemplate() { var template = new CarouselTemplate() { Columns = new ICarouselColumn[] { new CarouselColumn() { ThumbnailUrl = new Uri("https://foo.bar"), Title = "CarouselTitle", Text = "CarouselText", Actions = new ITemplateAction[] { new MessageAction() { Label = "PostbackLabel", Text = "PostbackText" } } } } }; var carouselTemplate = CarouselTemplate.Convert(template); Assert.AreSame(template, carouselTemplate); var column = carouselTemplate.Columns.First(); Assert.AreSame(column, carouselTemplate.Columns.First()); }
public void Constructor_SerializedCorrectly() { CarouselTemplate template = new CarouselTemplate(); string serialized = JsonConvert.SerializeObject(template); Assert.AreEqual(@"{""type"":""carousel"",""columns"":null}", serialized); }
public void ShouldCreateSerializeableObject() { var template = new CarouselTemplate(); string serialized = JsonConvert.SerializeObject(template); Assert.AreEqual(@"{""type"":""carousel"",""columns"":null,""imageAspectRatio"":""rectangle"",""imageSize"":""cover""}", serialized); }
public void ShouldThrowExceptionWhenColumnsIsNull() { var template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The columns cannot be null.", () => { CarouselTemplate.Convert(template); }); }
public void ShouldThrowExceptionWhenValueIsEmpty() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The minimum number of columns is 1.", () => { template.Columns = new CarouselColumn[] { }; }); }
public void ShouldThrowExceptionWhenValueIsNull() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The columns cannot be null.", () => { template.Columns = null; }); }
public void Columns_LessThan1_ThrowsException() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The minimum number of columns is 1.", () => { template.Columns = new ICarouselColumn[] { }; }); }
public void Columns_Null_ThrowsException() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The columns cannot be null.", () => { template.Columns = null; }); }
public async Task HandleTextMessage() { var textMessage = JsonConvert.DeserializeObject <TextMessage>(lineEvent.Message.ToString()); Message replyMessage = null; if (textMessage.Text.ToLower() == "buttons") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Message Label", "sample data")); actions.Add(new PostbackTemplateAction("Postback Label", "sample data", "sample data")); actions.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); ButtonsTemplate buttonsTemplate = new ButtonsTemplate("https://github.com/apple-touch-icon.png", "Sample Title", "Sample Text", actions); replyMessage = new TemplateMessage("Buttons", buttonsTemplate); } else if (textMessage.Text.ToLower() == "confirm") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Yes", "yes")); actions.Add(new MessageTemplateAction("No", "no")); ConfirmTemplate confirmTemplate = new ConfirmTemplate("Confirm Test", actions); replyMessage = new TemplateMessage("Confirm", confirmTemplate); } else if (textMessage.Text.ToLower() == "carousel") { List <TemplateColumn> columns = new List <TemplateColumn>(); List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Message Label", "sample data")); actions.Add(new PostbackTemplateAction("Postback Label", "sample data", "sample data")); actions.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); columns.Add(new TemplateColumn() { Title = "Casousel 1 Title", Text = "Casousel 1 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions }); columns.Add(new TemplateColumn() { Title = "Casousel 2 Title", Text = "Casousel 2 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions }); CarouselTemplate carouselTemplate = new CarouselTemplate(columns); replyMessage = new TemplateMessage("Carousel", carouselTemplate); } else if (textMessage.Text.ToLower() == "imagemap") { var url = HttpContext.Current.Request.Url; var imageUrl = $"{url.Scheme}://{url.Host}:{url.Port}/images/githubicon"; List <ImageMapAction> actions = new List <ImageMapAction>(); actions.Add(new UriImageMapAction("http://github.com", new ImageMapArea(0, 0, 520, 1040))); actions.Add(new MessageImageMapAction("I love LINE!", new ImageMapArea(520, 0, 520, 1040))); replyMessage = new ImageMapMessage(imageUrl, "GitHub", new BaseSize(1040, 1040), actions); } else { replyMessage = new TextMessage(textMessage.Text); } await Reply(replyMessage); }
public void ShouldThrowExceptionWhenColumnsContainsNull() { ITemplate template = new CarouselTemplate() { Columns = new CarouselColumn[] { null } }; ExceptionAssert.Throws <InvalidOperationException>("The column should not be null.", () => { template.Validate(); }); }
public void ShouldThrowExceptionWhenColumnsIsInvalid() { ITemplate template = new CarouselTemplate() { Columns = new[] { new CarouselColumn() } }; ExceptionAssert.Throws <InvalidOperationException>("The text cannot be null.", () => { template.Validate(); }); }
public void ShouldNotThrowExceptionWhenValueContains10Items() { CarouselTemplate template = new CarouselTemplate() { Columns = new ICarouselColumn[] { new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn() } }; }
public void Columns_5_ThrowsNoException() { CarouselTemplate template = new CarouselTemplate() { Columns = new ICarouselColumn[] { new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn() } }; }
public async Task HandleTextMessage() { var textMessage = JsonConvert.DeserializeObject <TextMessage>(lineEvent.Message.ToString()); Message replyMessage = null; if (textMessage.Text.ToLower() == "buttons") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Message Label", "sample data")); actions.Add(new PostbackTemplateAction("Postback Label", "sample data")); actions.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); ButtonsTemplate buttonsTemplate = new ButtonsTemplate("https://github.com/apple-touch-icon.png", "Sample Title", "Sample Text", actions); replyMessage = new TemplateMessage("Buttons", buttonsTemplate); } else if (textMessage.Text.ToLower() == "confirm") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Yes", "yes")); actions.Add(new MessageTemplateAction("No", "no")); ConfirmTemplate confirmTemplate = new ConfirmTemplate("Confirm Test", actions); replyMessage = new TemplateMessage("Confirm", confirmTemplate); } else if (textMessage.Text.ToLower() == "carousel") { List <TemplateColumn> columns = new List <TemplateColumn>(); List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Message Label", "sample data")); actions.Add(new PostbackTemplateAction("Postback Label", "sample data")); actions.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); columns.Add(new TemplateColumn() { Title = "Casousel 1 Title", Text = "Casousel 1 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions }); columns.Add(new TemplateColumn() { Title = "Casousel 2 Title", Text = "Casousel 2 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions }); CarouselTemplate carouselTemplate = new CarouselTemplate(columns); replyMessage = new TemplateMessage("Carousel", carouselTemplate); } else { replyMessage = new TextMessage(textMessage.Text); } await Reply(replyMessage); }
public void Columns_MoreThan5_ThrowsException() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The maximum number of columns is 5.", () => { template.Columns = new ICarouselColumn[] { new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn() }; }); }
public async Task <IHttpActionResult> Post() { try { //Get Message string postData = Request.Content.ReadAsStringAsync().Result; db.InsertRequestLog(postData); var RequestBody = isRock.LineBot.Utility.Parsing(postData); string Message = RequestBody.events[0].message.text; string ChannelAccessToken = db.GetBotToken("Line"); //取得LUIS的相關設定值 NLPInfo LUISInfo = db.GetNLPInfo("LineBotNLP"); //Send to Analysis Microsoft.Cognitive.LUIS.LuisClient lc = new Microsoft.Cognitive.LUIS.LuisClient(LUISInfo.appid, LUISInfo.appKey, true); var AnalysisResult = await lc.Predict(Message); string replyMessage; //Get Reply Message bool isGreeting = db.GetResult(AnalysisResult, out replyMessage); if (isGreeting) { CarouselTemplate ct = LineRepository.GetButtonTemplateMessage("Carousel") as CarouselTemplate; var result = Utility.PushTemplateMessage(RequestBody.events[0].source.userId , ct , ChannelAccessToken); } else { //Response Message isRock.LineBot.Utility.ReplyMessage(RequestBody.events[0].replyToken, replyMessage, ChannelAccessToken); } return(Ok()); } catch (Exception ex) { string errorMessage = string.Format("ErrorMessage:{0},ErrorStack:{1},InnerExcepton:", ex.Message, ex.StackTrace, ex.InnerException); db.InsertRequestLog(errorMessage); return(Ok(errorMessage)); } }
internal static CarouselTemplate GenCarouselTemplate() { var TemplateMessages = db.Database.SqlQuery <BotTemplateMessage>(@" SELECT A.* FROM dbo.BotTemplateMessage A INNER JOIN dbo.BotData B ON A.BotSeq = B.BotSeq WHERE B.BotName = 'LINE' AND A.Type = 'Menu'", ""); CarouselTemplate ct = new CarouselTemplate(); ct.altText = "RBot的CarouselMenu"; ct.columns = new List <Column>(); foreach (var message in TemplateMessages) { Column c = new Column(); c.text = message.Text; c.title = message.Title; c.thumbnailImageUrl = new Uri(message.TemplateURL); var actionData = db.BotTemplateAction.AsQueryable() .Where(o => o.TemplateSeq == message.Seq); foreach (var action in actionData) { if (action.type == "postback") { PostbackActon postbackAction = new PostbackActon(); postbackAction.data = action.data; postbackAction.label = action.label; postbackAction.text = action.text; c.actions.Add(postbackAction); } else if (action.type == "uri") { UriActon uriAction = new UriActon(); uriAction.label = action.label; uriAction.uri = new Uri(action.url); c.actions.Add(uriAction); } } ct.columns.Add(c); } return(ct); }
private CarouselTemplate GetCarouselTemplate(List <CarouselItem> carouselItems) { CarouselTemplate carouselTemplate = null; List <CarouselColumn> carouselColumns = new List <CarouselColumn>(); foreach (CarouselItem item in carouselItems) { // carouselColumns.Add(new CarouselColumn( item.Text, item.ImageUrl, item.Title, item.Actions)); } carouselTemplate = new CarouselTemplate(carouselColumns); return(carouselTemplate); }
public void ShouldNotThrowExceptionWhenValid() { ITemplate template = new CarouselTemplate() { Columns = new[] { new CarouselColumn() { Text = "Foo", Actions = new[] { new MessageAction() { Label = "Foo", Text = "Bar" } } } } }; template.Validate(); }
public void ShouldConvertCustomICarouselTemplateToCarouselTemplate() { var template = new TestCarouselTemplate(); var carouselTemplate = CarouselTemplate.Convert(template); Assert.AreNotEqual(template, carouselTemplate); var column = carouselTemplate.Columns.First() as CarouselColumn; Assert.AreEqual(new Uri("https://carousel.url"), column.ThumbnailUrl); Assert.AreEqual("CarouselTitle", column.Title); Assert.AreEqual("CarouselText", column.Text); var actions = column.Actions.ToArray(); var action = actions[0] as MessageAction; Assert.AreEqual("MessageLabel", action.Label); Assert.AreEqual("MessageText", action.Text); }
public void ShouldThrowExceptionWhenValueContainsMoreThan10Items() { CarouselTemplate template = new CarouselTemplate(); ExceptionAssert.Throws <InvalidOperationException>("The maximum number of columns is 10.", () => { template.Columns = new CarouselColumn[] { new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn(), new CarouselColumn() }; }); }
public ActionResult DispatchTemplate3() { var actions = new List <TemplateActionBase>(); actions.Add(new MessageAction() { label = "標題 - 文字回復", text = "回復文字" }); actions.Add(new UriAction() { label = "標題 - Google", uri = new Uri("http://www.google.com") }); actions.Add(new PostbackAction() { label = "標題 - 發生Postback", data = "abc=aaa&def=111" }); var column = new Column { text = "ButtonTemplate文字訊息", title = "ButtonTemplate標題", thumbnailImageUrl = new Uri("https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/LINE_logo.svg/200px-LINE_logo.svg.png"), actions = actions }; var tmpl = new CarouselTemplate() { altText = "快快樂樂發送了一個詢問," }; tmpl.columns.Add(column); tmpl.columns.Add(column); tmpl.columns.Add(column); bot.PushMessage(toUserID, tmpl); return(View("Index")); }
/// <summary> /// Get all messages from DirectLine and reply back to Line /// </summary> private async Task GetAndReplyMessages() { dl.MessageSet result = string.IsNullOrEmpty(watermark) ? await dlClient.Conversations.GetMessagesAsync(conversationId) : await dlClient.Conversations.GetMessagesAsync(conversationId, watermark); userParams["Watermark"] = (Int64.Parse(result.Watermark)).ToString(); foreach (var message in result.Messages) { if (message.FromProperty == lineEvent.Source.UserId) { continue; } Message replyMessage = new Message(); if (message.Attachments != null && message.Attachments.Count != 0) { foreach (var attachment in message.Attachments) { if (attachment.ContentType.Contains("image")) { var originalContentUrl = ""; var previewImageUrl = ""; if (!string.IsNullOrEmpty(attachment.Url)) { originalContentUrl = attachment.Url.Contains("http") ? attachment.Url : "https://directline.botframework.com/" + attachment.Url; } else { // Have to create Uri accessible to Line } replyMessage = new ImageMessage(originalContentUrl, previewImageUrl); } else if (attachment.ContentType.Contains("audio")) { var originalContentUrl = ""; var durationInMilliseconds = 0; if (!string.IsNullOrEmpty(attachment.Url)) { originalContentUrl = attachment.Url.Contains("http") ? attachment.Url : "https://directline.botframework.com/" + attachment.Url; } else { // Have to create Uri accessible to Line } replyMessage = new AudioMessage(originalContentUrl, durationInMilliseconds); } else if (attachment.ContentType.Contains("video")) { var originalContentUrl = ""; var previewImageUrl = ""; if (!string.IsNullOrEmpty(attachment.Url)) { originalContentUrl = attachment.Url.Contains("http") ? attachment.Url : "https://directline.botframework.com/" + attachment.Url; } else { // Have to create Uri accessible to Line } replyMessage = new VideoMessage(originalContentUrl, previewImageUrl); } } } else if (message.ChannelData != null) { Entity entity = JsonConvert.DeserializeObject <Entity>(message.ChannelData.ToString()); switch (entity.Type) { case "GeoCoordinates": GeoCoordinates geoCoordinates = JsonConvert.DeserializeObject <GeoCoordinates>(entity.Properties.ToString()); replyMessage = new LocationMessage(message.Text, geoCoordinates.Name, geoCoordinates.Latitude, geoCoordinates.Longitude); break; case "Place": Place place = JsonConvert.DeserializeObject <Place>(entity.Properties.ToString()); GeoCoordinates geo = JsonConvert.DeserializeObject <GeoCoordinates>(place.Geo.ToString()); replyMessage = new LocationMessage(place.Name, place.Address, geo.Latitude, geo.Longitude); break; case "Confirm": string title = entity.Properties.ToString(); ConfirmTemplate confirmTemplate = new ConfirmTemplate(title, new List <TemplateAction>() { new MessageTemplateAction("Yes", "Yes"), new MessageTemplateAction("No", "No") }); replyMessage = new TemplateMessage("Confirm template", confirmTemplate); break; case "Rich": List <Attachment> attachments = JsonConvert.DeserializeObject <List <Attachment> >(entity.Properties["Attachments"].ToString()); if (attachments.Count == 1) { var attachment = attachments.First(); HeroCard hcard = null; if (attachment.ContentType == "application/vnd.microsoft.card.hero") { hcard = JsonConvert.DeserializeObject <HeroCard>(attachment.Content.ToString()); } else if (attachment.ContentType == "application/vnd.microsoft.card.thumbnail") { ThumbnailCard tCard = JsonConvert.DeserializeObject <ThumbnailCard>(attachment.Content.ToString()); hcard = new HeroCard(tCard.Title, tCard.Subtitle, tCard.Text, tCard.Images, tCard.Buttons, null); } else { break; } ButtonsTemplate buttonsTemplate = new ButtonsTemplate(hcard.Images.First().Url, hcard.Title, hcard.Subtitle); foreach (var button in hcard.Buttons) { switch (button.Type) { case "openUrl": buttonsTemplate.Actions.Add(new UriTemplateAction(button.Title, button.Value)); break; case "imBack": buttonsTemplate.Actions.Add(new MessageTemplateAction(button.Title, button.Value)); break; case "postBack": buttonsTemplate.Actions.Add(new PostbackTemplateAction(button.Title, button.Value)); break; } } replyMessage = new TemplateMessage("Buttons template", buttonsTemplate); } else { CarouselTemplate carouselTemplate = new CarouselTemplate(); foreach (var attachment in attachments) { TemplateColumn tColumn = new TemplateColumn(); HeroCard hcard = null; if (attachment.ContentType == "application/vnd.microsoft.card.hero") { hcard = JsonConvert.DeserializeObject <HeroCard>(attachment.Content.ToString()); } else if (attachment.ContentType == "application/vnd.microsoft.card.thumbnail") { ThumbnailCard tCard = JsonConvert.DeserializeObject <ThumbnailCard>(attachment.Content.ToString()); hcard = new HeroCard(tCard.Title, tCard.Subtitle, tCard.Text, tCard.Images, tCard.Buttons, null); } else { continue; } foreach (var button in hcard.Buttons) { switch (button.Type) { case "openUrl": tColumn.Actions.Add(new UriTemplateAction(button.Title, button.Value)); break; case "imBack": tColumn.Actions.Add(new MessageTemplateAction(button.Title, button.Value)); break; case "postBack": tColumn.Actions.Add(new PostbackTemplateAction(button.Title, button.Value)); break; } } tColumn.ThumbnailImageUrl = string.IsNullOrEmpty(hcard.Images.First().Url) ? null : hcard.Images.First().Url; tColumn.Text = hcard.Subtitle; tColumn.Title = hcard.Title; carouselTemplate.Columns.Add(tColumn); } replyMessage = new TemplateMessage("Carousel template", carouselTemplate); } break; } } else if (!string.IsNullOrEmpty(message.Text)) { if (message.Text.Contains("\n\n*")) { var lines = message.Text.Split(new[] { "\n\n" }, StringSplitOptions.RemoveEmptyEntries); ButtonsTemplate buttonsTemplate = new ButtonsTemplate(text: lines[0]); foreach (var line in lines.Skip(1)) { buttonsTemplate.Actions.Add(new PostbackTemplateAction(line, line.Replace("* ", ""))); } replyMessage = new TemplateMessage("Buttons template", buttonsTemplate); } else { replyMessage = new TextMessage(message.Text); } } await Reply(replyMessage); } }
public IActionResult Post() { try { foreach (var lineEvent in this.ReceivedMessage.events) { if (lineEvent == null || lineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } //準備回覆訊息 if (lineEvent.type.ToLower() != "message" || lineEvent.message.type != "text") { return(Ok()); } switch (lineEvent.message.text.ToLower()) { case "/quickreply": var quickReplyMsg = new TextMessage("拒絕融資推銷"); quickReplyMsg.quickReply.items.AddRange(new QuickReplyItemBase[] { new QuickReplyMessageAction("不需要", "不需要"), new QuickReplyMessageAction("再見", "再見"), new QuickReplyMessageAction("我超有錢", "我超有錢"), new QuickReplyDatetimePickerAction("選擇時間", DateTime.Now.ToString("yyyy-MM-dd"), DatetimePickerModes.date), new QuickReplyPostbackAction("PostBack Data 1", "Quick Reply PostBack Data", "顯示的文字", ""), new QuickReplyPostbackAction("PostBack Data 2", "Quick Reply PostBack Data", "", ""), new QuickReplyLocationAction("地點") }); this.ReplyMessage(lineEvent.replyToken, quickReplyMsg); break; case "/imagemap": var imgmapMsg = new ImagemapMessage { baseUrl = new Uri(@"https://i.imgur.com/7pxFJW8.jpg"), baseSize = new System.Drawing.Size(816, 649) }; var largeNumber = new string[] { "壹", "貳", "參", "肆", "伍", "陸", "漆", "捌", "玖" }; var address = new List <List <int> > { new List <int> { 666, 111, 90, 90 }, new List <int> { 719, 287, 90, 90 }, new List <int> { 655, 458, 90, 90 }, new List <int> { 490, 561, 90, 90 }, new List <int> { 265, 568, 90, 90 }, new List <int> { 79, 465, 90, 90 }, new List <int> { 30, 283, 90, 90 }, new List <int> { 56, 105, 90, 90 }, new List <int> { 357, 341, 90, 90 }, }; for (var i = 0; i < largeNumber.Length && i < address.Count; i++) { imgmapMsg.actions.Add(new ImagemapMessageAction { text = largeNumber[i], area = new ImagemapArea(address[i][0], address[i][1], address[i][2], address[i][3]) }); } imgmapMsg.actions.Add(new ImagemapUriAction { linkUri = new Uri(@"https://i.imgur.com/7pxFJW8.jpg"), area = new ImagemapArea(297, 71, 234, 201) }); this.ReplyMessage(lineEvent.replyToken, imgmapMsg); break; case "/flexmessage": //定義一則訊息 var baseFlexMessages = @" [ { ""type"": ""text"", ""text"": ""來源 : $source$"" }, { ""type"": ""flex"", ""altText"": ""Sample Flex Message"", ""contents"": $flex$ } ]"; var flexMessage = baseFlexMessages.Replace("$flex$", SampleFlexMessage.Sample1) .Replace("$source$", SampleFlexMessage.Source1); this.ReplyMessageWithJSON(lineEvent.replyToken, flexMessage); break; case "/flexmessage2": //定義一則訊息 var baseFlexMessages2 = @" [ { ""type"": ""text"", ""text"": ""來源 : $source$"" }, { ""type"": ""flex"", ""altText"": ""Sample Flex Message"", ""contents"": $flex$ } ]"; var flexMessage2 = baseFlexMessages2.Replace("$flex$", SampleFlexMessage.Sample2) .Replace("$source$", SampleFlexMessage.Source2); this.ReplyMessageWithJSON(lineEvent.replyToken, flexMessage2); break; case "/lineurlscheme": this.ReplyMessage(lineEvent.replyToken, "https://developers.line.biz/en/docs/messaging-api/using-line-url-scheme/#available-line-url-schemes"); break; case "/liff": //var liff = isRock.LIFF.Utility.AddLiffApp(_lineBot.ChannelAccessToken, new Uri("https://bu9lifftest.azurewebsites.net"), isRock.LIFF.ViewType.full); this.ReplyMessage(lineEvent.replyToken, "line://app/1655852489-2yE1NxMX"); break; case "/templatemessage": var templateAction = new List <TemplateActionBase>(); templateAction.AddRange(new TemplateActionBase[] { new MessageAction { label = "回覆訊息", text = "測試訊息" }, new UriAction { label = "開啟網頁", uri = new Uri("https://www.google.com.tw/") }, new PostbackAction { label = "PostBack", data = "Postback Data" } }); var buttomTemplate = new ButtonsTemplate { altText = "無法顯示", text = "測試text", title = "測試title", thumbnailImageUrl = new Uri(@"https://i.imgur.com/7pxFJW8.jpg"), actions = templateAction //設定回覆動作 }; this.ReplyMessage(lineEvent.replyToken, buttomTemplate); break; case "/templatemessage2": var templateAction2 = new List <TemplateActionBase>(); templateAction2.AddRange(new TemplateActionBase[] { new MessageAction { label = "回覆訊息", text = "測試訊息" }, new UriAction { label = "開啟網頁", uri = new Uri("https://www.google.com.tw/") }, new PostbackAction { label = "PostBack", data = "Postback Data" } }); var carouseTemplate2 = new CarouselTemplate { altText = "無法顯示", columns = new List <Column> { new Column { actions = templateAction2, text = "測試text", title = "測試title", thumbnailImageUrl = new Uri(@"https://i.imgur.com/7pxFJW8.jpg") }, new Column { actions = templateAction2, text = "測試text", title = "測試title", thumbnailImageUrl = new Uri(@"https://i.imgur.com/7pxFJW8.jpg") }, new Column { actions = templateAction2, text = "測試text", title = "測試title", thumbnailImageUrl = new Uri(@"https://i.imgur.com/7pxFJW8.jpg") } } }; this.ReplyMessage(lineEvent.replyToken, carouseTemplate2); break; case "/templatemessage3": var templateAction3 = new List <TemplateActionBase>(); templateAction3.AddRange(new TemplateActionBase[] { new UriAction { label = "開啟網頁", uri = new Uri("https://www.google.com.tw/") }, new PostbackAction { label = "PostBack", data = "Postback Data" } }); var confirmTemplate = new ConfirmTemplate { altText = "無法顯示", text = "測試text", actions = templateAction3 }; this.ReplyMessage(lineEvent.replyToken, confirmTemplate); break; default: return(Ok()); } } } catch (Exception ex) { this.PushMessage(_lineBot.AdminUserId, "發生錯誤:\n" + ex.Message); } return(Ok()); }
/// <summary> /// Get all messages from DirectLine and reply back to Line /// </summary> private async Task GetAndReplyMessages() { dl.ActivitySet result = string.IsNullOrEmpty(watermark) ? await dlClient.Conversations.GetActivitiesAsync(conversationId) : await dlClient.Conversations.GetActivitiesAsync(conversationId, watermark); userParams["Watermark"] = (Int64.Parse(result.Watermark)).ToString(); foreach (var activity in result.Activities) { if (activity.From.Id == lineEvent.Source.UserId) { continue; } List <Message> messages = new List <Message>(); if (activity.Attachments != null && activity.Attachments.Count != 0 && (activity.AttachmentLayout == null || activity.AttachmentLayout == "list")) { foreach (var attachment in activity.Attachments) { if (attachment.ContentType.Contains("card.animation")) { // https://docs.botframework.com/en-us/core-concepts/reference/#animationcard // Use TextMessage for title and use Image message for image. Not really an animation though. AnimationCard card = JsonConvert.DeserializeObject <AnimationCard>(attachment.Content.ToString()); messages.Add(new TextMessage($"{card.Title}\r\n{card.Subtitle}\r\n{card.Text}")); foreach (var media in card.Media) { var originalContentUrl = media.Url?.Replace("http://", "https://"); var previewImageUrl = card.Image?.Url?.Replace("http://", "https://"); messages.Add(new ImageMessage(originalContentUrl, previewImageUrl)); } } else if (attachment.ContentType.Contains("card.audio")) { // https://docs.botframework.com/en-us/core-concepts/reference/#audiocard // Use TextMessage for title and use Audio message for image. AudioCard card = JsonConvert.DeserializeObject <AudioCard>(attachment.Content.ToString()); messages.Add(new TextMessage($"{card.Title}\r\n{card.Subtitle}\r\n{card.Text}")); foreach (var media in card.Media) { var originalContentUrl = media.Url?.Replace("http://", "https://"); var durationInMilliseconds = 1; messages.Add(new AudioMessage(originalContentUrl, durationInMilliseconds)); } } else if (attachment.ContentType.Contains("card.hero") || attachment.ContentType.Contains("card.thumbnail")) { // https://docs.botframework.com/en-us/core-concepts/reference/#herocard // https://docs.botframework.com/en-us/core-concepts/reference/#thumbnailcard HeroCard hcard = null; if (attachment.ContentType.Contains("card.hero")) { hcard = JsonConvert.DeserializeObject <HeroCard>(attachment.Content.ToString()); } else if (attachment.ContentType.Contains("card.thumbnail")) { ThumbnailCard tCard = JsonConvert.DeserializeObject <ThumbnailCard>(attachment.Content.ToString()); hcard = new HeroCard(tCard.Title, tCard.Subtitle, tCard.Text, tCard.Images, tCard.Buttons, null); } var imageUrl = string.Empty; if (hcard.Images.Any()) { imageUrl = hcard.Images?.First().Url.Replace("http://", "https://"); } string text = string.IsNullOrEmpty(hcard.Subtitle) ? hcard.Text : hcard.Subtitle; if (string.IsNullOrEmpty(text)) { text = " "; } ButtonsTemplate buttonsTemplate = new ButtonsTemplate( imageUrl, hcard.Subtitle == null ? null : hcard.Title, text); if (hcard.Buttons != null) { foreach (var button in hcard.Buttons) { buttonsTemplate.Actions.Add(GetAction(button)); } } else { // Action is mandatory, so create from title/subtitle. var actionLabel = hcard.Title?.Length < hcard.Subtitle?.Length ? hcard.Title : hcard.Subtitle; buttonsTemplate.Actions.Add(new PostbackTemplateAction(actionLabel, actionLabel, actionLabel)); } messages.Add(new TemplateMessage("Buttons template", buttonsTemplate)); } else if (attachment.ContentType.Contains("receipt")) { // https://docs.botframework.com/en-us/core-concepts/reference/#receiptcard // Use TextMessage and Buttons. As LINE doesn't support thumbnail type yet. ReceiptCard card = JsonConvert.DeserializeObject <ReceiptCard>(attachment.Content.ToString()); var text = card.Title + "\r\n\r\n"; foreach (var fact in card.Facts) { text += $"{fact.Key}:{fact.Value}\r\n"; } text += "\r\n"; foreach (var item in card.Items) { text += $"{item.Title}\r\nprice:{item.Price},quantity:{item.Quantity}"; } messages.Add(new TextMessage(text)); ButtonsTemplate buttonsTemplate = new ButtonsTemplate(title: $"total:{card.Total}", text: $"tax:{card.Tax}"); foreach (var button in card.Buttons) { buttonsTemplate.Actions.Add(GetAction(button)); } messages.Add(new TemplateMessage("Buttons template", buttonsTemplate)); } else if (attachment.ContentType.Contains("card.signin")) { // https://docs.botframework.com/en-us/core-concepts/reference/#signincard // Line doesn't support auth button yet, so simply represent link. SigninCard card = JsonConvert.DeserializeObject <SigninCard>(attachment.Content.ToString()); ButtonsTemplate buttonsTemplate = new ButtonsTemplate(text: card.Text); foreach (var button in card.Buttons) { buttonsTemplate.Actions.Add(GetAction(button)); } messages.Add(new TemplateMessage("Buttons template", buttonsTemplate)); } else if (attachment.ContentType.Contains("card.video")) { // https://docs.botframework.com/en-us/core-concepts/reference/#videocard // Use Video message for video and buttons for action. VideoCard card = JsonConvert.DeserializeObject <VideoCard>(attachment.Content.ToString()); foreach (var media in card.Media) { var originalContentUrl = media?.Url?.Replace("http://", "https://"); var previewImageUrl = card.Image?.Url?.Replace("http://", "https://"); messages.Add(new VideoMessage(originalContentUrl, previewImageUrl)); } ButtonsTemplate buttonsTemplate = new ButtonsTemplate(title: card.Title, text: $"{card.Subtitle}\r\n{card.Text}"); foreach (var button in card.Buttons) { buttonsTemplate.Actions.Add(GetAction(button)); } messages.Add(new TemplateMessage("Buttons template", buttonsTemplate)); } else if (attachment.ContentType.Contains("image")) { var originalContentUrl = attachment.ContentUrl?.Replace("http://", "https://"); var previewImageUrl = string.IsNullOrEmpty(attachment.ThumbnailUrl) ? attachment.ContentUrl?.Replace("http://", "https://") : attachment.ThumbnailUrl?.Replace("http://", "https://"); messages.Add(new ImageMessage(originalContentUrl, previewImageUrl)); } else if (attachment.ContentType.Contains("audio")) { var originalContentUrl = attachment.ContentUrl?.Replace("http://", "https://"); var durationInMilliseconds = 0; messages.Add(new AudioMessage(originalContentUrl, durationInMilliseconds)); } else if (attachment.ContentType.Contains("video")) { var originalContentUrl = attachment.ContentUrl?.Replace("http://", "https://"); var previewImageUrl = attachment.ThumbnailUrl?.Replace("http://", "https://"); messages.Add(new VideoMessage(originalContentUrl, previewImageUrl)); } } } else if (activity.Attachments != null && activity.Attachments.Count != 0 && activity.AttachmentLayout != null) { CarouselTemplate carouselTemplate = new CarouselTemplate(); foreach (var attachment in activity.Attachments) { HeroCard hcard = null; if (attachment.ContentType == "application/vnd.microsoft.card.hero") { hcard = JsonConvert.DeserializeObject <HeroCard>(attachment.Content.ToString()); } else if (attachment.ContentType == "application/vnd.microsoft.card.thumbnail") { ThumbnailCard tCard = JsonConvert.DeserializeObject <ThumbnailCard>(attachment.Content.ToString()); hcard = new HeroCard(tCard.Title, tCard.Subtitle, tCard.Text, tCard.Images, tCard.Buttons, null); } else { continue; } TemplateColumn tColumn = new TemplateColumn( hcard.Images.FirstOrDefault()?.Url?.Replace("http://", "https://"), hcard.Subtitle == null ? null : hcard.Title, string.IsNullOrEmpty(hcard.Subtitle) ? hcard.Title : hcard.Subtitle); if (hcard.Buttons != null) { foreach (var button in hcard.Buttons) { tColumn.Actions.Add(GetAction(button)); } } else { // Action is mandatory, so create from title/subtitle. var actionLabel = hcard.Title?.Length < hcard.Subtitle?.Length ? hcard.Title : hcard.Subtitle; tColumn.Actions.Add(new PostbackTemplateAction(actionLabel, actionLabel, actionLabel)); } carouselTemplate.Columns.Add(tColumn); } messages.Add(new TemplateMessage("Carousel template", carouselTemplate)); } else if (activity.Entities != null && activity.Entities.Count != 0) { foreach (var entity in activity.Entities) { switch (entity.Type) { case "Place": Place place = entity.Properties.ToObject <Place>(); GeoCoordinates geo = JsonConvert.DeserializeObject <GeoCoordinates>(place.Geo.ToString()); messages.Add(new LocationMessage(place.Name, place.Address.ToString(), geo.Latitude, geo.Longitude)); break; case "GeoCoordinates": GeoCoordinates geoCoordinates = entity.Properties.ToObject <GeoCoordinates>(); messages.Add(new LocationMessage(activity.Text, geoCoordinates.Name, geoCoordinates.Latitude, geoCoordinates.Longitude)); break; } } } else if (activity.ChannelData != null) { } else if (!string.IsNullOrEmpty(activity.Text)) { if (activity.Text.Contains("\n\n*")) { var lines = activity.Text.Split(new[] { "\n\n" }, StringSplitOptions.RemoveEmptyEntries); ButtonsTemplate buttonsTemplate = new ButtonsTemplate(text: lines[0]); foreach (var line in lines.Skip(1)) { buttonsTemplate.Actions.Add(new PostbackTemplateAction(line, line.Replace("* ", ""), line.Replace("* ", ""))); } messages.Add(new TemplateMessage("Buttons template", buttonsTemplate)); } else { messages.Add(new TextMessage(activity.Text)); } } await Reply(messages); } }
public async Task HandleTextMessage() { var textMessage = JsonConvert.DeserializeObject <TextMessage>(lineEvent.Message.ToString()); Message replyMessage = null; if (textMessage.Text.ToLower() == "buttons") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Message Label", "sample data")); actions.Add(new PostbackTemplateAction("Postback Label", "sample data", "sample data")); actions.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); ButtonsTemplate buttonsTemplate = new ButtonsTemplate("https://github.com/apple-touch-icon.png", "Sample Title", "Sample Text", actions); replyMessage = new TemplateMessage("Buttons", buttonsTemplate); } else if (textMessage.Text.ToLower() == "confirm") { List <TemplateAction> actions = new List <TemplateAction>(); actions.Add(new MessageTemplateAction("Yes", "yes")); actions.Add(new MessageTemplateAction("No", "no")); ConfirmTemplate confirmTemplate = new ConfirmTemplate("Confirm Test", actions); replyMessage = new TemplateMessage("Confirm", confirmTemplate); } else if (textMessage.Text.ToLower() == "carousel") { List <TemplateColumn> columns = new List <TemplateColumn>(); List <TemplateAction> actions1 = new List <TemplateAction>(); List <TemplateAction> actions2 = new List <TemplateAction>(); // Add actions. actions1.Add(new MessageTemplateAction("Message Label", "sample data")); actions1.Add(new PostbackTemplateAction("Postback Label", "sample data", "sample data")); actions1.Add(new UriTemplateAction("Uri Label", "https://github.com/kenakamu")); // Add datetime picker actions actions2.Add(new DatetimePickerTemplateAction("DateTime Picker", "DateTime", DatetimePickerMode.Datetime, "2017-07-21T13:00")); actions2.Add(new DatetimePickerTemplateAction("Date Picker", "Date", DatetimePickerMode.Date, "2017-07-21")); actions2.Add(new DatetimePickerTemplateAction("Time Picker", "Time", DatetimePickerMode.Time, "13:00")); columns.Add(new TemplateColumn() { Title = "Casousel 1 Title", Text = "Casousel 1 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions1 }); columns.Add(new TemplateColumn() { Title = "Casousel 2 Title", Text = "Casousel 2 Text", ThumbnailImageUrl = "https://github.com/apple-touch-icon.png", Actions = actions2 }); CarouselTemplate carouselTemplate = new CarouselTemplate(columns); replyMessage = new TemplateMessage("Carousel", carouselTemplate); } else if (textMessage.Text.ToLower() == "imagecarousel") { List <ImageColumn> columns = new List <ImageColumn>(); UriTemplateAction action = new UriTemplateAction("Uri Label", "https://github.com/kenakamu"); columns.Add(new ImageColumn("https://github.com/apple-touch-icon.png", action)); columns.Add(new ImageColumn("https://github.com/apple-touch-icon.png", action)); columns.Add(new ImageColumn("https://github.com/apple-touch-icon.png", action)); columns.Add(new ImageColumn("https://github.com/apple-touch-icon.png", action)); columns.Add(new ImageColumn("https://github.com/apple-touch-icon.png", action)); ImageCarouselTemplate carouselTemplate = new ImageCarouselTemplate(columns); replyMessage = new TemplateMessage("Carousel", carouselTemplate); } else if (textMessage.Text.ToLower() == "imagemap") { var url = HttpContext.Current.Request.Url; var imageUrl = $"{url.Scheme}://{url.Host}:{url.Port}/images/githubicon"; List <ImageMapAction> actions = new List <ImageMapAction>(); actions.Add(new UriImageMapAction("http://github.com", new ImageMapArea(0, 0, 520, 1040))); actions.Add(new MessageImageMapAction("I love LINE!", new ImageMapArea(520, 0, 520, 1040))); replyMessage = new ImageMapMessage(imageUrl, "GitHub", new BaseSize(1040, 1040), actions); } else if (textMessage.Text.ToLower() == "addrichmenu") { // Create Rich Menu RichMenu richMenu = new RichMenu() { Size = new RichMenuSize(1686), Selected = false, Name = "nice richmenu", ChatBarText = "touch me", Areas = new List <RichMenuArea>() { new RichMenuArea() { Action = new PostbackTemplateAction("action=buy&itemid=123"), Bounds = new RichMenuBounds(0, 0, 2500, 1686) } } }; var richMenuId = await lineClient.CreateRichMenu(richMenu); var image = new MemoryStream(File.ReadAllBytes(HttpContext.Current.Server.MapPath(@"~\Images\richmenu.PNG"))); // Upload Image await lineClient.UploadRichMenuImage(richMenuId, image); // Link to user await lineClient.LinkRichMenuToUser(lineEvent.Source.UserId, richMenuId); } else if (textMessage.Text.ToLower() == "deleterichmenu") { // Get Rich Menu for the user var richMenuId = await lineClient.GetRichMenuIdForUser(lineEvent.Source.UserId); await lineClient.UnlinkRichMenuToUser(lineEvent.Source.UserId); await lineClient.DeleteRichMenu(richMenuId); } else if (textMessage.Text.ToLower() == "deleteallrichmenu") { // Get Rich Menu for the user var richMenuList = await lineClient.GetRichMenuList(); foreach (var richMenu in richMenuList) { await lineClient.DeleteRichMenu(richMenu["richMenuId"].ToString()); } } else { replyMessage = new TextMessage(textMessage.Text); } await Reply(replyMessage); }
private CarouselTemplate GetCarouselList() { CarouselTemplate _carousel = new CarouselTemplate() { CarouselName = "CarouselProductos", Elements = new List <ElementTemplate>() { new ElementTemplate() { Img_Url = "images/products/cool_tea.png", Title = "Cool Tea", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/volt.jpg", Title = "Volt", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/sporade.jpg", Title = "Sporade", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/cifrut.png", Title = "Cifrut", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/big_cola.jpg", Title = "Big Cola", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/agua_cielo.png", Title = "Cielo", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } }, new ElementTemplate() { Img_Url = "images/products/pulp.png", Title = "Pulp", Buttons = new List <ButtonTemplate>() { new ButtonTemplate() { Text = "Ver más", HrefLink = "javascript:void();" } } } } }; return(_carousel); }