Files
rosetta-wss/src/main/java/im/rosetta/Boot.java

215 lines
9.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package im.rosetta;
import im.rosetta.client.ClientManager;
import im.rosetta.client.OnlineManager;
import im.rosetta.event.EventManager;
import im.rosetta.executors.Executor0Handshake;
import im.rosetta.executors.Executor10RequestUpdate;
import im.rosetta.executors.Executor11Typeing;
import im.rosetta.executors.Executor15RequestTransport;
import im.rosetta.executors.Executor16PushNotification;
import im.rosetta.executors.Executor17GroupCreate;
import im.rosetta.executors.Executor18GroupInfo;
import im.rosetta.executors.Executor19GroupInviteInfo;
import im.rosetta.executors.Executor1UserInfo;
import im.rosetta.executors.Executor20GroupJoin;
import im.rosetta.executors.Executor21GroupLeave;
import im.rosetta.executors.Executor22GroupBan;
import im.rosetta.executors.Executor24DeviceResolve;
import im.rosetta.executors.Executor25Sync;
import im.rosetta.executors.Executor3Search;
import im.rosetta.executors.Executor4OnlineState;
import im.rosetta.executors.Executor6Message;
import im.rosetta.executors.Executor7Read;
import im.rosetta.listeners.DeviceListListener;
import im.rosetta.listeners.HandshakeCompleteListener;
import im.rosetta.listeners.OnlineStatusDisconnectListener;
import im.rosetta.listeners.OnlineStatusHandshakeCompleteListener;
import im.rosetta.listeners.ServerStopListener;
import im.rosetta.logger.Logger;
import im.rosetta.logger.enums.Color;
import im.rosetta.logger.enums.LogLevel;
import im.rosetta.packet.Packet0Handshake;
import im.rosetta.packet.Packet10RequestUpdate;
import im.rosetta.packet.Packet11Typeing;
import im.rosetta.packet.Packet15RequestTransport;
import im.rosetta.packet.Packet16PushNotification;
import im.rosetta.packet.Packet17GroupCreate;
import im.rosetta.packet.Packet18GroupInfo;
import im.rosetta.packet.Packet19GroupInviteInfo;
import im.rosetta.packet.Packet1UserInfo;
import im.rosetta.packet.Packet20GroupJoin;
import im.rosetta.packet.Packet21GroupLeave;
import im.rosetta.packet.Packet22GroupBan;
import im.rosetta.packet.Packet23DeviceList;
import im.rosetta.packet.Packet24DeviceResolve;
import im.rosetta.packet.Packet25Sync;
import im.rosetta.packet.Packet2Result;
import im.rosetta.packet.Packet3Search;
import im.rosetta.packet.Packet4OnlineSubscribe;
import im.rosetta.packet.Packet5OnlineState;
import im.rosetta.packet.Packet6Message;
import im.rosetta.packet.Packet7Read;
import im.rosetta.packet.Packet8Delivery;
import im.rosetta.packet.Packet9DeviceNew;
import io.orprotocol.Server;
import io.orprotocol.Settings;
import io.orprotocol.packet.PacketManager;
/**
* Boot отвечает за инициализацию всех пакетов и их обработчиков,
* а так же событий приложения. Этот Boot отвечает за приложение, а не за протокол.
*
* Нужен он для того, чтобы все части приложения получали одинаковые ссылки на глобальные обьекты приложения, такие как менеджер пакетов,
* менеджер событий, менеджер клиентов и так далее
*/
public class Boot {
private PacketManager packetManager;
private EventManager eventManager;
private Logger logger;
private Server server;
private ServerAdapter serverAdapter;
private ClientManager clientManager;
private OnlineManager onlineManager;
/**
* Конструктор по умолчанию, использует порт 3000 для сервера
*/
public Boot() {
this(3000);
}
/**
* Инициализатор приложения
* @param port Порт, на котором будет работать сервер. Если не указан, то будет использован порт 3000
*/
public Boot(int port) {
this.packetManager = new PacketManager();
this.eventManager = new EventManager();
this.onlineManager = new OnlineManager();
this.logger = new Logger(LogLevel.INFO);
this.serverAdapter = new ServerAdapter(this.eventManager);
this.server = new Server(new Settings(
port,
30
), packetManager, this.serverAdapter);
this.clientManager = new ClientManager(server);
}
/**
* Получить менеджер пакетов приложения
* @return PacketManager
*/
public PacketManager getPacketManager() {
return this.packetManager;
}
/**
* Получить менеджер событий приложения
* @return EventManager
*/
public EventManager getEventManager() {
return this.eventManager;
}
/**
* Получить менеджера клиентов, нужно для того чтобы отправить пакет списку клиентов например
* @return менеджер клиентов
*/
public ClientManager getClientManager() {
return this.clientManager;
}
/**
* Получить логгер приложения
* @return Logger
*/
public Logger getLogger() {
return this.logger;
}
/**
* Запуск сервера, регистрация пакетов, обработчиков, событий приложения
* @return Boot
*/
public Boot bootstrap() {
try{
this.server.start();
this.registerAllPackets();
this.registerAllExecutors();
this.registerAllEvents();
this.printBootMessage();
return this;
}catch(Exception e){
this.logger.error(Color.RED + "Booting error, stack trace:");
e.printStackTrace();
return null;
}
}
private void registerAllEvents() {
this.eventManager.registerListener(new ServerStopListener(this.logger));
this.eventManager.registerListener(new HandshakeCompleteListener());
this.eventManager.registerListener(new OnlineStatusHandshakeCompleteListener(this.onlineManager));
this.eventManager.registerListener(new OnlineStatusDisconnectListener(this.onlineManager, this.clientManager));
this.eventManager.registerListener(new DeviceListListener(this.clientManager));
}
private void registerAllPackets() {
this.packetManager.registerPacket(0, Packet0Handshake.class);
this.packetManager.registerPacket(1, Packet1UserInfo.class);
this.packetManager.registerPacket(2, Packet2Result.class);
this.packetManager.registerPacket(3, Packet3Search.class);
this.packetManager.registerPacket(4, Packet4OnlineSubscribe.class);
this.packetManager.registerPacket(5, Packet5OnlineState.class);
this.packetManager.registerPacket(6, Packet6Message.class);
this.packetManager.registerPacket(7, Packet7Read.class);
this.packetManager.registerPacket(8, Packet8Delivery.class);
this.packetManager.registerPacket(9, Packet9DeviceNew.class);
this.packetManager.registerPacket(10, Packet10RequestUpdate.class);
this.packetManager.registerPacket(11, Packet11Typeing.class);
//RESERVED 12 PACKET AVATAR (unused)
//RESERVED 13 PACKET KERNEL UPDATE (unused)
//RESERVED 14 PACKET APP UPDATE (unused)
this.packetManager.registerPacket(15, Packet15RequestTransport.class);
this.packetManager.registerPacket(16, Packet16PushNotification.class);
this.packetManager.registerPacket(17, Packet17GroupCreate.class);
this.packetManager.registerPacket(18, Packet18GroupInfo.class);
this.packetManager.registerPacket(19, Packet19GroupInviteInfo.class);
this.packetManager.registerPacket(20, Packet20GroupJoin.class);
this.packetManager.registerPacket(21, Packet21GroupLeave.class);
this.packetManager.registerPacket(22, Packet22GroupBan.class);
this.packetManager.registerPacket(23, Packet23DeviceList.class);
this.packetManager.registerPacket(24, Packet24DeviceResolve.class);
this.packetManager.registerPacket(25, Packet25Sync.class);
}
private void registerAllExecutors() {
this.packetManager.registerExecutor(0, new Executor0Handshake(this.eventManager, this.clientManager, this.packetManager));
this.packetManager.registerExecutor(1, new Executor1UserInfo());
this.packetManager.registerExecutor(3, new Executor3Search(this.clientManager));
this.packetManager.registerExecutor(4, new Executor4OnlineState(this.onlineManager, this.clientManager));
this.packetManager.registerExecutor(6, new Executor6Message(this.clientManager, this.packetManager));
this.packetManager.registerExecutor(7, new Executor7Read(this.clientManager, this.packetManager));
this.packetManager.registerExecutor(10, new Executor10RequestUpdate());
this.packetManager.registerExecutor(11, new Executor11Typeing(this.clientManager, this.packetManager));
this.packetManager.registerExecutor(15, new Executor15RequestTransport());
this.packetManager.registerExecutor(16, new Executor16PushNotification());
this.packetManager.registerExecutor(17, new Executor17GroupCreate());
this.packetManager.registerExecutor(18, new Executor18GroupInfo());
this.packetManager.registerExecutor(19, new Executor19GroupInviteInfo());
this.packetManager.registerExecutor(20, new Executor20GroupJoin(this.packetManager));
this.packetManager.registerExecutor(21, new Executor21GroupLeave());
this.packetManager.registerExecutor(22, new Executor22GroupBan());
this.packetManager.registerExecutor(24, new Executor24DeviceResolve(this.clientManager, this.eventManager, this.packetManager));
this.packetManager.registerExecutor(25, new Executor25Sync(this.packetManager));
}
private void printBootMessage() {
this.logger.log(LogLevel.INFO, Color.GREEN + "Boot successful complete");
}
}