diff options
Diffstat (limited to 'src/chat-server/guildhandler.cpp')
-rw-r--r-- | src/chat-server/guildhandler.cpp | 237 |
1 files changed, 131 insertions, 106 deletions
diff --git a/src/chat-server/guildhandler.cpp b/src/chat-server/guildhandler.cpp index 110727cf..949728c2 100644 --- a/src/chat-server/guildhandler.cpp +++ b/src/chat-server/guildhandler.cpp @@ -31,6 +31,7 @@ #include "net/messagein.h" #include "net/messageout.h" +#include "common/configuration.h" #include "common/manaserv_protocol.h" using namespace ManaServ; @@ -43,25 +44,31 @@ void ChatHandler::sendGuildInvite(const std::string &invitedName, msg.writeString(inviterName); msg.writeString(guildName); - std::map<std::string, ChatClient*>::iterator itr = mPlayerMap.find(invitedName); - if (itr == mPlayerMap.end()) + ChatClient *client = getClient(invitedName); + if (client) { - itr->second->send(msg); + client->send(msg); } } void ChatHandler::sendGuildRejoin(ChatClient &client) { // Get list of guilds and check what rights they have. - std::vector<Guild*> guilds = guildManager->getGuildsForPlayer(client.characterId); - for (unsigned int i = 0; i != guilds.size(); ++i) + std::vector<Guild *> guilds = + guildManager->getGuildsForPlayer(client.characterId); + + client.guilds = guilds; + + for (std::vector<Guild *>::iterator it = guilds.begin(), + it_end = guilds.end(); it != it_end; ++it) { - const Guild *guild = guilds[i]; + Guild *guild = *it; const int permissions = guild->getUserPermissions(client.characterId); const std::string guildName = guild->getName(); - // Tell the client what guilds the character belongs to and their permissions + // Tell the client what guilds the character belongs to + // and their permissions MessageOut msg(CPMSG_GUILD_REJOIN); msg.writeString(guildName); msg.writeInt16(guild->getId()); @@ -76,7 +83,8 @@ void ChatHandler::sendGuildRejoin(ChatClient &client) client.send(msg); - sendGuildListUpdate(guildName, client.characterName, GUILD_EVENT_ONLINE_PLAYER); + sendGuildListUpdate(guild, client.characterName, + GUILD_EVENT_ONLINE_PLAYER); } } @@ -104,30 +112,26 @@ ChatChannel *ChatHandler::joinGuildChannel(const std::string &guildName, ChatCli return channel; } -void ChatHandler::sendGuildListUpdate(const std::string &guildName, +void ChatHandler::sendGuildListUpdate(Guild *guild, const std::string &characterName, char eventId) { - Guild *guild = guildManager->findByName(guildName); - if (guild) - { - MessageOut msg(CPMSG_GUILD_UPDATE_LIST); + MessageOut msg(CPMSG_GUILD_UPDATE_LIST); - msg.writeInt16(guild->getId()); - msg.writeString(characterName); - msg.writeInt8(eventId); - std::map<std::string, ChatClient*>::const_iterator chr; - std::list<GuildMember*> members = guild->getMembers(); + msg.writeInt16(guild->getId()); + msg.writeString(characterName); + msg.writeInt8(eventId); + std::map<std::string, ChatClient*>::const_iterator chr; + std::list<GuildMember*> members = guild->getMembers(); - for (std::list<GuildMember*>::const_iterator itr = members.begin(); - itr != members.end(); ++itr) + for (std::list<GuildMember*>::const_iterator itr = members.begin(); + itr != members.end(); ++itr) + { + Character *c = storage->getCharacter((*itr)->mId, NULL); + chr = mPlayerMap.find(c->getName()); + if (chr != mPlayerMap.end()) { - Character *c = storage->getCharacter((*itr)->mId, NULL); - chr = mPlayerMap.find(c->getName()); - if (chr != mPlayerMap.end()) - { - chr->second->send(msg); - } + chr->second->send(msg); } } } @@ -140,8 +144,8 @@ void ChatHandler::handleGuildCreate(ChatClient &client, MessageIn &msg) std::string guildName = msg.readString(); if (!guildManager->doesExist(guildName)) { - // check the player hasnt already created a guild - if (guildManager->alreadyOwner(client.characterId)) + if ((int)client.guilds.size() >= + Configuration::getValue("account_maxGuildsPerCharacter", 1)) { reply.writeInt8(ERRMSG_LIMIT_REACHED); } @@ -154,6 +158,8 @@ void ChatHandler::handleGuildCreate(ChatClient &client, MessageIn &msg) reply.writeInt16(guild->getId()); reply.writeInt16(guild->getUserPermissions(client.characterId)); + client.guilds.push_back(guild); + // Send autocreated channel id ChatChannel* channel = joinGuildChannel(guildName, client); reply.writeInt16(channel->getId()); @@ -177,7 +183,7 @@ void ChatHandler::handleGuildInvite(ChatClient &client, MessageIn &msg) std::string character = msg.readString(); // get the chat client and the guild - ChatClient *invitedClient = mPlayerMap[character]; + ChatClient *invitedClient = getClient(character); Guild *guild = guildManager->findById(guildId); if (invitedClient && guild) @@ -185,21 +191,33 @@ void ChatHandler::handleGuildInvite(ChatClient &client, MessageIn &msg) // check permissions of inviter, and that they arent inviting themself, // and arent someone already in the guild if (guild->canInvite(client.characterId) && - (client.characterName != character) && - !guild->checkInGuild(invitedClient->characterId)) + client.characterName != character && + guild->checkInGuild(client.characterId)) { - // send the name of the inviter and the name of the guild - // that the character has been invited to join - std::string senderName = client.characterName; - std::string guildName = guild->getName(); - invite.writeString(senderName); - invite.writeString(guildName); - invite.writeInt16(guildId); - invitedClient->send(invite); - reply.writeInt8(ERRMSG_OK); - - // add member to list of invited members to the guild - guild->addInvited(invitedClient->characterId); + if ((int)invitedClient->guilds.size() >= + Configuration::getValue("account_maxGuildsPerCharacter", 1)) + { + reply.writeInt8(ERRMSG_LIMIT_REACHED); + } + else if (guild->checkInGuild(invitedClient->characterId)) + { + reply.writeInt8(ERRMSG_ALREADY_MEMBER); + } + else + { + // send the name of the inviter and the name of the guild + // that the character has been invited to join + std::string senderName = client.characterName; + std::string guildName = guild->getName(); + invite.writeString(senderName); + invite.writeString(guildName); + invite.writeInt16(guildId); + invitedClient->send(invite); + reply.writeInt8(ERRMSG_OK); + + // add member to list of invited members to the guild + guild->addInvited(invitedClient->characterId); + } } else { @@ -218,37 +236,38 @@ void ChatHandler::handleGuildAcceptInvite(ChatClient &client, MessageIn &msg) { MessageOut reply(CPMSG_GUILD_ACCEPT_RESPONSE); - std::string guildName = msg.readString(); - bool error = true; // set true by default, and set false only if success + const int guildId = msg.readInt16(); + const bool accepted = msg.readInt8(); // check guild exists and that member was invited // then add them as guild member // and remove from invite list - Guild *guild = guildManager->findByName(guildName); - if (guild) + Guild *guild = guildManager->findById(guildId); + if (!(guild && guild->checkInvited(client.characterId))) { - if (guild->checkInvited(client.characterId)) - { - // add user to guild - guildManager->addGuildMember(guild, client.characterId); - reply.writeInt8(ERRMSG_OK); - reply.writeString(guild->getName()); - reply.writeInt16(guild->getId()); - reply.writeInt16(guild->getUserPermissions(client.characterId)); - - // have character join guild channel - ChatChannel *channel = joinGuildChannel(guild->getName(), client); - reply.writeInt16(channel->getId()); - sendGuildListUpdate(guildName, client.characterName, GUILD_EVENT_NEW_PLAYER); - // success! set error to false - error = false; - } + reply.writeInt8(ERRMSG_FAILURE); } - - if (error) + else if (accepted) { - reply.writeInt8(ERRMSG_FAILURE); + // add user to guild + guildManager->addGuildMember(guild, client.characterId); + client.guilds.push_back(guild); + reply.writeInt8(ERRMSG_OK); + reply.writeString(guild->getName()); + reply.writeInt16(guild->getId()); + reply.writeInt16(guild->getUserPermissions(client.characterId)); + + // have character join guild channel + ChatChannel *channel = joinGuildChannel(guild->getName(), client); + reply.writeInt16(channel->getId()); + sendGuildListUpdate(guild, client.characterName, + GUILD_EVENT_NEW_PLAYER); + } + else + { + guild->removeInvited(client.characterId); + reply.writeInt8(ERRMSG_OK); } client.send(reply); @@ -304,7 +323,8 @@ void ChatHandler::handleGuildMemberLevelChange(ChatClient &client, if (guild && c) { int rights = guild->getUserPermissions(c->getDatabaseID()) | level; - if (guildManager->changeMemberLevel(&client, guild, c->getDatabaseID(), rights) == 0) + if (guildManager->changeMemberLevel(&client, guild, c->getDatabaseID(), + rights) == 0) { reply.writeInt8(ERRMSG_OK); client.send(reply); @@ -319,27 +339,50 @@ void ChatHandler::handleGuildKickMember(ChatClient &client, MessageIn &msg) { MessageOut reply(CPMSG_GUILD_KICK_MEMBER_RESPONSE); short guildId = msg.readInt16(); - std::string user = msg.readString(); + std::string otherCharName = msg.readString(); Guild *guild = guildManager->findById(guildId); - Character *c = storage->getCharacter(user); - if (guild && c) + if (!guild) { - if (guild->getUserPermissions(c->getDatabaseID()) & GAL_KICK) - { - reply.writeInt8(ERRMSG_OK); - } - else - { - reply.writeInt8(ERRMSG_INSUFFICIENT_RIGHTS); - } + reply.writeInt8(ERRMSG_INVALID_ARGUMENT); + client.send(reply); + return; } + ChatClient *otherClient = getClient(otherCharName); + unsigned int otherCharId; + if (otherClient) + otherCharId = otherClient->characterId; else + otherCharId = storage->getCharacterId(otherCharName); + + if (otherCharId == 0) { reply.writeInt8(ERRMSG_INVALID_ARGUMENT); + client.send(reply); + return; + } + + if (!((guild->getUserPermissions(client.characterId) & GAL_KICK) && + guild->checkInGuild(otherCharId) && + otherCharId != client.characterId)) + { + reply.writeInt8(ERRMSG_INSUFFICIENT_RIGHTS); + client.send(reply); + return; + } + if (otherClient) + { + // Client is online. Inform him about that he got kicked + MessageOut kickMsg(CPMSG_GUILD_KICK_NOTIFICATION); + kickMsg.writeInt16(guild->getId()); + kickMsg.writeString(client.characterName); + otherClient->send(kickMsg); } + guildManager->removeGuildMember(guild, otherCharId, otherCharName, + otherClient); + reply.writeInt8(ERRMSG_OK); client.send(reply); } @@ -347,40 +390,22 @@ void ChatHandler::handleGuildQuit(ChatClient &client, MessageIn &msg) { MessageOut reply(CPMSG_GUILD_QUIT_RESPONSE); short guildId = msg.readInt16(); - Guild *guild = guildManager->findById(guildId); - // check for valid guild - // check the member is in the guild - // remove the member from the guild - if (guild) - { - if (guild->checkInGuild(client.characterId)) - { - reply.writeInt8(ERRMSG_OK); - reply.writeInt16(guildId); - - // Check if there are no members left, remove the guild channel - if (guild->memberCount() == 0) - { - chatChannelManager->removeChannel(chatChannelManager->getChannelId(guild->getName())); - } - - // guild manager checks if the member is the last in the guild - // and removes the guild if so - guildManager->removeGuildMember(guild, client.characterId); - sendGuildListUpdate(guild->getName(), client.characterName, GUILD_EVENT_LEAVING_PLAYER); - } - else - { - reply.writeInt8(ERRMSG_FAILURE); - } - } - else + Guild *guild = guildManager->findById(guildId); + if (!guild || !guild->checkInGuild(client.characterId)) { reply.writeInt8(ERRMSG_FAILURE); + client.send(reply); + return; } + guildManager->removeGuildMember(guild, client.characterId, + client.characterName, &client); + reply.writeInt8(ERRMSG_OK); + reply.writeInt16(guildId); client.send(reply); + + } void ChatHandler::guildChannelTopicChange(ChatChannel *channel, int playerId, |