/// <summary> /// Verify if the request is valid, then returns LINE Web-hook events from the request /// </summary> /// <param name="httpRequest">Http Request</param> /// <param name="requestPayload">Request Payload</param> /// <returns>List of Web-hook Events</returns> public IEnumerable <WebhookEvent> GetWebhookEvents(HttpRequest httpRequest, JToken requestPayload) { if (httpRequest == null) { throw new ArgumentNullException(nameof(httpRequest)); } if (requestPayload == null) { throw new ArgumentNullException(nameof(requestPayload)); } var content = JsonConvert.SerializeObject(requestPayload); var xLineSignature = httpRequest.Headers["X-Line-Signature"]; if (string.IsNullOrEmpty(xLineSignature) || !LineHelper.VerifySignature(_lineAdapterConfiguration.Value.LineChannelSecret, xLineSignature, content)) { throw new InvalidSignatureException(Constant.InvalidSignatureExceptionMessage); } dynamic json = JsonConvert.DeserializeObject(content); return(WebhookEventParser.ParseEvents(json.events)); }
/// <summary> /// Process Inbound Request from the Line Channel /// </summary> /// <param name="content">Inbound message content</param> /// <param name="request">Represents the incoming side of an individual HTTP request</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> public async Task ProcessInboundActivitiesAsync(JToken content, HttpRequest request) { if (content == null) { throw new ArgumentNullException(nameof(content)); } if (request == null) { throw new ArgumentNullException(nameof(request)); } var events = _lineClient.GetWebhookEvents(request, content); foreach (var eventData in events) { var eventInfo = (MessageEvent)eventData; if (eventInfo?.Type != WebhookEventType.Message) { continue; } var userProfile = await _lineClient.GetUserProfileAsync(eventInfo.Source?.UserId).ConfigureAwait(false); var activity = LineHelper.PayloadToActivity(eventInfo, userProfile); await _relayProcessor.PostActivityAsync(activity, LineActivitiesReceived).ConfigureAwait(false); } }
/// <summary> /// Accept outbound Activities from Message Relay Processor, convert it into channel response model /// and send it to Line Messaging API /// </summary> /// <param name="outboundActivities">The outbound activities</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> public async Task ProcessOutboundActivitiesAsync(IList <Activity> outboundActivities) { if (outboundActivities == null || outboundActivities.Count == 0) { throw new ArgumentNullException(nameof(outboundActivities)); } var replyToId = outboundActivities[0]?.ReplyToId; var lineMessages = LineHelper.ActivityToLine(outboundActivities); await _lineClient.SendMessageToLine(replyToId, lineMessages).ConfigureAwait(false); }