Beispiel #1
0
        /// <summary>
        /// Main run method
        /// </summary>
        /// <param name="req">HttpRequestMessage</param>
        /// <param name="log">TraceWriter</param>
        /// <returns>Result</returns>
        public static async Task <IActionResult> Run(HttpRequestMessage req, TraceWriter log)
        {
            try
            {
                log.Info("C# HTTP trigger function processed a request.");
                var channelSecret = Environment.GetEnvironmentVariable("7410da12768dbb3db2632dd64ed33a12");
                var events        = await req.GetWebhookEventsAsync(channelSecret);

                var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
                var eventSourceState = await TableStorage <EventSourceState> .CreateAsync(connectionString, "eventsourcestate");

                var blobStorage = await BlobStorage.CreateAsync(connectionString, "linebotcontainer");

                // Create the LineBotApp and run it.
                var app = new LineBotApp(lineMessagingClient, eventSourceState, blobStorage, log);
                await app.RunAsync(events);
            }
            catch (InvalidSignatureException e)
            {
                return(new ObjectResult(e.Message)
                {
                    StatusCode = (int)HttpStatusCode.Forbidden
                });
            }
            catch (LineResponseException e)
            {
                log.Error(e.ToString());
                var debugUserId = Environment.GetEnvironmentVariable("DebugUser");
                if (debugUserId != null)
                {
                    await lineMessagingClient.PushMessageAsync(debugUserId, $"{e.StatusCode}({(int)e.StatusCode}), {e.ResponseMessage.ToString()}");
                }
            }
            catch (Exception e)
            {
                log.Error(e.ToString());
                var debugUserId = Environment.GetEnvironmentVariable("DebugUser");
                if (debugUserId != null)
                {
                    await lineMessagingClient.PushMessageAsync(debugUserId, e.Message);
                }
            }

            return(new OkObjectResult("OK"));
        }
Beispiel #2
0
        public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            try
            {
                var channelSecret = System.Configuration.ConfigurationManager.AppSettings["ChannelSecret"];
                var events        = await req.GetWebhookEventsAsync(channelSecret);

                var connectionString = System.Configuration.ConfigurationManager.AppSettings["AzureWebJobsStorage"];
                var botStatus        = await TableStorage <BotStatus> .CreateAsync(connectionString, "botstatus");

                var blobStorage = await BlobStorage.CreateAsync(connectionString, "linebotcontainer");

                var app = new LineBotApp(lineMessagingClient, botStatus, blobStorage, log);

                /* To run sample apps in the samples directory, comment out the above line and cancel this comment out.
                 * var app = await AppSwitcher.SwitchAppsAsync(events,lineMessagingClient, botStatus, blobStorage, log);
                 * //*/

                await app.RunAsync(events);
            }
            catch (InvalidSignatureException e)
            {
                return(req.CreateResponse(HttpStatusCode.Forbidden, new { e.Message }));
            }
            catch (LineResponseException e)
            {
                log.Error(e.ToString());
                var debugUserId = System.Configuration.ConfigurationManager.AppSettings["DebugUser"];
                if (debugUserId != null)
                {
                    await lineMessagingClient.PushMessageAsync(debugUserId, $"{e.StatusCode}({(int)e.StatusCode}), {e.ResponseMessage.ToString()}");
                }
            }
            catch (Exception e)
            {
                log.Error(e.ToString());
                var debugUserId = System.Configuration.ConfigurationManager.AppSettings["DebugUser"];
                if (debugUserId != null)
                {
                    await lineMessagingClient.PushMessageAsync(debugUserId, e.Message);
                }
            }

            return(req.CreateResponse(HttpStatusCode.OK));
        }
Beispiel #3
0
        private async Task UploadImageAsync(string replyToken, string messageId, string blobDirectoryName)
        {
            var imageStream = await MessagingClient.GetContentStreamAsync(messageId);

            var image = System.Drawing.Image.FromStream(imageStream);

            var imageCount = BlobStorage.ListBlobUri(blobDirectoryName).Count();

            if (imageCount == 5)
            {
                await BlobStorage.DeleteDirectoryAsync(blobDirectoryName);

                imageCount = 0;
            }

            await BlobStorage.UploadImageAsync(image, blobDirectoryName, (imageCount + 1) + ".jpeg");

            await MessagingClient.ReplyMessageAsync(replyToken, $"Image uploaded ({imageCount + 1}).");
        }
Beispiel #4
0
        private async Task ReplyImagemapAsync(string replyToken, string messageId, string blobDirectoryName)
        {
            var imageStream = await MessagingClient.GetContentStreamAsync(messageId);

            var image = Image.FromStream(imageStream);

            using (var g = Graphics.FromImage(image))
            {
                g.DrawLine(Pens.Red, image.Width / 2, 0, image.Width / 2, image.Height);
                g.DrawLine(Pens.Red, 0, image.Height / 2, image.Width, image.Height / 2);
            }

            var uri = await UploadImageAsync(1040);

            await UploadImageAsync(700);
            await UploadImageAsync(460);
            await UploadImageAsync(300);
            await UploadImageAsync(240);

            var imageSize       = new ImagemapSize(1024, (int)(1040 * (double)image.Height / image.Width));
            var areaWidth       = imageSize.Width / 2;
            var areaHeight      = imageSize.Height / 2;
            var imagemapMessage = new ImagemapMessage(uri.ToString().Replace("/1040", ""),
                                                      "Sample Imagemap",
                                                      imageSize,
                                                      new IImagemapAction[] {
                new MessageImagemapAction(new ImagemapArea(0, 0, areaWidth, areaHeight), "Area Top-Left"),
                new MessageImagemapAction(new ImagemapArea(areaWidth, 0, areaWidth, areaHeight), "Area Top-Right"),
                new MessageImagemapAction(new ImagemapArea(0, areaHeight, areaWidth, areaHeight), "Area Bottom-Left"),
                new MessageImagemapAction(new ImagemapArea(areaWidth, areaHeight, areaWidth, areaHeight), "Area Bottom-Right"),
            });

            await MessagingClient.ReplyMessageAsync(replyToken, new[] { imagemapMessage });

            async Task <Uri> UploadImageAsync(int baseSize)
            {
                var img = image.GetThumbnailImage(baseSize, image.Height * baseSize / image.Width, () => false, IntPtr.Zero);

                return(await BlobStorage.UploadImageAsync(img, blobDirectoryName + "/" + messageId, baseSize.ToString()));
            }
        }
Beispiel #5
0
 public ImageCarouselSampleApp(LineMessagingClient lineMessagingClient, BlobStorage blobStorage, TraceWriter log)
 {
     MessagingClient = lineMessagingClient;
     BlobStorage     = blobStorage;
     Log             = log;
 }
        public static async Task <WebhookApplication> SwitchAppsAsync(IEnumerable <WebhookEvent> events, LineMessagingClient line, TableStorage <BotStatus> botStatus, BlobStorage blobStorage, TraceWriter log)
        {
            var ev     = events.First();
            var status = await botStatus.FindAsync(ev.Source.Type.ToString(), ev.Source.Id);

            if (status == null)
            {
                status = new BotStatus()
                {
                    SourceType = ev.Source.Type.ToString(),
                    SourceId   = ev.Source.Id,
                    CurrentApp = "@"
                };
            }

            var message = (ev as MessageEvent)?.Message as TextEventMessage;
            var text    = message?.Text;

            if (text == null || !text.StartsWith("@"))
            {
                text = status.CurrentApp;
            }
            text = text.Trim().ToLower();
            WebhookApplication app = null;

            if (text != "@richmenu")
            {
                try
                {
                    await line.UnLinkRichMenuFromUserAsync(ev.Source.Id);
                }
                catch (LineResponseException e)
                {
                    if (e.StatusCode != HttpStatusCode.NotFound)
                    {
                        throw;
                    }
                }
            }

            switch (text)
            {
            case "@":
                app = new LineBotApp(line, botStatus, blobStorage, log);
                break;

            case "@buttons":
                app = new ButtonsTemplateSampleApp(line, blobStorage, log);
                break;

            case "@carousel":
                app = new CarouselTemplateSampleApp(line, blobStorage, log);
                break;

            case "@postback":
                app = new PostbackMessageSampleApp(line, botStatus, log);
                break;

            case "@imagemap":
                app = new ImagemapSampleApp(line, blobStorage, log);
                break;

            case "@imagecarousel":
                app = new ImageCarouselSampleApp(line, blobStorage, log);
                break;

            case "@datetime":
                app = new DateTimePickerSampleApp(line, log);
                break;

            case "@richmenu":
                app = new RichMenuSampleApp(line, log);
                break;

            default:
                text = "@";
                app  = new LineBotApp(line, botStatus, blobStorage, log);
                break;
            }
            status.CurrentApp = text;
            await botStatus.UpdateAsync(status);

            return(app);
        }
        protected override async Task OnMessageAsync(MessageEvent ev)
        {
            var msg = ev.Message as TextEventMessage;

            if (msg == null)
            {
                return;
            }

            switch (msg.Text)
            {
            case "Rectangle-Cover":
                await ReplyButtonsTemplateMessageAsync(ImageAspectRatioType.Rectangle, ImageSizeType.Cover);

                break;

            case "Square-Contain":
                await ReplyButtonsTemplateMessageAsync(ImageAspectRatioType.Square, ImageSizeType.Contain);

                break;

            case "Square-Cover":
                await ReplyButtonsTemplateMessageAsync(ImageAspectRatioType.Square, ImageSizeType.Cover);

                break;

            case "Rectangle-Contein":
            default:
                await ReplyButtonsTemplateMessageAsync(ImageAspectRatioType.Rectangle, ImageSizeType.Contain);

                break;
            }

            async Task ReplyButtonsTemplateMessageAsync(ImageAspectRatioType imageAspectRatio, ImageSizeType imageSize)
            {
                var imageUri = BlobStorage.ListBlobUri(blobDirectoryName).FirstOrDefault(uri => uri.ToString().EndsWith(imageName));

                if (imageUri == null)
                {
                    imageUri = await BlobStorage.UploadImageAsync(Properties.Resources.sample_image, blobDirectoryName, imageName);
                }

                var actions = new[]
                {
                    new MessageTemplateAction("Rectangle-Contain", "Rectangle-Contain"),
                    new MessageTemplateAction("Rectangle-Cover", "Rectangle-Cover"),
                    new MessageTemplateAction("Square-Contain", "Square-Contain"),
                    new MessageTemplateAction("Square-Cover", "Square-Cover")
                };
                var templateMessage = new TemplateMessage("ButtonsTemplate",
                                                          new ButtonsTemplate(
                                                              imageAspectRatio.ToString() + "-" + imageSize.ToString(),
                                                              imageUri.ToString(),
                                                              "Test of thumbnail image settings",
                                                              actions,
                                                              imageAspectRatio,
                                                              imageSize,
                                                              imageBackgroundColor: "#FF0000"));
                await MessagingClient.ReplyMessageAsync(ev.ReplyToken, new[] { templateMessage });
            }
        }
 public ButtonsTemplateSampleApp(LineMessagingClient lineMessagingClient, BlobStorage blobStorage, TraceWriter log)
 {
     MessagingClient = lineMessagingClient;
     BlobStorage     = blobStorage;
     Log             = log;
 }
 public LineBotApp(LineMessagingClient lineMessagingClient, TableStorage <EventSourceState> tableStorage, BlobStorage blobStorage, TraceWriter log)
 {
     MessagingClient = lineMessagingClient;
     SourceState     = tableStorage;
     BlobStorage     = blobStorage;
     Log             = log;
 }
Beispiel #10
0
 public LineBotApp(LineMessagingClient messagingClient, TableStorage <EventSourceState> tableStorage, BlobStorage blobStorage, TraceWriter log)
 {
     this.messagingClient = messagingClient;
     this.sourceState     = tableStorage;
     this.blobStorage     = blobStorage;
     this.log             = log;
 }