/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program 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 Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "Chat.h"
#include "CommandScript.h"
#include "Guild.h"
#include "GuildMgr.h"
using namespace Acore::ChatCommands;
class guild_commandscript : public CommandScript
{
public:
guild_commandscript() : CommandScript("guild_commandscript") { }
ChatCommandTable GetCommands() const override
{
static ChatCommandTable guildCommandTable =
{
{ "create", HandleGuildCreateCommand, SEC_GAMEMASTER, Console::Yes },
{ "delete", HandleGuildDeleteCommand, SEC_GAMEMASTER, Console::Yes },
{ "invite", HandleGuildInviteCommand, SEC_GAMEMASTER, Console::Yes },
{ "uninvite", HandleGuildUninviteCommand, SEC_GAMEMASTER, Console::Yes },
{ "rank", HandleGuildRankCommand, SEC_GAMEMASTER, Console::Yes },
{ "rename", HandleGuildRenameCommand, SEC_GAMEMASTER, Console::Yes },
{ "info", HandleGuildInfoCommand, SEC_GAMEMASTER, Console::Yes }
};
static ChatCommandTable commandTable =
{
{ "guild", guildCommandTable }
};
return commandTable;
}
static bool HandleGuildCreateCommand(ChatHandler* handler, Optional target, QuotedString guildName)
{
if (!target)
{
target = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!target || !target->IsConnected())
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
if (guildName.empty())
{
return false;
}
Player* playerTarget = target->GetConnectedPlayer();
if (playerTarget->GetGuildId())
{
handler->SendErrorMessage(LANG_PLAYER_IN_GUILD);
return false;
}
if (sGuildMgr->GetGuildByName(guildName))
{
handler->SendErrorMessage(LANG_GUILD_RENAME_ALREADY_EXISTS, guildName);
return false;
}
if (!sObjectMgr->IsValidCharterName(guildName))
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
Guild* guild = new Guild;
if (!guild->Create(playerTarget, guildName))
{
delete guild;
handler->SendErrorMessage(LANG_GUILD_NOT_CREATED);
return false;
}
sGuildMgr->AddGuild(guild);
return true;
}
static bool HandleGuildDeleteCommand(ChatHandler*, QuotedString guildName)
{
if (guildName.empty())
{
return false;
}
Guild* targetGuild = sGuildMgr->GetGuildByName(guildName);
if (!targetGuild)
return false;
targetGuild->Disband();
delete targetGuild;
return true;
}
static bool HandleGuildInviteCommand(ChatHandler* handler, Optional target, QuotedString guildName)
{
if (!target)
{
target = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!target)
{
return false;
}
if (guildName.empty())
{
return false;
}
Guild* targetGuild = sGuildMgr->GetGuildByName(guildName);
if (!targetGuild)
return false;
// player's guild membership checked in AddMember before add
return targetGuild->AddMember(target->GetGUID());
}
static bool HandleGuildUninviteCommand(ChatHandler* handler, Optional target)
{
if (!target)
{
target = PlayerIdentifier::FromTargetOrSelf(handler);
}
if (!target)
{
return false;
}
Player* playerTarget = target->GetConnectedPlayer();
uint32 guildId = playerTarget ? playerTarget->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(target->GetGUID());
if (!guildId)
return false;
Guild* targetGuild = sGuildMgr->GetGuildById(guildId);
if (!targetGuild)
return false;
targetGuild->DeleteMember(target->GetGUID(), false, true, true);
return true;
}
static bool HandleGuildRankCommand(ChatHandler* handler, Optional player, uint8 rank)
{
if (!player)
player = PlayerIdentifier::FromTargetOrSelf(handler);
if (!player)
return false;
uint32 guildId = player->IsConnected() ? player->GetConnectedPlayer()->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(player->GetGUID());
if (!guildId)
return false;
Guild* targetGuild = sGuildMgr->GetGuildById(guildId);
if (!targetGuild)
return false;
return targetGuild->ChangeMemberRank(player->GetGUID(), rank);
}
static bool HandleGuildRenameCommand(ChatHandler* handler, QuotedString oldGuildStr, QuotedString newGuildStr)
{
if (oldGuildStr.empty() || newGuildStr.empty())
{
return false;
}
Guild* guild = sGuildMgr->GetGuildByName(oldGuildStr);
if (!guild)
{
handler->SendErrorMessage(LANG_COMMAND_COULDNOTFIND, oldGuildStr);
return false;
}
if (sGuildMgr->GetGuildByName(newGuildStr))
{
handler->SendErrorMessage(LANG_GUILD_RENAME_ALREADY_EXISTS, newGuildStr);
return false;
}
if (!guild->SetName(newGuildStr))
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
handler->PSendSysMessage(LANG_GUILD_RENAME_DONE, oldGuildStr, newGuildStr);
return true;
}
static bool HandleGuildInfoCommand(ChatHandler* handler, Optional> const& guildIdentifier)
{
Guild* guild = nullptr;
if (guildIdentifier)
{
if (ObjectGuid::LowType const* guid = std::get_if(&*guildIdentifier))
guild = sGuildMgr->GetGuildById(*guid);
else
guild = sGuildMgr->GetGuildByName(guildIdentifier->get());
}
else if (Optional target = PlayerIdentifier::FromTargetOrSelf(handler); target && target->IsConnected())
guild = target->GetConnectedPlayer()->GetGuild();
if (!guild)
return false;
// Display Guild Information
handler->PSendSysMessage(LANG_GUILD_INFO_NAME, guild->GetName(), guild->GetId()); // Guild Id + Name
std::string guildMasterName;
if (sCharacterCache->GetCharacterNameByGuid(guild->GetLeaderGUID(), guildMasterName))
handler->PSendSysMessage(LANG_GUILD_INFO_GUILD_MASTER, guildMasterName, guild->GetLeaderGUID().ToString()); // Guild Master
// Format creation date
char createdDateStr[20];
time_t createdDate = guild->GetCreatedDate();
tm localTm;
strftime(createdDateStr, 20, "%Y-%m-%d %H:%M:%S", localtime_r(&createdDate, &localTm));
handler->PSendSysMessage(LANG_GUILD_INFO_CREATION_DATE, createdDateStr); // Creation Date
handler->PSendSysMessage(LANG_GUILD_INFO_MEMBER_COUNT, guild->GetMemberCount()); // Number of Members
handler->PSendSysMessage(LANG_GUILD_INFO_BANK_GOLD, guild->GetTotalBankMoney() / 100 / 100); // Bank Gold (in gold coins)
handler->PSendSysMessage(LANG_GUILD_INFO_MOTD, guild->GetMOTD()); // Message of the Day
handler->PSendSysMessage(LANG_GUILD_INFO_EXTRA_INFO, guild->GetInfo()); // Extra Information
QueryResult result = CharacterDatabase.Query("SELECT rid, rname FROM guild_rank WHERE guildid = {}", guild->GetId());
if (result)
{
handler->PSendSysMessage(LANG_GUILD_INFO_RANKS);
do
{
Field* fields = result->Fetch();
uint32 rid = fields[0].Get();
std::string rname = fields[1].Get();
handler->PSendSysMessage(LANG_GUILD_INFO_RANKS_LIST, rid, rname);
} while (result->NextRow());
}
return true;
}
};
void AddSC_guild_commandscript()
{
new guild_commandscript();
}