コード例 #1
0
 public bool Filter(int id)
 {
     lock (SyncRoot)
     {
         int         time = Time32.Now.GetHashCode();
         PacketEntry filter;
         if (!Entries.TryGetValue(id, out filter))
         {
             Entries.TryAdd(id, filter = new PacketEntry()
             {
                 Count = 1,
                 Time  = time
             });
             return(false);
         }
         if (time - filter.Time > PacketFilter.Timelimit)
         {
             filter.Time  = time;
             filter.Count = 0;
         }
         filter.Count++;
         Entries[id] = filter;
         return(filter.Count > Limit(id));
     }
 }
コード例 #2
0
        public bool IsApplicableForFilterSet(PacketEntry item)
        {
            bool isApplicable = false;

            switch (this.type)
            {
            case FilterType.Message:
                if (item.Message == ((int)this.value).ToString("X4"))
                {
                    isApplicable = true;
                }
                break;

            case FilterType.ActorControl:
                if (item.ActorControl == (int)this.value)
                {
                    isApplicable = true;
                }
                break;

            case FilterType.ActorControlName:
                if (item.ActorControl != -1 && item.Name.ToLower().Contains(((string)this.value).ToLower()))
                {
                    isApplicable = true;
                }
                break;

            case FilterType.PacketName:
                if (item.Name.ToLower().Contains(((string)this.value).ToLower()))
                {
                    isApplicable = true;
                }
                break;

            case FilterType.StringContents:
                var findStr   = Convert.ToString(this.value).ToLower();
                var packetStr = Encoding.UTF8.GetString(item.Data).ToLower();

                if (packetStr.Contains(findStr))
                {
                    isApplicable = true;
                }
                break;

            default:
                break;
            }

            return(isApplicable);
        }
コード例 #3
0
ファイル: XivMonTab.xaml.cs プロジェクト: dio85/ffxivmon
        private void ReloadCurrentPackets()
        {
            var lastIndex = PacketListView.SelectedIndex;

            var array = new PacketEntry[PacketListView.Items.Count];

            PacketListView.Items.CopyTo(array, 0);
            PacketListView.Items.Clear();

            foreach (var item in array)
            {
                AddPacketToListView(item);
            }

            PacketListView.SelectedIndex = lastIndex;
        }
コード例 #4
0
        private void MessageSent(long epoch, byte[] message, int set, FFXIVNetworkMonitor.ConnectionType connectionType)
        {
            var res = Parse(message);

            var item = new PacketEntry {
                IsVisible = true, ActorControl = -1, Data = message, Message = res.header.MessageType.ToString("X4"), Direction = "C",
                Category  = set.ToString(), Timestamp = Util.UnixTimeStampToDateTime(res.header.Seconds).ToString(@"MM\/dd\/yyyy HH:mm:ss"), Size = res.header.MessageLength.ToString(),
                Set       = set, RouteID = res.header.RouteID.ToString(), PacketUnixTime = res.header.Seconds, SystemMsTime = Millis(), Connection = connectionType
            };

            if (_configFlags.HasFlag(ConfigFlags.DontUsePacketTimestamp))
            {
                item.Timestamp = DateTime.Now.ToString(@"MM\/dd\/yyyy HH:mm:ss.fff tt");
            }

            _myTab.Dispatcher.Invoke(new Action(() => { _myTab.AddPacketToListView(item); }));
        }
コード例 #5
0
ファイル: XivMonTab.xaml.cs プロジェクト: dio85/ffxivmon
        private void Scripting_RunOnPacket(PacketEntry item, ScriptingProvider provider)
        {
            PacketEventArgs args = null;

            string structText = null;

            structText = item.Direction == "S" ? _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)) : _db.GetClientZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));


            if (structText != null)
            {
                if (structText.Length != 0)
                {
                    try
                    {
                        var structProvider = new Struct();
                        var structEntries  = structProvider.Parse(structText, item.Data);

                        args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.LogView);
                    }
                    catch (Exception exc)
                    {
                        _mainWindow.LogView.WriteLine($"[EXCEPTION] Thrown for {item.Message} - {item.Name}: {exc}");
                        args = new PacketEventArgs(item, null, _mainWindow.LogView);
                    }
                }
            }
            else
            {
                args = new PacketEventArgs(item, null, _mainWindow.LogView);
            }

            if (args != null)
            {
                provider.ExecuteScripts(null, args);
            }
        }
コード例 #6
0
ファイル: ActLogImporter.cs プロジェクト: zhc105/ffxivmon
        public static PacketEntry[] Import(string path)
        {
            var lines = File.ReadAllLines(path);

            var output = new List <PacketEntry>();

            foreach (var line in lines)
            {
                var parts = line.Split('|');

                if (parts[0] != "252")
                {
                    continue;
                }

                var packet = new PacketEntry();
                packet.Timestamp = DateTime.Parse(parts[1]).ToString(@"MM\/dd\/yyyy HH:mm:ss.fff tt");

                var bytes = new byte[(parts.Length - 3) * 4];
                for (int i = 2; i < parts.Length - 1; i++)
                {
                    var data = Util.StringToByteArray(parts[i]);
                    Array.Copy(data.Reverse().ToArray(), 0, bytes, (i - 2) * 4, data.Length);
                }

                packet.Data = bytes;

                // ACT Plugin only logs server messages
                packet.Direction = "S";

                packet.Message = BitConverter.ToUInt16(packet.Data, 0x12).ToString("X4");

                output.Add(packet);
            }

            return(output.ToArray());
        }
コード例 #7
0
 public PacketList()
 {
     StringHead = StringTail = null;
 }
コード例 #8
0
 public PacketEventArgs(PacketEntry packet, ExpandoObject packetobj, LogView debugView)
 {
     this.Packet    = packet;
     this.PacketObj = packetobj;
     this.Debug     = debugView;
 }
コード例 #9
0
ファイル: Filter.cs プロジェクト: zhc105/ffxivmon
        public bool IsApplicableForFilterSet(PacketEntry item)
        {
            try
            {
                switch (this.type)
                {
                case FilterType.Message:
                {
                    var          valStr = (string)value;
                    string[]     split;
                    NumberStyles styles = NumberStyles.Any;

                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }

                    if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16))
                    {
                        for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i)
                        {
                            return(item.Message == findUInt16.ToString("X4"));
                        }
                    }
                }
                break;

                case FilterType.ActorControl:
                {
                    var          valStr = (string)value;
                    string[]     split;
                    NumberStyles styles = NumberStyles.Any;

                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }

                    if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16))
                    {
                        for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i)
                        {
                            return(item.ActorControl == findUInt16);
                        }
                    }
                }
                break;

                case FilterType.ActorControlName:
                    if (item.ActorControl != -1 && item.Name.ToLower().Contains(((string)this.value).ToLower()))
                    {
                        return(true);
                    }
                    break;

                case FilterType.PacketName:
                    if (item.Name.ToLower().Contains(((string)this.value).ToLower()))
                    {
                        return(true);
                    }
                    break;

                case FilterType.StringContents:
                    var findStr   = Convert.ToString(this.value).ToLower();
                    var packetStr = Encoding.UTF8.GetString(item.Data).ToLower();

                    if (packetStr.Contains(findStr))
                    {
                        return(true);
                    }
                    break;

                // todo: these are horribly inefficient
                case FilterType.Int64:
                {
                    var          valStr = (string)value;
                    string[]     split;
                    NumberStyles styles = NumberStyles.Any;

                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }

                    if (Int64.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt64))
                    {
                        for (var i = 0; i + sizeof(Int64) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToInt64(item.Data, i) == findInt64)
                            {
                                return(true);
                            }
                        }
                    }
                    if (UInt64.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt64))
                    {
                        for (var i = 0; i + sizeof(UInt64) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToUInt64(item.Data, i) == findUInt64)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.Int32:
                {
                    var          valStr = (string)value;
                    string[]     split;
                    NumberStyles styles = NumberStyles.Any;

                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }

                    if (Int32.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt32))
                    {
                        for (var i = 0; i + sizeof(Int32) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToInt32(item.Data, i) == findInt32)
                            {
                                return(true);
                            }
                        }
                    }
                    if (UInt32.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt32))
                    {
                        for (var i = 0; i + sizeof(UInt32) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToUInt32(item.Data, i) == findUInt32)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.Int16:
                {
                    var          valStr = (string)value;
                    string[]     split;
                    NumberStyles styles = NumberStyles.Any;

                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr = split[1];
                        styles = NumberStyles.HexNumber;
                    }

                    if (Int16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt16))
                    {
                        for (var i = 0; i + sizeof(Int16) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToInt16(item.Data, i) == findInt16)
                            {
                                return(true);
                            }
                        }
                    }
                    if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16))
                    {
                        for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToUInt16(item.Data, i) == findUInt16)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.Int8:
                {
                    var      valStr = (string)value;
                    string[] split;
                    int      convertBase = 10;
                    if ((split = valStr.Split('x')).Length > 1)
                    {
                        valStr      = split[1];
                        convertBase = 16;
                    }
                    else if ((split = valStr.Split('X')).Length > 1)
                    {
                        valStr      = split[1];
                        convertBase = 16;
                    }

                    var findInt8 = System.Convert.ToChar(System.Convert.ToUInt32(valStr, convertBase));
                    {
                        for (var i = 0; i < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToChar(item.Data, i) == findInt8)
                            {
                                return(true);
                            }
                        }
                    }

                    var findUInt8 = System.Convert.ToByte(System.Convert.ToUInt32(valStr, convertBase));
                    {
                        for (var i = 0; i < item.Data.Length; ++i)
                        {
                            if (item.Data[i] == findUInt8)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.Float:
                {
                    if (float.TryParse((string)value, out var findFloat))
                    {
                        for (var i = 0; i + sizeof(float) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToSingle(item.Data, i) == findFloat)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.Double:
                {
                    if (double.TryParse((string)value, out var findDouble))
                    {
                        for (var i = 0; i + sizeof(double) - 1 < item.Data.Length; ++i)
                        {
                            if (BitConverter.ToSingle(item.Data, i) == findDouble)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                case FilterType.ByteArray:
                {
                    string      valStr    = value.ToString().Replace(" ", "");
                    List <byte> findBytes = new List <byte>();

                    for (var i = 0; i + 1 < valStr.Length; i += 2)
                    {
                        findBytes.Add(Convert.ToByte(Convert.ToUInt32(valStr.Substring(i, 2), 16)));
                    }

                    for (var i = 0; i + findBytes.Count - 1 < item.Data.Length; ++i)
                    {
                        if (item.Data[i] == findBytes[0])
                        {
                            bool isMatch = true;
                            for (var j = 0; j < findBytes.Count; ++j)
                            {
                                if (item.Data[i + j] != findBytes[j])
                                {
                                    isMatch = false;
                                    break;
                                }
                            }

                            if (isMatch)
                            {
                                return(true);
                            }
                        }
                    }
                }
                break;

                default:
                    break;
                }
            }
            catch (Exception e)
            {
                return(false);
            }

            return(false);
        }
コード例 #10
0
ファイル: XivMonTab.xaml.cs プロジェクト: dio85/ffxivmon
        public void AddPacketToListView(PacketEntry item, bool silent = false)
        {
            if (_mainWindow.IsPausedCheckBox.IsChecked && !silent)
            {
                return;
            }

            if (_encryptionProvider != null && !item.IsDecrypted &&
                item.Data[0x0C] != 0x09 && item.Data[0x0C] != 0x07 &&
                item.Connection == FFXIVNetworkMonitor.ConnectionType.Lobby)
            {
                var data = item.Data;
                _encryptionProvider.DecryptPacket(data);

                item.Message = BitConverter.ToUInt16(item.Data, 0x12).ToString("X4");

                item.IsDecrypted = true;
            }

            if (item.Direction == "S")
            {
                item.Name    = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));

                switch (item.Message)
                {
                case "0142":
                case "0143":
                case "0144":
                    int cat = BitConverter.ToUInt16(item.Data, 0x20);
                    item.ActorControl = cat;
                    item.Name         = _db.GetActorControlTypeName(cat);
                    break;
                }

                if (_mainWindow.ExEnabledCheckbox.IsChecked)
                {
                    try
                    {
                        var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));

                        if (structText != null && structText.Length != 0)
                        {
                            switch (item.Name)
                            {
                            case "NpcSpawn":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment =
                                    $"Name: {_mainWindow.ExdProvider.GetBnpcName((uint)obj.bNPCName)}({obj.bNPCName}) - Base: {obj.bNPCBase}";
                            }
                            break;

                            case "ActorCast":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}";
                            }
                            break;
                            }

                            if (item.Name.Contains("ActorControl"))
                            {
                                switch (item.ActorControl)
                                {
                                case 3:     //CastStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((uint)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;

                                case 17:     //ActionStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((uint)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;
                                }
                            }
                        }
                    }
                    catch (Exception exc)
                    {
                        new ExtendedErrorView(
                            $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog();
                        _mainWindow.ExEnabledCheckbox.IsChecked = false;
                    }
                }
            }
            else
            {
                item.Name    = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));

                if (item.Data[0x0C] == 0x09 && item.Message == "0000" && item.Connection == FFXIVNetworkMonitor.ConnectionType.Lobby)
                {
                    _encryptionProvider = new LobbyEncryptionProvider(item.Data);

                    item.Comment = "Lobby Encryption INIT";
                }
            }

            item.IsForSelf = BitConverter.ToUInt32(item.Data, 0x04) == BitConverter.ToUInt32(item.Data, 0x08);
            item.Category  = item.Set.ToString();

            if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked)
            {
                if (_mainWindow.ScriptProvider == null)
                {
                    MessageBox.Show("No scripts were loaded.", "Error", MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                    _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false;
                }
                else
                {
                    try
                    {
                        Scripting_RunOnPacket(item, _mainWindow.ScriptProvider);
                    }
                    catch (Exception exc)
                    {
                        new ExtendedErrorView(
                            $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog();
                        _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false;
                    }
                }
            }

            if (_filters != null && _filters.Length > 0)
            {
                foreach (var filterEntry in _filters)
                {
                    if (!filterEntry.IsApplicableForFilterSet(item))
                    {
                        return;
                    }
                }
            }

            item.Size = item.Data.Length.ToString();

            PacketListView.Items.Add(item);

            if (!silent)
            {
                UpdateInfoLabel();
            }
        }
コード例 #11
0
ファイル: Capture.cs プロジェクト: zhc105/ffxivmon
 public Capture()
 {
     Packets = new PacketEntry[0];
 }
コード例 #12
0
        public void AddPacketToListView(PacketEntry item, bool silent = false)
        {
            if (item.Direction == "S")
            {
                item.Name    = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));
            }
            else
            {
                item.Name    = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));
            }

            item.Category = item.Set.ToString();

            if (item.Message == "0142" || item.Message == "0143" || item.Message == "0144")
            {
                int cat = BitConverter.ToUInt16(item.Data, 0x20);
                item.ActorControl = cat;
                item.Name         = _db.GetActorControlTypeName(cat);
            }

            if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked)
            {
                try
                {
                    PacketEventArgs args = null;

                    var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            var structProvider = new Struct();
                            var structEntries  = structProvider.Parse(structText, item.Data);

                            args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView);
                        }
                    }
                    else
                    {
                        args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView);
                    }

                    Scripting_RunOnPacket(args);
                }
                catch (Exception exc)
                {
                    new ExtendedErrorView(
                        $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog();
                    _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false;
                    return;
                }
            }

            if (_mainWindow.ExEnabledCheckbox.IsChecked && item.Direction == "S")
            {
                try
                {
                    var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            switch (item.Name)
                            {
                            case "NpcSpawn":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment =
                                    $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})";
                            }
                            break;

                            case "ActorCast":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}";
                            }
                            break;
                            }

                            if (item.Name.Contains("ActorControl"))
                            {
                                switch (item.ActorControl)
                                {
                                case 3:     //CastStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;

                                case 17:     //ActionStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;
                                }
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    new ExtendedErrorView(
                        $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog();
                    _mainWindow.ExEnabledCheckbox.IsChecked = false;
                }
            }

            PacketListView.Items.Add(item);

            if (!silent)
            {
                UpdateInfoLabel();
            }
        }