コード例 #1
0
ファイル: LogParser.cs プロジェクト: schovan/ddayserverstats
        /// <summary>
        /// Parses a log file and stores the stats to the players stats dictionary.
        /// </summary>
        public void Parse()
        {
            try
            {
                int lineCount = 0;
                int max       = int.MinValue;

                pattern = new string[Settings.PatternsCount];
                pattern[(int)Patterns.Infantry]     = @"^(.+) was shot down by (.+)'s rifle( \(Friendly fire\))?";
                pattern[(int)Patterns.Sniper]       = @"^(.+) was sniped by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.SMG]          = @"^(.+) was gunned down by (.+)'s submachinegun( \(Friendly fire\))?";
                pattern[(int)Patterns.LMG]          = @"^(.+) was machinegunned by (.+)'s light machine gun( \(Friendly fire\))?";
                pattern[(int)Patterns.HMG]          = @"^(.+) was killed by (.+)'s heavy machine gun( \(Friendly fire\))?";
                pattern[(int)Patterns.Bazooka]      = @"^(.+) did not survive (.+)'s explosive attack( \(Friendly fire\))?";
                pattern[(int)Patterns.Flamethrower] = @"^(.+) was cremated by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Grenade]      = @"^(.+) didn't see (.+)'s handgrenade( \(Friendly fire\))?";
                pattern[(int)Patterns.Pistol]       = @"^(.+) was capped by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Knife]        = @"^(.+) was castrated by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Airstrike]    = @"^(.+) was killed by (.+)'s airstrike( \(Friendly fire\))?";
                pattern[(int)Patterns.TNT]          = @"^(.+) didn't see (.+)'s TNT( \(Friendly fire\))?";
                pattern[(int)Patterns.Punch]        = @"^(.+) was punched out by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Helmet]       = @"^(.+) was helmeted by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Wound]        = @"^(.+) died of severe wounds inflicted by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Rocket]       = @"^(.+) ate (.+)'s rocket( \(Friendly fire\))?";
                pattern[(int)Patterns.Airstrike2]   = @"^(.+) ate (.+)'s airstrike( \(Friendly fire\))?";
                pattern[(int)Patterns.Scorch]       = @"^(.+) was scorched by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Flame]        = @"^(.+) got flamed by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.Shrapnel]     = @"^(.+) was shredded by (.+)'s shrapnel( \(Friendly fire\))?";
                pattern[(int)Patterns.Flatten]      = @"^(.+) was flattened by (.*?)( \(Friendly fire\))?$";
                pattern[(int)Patterns.SliceInHalf]  = @"^(.+) was sliced in half by (.*?)( \(Friendly fire\))?$";

                pattern[(int)Patterns.Gun] = @"^(.+) was gunned down by (.*?)( \(Friendly fire\))?$";

                pattern[(int)Patterns.Speach] = @"^([^:]+):(.*)$";

                pattern[(int)Patterns.OwnGrenade]       = @"^(.+) tripped on his own grenade";
                pattern[(int)Patterns.BlewUp]           = @"^(.+) blew"; // blew up, blew himself up
                pattern[(int)Patterns.SelfKill]         = @"^(.+) killed himself";
                pattern[(int)Patterns.Fall]             = @"^(.+) fell to his death";
                pattern[(int)Patterns.Drown]            = @"^(.+) drowned";
                pattern[(int)Patterns.Squash]           = @"^(.+) was squished";
                pattern[(int)Patterns.Barbedwire]       = @"^(.+) tripped on barbedwire";
                pattern[(int)Patterns.AirstrikeSuicide] = @"^(.+) called an airstrike on himself";
                pattern[(int)Patterns.SelfBurn]         = @"^(.+) burned himself";
                pattern[(int)Patterns.WrongPlace]       = @"^(.+) was in the wrong place";
                pattern[(int)Patterns.SpawnKill]        = @"^(.+) was killed for being in a spawn area";
                pattern[(int)Patterns.TeamChange]       = @"^(.+) changed teams";
                pattern[(int)Patterns.Connection]       = @"^(.+) connected.$";
                pattern[(int)Patterns.TeamJoin]         = @"^(.+) has joined team (.+).$";
                pattern[(int)Patterns.NameChange]       = @"^(.+) changed name to (.+)$";
                pattern[(int)Patterns.Destroyed]        = @"^(.+) destroyed by (.+) \[(.+)\]$";
                pattern[(int)Patterns.Taken]            = @"^(.+) taken by (.+) \[(.+)\]$";
                pattern[(int)Patterns.Observer]         = @"^(.+) is now an Observer.$";
                pattern[(int)Patterns.Disconnection]    = @"^(.+) disconnected$";
                pattern[(int)Patterns.Overflow]         = @"^(.+) overflowed$";
                pattern[(int)Patterns.Timeout]          = @"^(.+) timed out$";
                pattern[(int)Patterns.ObserverEnd]      = @"^(.+) is no longer an Observer.$";
                pattern[(int)Patterns.Victory]          = @"^Team (.+) is";
                pattern[(int)Patterns.SpeedHack]        = @"^(.+) is being disconnected for Speed hack..$";
                pattern[(int)Patterns.ModifiedClient]   = @"^(.+) is using a modified client.$";
                pattern[(int)Patterns.Kick]             = @"^(.+) was kicked$";
                pattern[(int)Patterns.NextGame]         = @"^(.+) will be changed for next game.$";

                pattern[(int)Patterns.Ping]           = @"^Sending a ping.$";
                pattern[(int)Patterns.Master]         = @"^Master server at";
                pattern[(int)Patterns.InitGame]       = @"^==== InitGame ====$";
                pattern[(int)Patterns.ShutdownGame]   = @"^==== ShutdownGame ====$";
                pattern[(int)Patterns.Rcon]           = @"^rcon ";
                pattern[(int)Patterns.Processing]     = @"^processing id commands$";
                pattern[(int)Patterns.Q2Admin]        = @"^Q2Admin ";
                pattern[(int)Patterns.ConfigStrings]  = @"^configstrings not valid";
                pattern[(int)Patterns.UnknownCommand] = @"^Unknown command ";
                pattern[(int)Patterns.NoMap]          = @"^Can't find ";
                pattern[(int)Patterns.UnknownItem]    = @"^unknown item$";
                pattern[(int)Patterns.NumScorePing]   = @"^num score ping name";
                pattern[(int)Patterns.Loading]        = @"^------- Loading gamei386.so -------$";

                for (int i = 0; i < Settings.PatternsCount; i++)
                {
                    if (settings.ItemsOpen[i])
                    {
                        max = i;
                    }
                }

                using (StreamReader sr2 = File.OpenText(fileName))
                {
                    while (sr2.ReadLine() != null)
                    {
                        lineCount++;
                    }
                }

                formParser.Invoke(formParser.setProgressBarMaximumDelegate, lineCount);

                using (StreamReader sr = File.OpenText(fileName))
                {
                    string   line;
                    int      index;
                    int      progress = 0;
                    Match    m        = null;
                    Patterns patternName;
                    int      groupsCount;
                    string   name1 = "";
                    string   name2 = "";
                    string   name3 = "";

                    while ((line = sr.ReadLine()) != null)
                    {
                        progress++;
                        tempPercentage = (int)((double)progress / (double)lineCount * 100d);
                        patternName    = Patterns.Unknown;
                        index          = Settings.PatternsCount - 1;
                        groupsCount    = 0;
                        for (int i = 0; i <= max; i++)
                        {
                            m = Regex.Match(line, pattern[i]);
                            if (m.Success)
                            {
                                index       = i;
                                patternName = (Patterns)index;
                                groupsCount = m.Groups.Count;
                                break;
                            }
                        }
                        switch (groupsCount)
                        {
                        case 2:
                            name1 = m.Groups[1].Value;
                            break;

                        case 3:
                            name2 = m.Groups[2].Value;
                            goto case 2;

                        case 4:
                            name3 = m.Groups[3].Value;
                            goto case 3;
                        }
                        switch (patternName)
                        {
                        case Patterns.Speach:
                            updatePlayers(map[index], name1);
                            if (settings.Words)
                            {
                                updateWords(name1, name2);
                            }
                            break;

                        case Patterns.Infantry:
                        case Patterns.Sniper:
                        case Patterns.SMG:
                        case Patterns.LMG:
                        case Patterns.HMG:
                        case Patterns.Bazooka:
                        case Patterns.Flamethrower:
                        case Patterns.Grenade:
                        case Patterns.Pistol:
                        case Patterns.Knife:
                        case Patterns.Airstrike:
                        case Patterns.TNT:
                        case Patterns.Punch:
                        case Patterns.Helmet:
                        case Patterns.Wound:
                        case Patterns.Rocket:
                        case Patterns.Shrapnel:
                        case Patterns.Scorch:
                        case Patterns.Flame:
                        case Patterns.Gun:
                        case Patterns.SliceInHalf:
                        case Patterns.Flatten:
                        case Patterns.Airstrike2:
                            if (name3 == "")
                            {
                                updatePlayers(map[index] + Settings.KillsCount, name1);
                                updatePlayers(map[index], name2);
                            }
                            else
                            {
                                updatePlayers((int)Stats.TeamKills, name2);
                            }
                            break;

                        case Patterns.OwnGrenade:
                        case Patterns.BlewUp:
                        case Patterns.SelfKill:
                        case Patterns.Fall:
                        case Patterns.Drown:
                        case Patterns.Squash:
                        case Patterns.Barbedwire:
                        case Patterns.AirstrikeSuicide:
                        case Patterns.SelfBurn:
                        case Patterns.WrongPlace:
                        case Patterns.SpawnKill:
                        case Patterns.Connection:
                        case Patterns.TeamJoin:
                        case Patterns.NameChange:
                        case Patterns.Observer:
                            //case Patterns.Disconnection:
                            //case Patterns.Overflow:
                            //case Patterns.Timeout:
                            //case Patterns.ObserverEnd:
                            //case Patterns.Victory:
                            //case Patterns.SpeedHack:
                            //case Patterns.ModifiedClient:
                            //case Patterns.Kick:
                            //case Patterns.NextGame:
                            updatePlayers(map[index], name1);
                            break;

                        case Patterns.Destroyed:
                        case Patterns.Taken:
                            updatePlayers(map[index], name2);
                            break;

                        case Patterns.TeamChange:
                            updatePlayers(map[index], name1);
                            if ((line = sr.ReadLine()) != null)
                            {
                                progress++;
                            }
                            break;

                        case Patterns.InitGame:
                        case Patterns.ShutdownGame:
                            while ((line = sr.ReadLine()) != null)
                            {
                                progress++;
                                if (line == "-------------------------------------")
                                {
                                    break;
                                }
                            }

                            break;

                        case Patterns.NumScorePing:
                            if ((line = sr.ReadLine()) != null)
                            {
                                progress++;
                                while ((line = sr.ReadLine()) != null)
                                {
                                    progress++;
                                    if (line == "")
                                    {
                                        break;
                                    }
                                }
                            }
                            break;

                        default:
                            break;
                        }
                        if (percentage != tempPercentage)
                        {
                            percentage = tempPercentage;
                            formParser.Invoke(formParser.setProgressDelegate, progress, percentage);
                        }
                    }
                    players.Remove("NET_GetPacket");
                    players.Remove("SZ_GetSpace");
                    players.Remove("Netchan_Transmit");
                    players.Remove("WARNING");
                    players.Remove("NET_SendPacket ERROR");
                    Int32[]       a          = null;
                    List <string> removeList = new List <string>();
                    foreach (KeyValuePair <string, Int32[]> kvp in players)
                    {
                        a = kvp.Value;
                        if (settings.Connections)
                        {
                            if (a[(int)Stats.Connections] == 0)
                            {
                                removeList.Add(kvp.Key);
                                continue;
                            }
                        }

                        a[(int)Stats.Kills] += a[(int)Stats.InfantryKills];
                        a[(int)Stats.Kills] += a[(int)Stats.SniperKills];
                        a[(int)Stats.Kills] += a[(int)Stats.SMGKills];
                        a[(int)Stats.Kills] += a[(int)Stats.LMGKills];
                        a[(int)Stats.Kills] += a[(int)Stats.HMGKills];
                        a[(int)Stats.Kills] += a[(int)Stats.BazookaKills];
                        a[(int)Stats.Kills] += a[(int)Stats.FlamethrowerKills];
                        a[(int)Stats.Kills] += a[(int)Stats.GrenadeKills];
                        a[(int)Stats.Kills] += a[(int)Stats.PistolKills];
                        a[(int)Stats.Kills] += a[(int)Stats.KnifeKills];
                        a[(int)Stats.Kills] += a[(int)Stats.AirstrikeKills];
                        a[(int)Stats.Kills] += a[(int)Stats.TNTKills];
                        a[(int)Stats.Kills] += a[(int)Stats.PunchKills];
                        a[(int)Stats.Kills] += a[(int)Stats.HelmetKills];
                        a[(int)Stats.Kills] += a[(int)Stats.WoundKills];
                        a[(int)Stats.Kills] += a[(int)Stats.FlattenKills];
                        a[(int)Stats.Kills] += a[(int)Stats.GunKills];
                        a[(int)Stats.Kills] += a[(int)Stats.SliceInHalfKills];

                        if (settings.Kills)
                        {
                            if (a[(int)Stats.Kills] < settings.KillsMin)
                            {
                                removeList.Add(kvp.Key);
                                continue;
                            }
                        }

                        a[(int)Stats.Deaths] += a[(int)Stats.InfantryDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.SniperDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.SMGDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.LMGDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.HMGDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.BazookaDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.FlamethrowerDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.GrenadeDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.PistolDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.KnifeDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.AirstrikeDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.TNTDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.PunchDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.HelmetDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.WoundDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.FlattenDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.GunDeaths];
                        a[(int)Stats.Deaths] += a[(int)Stats.SliceInHalfDeaths];

                        a[(int)Stats.Suicides] += a[(int)Stats.GrenadeSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.BlewUpSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.SelfKillSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.FallSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.DrownSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.SquashSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.BarbedwireSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.AirstrikeSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.SelfBurnSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.WrongPlaceSuicides];
                        a[(int)Stats.Suicides] += a[(int)Stats.SpawnKillSuicides];

                        double b = (double)(a[(int)Stats.Kills] + a[(int)Stats.Deaths] + a[(int)Stats.Suicides] + a[(int)Stats.TeamKills]);
                        if (settings.PlusMinus)
                        {
                            if (b == 0)
                            {
                                removeList.Add(kvp.Key);
                                continue;
                            }
                        }
                        double percentage = ((double)a[(int)Stats.Kills] / b) * 100d;
                        a[(int)Stats.Percentage] = (int)percentage;

                        a[(int)Stats.PlusMinus] = a[(int)Stats.Kills] - a[(int)Stats.Deaths] - a[(int)Stats.Suicides] - a[(int)Stats.TeamKills];

                        a[(int)Stats.Points] += a[(int)Stats.Destroyed];
                        a[(int)Stats.Points] += a[(int)Stats.Taken];

                        a[(int)Stats.Words] += a[(int)Stats.Word0];
                        a[(int)Stats.Words] += a[(int)Stats.Word1];
                        a[(int)Stats.Words] += a[(int)Stats.Word2];
                        a[(int)Stats.Words] += a[(int)Stats.Word3];
                        a[(int)Stats.Words] += a[(int)Stats.Word4];
                        a[(int)Stats.Words] += a[(int)Stats.Word5];
                        a[(int)Stats.Words] += a[(int)Stats.Word6];
                        a[(int)Stats.Words] += a[(int)Stats.Word7];
                        a[(int)Stats.Words] += a[(int)Stats.Word8];
                        a[(int)Stats.Words] += a[(int)Stats.Word9];
                        a[(int)Stats.Words] += a[(int)Stats.Word10];
                        a[(int)Stats.Words] += a[(int)Stats.Word11];
                        a[(int)Stats.Words] += a[(int)Stats.Word12];
                        a[(int)Stats.Words] += a[(int)Stats.Word13];
                        a[(int)Stats.Words] += a[(int)Stats.Word14];
                        a[(int)Stats.Words] += a[(int)Stats.Word15];
                        a[(int)Stats.Words] += a[(int)Stats.Word16];
                        a[(int)Stats.Words] += a[(int)Stats.Word17];
                        a[(int)Stats.Words] += a[(int)Stats.Word18];
                        a[(int)Stats.Words] += a[(int)Stats.Word19];
                    }
                    foreach (string s in removeList)
                    {
                        players.Remove(s);
                    }
                }
                formParser.Invoke(formParser.finish);
            }
            catch (ThreadAbortException)
            {
            }
        }