diff --git a/rsc/scripts/setup_server.sql b/rsc/scripts/setup_server.sql index 2c5c018..7a84df0 100644 --- a/rsc/scripts/setup_server.sql +++ b/rsc/scripts/setup_server.sql @@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS UserAccounts ( -- password varchar(100), blacklisted BIT DEFAULT 0, whitelisted BIT DEFAULT 1 +-- TODO: moderator ); ------------------------- diff --git a/server/account_management.cpp b/server/account_management.cpp index 4cb201a..5f82e55 100644 --- a/server/account_management.cpp +++ b/server/account_management.cpp @@ -159,13 +159,14 @@ int ServerApplication::SaveUserAccount(int uid) { void ServerApplication::UnloadUserAccount(int uid) { //save this user account, and then unload it + //NOTE: the associated characters are unloaded externally SaveUserAccount(uid); accountMap.erase(uid); - //TODO: unload this account's characters? } void ServerApplication::DeleteUserAccount(int uid) { //delete a user account from the database, and remove it from memory + //NOTE: the associated characters are unloaded externally sqlite3_stmt* statement = nullptr; //prep @@ -185,8 +186,6 @@ void ServerApplication::DeleteUserAccount(int uid) { throw( std::runtime_error(std::string() + "Unknown SQL error when deleting an account: " + sqlite3_errmsg(database)) ); } - //TODO: delete this account's characters? - //finish the routine sqlite3_finalize(statement); accountMap.erase(uid); diff --git a/server/server_application.hpp b/server/server_application.hpp index 56f1303..0b93372 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -75,6 +75,7 @@ private: //TODO: a function that only sends to characters in a certain proximity void PumpPacket(SerialPacket); + void PumpCharacterUnload(int uid); //Account management int CreateUserAccount(std::string username, int clientIndex); diff --git a/server/server_connections.cpp b/server/server_connections.cpp index a311ba5..4b3bf0f 100644 --- a/server/server_connections.cpp +++ b/server/server_connections.cpp @@ -113,21 +113,16 @@ void ServerApplication::HandleSynchronize(SerialPacket packet) { void ServerApplication::HandleDisconnect(SerialPacket packet) { //TODO: authenticate who is disconnecting/kicking - //TODO: define the difference between unloading and deleting a character //forward to the specified client char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); network.Send(&clientMap[accountMap[packet.clientInfo.accountIndex].clientIndex].address, buffer, PACKET_BUFFER_SIZE); - //delete the server- and client-side character(s) - SerialPacket delPacket; - delPacket.meta.type = SerialPacket::Type::CHARACTER_DELETE; - + //unload client and server-side characters for (std::map::iterator it = characterMap.begin(); it != characterMap.end(); /* EMPTY */ ) { if (it->second.owner == packet.clientInfo.accountIndex) { - delPacket.characterInfo.characterIndex = it->first; - PumpPacket(delPacket); + PumpCharacterUnload(it->first); SaveCharacter(it->first); it = characterMap.erase(it); //efficient continue; @@ -191,3 +186,11 @@ void ServerApplication::PumpPacket(SerialPacket packet) { network.Send(&it.second.address, buffer, PACKET_BUFFER_SIZE); } } + +void ServerApplication::PumpCharacterUnload(int uid) { + //delete the client-side character(s) + SerialPacket delPacket; + delPacket.meta.type = SerialPacket::Type::CHARACTER_DELETE; + delPacket.characterInfo.characterIndex = uid; + PumpPacket(delPacket); +} \ No newline at end of file