namespace ICRebuild.Core; // One consumer of the manager. Pausing and filtering affect only this log. public sealed class PacketRecorder(PacketBuffer buffer) { private long completeUp,completeDown,metadataOnly; public long CompleteUp => Interlocked.Read(ref completeUp); public long CompleteDown => Interlocked.Read(ref completeDown); public long MetadataOnly => Interlocked.Read(ref metadataOnly); public void Record(NetworkObservation observation) { if(observation.Phase==NetworkPhase.AfterSend) return; // One record per message. var packet=observation.Message; if(!buffer.Add(packet.Direction,packet.Opcode,packet.GameVersion,null,packet.Target,packet.Payload, packet.Complete,packet.Issue,observation.Context,packet.MonotonicTicks,packet.Time)) return; if(!packet.Complete) Interlocked.Increment(ref metadataOnly); else if(packet.Direction==PacketDirection.Up) Interlocked.Increment(ref completeUp); else Interlocked.Increment(ref completeDown); } }