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"); } }