private void ConvertCS2ToEvent()

in Source/RulesEngine/ServiceCallData.cs [207:295]


        private void ConvertCS2ToEvent(Dictionary<string, LinkedList<ServiceCallItem>> servicesHistory)
        {
            var eventNameMatch1 = new Regex("Microsoft.XboxLive.T[a-zA-Z0-9]{8}.");
            var eventNameMatch2 = "Microsoft.Xbox.XceBridge";

            var events = servicesHistory.Where(k => k.Key.Contains(".data.microsoft.com")).ToList();
            foreach (var endpoint in events)
            {
                servicesHistory.Remove(endpoint.Key);
            }
            LinkedList<ServiceCallItem> inGameEvents = null;
            if (servicesHistory.ContainsKey("inGameEvents"))
            {
                inGameEvents = servicesHistory["inGameEvents"];
            }
            else
            {
                inGameEvents = new LinkedList<ServiceCallItem>();
                servicesHistory.Add("inGameEvents", inGameEvents);
            }

            foreach (var eventCall in events.SelectMany(e => e.Value))
            {
                var requestBody = eventCall.m_reqBody;

                // If there's nothing in the request body, then there was an error with the event and we can't parse it.
                if(string.IsNullOrEmpty(requestBody))
                {
                    continue;
                }

                var eventArray = requestBody.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

                foreach (var eventLine in eventArray)
                {
                    JObject requestBodyJson;

                    try
                    {
                        requestBodyJson = JObject.Parse(eventLine);
                    }
                    catch
                    {
                        continue;
                    }

                    var eventName = requestBodyJson["name"].ToString();

                    if (eventNameMatch1.IsMatch(eventName) || eventNameMatch2.StartsWith(eventName))
                    {
                        var serviceCall = eventCall.Copy();
                        var eventNameParts = eventName.Split('.');


                        serviceCall.m_host = "inGameEvents";
                        serviceCall.m_eventName = eventNameParts.Last();
                        serviceCall.m_reqTimeUTC =
                            (UInt64) DateTime.Parse(requestBodyJson["time"].ToString()).ToFileTimeUtc();
                        serviceCall.m_reqBody = String.Empty;

                        var data = requestBodyJson.GetValue("data") as JObject;
                        if (data != null)
                        {
                            var baseData = data.GetValue("baseData") as JObject;

                            if (baseData != null)
                            {
                                var measurements = baseData["measurements"];
                                serviceCall.m_measurements =
                                    measurements != null ? measurements.ToString() : String.Empty;

                                var properties = baseData["properties"];
                                if (serviceCall.m_eventName.Contains("MultiplayerRoundStart") ||
                                    serviceCall.m_eventName.Contains("MultiplayerRoundEnd"))
                                {
                                    serviceCall.m_playerSessionId = baseData["playerSessionId"].ToString();
                                    serviceCall.m_multiplayerCorrelationId =
                                        properties["MultiplayerCorrelationId"].ToString();
                                }
                            }
                        }

                        inGameEvents.AddLast(serviceCall);
                    }
                }

            }

        }