示例#1
0
        protected override int Invoke(string[] args)
        {
            if (args.Length != 1)
            {
                Console.Error.WriteLine("Expected exactly 1 argument");
                return(1);
            }

            var input = args[0];

            if (_output == null)
            {
                _output = Path.ChangeExtension(input, ParsedExtension);
            }

            if (_regexes.Count == 0)
            {
                _regexes.Add(new Regex(".*", FilterRegexOptions));
            }

            _log.Basic("Parsing {0}...", input);

            var stats = new PacketStatistics();

            using var reader = new PacketLogReader(input);

            if (_header)
            {
                _log.Info(string.Empty);
                _log.Info("Version: {0}", reader.Version);
                _log.Info("Compression: {0}", reader.CompressionLevel);
                _log.Info("Region: {0}", reader.Region);
                _log.Info("Client Version: {0}", reader.GameMessages.Version);
                _log.Info("Servers:");

                foreach (var srv in reader.Servers.Values)
                {
                    _log.Info("  {0} ({1}): {2} -> {3}", srv.Name, srv.Id, srv.RealEndPoint,
                              srv.ProxyEndPoint);
                }

                _log.Info(string.Empty);
            }

            PacketSerializer serializer;

            switch (_backend)
            {
            case PacketSerializerBackend.Reflection:
                serializer = new ReflectionPacketSerializer(reader.Region, reader.GameMessages,
                                                            reader.SystemMessages);
                break;

            case PacketSerializerBackend.Compiler:
                serializer = new CompilerPacketSerializer(reader.Region, reader.GameMessages,
                                                          reader.SystemMessages);
                break;

            default:
                throw Assert.Unreachable();
            }

            using var result = new StreamWriter(new FileStream(_output, FileMode.Create, FileAccess.Write));

            foreach (var entry in reader.EnumerateAll())
            {
                HandleEntry(reader, entry, stats, serializer, result);
            }

            _log.Basic("Parsed packets to {0}", _output);

            PrintStatistics(stats);

            return(0);
        }
示例#2
0
        public static int Run(string[] args)
        {
            try
            {
                if (!HandleArguments(ref args))
                {
                    return(0);
                }
            }
            catch (OptionException e)
            {
                Console.Error.WriteLine(e.Message);
                return(1);
            }

            if (args.Length != 1)
            {
                Console.Error.WriteLine("Expected exactly one input file argument.");
                return(1);
            }

            Log.Level           = LogLevel.Debug;
            Log.TimestampFormat = "HH:mm:ss:fff";

            var color = Console.ForegroundColor;

            Log.Loggers.Add(new ConsoleLogger(false,
                                              color, color, color, color, color));

            if (!Debugger.IsAttached)
            {
                AppDomain.CurrentDomain.UnhandledException += UnhandledException;
            }

            var input   = args[0];
            var output  = _output ?? Path.ChangeExtension(input, "txt");
            var regexes = _regexes.Select(x => new Regex(x, RegexOptions))
                          .DefaultIfEmpty(new Regex(".*", RegexOptions))
                          .ToArray();

            _log.Basic("Parsing {0}...", input);

            var stats = new PacketStatistics();

            using (var reader = new PacketLogReader(input))
            {
                if (_header)
                {
                    _log.Info(string.Empty);
                    _log.Info("Version: {0}", reader.Version);
                    _log.Info("Compressed: {0}", reader.Compressed);
                    _log.Info("Region: {0}", reader.Messages.Region);
                    _log.Info("Servers:");

                    foreach (var srv in reader.Servers.Values)
                    {
                        _log.Info("  {0} ({1}): {2} -> {3}", srv.Name, srv.Id,
                                  srv.RealEndPoint, srv.ProxyEndPoint);
                    }

                    _log.Info(string.Empty);
                }

                PacketSerializer serializer;

                switch (_backend)
                {
                case PacketSerializerBackend.Reflection:
                    serializer = new ReflectionPacketSerializer(
                        reader.Messages);
                    break;

                case PacketSerializerBackend.Compiler:
                    serializer = new CompilerPacketSerializer(
                        reader.Messages);
                    break;

                default:
                    throw Assert.Unreachable();
                }

                using (var result = new StreamWriter(new FileStream(output,
                                                                    FileMode.Create, FileAccess.Write)))
                    foreach (var entry in reader.EnumerateAll())
                    {
                        HandleEntry(reader, entry, regexes, stats, serializer,
                                    result);
                    }
            }

            _log.Basic("Parsed packets to {0}", output);

            PrintStats(stats);

            return(0);
        }