/// <summary>
        /// Process the calling request and returns <see cref="ParsedCallingRequest"/>.
        /// </summary>
        /// <param name="callType"> The type of request.</param>
        /// <returns> The parsed request.</returns>
        public virtual async Task <ParsedCallingRequest> ProcessRequest(RealTimeMediaCallRequestType callType)
        {
            ParsedCallingRequest parsedRequest;

            switch (callType)
            {
            case RealTimeMediaCallRequestType.IncomingCall:
            case RealTimeMediaCallRequestType.CallingEvent:
            case RealTimeMediaCallRequestType.NotificationEvent:
                parsedRequest = await ProcessRequestAsync();

                break;

            default:
                parsedRequest = CallingContext.GenerateParsedResults(HttpStatusCode.BadRequest, $"{callType} not accepted");
                break;
            }
            parsedRequest.SkypeChainId = CallingContext.ExtractSkypeChainId(this.Request);
            return(parsedRequest);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Process an incoming request
        /// </summary>
        /// <param name="toBot"> The calling request sent to the bot.</param>
        /// <param name="callRequestType"> The type of calling request.</param>
        /// <returns> The response from the bot.</returns>
        public static async Task <HttpResponseMessage> SendAsync(HttpRequestMessage toBot, RealTimeMediaCallRequestType callRequestType)
        {
            using (var scope = RealTimeMediaCallingModule.BeginLifetimeScope(Container, toBot))
            {
                var context       = scope.Resolve <RealTimeMediaCallingContext>();
                var parsedRequest = await context.ProcessRequest(callRequestType).ConfigureAwait(false);

                if (parsedRequest.Faulted())
                {
                    return(GetResponseMessage(parsedRequest.ParseStatusCode, parsedRequest.Content));
                }
                else
                {
                    try
                    {
                        ResponseResult result;
                        var            callingBotService = scope.Resolve <IRealTimeCallProcessor>();
                        switch (callRequestType)
                        {
                        case RealTimeMediaCallRequestType.IncomingCall:
                            result = await callingBotService.ProcessIncomingCallAsync(parsedRequest.Content, parsedRequest.SkypeChainId).ConfigureAwait(false);

                            break;

                        case RealTimeMediaCallRequestType.CallingEvent:
                            result = await callingBotService.ProcessCallbackAsync(parsedRequest.Content).ConfigureAwait(false);

                            break;

                        case RealTimeMediaCallRequestType.NotificationEvent:
                            result = await callingBotService.ProcessNotificationAsync(parsedRequest.Content).ConfigureAwait(false);

                            break;

                        default:
                            result = new ResponseResult(ResponseType.BadRequest, $"Unsupported call request type: {callRequestType}");
                            break;
                        }

                        return(GetHttpResponseForResult(result));
                    }
                    catch (Exception e)
                    {
                        Trace.TraceError($"RealTimeMediaCallingConversation: {e}");
                        return(GetResponseMessage(HttpStatusCode.InternalServerError, e.ToString()));
                    }
                }
            }
        }