diff options
Diffstat (limited to 'src/chat-server/chathandler.cpp')
-rw-r--r-- | src/chat-server/chathandler.cpp | 107 |
1 files changed, 97 insertions, 10 deletions
diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp index 4170ef13..6f7fac9c 100644 --- a/src/chat-server/chathandler.cpp +++ b/src/chat-server/chathandler.cpp @@ -192,12 +192,16 @@ void ChatHandler::processMessage(NetComputer *comp, MessageIn &message) handleGuildQuit(computer, message); break; - case PCMSG_PARTY_CREATE: - handlePartyCreation(computer, message); + case PCMSG_PARTY_INVITE: + handlePartyInvite(computer, message); + break; + + case PCMSG_PARTY_ACCEPT_INVITE: + handlePartyAcceptInvite(computer, message); break; case PCMSG_PARTY_QUIT: - handlePartyQuit(computer, message); + handlePartyQuit(computer); default: LOG_WARN("ChatHandler::processMessage, Invalid message type" @@ -906,14 +910,83 @@ void ChatHandler::sendGuildListUpdate(const std::string &guildName, } } -void ChatHandler::handlePartyCreation(ChatClient &client, MessageIn &msg) +bool ChatHandler::handlePartyJoin(const std::string &invited, const std::string &inviter) +{ + MessageOut out(CPMSG_PARTY_INVITE_RESPONSE); + + // Get inviting client + ChatClient *c1 = getClient(inviter); + if (c1) + { + // if party doesnt exist, create it + if (!c1->party) + { + c1->party = new Party(); + } + + // add inviter to the party + c1->party->addUser(inviter); + + // Get invited client + ChatClient *c2 = getClient(invited); + if (c2) + { + // add invited to the party + c1->party->addUser(invited); + c2->party = c1->party; + // was successful so return success to inviter + out.writeByte(ERRMSG_OK); + c1->send(out); + return true; + } + } + + // there was an error, return false + return false; + +} + +void ChatHandler::handlePartyInvite(ChatClient &client, MessageIn &msg) { - MessageOut out(CPMSG_PARTY_CREATE_RESPONSE); - if (!client.party) + //TODO: Handle errors + MessageOut out(CPMSG_PARTY_INVITED); + + out.writeString(client.characterName); + + std::string invited = msg.readString(); + if (invited != "") { - client.party = new Party(); - client.party->addUser(client.characterName); - out.writeByte(ERRMSG_OK); + // Get client and send it the invite + ChatClient *c = getClient(invited); + if (c) + { + // store the invite + mPartyInvitedUsers.push_back(invited); + c->send(out); + } + } +} + +void ChatHandler::handlePartyAcceptInvite(ChatClient &client, MessageIn &msg) +{ + MessageOut out(CPMSG_PARTY_ACCEPT_INVITE_RESPONSE); + + // Check that the player was invited + std::vector<std::string>::iterator itr; + itr = std::find(mPartyInvitedUsers.begin(), mPartyInvitedUsers.end(), + client.characterName); + if (itr != mPartyInvitedUsers.end()) + { + // make them join the party + if (handlePartyJoin(client.characterName, msg.readString())) + { + out.writeByte(ERRMSG_OK); + mPartyInvitedUsers.erase(itr); + } + else + { + out.writeByte(ERRMSG_FAILURE); + } } else { @@ -922,7 +995,7 @@ void ChatHandler::handlePartyCreation(ChatClient &client, MessageIn &msg) client.send(out); } -void ChatHandler::handlePartyQuit(ChatClient &client, MessageIn &msg) +void ChatHandler::handlePartyQuit(ChatClient &client) { removeUserFromParty(client); MessageOut out(CPMSG_PARTY_QUIT_RESPONSE); @@ -942,3 +1015,17 @@ void ChatHandler::removeUserFromParty(ChatClient &client) } } } + +ChatClient* ChatHandler::getClient(const std::string &name) +{ + std::map<std::string, ChatClient*>::iterator itr; + itr = mPlayerMap.find(name); + if (itr != mPlayerMap.end()) + { + return itr->second; + } + else + { + return NULL; + } +} |