package im.rosetta; import im.rosetta.event.EventManager; import im.rosetta.event.events.ConnectEvent; import im.rosetta.event.events.DisconnectEvent; import im.rosetta.event.events.PacketInputEvent; import im.rosetta.event.events.ServerErrorEvent; import im.rosetta.event.events.ServerStartEvent; import im.rosetta.event.events.ServerStopEvent; import io.orprotocol.Server; import io.orprotocol.ServerListener; import io.orprotocol.client.Client; import io.orprotocol.packet.Packet; /** * Адаптер нужный для трансляции событий протокола в события приложения (EventManager) */ public class ServerAdapter implements ServerListener { private EventManager eventManager; public ServerAdapter(EventManager eventManager) { this.eventManager = eventManager; } @Override public void onServerStart(Server server) { this.eventManager.callEvent(new ServerStartEvent(server)); } @Override public void onServerStop(Server server) { this.eventManager.callEvent(new ServerStopEvent(server)); } @Override public boolean onClientConnect(Server server, Client client) { boolean cancelled = this.eventManager.callEvent(new ConnectEvent(server, client)); /** * Если событие отменено (true), то подключение клиента будет отклонено, * иначе (false) клиент будет успешно подключен. * Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener, * который требует чтобы мы возвращали true если подключение должно быть разрешено. */ return !cancelled; } @Override public void onClientDisconnect(Server server, Client client) { this.eventManager.callEvent(new DisconnectEvent(server, client)); } @Override public void onError(Server server, Exception exception) { this.eventManager.callEvent(new ServerErrorEvent(server, exception)); } @Override public boolean onPacketReceived(Server server, Client client, Packet packet) { boolean cancelled = this.eventManager.callEvent(new PacketInputEvent(server, client, packet)); /** * Если событие отменено (true), то пакет не будет обработан дальше, * иначе (false) будет продолжена его обработка. * Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener, * который требует чтобы мы возвращали true если пакет должен быть обработан дальше. */ return !cancelled; } }