in Source/RulesEngine/ServiceCallData.cs [297:356]
private void ConvertCS1ToEvent(Dictionary<string, LinkedList<ServiceCallItem>> servicesHistory)
{
var events = servicesHistory["data-vef.xboxlive.com"];
servicesHistory.Remove("data-vef.xboxlive.com");
LinkedList<ServiceCallItem> inGameEvents = null;
if (servicesHistory.ContainsKey("inGameEvents"))
{
inGameEvents = servicesHistory["inGameEvents"];
}
else
{
inGameEvents = new LinkedList<ServiceCallItem>();
servicesHistory.Add("inGameEvents", inGameEvents);
}
// Event Name starts with a string in the form of {Publisher}_{TitleId}
Regex eventNameMatch = new Regex("[a-zA-z]{4}_[a-zA-Z0-9]{8}");
foreach(var eventCall in events)
{
var requestBody = eventCall.m_reqBody;
var eventArray = requestBody.Split(Environment.NewLine.ToCharArray());
foreach(var eventLine in eventArray)
{
var fields = eventLine.Split('|');
if(fields.Length < 12)
{
// This event is not valid as it is missing fields
continue;
}
// The name field is in the form of {Publisher}_{TitleId}.{EventName}
var eventNameParts = fields[1].Split('.');
if(eventNameParts.Length > 1 && eventNameMatch.IsMatch(eventNameParts[0]))
{
ServiceCallItem splitEvent = eventCall.Copy();
splitEvent.m_host = "inGameEvents";
splitEvent.m_eventName = eventNameParts[1];
splitEvent.m_reqTimeUTC = (UInt64)DateTime.Parse(fields[2]).ToFileTimeUtc();
splitEvent.m_reqBody = String.Empty;
splitEvent.m_dimensions = CS1PartBC(fields);
splitEvent.m_isInGameEvent = true;
if(splitEvent.m_eventName.Contains("MultiplayerRoundStart") || splitEvent.m_eventName.Contains("MultiplayerRoundEnd"))
{
splitEvent.m_playerSessionId = fields[15];
splitEvent.m_multiplayerCorrelationId = fields[16];
}
inGameEvents.AddLast(splitEvent);
}
}
}
}