package im.rosetta.executors; import java.util.ArrayList; import im.rosetta.Failures; import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.database.entity.Group; import im.rosetta.database.repository.GroupRepository; import im.rosetta.packet.Packet18GroupInfo; import io.orprotocol.ProtocolException; import io.orprotocol.client.Client; import io.orprotocol.packet.PacketExecutor; public class Executor18GroupInfo extends PacketExecutor { private final GroupRepository groupRepository = new GroupRepository(); @Override public void onPacketReceived(Packet18GroupInfo packet, Client client) throws Exception, ProtocolException { ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class); if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()){ /** * Клиент не авторизован, он не может запрашивать информацию о группах */ client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED); return; } String groupId = packet.getGroupId(); Group group = this.groupRepository.getGroup(groupId); if(group == null || group.getMembersPublicKeys().size() <= 0) { /** * Если сервер возвращает пустой список участников, * значит группы не существует, потому что * пустая группа быть не может, так как они автоматически * удаляются при выходе последнего участника */ packet.setMembersPKs(new ArrayList<>()); client.send(packet); return; } if(!group.getMembersPublicKeys().contains(eciAuthentificate.getPublicKey())){ /** * Клиент не является участником группы, значит его может быть * исключили, возвращаем пустую информацию как будто группы нет. */ packet.setMembersPKs(new ArrayList<>()); client.send(packet); return; } /** * Отправляем клиенту список участников группы */ packet.setMembersPKs(group.getMembersPublicKeys()); client.send(packet); } }