Базовые события сервера, адаптер сервера, сборка контекста

This commit is contained in:
RoyceDa
2026-02-02 23:36:27 +02:00
parent 07379beca1
commit f4be7b4e00
11 changed files with 291 additions and 24 deletions

View File

@@ -0,0 +1,22 @@
package com.rosetta.im;
import com.rosetta.im.event.EventManager;
import io.orprotocol.Context;
/**
* Контекст приложения, хранящий глобальные объекты
*/
public class AppContext extends Context {
private EventManager eventManager;
public AppContext(EventManager eventManager) {
this.eventManager = eventManager;
}
public EventManager getEventManager() {
return eventManager;
}
}

View File

@@ -9,8 +9,8 @@ public class Boot {
private PacketManager packetManager;
public Boot(PacketManager packetManager) {
this.packetManager = packetManager;
public Boot() {
this.packetManager = new PacketManager();
}
public PacketManager getPacketManager() {
@@ -20,10 +20,11 @@ public class Boot {
/**
* Инициализация всех пакетов и их обработчиков
*/
public void bootstrap() {
public Boot bootstrap() {
this.registerAllPackets();
this.registerAllExecutors();
this.printBootMessage();
return this;
}
private void registerAllPackets() {

View File

@@ -0,0 +1,21 @@
package com.rosetta.im;
import com.rosetta.im.event.EventManager;
public class ContextBuilder {
private AppContext appContext;
public ContextBuilder() {}
public AppContext buildContext() {
/**
* Создание глобальных объектов приложения
*/
EventManager eventManager = new EventManager();
this.appContext = new AppContext(eventManager);
return this.appContext;
}
}

View File

@@ -6,23 +6,21 @@ import io.orprotocol.packet.PacketManager;
public class Main {
public static void main(String[] args) {
PacketManager manager = new PacketManager();
/**
* Регистрация всех пакетов и их обработчиков
*/
Boot boot = new Boot(manager);
boot.bootstrap();
Boot boot = new Boot();
PacketManager manager = boot.bootstrap().getPacketManager();
/**
* Загрузка настроек сервера
* Загрузка настроек сервера, сборка контекста приложения
*/
Settings settings = new Settings(8881, 30);
AppContext appContext = new ContextBuilder().buildContext();
ServerAdapter serverAdapter = new ServerAdapter(appContext.getEventManager());
/**
* Запуск сервера на порту 8881
*/
Server server = new Server(settings, manager);
Server server = new Server(settings, manager, appContext, serverAdapter);
server.start();
}
}

View File

@@ -1,36 +1,71 @@
package com.rosetta.im;
import com.rosetta.im.event.EventManager;
import com.rosetta.im.event.events.ConnectEvent;
import com.rosetta.im.event.events.DisconnectEvent;
import com.rosetta.im.event.events.PacketInputEvent;
import com.rosetta.im.event.events.ServerErrorEvent;
import com.rosetta.im.event.events.ServerStartEvent;
import com.rosetta.im.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 {
@Override
public void onServerStart(Server server) {}
private EventManager eventManager;
@Override
public void onServerStop(Server server) {}
@Override
public boolean onClientConnect(Server server, Client client) {
return true;
public ServerAdapter(EventManager eventManager) {
this.eventManager = eventManager;
}
@Override
public void onClientDisconnect(Server server, Client client) {}
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) {
System.out.println("Server error: " + exception.getMessage());
this.eventManager.callEvent(new ServerErrorEvent(server, exception));
}
@Override
public boolean onPacketReceived(Server server, Client client, Packet packet) {
return true;
boolean cancelled = this.eventManager.callEvent(new PacketInputEvent(server, client, packet));
/**
* Если событие отменено (true), то пакет не будет обработан дальше,
* иначе (false) будет продолжена его обработка.
* Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener,
* который требует чтобы мы возвращали true если пакет должен быть обработан дальше.
*/
return !cancelled;
}
}

View File

@@ -0,0 +1,41 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Cancelable;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
import io.orprotocol.client.Client;
/**
* Событие подключения клиента к серверу.
*/
public class ConnectEvent extends Event implements Cancelable {
private boolean canceled = false;
private Server server;
private Client client;
public ConnectEvent(Server server, Client client) {
this.server = server;
this.client = client;
}
@Override
public boolean isCanceled() {
return this.canceled;
}
@Override
public void setCanceled(boolean canceled) {
this.canceled = canceled;
}
public Server getServer() {
return this.server;
}
public Client getClient() {
return this.client;
}
}

View File

@@ -0,0 +1,29 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
import io.orprotocol.client.Client;
/**
* Событие отключения клиента от сервера.
*/
public class DisconnectEvent extends Event {
private Server server;
private Client client;
public DisconnectEvent(Server server, Client client) {
this.server = server;
this.client = client;
}
public Server getServer() {
return this.server;
}
public Client getClient() {
return this.client;
}
}

View File

@@ -0,0 +1,48 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Cancelable;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
import io.orprotocol.client.Client;
import io.orprotocol.packet.Packet;
/**
* Событие входящего пакета от клиента.
*/
public class PacketInputEvent extends Event implements Cancelable {
private boolean canceled = false;
private Server server;
private Client client;
private Packet packet;
public PacketInputEvent(Server server, Client client, Packet packet) {
this.server = server;
this.client = client;
this.packet = packet;
}
@Override
public boolean isCanceled() {
return this.canceled;
}
@Override
public void setCanceled(boolean canceled) {
this.canceled = canceled;
}
public Server getServer() {
return this.server;
}
public Client getClient() {
return this.client;
}
public Packet getPacket() {
return this.packet;
}
}

View File

@@ -0,0 +1,28 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
/**
* Событие ошибки сервера.
*/
public class ServerErrorEvent extends Event {
private Exception exception;
private Server server;
public ServerErrorEvent(Server server, Exception exception) {
this.server = server;
this.exception = exception;
}
public Exception getException() {
return this.exception;
}
public Server getServer() {
return this.server;
}
}

View File

@@ -0,0 +1,22 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
/**
* Событие запуска сервера.
*/
public class ServerStartEvent extends Event {
private Server server;
public ServerStartEvent(Server server) {
this.server = server;
}
public Server getServer() {
return this.server;
}
}

View File

@@ -0,0 +1,22 @@
package com.rosetta.im.event.events;
import com.rosetta.im.event.Event;
import io.orprotocol.Server;
/**
* Событие остановки сервера.
*/
public class ServerStopEvent extends Event {
private Server server;
public ServerStopEvent(Server server) {
this.server = server;
}
public Server getServer() {
return this.server;
}
}