diff --git a/src/main/java/im/rosetta/service/services/BufferService.java b/src/main/java/im/rosetta/service/services/BufferService.java index f7fbaa3..313b848 100644 --- a/src/main/java/im/rosetta/service/services/BufferService.java +++ b/src/main/java/im/rosetta/service/services/BufferService.java @@ -9,6 +9,7 @@ import im.rosetta.database.QuerySession; import im.rosetta.database.entity.Buffer; import im.rosetta.database.repository.BufferRepository; import im.rosetta.exception.UnauthorizedExeception; +import im.rosetta.packet.Packet7Read; import im.rosetta.service.Service; import im.rosetta.service.services.runtime.PacketBuffer; import io.orprotocol.ProtocolException; @@ -71,6 +72,29 @@ public class BufferService extends Service { public void pushPacketToBuffer(String from, String to, Packet packet) { int packetId = this.packetManager.getPacketIdByClass(packet.getClass()); packet.packetId = packetId; + if(packet instanceof Packet7Read){ + /** + * Если это пакет чтения, то получаем последний пакет из буфера, если это уже чтение - то чтение больше не нужно + * записывать, так как эффект от нескольких пакетов чтения один и тот же, как и от одного, однако + * клиенты иногда порождают много пакетов чтения (на каждую загрузку диалога) + */ + String hql = "FROM Buffer WHERE from = :from AND to = :to ORDER BY timestamp DESC"; + HashMap parameters = new HashMap<>(); + parameters.put("from", from); + parameters.put("to", to); + try(QuerySession querySession = this.getRepository().buildQuery(hql, parameters)){ + List buffers = querySession.getQuery().setMaxResults(1).list(); + if(!buffers.isEmpty()){ + Buffer buffer = buffers.get(0); + if(buffer.getPacketId() == packetId){ + /** + * Последний пакет в буфере уже является пакетом чтения, значит нет смысла добавлять еще один + */ + return; + } + } + } + } byte[] packetBytes = packet.write().getBuffer(); Buffer buffer = new Buffer(); buffer.setFrom(from);