přepsani switch na map

NettyPing
Michal 2025-02-16 16:27:26 +01:00
parent 419312f3fc
commit a80d4198e2
1 changed files with 303 additions and 271 deletions

View File

@ -6,7 +6,9 @@ import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor; import io.netty.util.concurrent.GlobalEventExecutor;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.function.Consumer;
import jnet.lib.LogFile; import jnet.lib.LogFile;
import jnet.lib.Message; import jnet.lib.Message;
import jnet.lib.PasswordHashing; import jnet.lib.PasswordHashing;
@ -25,300 +27,330 @@ public class ServerMessageParser {
private static final ChannelGroup channels = new DefaultChannelGroup( private static final ChannelGroup channels = new DefaultChannelGroup(
"containers", GlobalEventExecutor.INSTANCE); "containers", GlobalEventExecutor.INSTANCE);
private static final java.util.Map<Integer, Consumer<Message>> handlers = new HashMap<>();
public ServerMessageParser(Channel currentClient) { public ServerMessageParser(Channel currentClient) {
this.currentClient = currentClient; this.currentClient = currentClient;
// Inicializace mapy typu zprávy na odpovídající metody
handlers.put(Message.CLIENT_VERSION, this::handleClientVersion);
handlers.put(Message.AUTH, this::handleAuth);
handlers.put(Message.RESTART, this::handleRestart);
handlers.put(Message.UPTIME, this::handleUptime);
handlers.put(Message.NEW_OBJECT_TYPE, this::handleNewObjectType);
handlers.put(Message.SET_MAP_LOCK, this::handleSetMapLock);
handlers.put(Message.ADD_OBJECT, this::handleAddObject);
handlers.put(Message.REMOVE_OBJECT, this::handleRemoveObject);
handlers.put(Message.MAP_REMOVE, this::handleMapRemove);
handlers.put(Message.MAP_ADD, this::handleMapAdd);
handlers.put(Message.OBJECT_MOVE, this::handleObjectMove);
handlers.put(Message.UPDATE_OBJECT, this::handleUpdateObject);
handlers.put(Message.DELETE_LOG, this::handleDeleteLog);
handlers.put(Message.USER, this::handleUser);
handlers.put(Message.USER_EDIT, this::handleUserEdit);
handlers.put(Message.SERVER_CONFIG, this::handleServerConfig);
handlers.put(Message.SNMP_OBJECT_INFO, this::handleSnmpObjectInfo);
} }
public void parse(Message msg) { public void parse(Message msg) {
LogFile.printDebug("-> Message type: " + msg.getType()); LogFile.printDebug("-> Message type: " + msg.getType());
ListIterator<Map> iteratorMap = Server.maps.listIterator(); Consumer<Message> handler = handlers.get(msg.getType());
if (handler != null) {
handler.accept(msg);
} else {
LogFile.printErr("Neznamy typ zpravy");
}
}
switch (msg.getType()) { private void handleClientVersion(Message msg) {
int client_version = (int) msg.getMsg();
if (client_version < Server.MINIMAL_CLIENT_VERSION) {
LogFile.printInfo("Outdated client. Sent update request (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")");
send(new Message(Message.UPDATE, null));
} else {
LogFile.printInfo("Authorization request send (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")");
// oodeslat pozadavek na autorizacni udaje
send(new Message(Message.AUTH_REQUEST, null));
}
}
case Message.CLIENT_VERSION: private void handleAuth(Message msg) {
int client_version = (int) msg.getMsg(); String[] userData = (String[]) msg.getMsg();
if (client_version < Server.MINIMAL_CLIENT_VERSION) { String username = userData[0];
LogFile.printInfo("Outdated client. Sent update request (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")"); String password = userData[1];
send(new Message(Message.UPDATE, null)); int platform = Integer.parseInt(userData[2]);
} else {
LogFile.printInfo("Authorization request send (" + ((InetSocketAddress) currentClient.remoteAddress()).getHostName() + ")"); User u = Database.getUserInfo(username);
// oodeslat pozadavek na autorizacni udaje
send(new Message(Message.AUTH_REQUEST, null)); if (PasswordHashing.verify(password, u.getPassword())) {
LogFile.printInfo("User: " + username + " logged in (" + ((InetSocketAddress) currentClient.remoteAddress()).getAddress().getHostName() + ")");
// odeslat informaci uzivateli o jeho uspesnem prihlaseni
send(new Message(Message.AUTH_SUCEFULL, null));
// pridani uzivatele mezi pripojene kanaly
channels.add(currentClient);
// vložit uživatele na seznam online uživatelů
InetSocketAddress socketAddress = (InetSocketAddress) currentClient.remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
String clientPort = String.valueOf(socketAddress.getPort());
Server.onlineClients.add(new OnlineClients(
String.valueOf(u.getId()),
u.getUsername(),
clientIp,
clientPort,
platform));
// odeslat informace o prihlasenem uzivateli, opravneni atd
send(new Message(Message.USER_INFO, u));
// odeslat vsem nový seznam pripojenych klientu
sendAll(new Message(Message.ONLINE_CLIENTS, Server.onlineClients));
// odeslat nastaveni serveru
ServerConfig sc = new ServerConfig(
Server.config.getInt("ping_repeat"),
Server.config.getInt("ping_attempt"),
Server.config.getInt("ping_timeout"),
Server.config.getInt("instability_attempt"),
Server.config.getInt("instability_limit"));
send(new Message(Message.SERVER_CONFIG, sc));
// odeslat typy objektu
for (ObjectType ot : Server.objectType) {
send(new Message(Message.OBJECT_TYPE, ot));
}
// odesila seznam uzivatelu
for (User us : Server.users) {
send(new Message(Message.USER, us));
}
// odeslat seznam map
for (Map i : Server.maps) {
send(new Message(Message.MAP, i));
}
// odeslat seznam udalosti
send(new Message(Message.EVENT_LIST, Server.events));
// odeslat seznam snmp profilů
for (SnmpProfile i : Server.snmpProfile) {
send(new Message(Message.SNMP_PROFILE, i));
}
} else {
LogFile.printInfo("Authorization failed (ser: " + username + " )");
}
}
private void handleRestart(Message msg) {
LogFile.printInfo("Prijat pozadavek na restart serveru");
Server.restartServer();
}
private void handleUptime(Message msg) {
long uptime = ManagementFactory.getRuntimeMXBean().getUptime();
send(Message.UPTIME, uptime);
}
private void handleNewObjectType(Message msg) {
ObjectType not = (ObjectType) msg.getMsg();
int id = Database.addObjectType(not);
not.setId(id);
Server.objectType.add(not);
sendAll(new Message(Message.OBJECT_TYPE, not));
}
private void handleSetMapLock(Message msg) {
int[] data_lock = (int[]) msg.getMsg();
for (Map map : Server.maps) {
if (map.getId() == data_lock[0]) {
map.setLock((data_lock[1] == 1));
break;
}
}
// upravit informaci v databazi
Database.mapLock(data_lock[1], data_lock[0]);
// odeslani informace ostatnim
sendAll(new Message(Message.SET_MAP_LOCK, data_lock));
}
private void handleAddObject(Message msg) {
MapObject mo = Database.addMapObject((MapObject) msg.getMsg());
// pridat do seznamu
for (Map map : Server.maps) {
if (map.getId() == mo.getMap()) {
map.getObjects().add(mo);
}
}
// odesle všem novy objekt
sendAll(new Message(Message.ADD_OBJECT, mo));
// prida event a odesle ho
Event event = Database.addEvent(mo.getId(), "Přidáno", Event.TYPE_INFO);
sendAll(new Message(Message.EVENT_NEW, event));
// pokud je object vypnuty prida log
if (!mo.isActive()) {
Event event_disable = Database.addEvent(mo.getId(), "Ping vypnut", Event.TYPE_PING_OFF);
sendAll(new Message(Message.EVENT_NEW, event_disable));
}
}
private void handleRemoveObject(Message msg) {
for (Map map : Server.maps) {
for (MapObject object : map.getObjects()) {
if (object.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeObject(object.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.REMOVE_OBJECT, object.getId()));
// odebere ze seznamu
map.getObjects().remove(object);
break;
} }
}
}
}
private void handleMapRemove(Message msg) {
for (Map map : Server.maps) {
if (map.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeMap(map.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.MAP_REMOVE, map.getId()));
// odebere ze seznamu
Server.maps.remove(map);
break; break;
}
}
}
case Message.AUTH: private void handleMapAdd(Message msg) {
String[] userData = (String[]) msg.getMsg(); Map map = new Map((String) msg.getMsg());
String username = userData[0]; // přidání mapy do databaze
String password = userData[1]; map.setId(Database.addMap(map.getName()));
int platform = Integer.parseInt(userData[2]); //odeslání mapy klientum
send(new Message(Message.MAP, map));
// pridani mapy do seznamu
Server.maps.add(map);
}
User u = Database.getUserInfo(username); private void handleObjectMove(Message msg) {
int[] data = (int[]) msg.getMsg();
if (PasswordHashing.verify(password, u.getPassword())) { // 0 = obj id
LogFile.printInfo("User: " + username + " logged in (" + ((InetSocketAddress) currentClient.remoteAddress()).getAddress().getHostName() + ")"); // 2 = x
// odeslat informaci uzivateli o jeho uspesnem prihlaseni // 2 = y
send(new Message(Message.AUTH_SUCEFULL, null)); // zmenit v databázi
// pridani uzivatele mezi pripojene kanaly Database.objectMove(data[0], data[1], data[2]);
channels.add(currentClient); // zmenit v seznamu
// vložit uživatele na seznam online uživatelů for (Map mapa : Server.maps) {
InetSocketAddress socketAddress = (InetSocketAddress) currentClient.remoteAddress(); for (MapObject object : mapa.getObjects()) {
String clientIp = socketAddress.getAddress().getHostAddress(); if (object.getId() == data[0]) {
String clientPort = String.valueOf(socketAddress.getPort()); // zmenit pozici
Server.onlineClients.add(new OnlineClients( object.setX(data[1]);
String.valueOf(u.getId()), object.setY(data[2]);
u.getUsername(), // zapsat zmenu do databaze
clientIp, Database.objectMove(data[0], data[1], data[2]);
clientPort, // preposlat zmenu klientum
platform)); sendAll(new Message(Message.UPDATE_OBJECT, object));
// odeslat informace o prihlasenem uzivateli, opravneni atd break;
send(new Message(Message.USER_INFO, u));
// odeslat vsem nový seznam pripojenych klientu
sendAll(new Message(Message.ONLINE_CLIENTS, Server.onlineClients));
// odeslat nastaveni serveru
ServerConfig sc = new ServerConfig(
Server.config.getInt("ping_repeat"),
Server.config.getInt("ping_attempt"),
Server.config.getInt("ping_timeout"),
Server.config.getInt("instability_attempt"),
Server.config.getInt("instability_limit"));
send(new Message(Message.SERVER_CONFIG, sc));
// odeslat typy objektu
for (ObjectType ot : Server.objectType) {
send(new Message(Message.OBJECT_TYPE, ot));
}
// odesila seznam uzivatelu
for (User us : Server.users) {
send(new Message(Message.USER, us));
}
// odeslat seznam map
for (Map i : Server.maps) {
send(new Message(Message.MAP, i));
}
// odeslat seznam udalosti
send(new Message(Message.EVENT_LIST, Server.events));
// odeslat seznam snmp profilů
for (SnmpProfile i : Server.snmpProfile) {
send(new Message(Message.SNMP_PROFILE, i));
}
} else {
LogFile.printInfo("Authorization failed (ser: " + username + " )");
} }
break; }
}
}
case Message.RESTART: private void handleUpdateObject(Message msg) {
LogFile.printInfo("Prijat pozadavek na restart serveru"); MapObject mo_u = (MapObject) msg.getMsg();
Server.restartServer(); // zmenit v databazi
break; Database.updateObject(mo_u);
// zmenit v seznamu
case Message.UPTIME: for (Map m : Server.maps) {
long uptime = ManagementFactory.getRuntimeMXBean().getUptime(); for (int i = 0; i < m.getObjects().size(); i++) {
send(Message.UPTIME, uptime); if (m.getObjects().get(i).getId() == mo_u.getId()) {
break; // pokud je object vypnuty a dřív nebyl prida log
if (!mo_u.isActive() && m.getObjects().get(i).isActive()) {
case Message.NEW_OBJECT_TYPE: Event event_disable = Database.addEvent(mo_u.getId(), "Ping vypnut", Event.TYPE_PING_OFF);
ObjectType not = (ObjectType) msg.getMsg(); sendAll(new Message(Message.EVENT_NEW, event_disable));
int id = Database.addObjectType(not);
not.setId(id);
Server.objectType.add(not);
sendAll(new Message(Message.OBJECT_TYPE, not));
break;
case Message.SET_MAP_LOCK:
int[] data_lock = (int[]) msg.getMsg();
while (iteratorMap.hasNext()) {
Map map = iteratorMap.next();
if (map.getId() == data_lock[0]) {
map.setLock((data_lock[1] == 1));
break;
} }
} // pokud je object zapnutý a dřív nebyl prida log
// upravit informaci v databazi if (mo_u.isActive() && !m.getObjects().get(i).isActive()) {
Database.mapLock(data_lock[1], data_lock[0]); Event event_disable = Database.addEvent(mo_u.getId(), "Ping zapnut", Event.TYPE_PING_OFF);
// odeslani informace ostatnim sendAll(new Message(Message.EVENT_NEW, event_disable));
sendAll(new Message(Message.SET_MAP_LOCK, data_lock));
break;
case Message.ADD_OBJECT:
MapObject mo = Database.addMapObject((MapObject) msg.getMsg());
// pridat do seznamu
for (Map map : Server.maps) {
if (map.getId() == mo.getMap()) {
map.getObjects().add(mo);
}
}
// odesle všem novy objekt
sendAll(new Message(Message.ADD_OBJECT, mo));
// prida event a odesle ho
Event event = Database.addEvent(mo.getId(), "Přidáno", Event.TYPE_INFO);
sendAll(new Message(Message.EVENT_NEW, event));
// pokud je object vypnuty prida log
if (!mo.isActive()) {
Event event_disable = Database.addEvent(mo.getId(), "Ping vypnut", Event.TYPE_PING_OFF);
sendAll(new Message(Message.EVENT_NEW, event_disable));
}
break;
case Message.REMOVE_OBJECT:
for (Map map : Server.maps) {
for (MapObject object : map.getObjects()) {
if (object.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeObject(object.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.REMOVE_OBJECT, object.getId()));
// odebere ze seznamu
map.getObjects().remove(object);
break;
}
}
}
break;
case Message.MAP_REMOVE:
while (iteratorMap.hasNext()) {
Map map = iteratorMap.next();
if (map.getId() == (int) msg.getMsg()) {
// odebere z databaze
Database.removeMap(map.getId());
// odesle informaci o odebrani objektu klientum
sendAll(new Message(Message.MAP_REMOVE, map.getId()));
// odebere ze seznamu
iteratorMap.remove();
break;
}
}
break;
case Message.MAP_ADD:
Map map = new Map((String) msg.getMsg());
// přidání mapy do databaze
map.setId(Database.addMap(map.getName()));
//odeslání mapy klientum
send(new Message(Message.MAP, map));
// pridani mapy do seznamu
iteratorMap.add(map);
break;
case Message.OBJECT_MOVE:
int[] data = (int[]) msg.getMsg();
// 0 = obj id
// 2 = x
// 2 = y
// zmenit v databázi
Database.objectMove(data[0], data[1], data[2]);
// zmenit v seznamu
for (Map mapa : Server.maps) {
for (MapObject object : mapa.getObjects()) {
if (object.getId() == data[0]) {
// zmenit pozici
object.setX(data[1]);
object.setY(data[2]);
// zapsat zmenu do databaze
Database.objectMove(data[0], data[1], data[2]);
// preposlat zmenu klientum
sendAll(new Message(Message.UPDATE_OBJECT, object));
break;
}
}
}
break;
case Message.UPDATE_OBJECT:
MapObject mo_u = (MapObject) msg.getMsg();
// zmenit v databazi
Database.updateObject(mo_u);
// zmenit v seznamu
for (Map m : Server.maps) {
for (int i = 0; i < m.getObjects().size(); i++) {
if (m.getObjects().get(i).getId() == mo_u.getId()) {
// pokud je object vypnuty a dřív nebyl prida log
if (!mo_u.isActive() && m.getObjects().get(i).isActive()) {
Event event_disable = Database.addEvent(mo_u.getId(), "Ping vypnut", Event.TYPE_PING_OFF);
sendAll(new Message(Message.EVENT_NEW, event_disable));
}
// pokud je object zapnutý a dřív nebyl prida log
if (mo_u.isActive() && !m.getObjects().get(i).isActive()) {
Event event_disable = Database.addEvent(mo_u.getId(), "Ping zapnut", Event.TYPE_PING_OFF);
sendAll(new Message(Message.EVENT_NEW, event_disable));
}
// zmeni objekt v seznamu
m.getObjects().set(i, mo_u);
break;
}
} }
// zmeni objekt v seznamu
m.getObjects().set(i, mo_u);
break;
} }
// preposlat zmenu klientum }
sendAll(new Message(Message.UPDATE_OBJECT, mo_u));
break;
case Message.DELETE_LOG:
int objId = (int) msg.getMsg();
// vymaže logy v databazi
Database.deleteObjectLog(objId);
// vymaze logy v listu
ListIterator<Event> iterator = Server.events.listIterator();
while (iterator.hasNext()) {
if (iterator.next().getObject() == objId) {
iterator.remove();
break;
}
}
sendAll(new Message(Message.DELETE_LOG, objId));
break;
case Message.USER:
User user = (User) msg.getMsg();
user.setPassword(PasswordHashing.hash(user.getPassword()));
//pridáni do databáze a nastaveni id
user.setId(Database.addUser(user));
// přidání do seznamu
Server.users.add(user);
// odeslat klientum nového uživatele
send(new Message(Message.USER, user));
break;
case Message.USER_EDIT:
User ue = (User) msg.getMsg();
// upraveni v databázi
Database.editUser(ue);
// zmenit v seznamu
ListIterator<User> iteratorUser = Server.users.listIterator();
while (iteratorUser.hasNext()) {
User next = iteratorUser.next();
if (next.getId() == ue.getId()) {
iteratorUser.set(ue);
break;
}
}
// preposlat zmenu klientum
sendAll(new Message(Message.USER_EDIT, ue));
break;
case Message.SERVER_CONFIG:
ServerConfig sc = (ServerConfig) msg.getMsg();
// ulozeni
Server.config.setInt("ping_repeat", sc.getPingRepeat());
Server.config.setInt("ping_attempt", sc.getPingAttempt());
Server.config.setInt("ping_timeout", sc.getPingTimeout());
Server.config.setInt("instability_attempt", sc.getInstabilityAttempt());
Server.config.setInt("instability_limit", sc.getInstabilityLimit());
Server.config.save();
//odeslani vsem
sendAll(Message.SERVER_CONFIG, sc);
break;
default:
LogFile.printErr("Neznamy typ zpravy");
} }
// preposlat zmenu klientum
sendAll(new Message(Message.UPDATE_OBJECT, mo_u));
} }
private void handleDeleteLog(Message msg) {
int objId = (int) msg.getMsg();
// vymaže logy v databazi
Database.deleteObjectLog(objId);
// vymaze logy v listu
ListIterator<Event> iterator = Server.events.listIterator();
while (iterator.hasNext()) {
if (iterator.next().getObject() == objId) {
iterator.remove();
break;
}
}
sendAll(new Message(Message.DELETE_LOG, objId));
}
private void handleUser(Message msg) {
User user = (User) msg.getMsg();
user.setPassword(PasswordHashing.hash(user.getPassword()));
//pridáni do databáze a nastaveni id
user.setId(Database.addUser(user));
// přidání do seznamu
Server.users.add(user);
// odeslat klientum nového uživatele
send(new Message(Message.USER, user));
}
private void handleUserEdit(Message msg) {
User ue = (User) msg.getMsg();
// upraveni v databázi
Database.editUser(ue);
// zmenit v seznamu
ListIterator<User> iteratorUser = Server.users.listIterator();
while (iteratorUser.hasNext()) {
User next = iteratorUser.next();
if (next.getId() == ue.getId()) {
iteratorUser.set(ue);
break;
}
}
// preposlat zmenu klientum
sendAll(new Message(Message.USER_EDIT, ue));
}
private void handleServerConfig(Message msg) {
ServerConfig sc = (ServerConfig) msg.getMsg();
// ulozeni
Server.config.setInt("ping_repeat", sc.getPingRepeat());
Server.config.setInt("ping_attempt", sc.getPingAttempt());
Server.config.setInt("ping_timeout", sc.getPingTimeout());
Server.config.setInt("instability_attempt", sc.getInstabilityAttempt());
Server.config.setInt("instability_limit", sc.getInstabilityLimit());
Server.config.save();
//odeslani vsem
sendAll(Message.SERVER_CONFIG, sc);
}
private void handleSnmpObjectInfo(Message msg) {
Object[] msg_object = (Object[]) msg.getMsg();
String frameName = (String) msg_object[0];
int objId = (int) msg_object[1];
}
/**
*
*
* @param message
*/
public void send(Message message) { public void send(Message message) {
currentClient.writeAndFlush(message); currentClient.writeAndFlush(message);
LogFile.printDebug("<- Message type: " + message.getType()); LogFile.printDebug("<- Message type: " + message.getType());