// /home/hannes/Dokumente/c#-Projects/DemoRename/DemoRename/DemoHandler.cs created with MonoDevelop
// User: hannes at 04:12 30.10.2007
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
namespace DemoRename
{
public class DemoHandler
{
private static string[] _mapNames
= new string[]
{
"salvage",
"volcano",
"area22",
"island",
"ark",
"sewer",
"canyon",
"outskirts",
"quarry",
"refinery",
"slipgate",
"valley"
};
public static void GetDemoInfos(
String demoFilepath, double hourOffset,
out string newFilename, out string mapName, out PlayerList playerList, out ArrayList teamNameList
)
{
mapName = "";
playerList
= new PlayerList
();
using (StreamReader sr
= new StreamReader
(demoFilepath
))
{
bool mapTagFound = false;
string demoContent = sr.ReadToEnd();
string[] demoParts = demoContent.Split('');
foreach (String rawData in demoParts)
{
if (!mapTagFound && (rawData.IndexOf("si_map") > -1))
{
string[] mapParts = rawData.Split('/');
for (int i = 0; i < mapParts.Length; i++)
{
if (mapParts[i].IndexOf("si_map") > -1)
{
mapTagFound = true;
mapName = FindMapName(mapParts[i + 1]);
break; // JB : can break right ?
}
}
}
if (rawData.IndexOf("ui_name") > 0)
{
string[] playerParts = rawData.Split('\n');
for (int i = 0; i < playerParts.Length; i++)
{
if (playerParts[i].IndexOf("ui_realname") > -1)
{
string[] nameParts = playerParts[i].Split('\0');
string playerName = RemoveColorCodes(nameParts[nameParts.Length-1]);
playerList.
Add(playerName,
new Player
(playerName
));
}
}
}
}
} // using (StreamReader sr = new StreamReader(demoFilepath))
DateTime demoDate
= (new FileInfo
(demoFilepath
)).
LastWriteTime.
AddHours(hourOffset
);
string dateString = demoDate.ToString("yyMMdd@HH;mm;ss"); // @;; (HH in upper case for 24 hours and not 12)
newFilename = string.Format("{0}_{1}.ndm", dateString, mapName); // builds the new demo filename
teamNameList = GetTeamNames(playerList);
}
private static ArrayList GetTeamNames(PlayerList playerList)
{
ArrayList nameList
= new ArrayList
();
foreach(String key in playerList.Keys)
{
nameList.Add(playerList[key].Name);
}
ArrayList teamNameList
= new ArrayList
();
string nameI = null;
string nameJ = null;
for(int i=0; i < nameList.Count; i++)
{
nameI = (string)nameList[i];
for(int j=0; j < nameList.Count; j++)
{
if(i != j)
{
nameJ = (string)nameList[j];
FindTeamName(teamNameList, nameI, nameJ);
}
}
}
return teamNameList;
}
private static void FindTeamName(ArrayList teamNameList, String x, String y)
{
int xLength = x.Length, yLength = y.Length;
StringBuilder nameBuilder
= new StringBuilder
();
int len = 0;
if(xLength < yLength)
{
len = xLength;
}
else
{
len = yLength;
}
// von vorne
for( int i=0; i <= len; i++)
{
if(x[i].Equals(y[i]))
{
nameBuilder.Append(x[i]);
}
else
{
break;
}
}
if(nameBuilder.Length == 0)
{
// von hinten
for(int m = len; m <= 1; m--)
{
if(x[m].Equals(y[m]))
{
nameBuilder.Append(x[m]);
}
else
{
break;
}
}
}
string teamName = nameBuilder.ToString();
if(teamName.Length > 0 && !teamNameList.Contains(teamName) )
{
teamNameList.Add(teamName);
}
}
private static string FindMapName(string rawString)
{
string mapName = "";
foreach(string name in _mapNames)
{
if(rawString.IndexOf(name) > -1)
{
mapName = name;
break;
}
}
return mapName;
}
///
/// Cleans a String from colorcodes
///
private static string RemoveColorCodes(String gameText)
{
if (gameText == null)
{
return String.Empty;
}
else
{
return Regex.Replace(gameText.Trim(), @"(\^\D)|(\$\D)|(\^\d)|(\$\d)", string.Empty);
}
}
}
}