diff --git a/src/main.cpp b/src/main.cpp index 54c00d7..18c569c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,17 +8,64 @@ using namespace std; Logger log; +auto writeMCString = [](char* buf, const string& str){ + memset(buf, ' ', 64); + memcpy(buf, str.c_str(), min(str.size(), (size_t)64)); +}; + class Player { public: string username; string verKey; + bool isOP; - Player(string uname, string verkey){ + Player(string uname, string verkey, bool op){ username = uname; verKey = verkey; + isOP = op; } }; +class Packet { +public: + void recvPlayerId(SOCKET socket){ + char buffer[131] = {}; + int bytesRecv = recv(socket, buffer, sizeof(buffer), 0); + + if(bytesRecv <= 0){ + log.err("No bytes received"); + closesocket(socket); + } + + uint8_t packID = buffer[0]; + uint8_t protVer = buffer[1]; + string username; username.assign(buffer + 2, 64); + username.erase(username.find_first_of("\0 \t\r\n", 0, 6)); + string verKey; verKey.assign(buffer + 66, 64); + uint8_t unused = buffer[130]; + + log.info(username + " connected"); + } + + void sendServerId(SOCKET socket, string name, string motd, char utype){ + char buffer[131] = {}; + + buffer[0] = 0x00; + buffer[1] = 0x07; + writeMCString(buffer + 2, name); + writeMCString(buffer + 66, motd); + buffer[130] = utype; + + int bytesSent = send(socket, buffer, sizeof(buffer), 0); + if(bytesSent != sizeof(buffer)){ + log.err("Failed to send buffer"); + closesocket(socket); + } + } +}; + +Packet pack; + int main() { log.raw("mcc v0.0.0"); Socket socket; @@ -32,14 +79,16 @@ int main() { if(clientSocket == INVALID_SOCKET) continue; // Receive player identification + /* char buffer[131] = {}; int bytesRecv = recv(clientSocket, buffer, sizeof(buffer), 0); if(bytesRecv <= 0){ log.err("No bytes received"); closesocket(clientSocket); - return 1; + continue; } + uint8_t packID = buffer[0]; uint8_t protVer = buffer[1]; string username; username.assign(buffer + 2, 64); @@ -47,13 +96,27 @@ int main() { string verKey; verKey.assign(buffer + 66, 64); uint8_t unused = buffer[130]; - Player player(username, verKey); + Player player(username, verKey, false); + log.info(username + " connected"); + */ // send server identification (using the same buffer) - for(int i=0; i < sizeof(buffer); i++){ - buffer[i] = {}; - } + Player player(username, verKey, false); + + string name, motd; + char utype; + + name = "MCC Testing"; + motd = "Welcome, " + player.username + "!"; + if(player.isOP == true) utype = 0x64; + else utype = 0x00; + + pack.sendServerId(clientSocket, name, motd, utype); + + // Level initialization (just to debug server id packet) + char levelinitbuff = 0x02; + send(clientSocket, &levelinitbuff, sizeof(levelinitbuff), 0); } return 0;