/*
* The Mana Server
* Copyright (C) 2004-2010 The Mana World Development Team
*
* This file is part of The Mana Server.
*
* The Mana Server is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* The Mana Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with The Mana Server. If not, see .
*/
#include "guildmanager.h"
#include "guild.h"
#include "common/defines.h"
#include "common/manaserv_protocol.h"
#include "account-server/storage.h"
#include "chat-server/chatclient.h"
#include "chat-server/chatchannelmanager.h"
#include "chat-server/chathandler.h"
using namespace ManaServ;
GuildManager::GuildManager():
mGuilds(storage->getGuildList())
{
}
GuildManager::~GuildManager()
{
for (std::map::iterator it = mGuilds.begin();
it != mGuilds.end(); ++it)
{
delete it->second;
}
}
Guild* GuildManager::createGuild(const std::string &name, int playerId)
{
Guild *guild = new Guild(name);
// Add guild to db
storage->addGuild(guild);
// Add guild
mGuilds[guild->getId()] = guild;
// put the owner in the guild
addGuildMember(guild, playerId);
// Set and save the member rights
storage->setMemberRights(guild->getId(), playerId, GAL_OWNER);
guild->setOwner(playerId);
return guild;
}
void GuildManager::removeGuild(Guild *guild)
{
storage->removeGuild(guild);
mGuilds.erase(guild->getId());
delete guild;
}
void GuildManager::addGuildMember(Guild *guild, int playerId)
{
storage->addGuildMember(guild->getId(), playerId);
guild->addMember(playerId);
}
void GuildManager::removeGuildMember(Guild *guild, int playerId,
const std::string &characterName,
ChatClient *client)
{
// remove the user from the guild
storage->removeGuildMember(guild->getId(), playerId);
guild->removeMember(playerId);
chatHandler->sendGuildListUpdate(guild, characterName,
GUILD_EVENT_LEAVING_PLAYER);
// if theres no more members left delete the guild
if (guild->memberCount() == 0)
{
chatChannelManager->removeChannel(
chatChannelManager->getChannelId(guild->getName()));
removeGuild(guild);
}
if (client)
{
for (std::vector::iterator it = client->guilds.begin(),
it_end = client->guilds.end(); it != it_end; ++it)
{
if (*it == guild)
{
client->guilds.erase(it);
break;
}
}
}
}
Guild *GuildManager::findById(short id) const
{
std::map::const_iterator it = mGuilds.find(id);
return it == mGuilds.end() ? 0 : it->second;
}
Guild *GuildManager::findByName(const std::string &name) const
{
for (std::map::const_iterator it = mGuilds.begin(),
it_end = mGuilds.end();
it != it_end; ++it)
{
Guild *guild = it->second;
if (guild->getName() == name)
return guild;
}
return 0;
}
bool GuildManager::doesExist(const std::string &name) const
{
return findByName(name) != 0;
}
std::vector GuildManager::getGuildsForPlayer(int playerId) const
{
std::vector guilds;
for (std::map::const_iterator it = mGuilds.begin();
it != mGuilds.end(); ++it)
{
if (it->second->checkInGuild(playerId))
{
guilds.push_back(it->second);
}
}
return guilds;
}
void GuildManager::disconnectPlayer(ChatClient *player)
{
for (std::vector::iterator it = player->guilds.begin(),
it_end = player->guilds.end(); it != it_end; ++it)
{
chatHandler->sendGuildListUpdate(*it,
player->characterName,
GUILD_EVENT_OFFLINE_PLAYER);
}
}
int GuildManager::changeMemberLevel(ChatClient *player, Guild *guild,
int playerId, int level)
{
if (guild->checkInGuild(playerId))
{
int playerLevel = guild->getUserPermissions(player->characterId);
if (playerLevel == GAL_OWNER)
{
// player can modify anyones permissions
setUserRights(guild, playerId, level);
return 0;
}
}
return -1;
}
void GuildManager::setUserRights(Guild *guild, int playerId, int rights)
{
// Set and save the member rights
storage->setMemberRights(guild->getId(), playerId, rights);
// Set with guild
guild->setUserPermissions(playerId, rights);
}