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);
}
}
}
}