From a85da1e05ecc97cd9af3783c2296acacd63e9e68 Mon Sep 17 00:00:00 2001 From: Anonymous275 Date: Fri, 24 Apr 2020 18:58:59 +0300 Subject: [PATCH] Disconnect handler + role sync --- src/Network/ClientHandler.cpp | 11 ++++++++++- src/Network/DataParser.cpp | 37 +++++++++++++++++++++++++++++++---- src/Network/Server.cpp | 9 +++------ src/Network/enet.hpp | 2 ++ src/main.cpp | 2 +- 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/Network/ClientHandler.cpp b/src/Network/ClientHandler.cpp index 2f00025..1ba44af 100644 --- a/src/Network/ClientHandler.cpp +++ b/src/Network/ClientHandler.cpp @@ -15,7 +15,7 @@ void Respond(const std::string& MSG, ENetPeer*peer){ } void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data, bool All, bool Reliable){ - std::cout << "Sending Code " << Data.at(0) << " length:" << Data.length() << " to all with the self switch : " << All << std::endl; + //std::cout << "Sending Code " << Data.at(0) << " length:" << Data.length() << " to all with the self switch : " << All << std::endl; for (int i = 0; i < server->connectedPeers; i++) { if (All || &server->peers[i] != peer) { //reliable is 1 unreliable is 8 @@ -25,6 +25,15 @@ void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data, bool All } } +void OnDisconnect(ENetHost *server,ENetPeer*peer){ + std::string Packet = "Od:" + std::to_string(peer->serverVehicleID[0]); + SendToAll(server,peer, Packet,false,true); + Packet.clear(); + peer->DID.clear(); + peer->Name.clear(); + peer->VehicleData.clear(); +} + void OnConnect(ENetHost *server,ENetPeer*peer){ enet_peer_send(peer, 0, enet_packet_create ("NR", 3, ENET_PACKET_FLAG_RELIABLE)); peer->serverVehicleID[0] = FindID(server,peer); ///TODO: WHAT IF IT IS THE SECOND VEHICLE? diff --git a/src/Network/DataParser.cpp b/src/Network/DataParser.cpp index a28004d..1f98c73 100644 --- a/src/Network/DataParser.cpp +++ b/src/Network/DataParser.cpp @@ -6,10 +6,12 @@ #include "enet.hpp" #include #include +#include #include "../logger.h" #include "../Settings.hpp" void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data,bool All, bool Reliable); +std::string HTTP_REQUEST(const std::string& IP,int port); void Respond(const std::string& MSG, ENetPeer*peer); void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){ @@ -18,12 +20,13 @@ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){ switch(Code){ //Spawned Destroyed Switched/Moved Reset case 's': if(Data.at(0) == '0'){ - Packet = "Os:"+peer->Name+":"+std::to_string(peer->serverVehicleID[0])+Packet.substr(4); + Packet = "Os:"+peer->Role+":"+peer->Name+":"+std::to_string(peer->serverVehicleID[0])+Packet.substr(4); peer->VehicleData = Packet; } SendToAll(server,peer,Packet,true,true); break; case 'd': + peer->VehicleData.clear(); SendToAll(server,peer,Packet,true,true); break; case 'm': @@ -33,6 +36,7 @@ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){ break; } } + void SyncVehicles(ENetHost*server,ENetPeer*peer){ ENetPeer*ENetClient; for (int i = 0; i < server->connectedPeers; i++) { @@ -46,6 +50,22 @@ void SyncVehicles(ENetHost*server,ENetPeer*peer){ } } +void HTTP(ENetPeer*peer){ + if(peer != nullptr && !peer->DID.empty()){ + std::string a = HTTP_REQUEST("https://beamng-mp.com/entitlement?did="+peer->DID,443); + if(!a.empty()){ + int pos = a.find('"'); + peer->Role = a.substr(pos+1,a.find('"',pos+1)-2); + if(Debug)debug("ROLE -> " + peer->Role); + } + } +} + +void GrabRole(ENetPeer*peer){ + std::thread t1(HTTP,peer); + t1.detach(); +} + void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){ std::string Packet = (char*)packet->data; if(Packet == "TEST")SyncVehicles(server,peer); @@ -56,16 +76,25 @@ void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){ Respond("p",peer); return; case 'N': - if(SubCode == 'R')peer->Name = Packet.substr(2); + if(SubCode == 'R'){ + peer->Name = Packet.substr(2,Packet.find(':')-2); + peer->DID = Packet.substr(Packet.find(':')+1); + GrabRole(peer); + } std::cout << "Name : " << peer->Name << std::endl; return; case 'O': - std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl; + if(Packet.length() > 1000) { + std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl; + } VehicleParser(Packet,peer,server); return; } //V to Z - std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl; + if(Packet.length() > 1000){ + std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl; + } + if(Code <= 90 && Code >= 86)SendToAll(server,peer,Packet,false,false); if(Debug)debug("Data : " + Packet); } diff --git a/src/Network/Server.cpp b/src/Network/Server.cpp index 7d543d0..5f0908e 100644 --- a/src/Network/Server.cpp +++ b/src/Network/Server.cpp @@ -10,8 +10,8 @@ #include "../Settings.hpp" void ParseData(ENetPacket*packet,ENetPeer*peer,ENetHost *server); //Data Parser +void OnDisconnect(ENetHost *server,ENetPeer*peer); void OnConnect(ENetHost *server,ENetPeer*peer); - ENetPacket* packet; int PlayerCount = 0; @@ -59,15 +59,12 @@ void host_server(ENetHost *server) { case ENET_EVENT_TYPE_DISCONNECT: std::cout << event.peer->Name << " disconnected." << std::endl; - // Reset the peer's client information. - event.peer->Name.clear(); - event.peer->VehicleData.clear(); + OnDisconnect(server,event.peer); break; case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT: std::cout << event.peer->Name << " timed out." << std::endl; - event.peer->Name.clear(); - event.peer->VehicleData.clear(); + OnDisconnect(server,event.peer); break; case ENET_EVENT_TYPE_NONE: break; } diff --git a/src/Network/enet.hpp b/src/Network/enet.hpp index f4c60db..6d70cce 100644 --- a/src/Network/enet.hpp +++ b/src/Network/enet.hpp @@ -637,6 +637,8 @@ typedef struct _ENetPeer { enet_uint8 incomingSessionID; ENetAddress address; /**< Internet address of the peer */ std::string Name; /**< Application private data, may be freely modified */ + std::string DID; + std::string Role = "USER"; std::string VehicleData; int gameVehicleID[10] = {0}; //added By Anonymous275 int serverVehicleID[10] = {0}; //added By Anonymous275 diff --git a/src/main.cpp b/src/main.cpp index 8f81d06..4fe51af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,7 @@ bool Debug = false; void addToLog(basic_string Data); void HeartbeatInit(); -string MapName = "levels/gridmap/level.json"; +string MapName = "/levels/gridmap/level.json"; bool Private = false; int MaxPlayers = 10; int UDPPort = 30814;