From f172be2b985821bbdd3da30915a49a4fa863e247 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 10 May 2015 14:17:42 +0300 Subject: Move guildmanager into net/tmwa directory. --- src/CMakeLists.txt | 4 +- src/Makefile.am | 4 +- src/actions/chat.cpp | 7 +- src/client.cpp | 7 +- src/game.cpp | 7 +- src/gui/popups/popupmenu.cpp | 7 +- src/gui/widgets/tabs/chat/emulateguildtab.cpp | 3 +- src/gui/windows/socialwindow.cpp | 8 +- src/guildmanager.cpp | 551 -------------------------- src/guildmanager.h | 106 ----- src/net/tmwa/beinghandler.cpp | 2 +- src/net/tmwa/chathandler.cpp | 2 +- src/net/tmwa/guildmanager.cpp | 551 ++++++++++++++++++++++++++ src/net/tmwa/guildmanager.h | 106 +++++ src/notifymanager.cpp | 7 +- src/utils/chatutils.cpp | 7 +- 16 files changed, 693 insertions(+), 686 deletions(-) delete mode 100644 src/guildmanager.cpp delete mode 100644 src/guildmanager.h create mode 100644 src/net/tmwa/guildmanager.cpp create mode 100644 src/net/tmwa/guildmanager.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 993fade24..a91fe48cb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1317,8 +1317,6 @@ SET(SRCS_EVOL ) SET(SRCS_TMWA - guildmanager.cpp - guildmanager.h gui/widgets/tabs/chat/emulateguildtab.cpp gui/widgets/tabs/chat/emulateguildtab.h gui/windows/shopselldialog.cpp @@ -1339,6 +1337,8 @@ SET(SRCS_TMWA net/tmwa/generalhandler.h net/tmwa/guildhandler.cpp net/tmwa/guildhandler.h + net/tmwa/guildmanager.cpp + net/tmwa/guildmanager.h net/tmwa/inventoryhandler.cpp net/tmwa/inventoryhandler.h net/tmwa/itemhandler.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 28e070e59..6f2729a3e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1255,8 +1255,6 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ if ENABLE_TMWA manaplus_CXXFLAGS += -DTMWA_SUPPORT manaplus_SOURCES += \ - guildmanager.cpp \ - guildmanager.h \ gui/widgets/tabs/chat/emulateguildtab.cpp \ gui/widgets/tabs/chat/emulateguildtab.h \ gui/windows/shopselldialog.cpp \ @@ -1277,6 +1275,8 @@ manaplus_SOURCES += \ net/tmwa/generalhandler.h \ net/tmwa/guildhandler.cpp \ net/tmwa/guildhandler.h \ + net/tmwa/guildmanager.cpp \ + net/tmwa/guildmanager.h \ net/tmwa/inventoryhandler.cpp \ net/tmwa/inventoryhandler.h \ net/tmwa/itemhandler.cpp \ diff --git a/src/actions/chat.cpp b/src/actions/chat.cpp index 140ef330e..cf85ad60c 100644 --- a/src/actions/chat.cpp +++ b/src/actions/chat.cpp @@ -21,9 +21,6 @@ #include "actions/chat.h" #include "configuration.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "actions/actiondef.h" @@ -39,6 +36,10 @@ #include "net/partyhandler.h" #include "net/serverfeatures.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "resources/iteminfo.h" #include "resources/db/itemdb.h" diff --git a/src/client.cpp b/src/client.cpp index 98fa33e18..615fcd169 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -31,9 +31,6 @@ #include "emoteshortcut.h" #include "eventsmanager.h" #include "game.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "graphicsmanager.h" #include "itemshortcut.h" #include "party.h" @@ -92,6 +89,10 @@ #include "net/packetlimiter.h" #include "net/partyhandler.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "particle/particle.h" #include "resources/imagehelper.h" diff --git a/src/game.cpp b/src/game.cpp index e3a7932ad..eb65b352f 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -31,9 +31,6 @@ #include "emoteshortcut.h" #include "eventsmanager.h" #include "gamemodifiers.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "itemshortcut.h" #include "soundmanager.h" #include "settings.h" @@ -122,6 +119,10 @@ #include "listeners/errorlistener.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #ifdef USE_MUMBLE #include "mumblemanager.h" #endif diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp index 5470d7b2e..78f4fd475 100644 --- a/src/gui/popups/popupmenu.cpp +++ b/src/gui/popups/popupmenu.cpp @@ -25,9 +25,6 @@ #include "actormanager.h" #include "configuration.h" #include "gamemodifiers.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "item.h" #include "party.h" #include "spellmanager.h" @@ -72,6 +69,10 @@ #include "net/pethandler.h" #include "net/serverfeatures.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "resources/chatobject.h" #include "resources/iteminfo.h" #include "resources/mapitemtype.h" diff --git a/src/gui/widgets/tabs/chat/emulateguildtab.cpp b/src/gui/widgets/tabs/chat/emulateguildtab.cpp index 07cb13d32..ccdf1bd43 100644 --- a/src/gui/widgets/tabs/chat/emulateguildtab.cpp +++ b/src/gui/widgets/tabs/chat/emulateguildtab.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/tabs/chat/emulateguildtab.h" #include "configuration.h" -#include "guildmanager.h" #include "soundconsts.h" #include "soundmanager.h" @@ -31,6 +30,8 @@ #include "utils/gettext.h" +#include "net/tmwa/guildmanager.h" + #include "debug.h" EmulateGuildTab::EmulateGuildTab(const Widget2 *const widget) : diff --git a/src/gui/windows/socialwindow.cpp b/src/gui/windows/socialwindow.cpp index ffe9688c6..f8197466b 100644 --- a/src/gui/windows/socialwindow.cpp +++ b/src/gui/windows/socialwindow.cpp @@ -21,10 +21,6 @@ #include "gui/windows/socialwindow.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif - #include "enums/gui/dialogtype.h" #include "gui/windows/okdialog.h" @@ -47,6 +43,10 @@ #include "net/serverfeatures.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "debug.h" SocialWindow *socialWindow = nullptr; diff --git a/src/guildmanager.cpp b/src/guildmanager.cpp deleted file mode 100644 index f3fee9f44..000000000 --- a/src/guildmanager.cpp +++ /dev/null @@ -1,551 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2015 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program 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. - * - * 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 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 "guildmanager.h" - -#include "actormanager.h" -#include "client.h" -#include "configuration.h" -#include "guild.h" -#include "notifymanager.h" - -#include "being/localplayer.h" - -#include "enums/net/packettypes.h" - -#include "gui/windows/chatwindow.h" -#include "gui/windows/socialwindow.h" - -#include "gui/widgets/tabs/chat/emulateguildtab.h" - -#include "net/chathandler.h" -#include "net/packetlimiter.h" -#include "net/serverfeatures.h" - -#include "utils/delete2.h" -#include "utils/timer.h" - -#include "resources/notifytypes.h" - -#include "debug.h" - -GuildManager *guildManager = nullptr; - -static const int requestTimeout = 5; - -bool GuildManager::mEnableGuildBot = false; - -GuildManager::GuildManager() : - mGotInfo(false), - mGotName(false), - mSentInfoRequest(false), - mSentNameRequest(false), - mHavePower(false), - mTempList(), - mTab(nullptr), - mRequest(false), - mRequestTime(cur_time + 3), - mGotOnlineInfo(false) -{ -} - -GuildManager::~GuildManager() -{ - delete2(mTab); -} - -void GuildManager::init() -{ - if (serverFeatures->haveNativeGuilds()) - { - mEnableGuildBot = false; - } - else - { - int val = serverConfig.getValue("enableGuildBot", -1); - if (val == -1) - { - if (client->isTmw()) - val = 1; - else - val = 0; - serverConfig.setValue("enableGuildBot", val); - } - mEnableGuildBot = val; - } - if (mEnableGuildBot) - { - if (!guildManager) - guildManager = new GuildManager(); - else - guildManager->reload(); - } - else if (guildManager) - { - delete2(guildManager); - } -} - -void GuildManager::reload() -{ - mGotInfo = false; - mGotName = false; - mHavePower = false; - mRequest = false; - mSentNameRequest = false; - mSentInfoRequest = false; - mGotOnlineInfo = false; - mRequestTime = 0; - mTempList.clear(); - - if (socialWindow) - { - Guild *const guild = Guild::getGuild(1); - if (guild && socialWindow) - socialWindow->removeTab(guild); - } - delete2(mTab); -} - -void GuildManager::send(const std::string &msg) -{ - chatHandler->privateMessage("guild", msg); -} - -void GuildManager::chat(const std::string &msg) -{ - if (!localPlayer || !mTab) - return; - - chatHandler->privateMessage("guild", msg); - mTab->chatLog(localPlayer->getName(), msg); -} - -void GuildManager::getNames(StringVect &names) const -{ - const Guild *const guild = createGuild(); - if (guild) - guild->getNames(names); -} - -void GuildManager::requestGuildInfo() -{ - if (mRequest && mRequestTime + 15 < cur_time) - return; - - if (!mGotName && !mSentNameRequest) - { - if (!PacketLimiter::limitPackets(PACKET_WHISPER)) - return; - send("!info " + toString(tick_time)); - mRequest = true; - mSentNameRequest = true; - mRequestTime = cur_time + requestTimeout; - } - else if (!mGotInfo && !mSentInfoRequest && !mSentNameRequest) - { - if (!PacketLimiter::limitPackets(PACKET_WHISPER)) - return; - send("!getonlineinfo " + toString(tick_time)); - mRequest = true; - mSentInfoRequest = true; - mRequestTime = cur_time + requestTimeout; - } -} - -void GuildManager::slowLogic() -{ - if (!mGotOnlineInfo && mGotName && mRequestTime < cur_time) - { - if (!PacketLimiter::limitPackets(PACKET_WHISPER)) - return; - send("!getonlineinfo " + toString(tick_time)); - mRequest = true; - mSentInfoRequest = true; - mRequestTime = cur_time + requestTimeout; - } -} - -void GuildManager::updateList() -{ - Guild *const guild = Guild::getGuild(1); - if (guild) - { - guild->setServerGuild(false); - StringVectCIter it = mTempList.begin(); - const StringVectCIter it_end = mTempList.end(); - int i = 0; - while (it != it_end) - { - std::string name = *it; - const size_t sz = name.size(); - if (sz > 1) - { - const int status = atoi(name.substr(sz - 1).c_str()); - - name = name.substr(0, sz - 1); - GuildMember *const m = guild->addMember(i, 0, name); - if (m) - { - m->setOnline(status & 1); - m->setGender(Gender::UNSPECIFIED); - if (status & 2) - m->setPos(10); - else - m->setPos(0); - if (localPlayer && name == localPlayer->getName()) - { - mHavePower = (status & 2); - m->setOnline(true); - } - } - } - ++ it; - i ++; - } - guild->sort(); - createTab(guild); - if (actorManager) - { - actorManager->updatePlayerGuild(); - actorManager->updatePlayerColors(); - } - if (socialWindow) - socialWindow->updateGuildCounter(); - } - mTempList.clear(); - mSentInfoRequest = false; - mGotInfo = true; -} - -void GuildManager::createTab(Guild *const guild) -{ - if (!mTab) - { - mTab = new EmulateGuildTab(chatWindow); - if (config.getBoolValue("showChatHistory")) - mTab->loadFromLogFile("#Guild"); - if (localPlayer) - localPlayer->addGuild(guild); - } -} - -Guild *GuildManager::createGuild() const -{ - Guild *const guild = Guild::getGuild(1); - if (!guild) - return nullptr; - - guild->setServerGuild(false); - return guild; -} - -bool GuildManager::processGuildMessage(const std::string &msg) -{ - const bool res = process(msg); - - if (!mRequest) - requestGuildInfo(); - - return res; -} - -bool GuildManager::process(std::string msg) -{ - if (msg.size() > 4 && msg[0] == '#' && msg[1] == '#') - msg = msg.substr(3); - - const bool haveNick = (msg.find(": ") != std::string::npos); - - if (!haveNick && findCutLast(msg, " is now Offline.")) - { - Guild *const guild = createGuild(); - if (!guild) - return false; - if (msg.size() < 4) - return false; - if (msg[0] == '#' && msg[1] == '#') - msg = msg.substr(3); - - GuildMember *const m = guild->addMember(msg); - if (m) - m->setOnline(false); - guild->sort(); - mRequest = false; - if (mTab) - mTab->showOnline(msg, false); - if (socialWindow) - socialWindow->updateGuildCounter(); - return true; - } - else if (!haveNick && findCutLast(msg, " is now Online.")) - { - Guild *const guild = createGuild(); - if (!guild) - return false; - if (msg.size() < 4) - return false; - if (msg[0] == '#' && msg[1] == '#') - msg = msg.substr(3); - GuildMember *const m = guild->addMember(msg); - if (m) - m->setOnline(true); - guild->sort(); - mRequest = false; - if (mTab) - mTab->showOnline(msg, true); - if (socialWindow) - socialWindow->updateGuildCounter(); - return true; - } - else if (findCutFirst(msg, "Welcome to the ")) - { - Guild *const guild = createGuild(); - if (!guild) - return false; -// logger->log("welcome message: %s", msg.c_str()); - const size_t pos = msg.find("! ("); - if (pos == std::string::npos) - return false; - msg = msg.substr(0, pos); - guild->setName(msg); - if (localPlayer) - localPlayer->setGuildName(msg); - mGotName = true; - mSentNameRequest = false; - mRequest = false; - return true; - } - else if (findCutFirst(msg, "Player name: ")) - { - Guild *const guild = createGuild(); - if (!guild) - return false; - size_t pos = msg.find("Access Level: "); - if (pos == std::string::npos) - return false; - - msg = msg.substr(pos); - if (!findCutFirst(msg, "Access Level: ")) - return false; - - pos = msg.find(", Guild:"); - if (pos == std::string::npos) - return false; - - const int level = atoi(msg.substr(0, pos).c_str()); - if (level >= 10) - mHavePower = true; - else - mHavePower = false; - - msg = msg.substr(pos + strlen(", Guild:")); - pos = msg.find(", No. Of Online Players: "); - if (pos == std::string::npos) - return false; - - msg = msg.substr(0, pos); -// logger->log("guild name: %s", msg.c_str()); - - guild->setName(msg); - if (localPlayer) - localPlayer->setGuildName(msg); - mGotName = true; - mSentNameRequest = false; - mRequest = false; - return true; - } - else if (findCutFirst(msg, "OL#")) - { -// logger->log("OL"); - mTempList.clear(); - splitToStringVector(mTempList, msg, '#'); - if (msg.empty() || msg[msg.size() - 1] != '#') - updateList(); - mRequest = false; - mGotOnlineInfo = true; - return true; - } - else if (findCutFirst(msg, "oL#")) - { -// logger->log("oL"); - splitToStringVector(mTempList, msg, '#'); - if (msg.empty() || msg[msg.size() - 1] != '#') - updateList(); - mRequest = false; - mGotOnlineInfo = true; - return true; - } - else if (msg == "You are currently not in a guild. For more information " - "or to discuss the possibility of adding you own guild " - "please contact Jero.") - { - mRequest = true; - return true; - } - else if (findCutFirst(msg, "You have been invited to the ") - && findCutLast(msg, " guild chat. If you would like to accept " - "this invitation please reply \"yes\" and if not then \"no\" .")) - { - if (socialWindow) - socialWindow->showGuildInvite(msg, 1, ""); - return true; - } - else if (!haveNick && (findCutLast(msg, " has been removed " - "from the Guild.") || findCutLast(msg, " has left the Guild."))) - { - Guild *const guild = createGuild(); - if (!guild) - return false; - if (msg.size() < 4) - return false; - if (msg[0] == '#' && msg[1] == '#') - msg = msg.substr(3); - - if (actorManager) - { - Being *const b = actorManager->findBeingByName( - msg, ActorType::Player); - - if (b) - { - b->clearGuilds(); - b->setGuildName(""); - b->updateColors(); - } - } - - guild->removeMember(msg); - return true; - } - else if (msg == "You have been removed from the Guild" - || msg == "You have left the Guild") - { - return afterRemove(); - } - else - { - Guild *const guild = createGuild(); - if (!guild) - return false; - if (!mTab) - { - createTab(guild); - } - if (mTab) - { - const size_t pos = msg.find(": ", 0); - if (pos != std::string::npos) - { - const std::string sender_name = msg.substr(0, pos); - if (!guild->getMember(sender_name)) - { - mTab->chatLog(msg); - return true; - } - - msg.erase(0, pos + 2); - if (msg.size() > 3 && msg[0] == '#' && msg[1] == '#') - msg.erase(0, 3); - - trim(msg); - mTab->chatLog(sender_name, msg); - } - else - { - mTab->chatLog(msg); - } - return true; - } - } - return false; -} - -void GuildManager::kick(const std::string &msg) -{ - send("!remove " + msg); -} - -void GuildManager::invite(const std::string &msg) -{ - send("!invite " + msg); -} - -void GuildManager::leave() -{ - send("!leave"); -} - -void GuildManager::notice(const std::string &msg) -{ - if (msg.empty()) - send("!removemotd"); - else - send("!setmotd " + msg); -} - -void GuildManager::clear() -{ - if (socialWindow) - { - Guild *const guild = Guild::getGuild(1); - if (guild) - socialWindow->removeTab(guild); - } -} - -void GuildManager::inviteResponse(const bool response) -{ - if (response) - send("yes"); - else - send("no"); -} - -bool GuildManager::afterRemove() -{ - Guild *const guild = createGuild(); - if (!guild) - return false; - guild->removeFromMembers(); - guild->clearMembers(); - if (localPlayer) - { - localPlayer->setGuildName(""); - localPlayer->clearGuilds(); - } - NotifyManager::notify(NotifyTypes::GUILD_LEFT); - delete2(mTab); - - if (socialWindow) - socialWindow->removeTab(guild); - if (actorManager) - { - actorManager->updatePlayerGuild(); - actorManager->updatePlayerColors(); - } - reload(); - return true; -} - -ChatTab *GuildManager::getTab() -{ - return mTab; -} diff --git a/src/guildmanager.h b/src/guildmanager.h deleted file mode 100644 index 2fa6b2df8..000000000 --- a/src/guildmanager.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2011-2015 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program 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. - * - * 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 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 . - */ - -#ifndef GUILDMANAGER_H -#define GUILDMANAGER_H - -#ifdef TMWA_SUPPORT - -#include "utils/stringvector.h" - -#include "localconsts.h" - -class ChatTab; -class Guild; -class EmulateGuildTab; - -class GuildManager final -{ - public: - GuildManager(); - - A_DELETE_COPY(GuildManager) - - ~GuildManager(); - - static void init(); - - void chat(const std::string &msg); - - static void send(const std::string &msg); - - bool processGuildMessage(const std::string &msg); - - void getNames(StringVect &names) const; - - void requestGuildInfo(); - - void updateList(); - - static bool getEnableGuildBot() A_WARN_UNUSED - { return mEnableGuildBot; } - - static void kick(const std::string &msg); - - static void invite(const std::string &msg); - - static void leave(); - - static void notice(const std::string &msg); - - void createTab(Guild *const guild); - - Guild *createGuild() const A_WARN_UNUSED; - - static void clear(); - - void reload(); - - static void inviteResponse(const bool response); - - bool afterRemove(); - - void slowLogic(); - - bool havePower() const A_WARN_UNUSED - { return mHavePower; } - - ChatTab *getTab(); - - private: - bool process(std::string msg); - - static bool mEnableGuildBot; - bool mGotInfo; - bool mGotName; - bool mSentInfoRequest; - bool mSentNameRequest; - bool mHavePower; - StringVect mTempList; - EmulateGuildTab *mTab; - bool mRequest; - int mRequestTime; - bool mGotOnlineInfo; -}; - -extern GuildManager *guildManager; - -#endif // TMWA_SUPPORT -#endif // GUILDMANAGER_H diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 8277e4805..20ab2cffa 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -25,7 +25,6 @@ #include "actormanager.h" #include "effectmanager.h" #include "guild.h" -#include "guildmanager.h" #include "party.h" #include "being/localplayer.h" @@ -39,6 +38,7 @@ #include "net/serverfeatures.h" +#include "net/tmwa/guildmanager.h" #include "net/tmwa/messageout.h" #include "net/tmwa/protocol.h" #include "net/tmwa/sprite.h" diff --git a/src/net/tmwa/chathandler.cpp b/src/net/tmwa/chathandler.cpp index 4a4810c58..e870ba563 100644 --- a/src/net/tmwa/chathandler.cpp +++ b/src/net/tmwa/chathandler.cpp @@ -24,7 +24,6 @@ #include "actormanager.h" #include "configuration.h" -#include "guildmanager.h" #include "being/localplayer.h" #include "being/playerrelations.h" @@ -38,6 +37,7 @@ #include "net/serverfeatures.h" +#include "net/tmwa/guildmanager.h" #include "net/tmwa/messageout.h" #include "net/tmwa/protocol.h" diff --git a/src/net/tmwa/guildmanager.cpp b/src/net/tmwa/guildmanager.cpp new file mode 100644 index 000000000..0e7b7a43a --- /dev/null +++ b/src/net/tmwa/guildmanager.cpp @@ -0,0 +1,551 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program 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. + * + * 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 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 "net/tmwa/guildmanager.h" + +#include "actormanager.h" +#include "client.h" +#include "configuration.h" +#include "guild.h" +#include "notifymanager.h" + +#include "being/localplayer.h" + +#include "enums/net/packettypes.h" + +#include "gui/windows/chatwindow.h" +#include "gui/windows/socialwindow.h" + +#include "gui/widgets/tabs/chat/emulateguildtab.h" + +#include "net/chathandler.h" +#include "net/packetlimiter.h" +#include "net/serverfeatures.h" + +#include "utils/delete2.h" +#include "utils/timer.h" + +#include "resources/notifytypes.h" + +#include "debug.h" + +GuildManager *guildManager = nullptr; + +static const int requestTimeout = 5; + +bool GuildManager::mEnableGuildBot = false; + +GuildManager::GuildManager() : + mGotInfo(false), + mGotName(false), + mSentInfoRequest(false), + mSentNameRequest(false), + mHavePower(false), + mTempList(), + mTab(nullptr), + mRequest(false), + mRequestTime(cur_time + 3), + mGotOnlineInfo(false) +{ +} + +GuildManager::~GuildManager() +{ + delete2(mTab); +} + +void GuildManager::init() +{ + if (serverFeatures->haveNativeGuilds()) + { + mEnableGuildBot = false; + } + else + { + int val = serverConfig.getValue("enableGuildBot", -1); + if (val == -1) + { + if (client->isTmw()) + val = 1; + else + val = 0; + serverConfig.setValue("enableGuildBot", val); + } + mEnableGuildBot = val; + } + if (mEnableGuildBot) + { + if (!guildManager) + guildManager = new GuildManager(); + else + guildManager->reload(); + } + else if (guildManager) + { + delete2(guildManager); + } +} + +void GuildManager::reload() +{ + mGotInfo = false; + mGotName = false; + mHavePower = false; + mRequest = false; + mSentNameRequest = false; + mSentInfoRequest = false; + mGotOnlineInfo = false; + mRequestTime = 0; + mTempList.clear(); + + if (socialWindow) + { + Guild *const guild = Guild::getGuild(1); + if (guild && socialWindow) + socialWindow->removeTab(guild); + } + delete2(mTab); +} + +void GuildManager::send(const std::string &msg) +{ + chatHandler->privateMessage("guild", msg); +} + +void GuildManager::chat(const std::string &msg) +{ + if (!localPlayer || !mTab) + return; + + chatHandler->privateMessage("guild", msg); + mTab->chatLog(localPlayer->getName(), msg); +} + +void GuildManager::getNames(StringVect &names) const +{ + const Guild *const guild = createGuild(); + if (guild) + guild->getNames(names); +} + +void GuildManager::requestGuildInfo() +{ + if (mRequest && mRequestTime + 15 < cur_time) + return; + + if (!mGotName && !mSentNameRequest) + { + if (!PacketLimiter::limitPackets(PACKET_WHISPER)) + return; + send("!info " + toString(tick_time)); + mRequest = true; + mSentNameRequest = true; + mRequestTime = cur_time + requestTimeout; + } + else if (!mGotInfo && !mSentInfoRequest && !mSentNameRequest) + { + if (!PacketLimiter::limitPackets(PACKET_WHISPER)) + return; + send("!getonlineinfo " + toString(tick_time)); + mRequest = true; + mSentInfoRequest = true; + mRequestTime = cur_time + requestTimeout; + } +} + +void GuildManager::slowLogic() +{ + if (!mGotOnlineInfo && mGotName && mRequestTime < cur_time) + { + if (!PacketLimiter::limitPackets(PACKET_WHISPER)) + return; + send("!getonlineinfo " + toString(tick_time)); + mRequest = true; + mSentInfoRequest = true; + mRequestTime = cur_time + requestTimeout; + } +} + +void GuildManager::updateList() +{ + Guild *const guild = Guild::getGuild(1); + if (guild) + { + guild->setServerGuild(false); + StringVectCIter it = mTempList.begin(); + const StringVectCIter it_end = mTempList.end(); + int i = 0; + while (it != it_end) + { + std::string name = *it; + const size_t sz = name.size(); + if (sz > 1) + { + const int status = atoi(name.substr(sz - 1).c_str()); + + name = name.substr(0, sz - 1); + GuildMember *const m = guild->addMember(i, 0, name); + if (m) + { + m->setOnline(status & 1); + m->setGender(Gender::UNSPECIFIED); + if (status & 2) + m->setPos(10); + else + m->setPos(0); + if (localPlayer && name == localPlayer->getName()) + { + mHavePower = (status & 2); + m->setOnline(true); + } + } + } + ++ it; + i ++; + } + guild->sort(); + createTab(guild); + if (actorManager) + { + actorManager->updatePlayerGuild(); + actorManager->updatePlayerColors(); + } + if (socialWindow) + socialWindow->updateGuildCounter(); + } + mTempList.clear(); + mSentInfoRequest = false; + mGotInfo = true; +} + +void GuildManager::createTab(Guild *const guild) +{ + if (!mTab) + { + mTab = new EmulateGuildTab(chatWindow); + if (config.getBoolValue("showChatHistory")) + mTab->loadFromLogFile("#Guild"); + if (localPlayer) + localPlayer->addGuild(guild); + } +} + +Guild *GuildManager::createGuild() const +{ + Guild *const guild = Guild::getGuild(1); + if (!guild) + return nullptr; + + guild->setServerGuild(false); + return guild; +} + +bool GuildManager::processGuildMessage(const std::string &msg) +{ + const bool res = process(msg); + + if (!mRequest) + requestGuildInfo(); + + return res; +} + +bool GuildManager::process(std::string msg) +{ + if (msg.size() > 4 && msg[0] == '#' && msg[1] == '#') + msg = msg.substr(3); + + const bool haveNick = (msg.find(": ") != std::string::npos); + + if (!haveNick && findCutLast(msg, " is now Offline.")) + { + Guild *const guild = createGuild(); + if (!guild) + return false; + if (msg.size() < 4) + return false; + if (msg[0] == '#' && msg[1] == '#') + msg = msg.substr(3); + + GuildMember *const m = guild->addMember(msg); + if (m) + m->setOnline(false); + guild->sort(); + mRequest = false; + if (mTab) + mTab->showOnline(msg, false); + if (socialWindow) + socialWindow->updateGuildCounter(); + return true; + } + else if (!haveNick && findCutLast(msg, " is now Online.")) + { + Guild *const guild = createGuild(); + if (!guild) + return false; + if (msg.size() < 4) + return false; + if (msg[0] == '#' && msg[1] == '#') + msg = msg.substr(3); + GuildMember *const m = guild->addMember(msg); + if (m) + m->setOnline(true); + guild->sort(); + mRequest = false; + if (mTab) + mTab->showOnline(msg, true); + if (socialWindow) + socialWindow->updateGuildCounter(); + return true; + } + else if (findCutFirst(msg, "Welcome to the ")) + { + Guild *const guild = createGuild(); + if (!guild) + return false; +// logger->log("welcome message: %s", msg.c_str()); + const size_t pos = msg.find("! ("); + if (pos == std::string::npos) + return false; + msg = msg.substr(0, pos); + guild->setName(msg); + if (localPlayer) + localPlayer->setGuildName(msg); + mGotName = true; + mSentNameRequest = false; + mRequest = false; + return true; + } + else if (findCutFirst(msg, "Player name: ")) + { + Guild *const guild = createGuild(); + if (!guild) + return false; + size_t pos = msg.find("Access Level: "); + if (pos == std::string::npos) + return false; + + msg = msg.substr(pos); + if (!findCutFirst(msg, "Access Level: ")) + return false; + + pos = msg.find(", Guild:"); + if (pos == std::string::npos) + return false; + + const int level = atoi(msg.substr(0, pos).c_str()); + if (level >= 10) + mHavePower = true; + else + mHavePower = false; + + msg = msg.substr(pos + strlen(", Guild:")); + pos = msg.find(", No. Of Online Players: "); + if (pos == std::string::npos) + return false; + + msg = msg.substr(0, pos); +// logger->log("guild name: %s", msg.c_str()); + + guild->setName(msg); + if (localPlayer) + localPlayer->setGuildName(msg); + mGotName = true; + mSentNameRequest = false; + mRequest = false; + return true; + } + else if (findCutFirst(msg, "OL#")) + { +// logger->log("OL"); + mTempList.clear(); + splitToStringVector(mTempList, msg, '#'); + if (msg.empty() || msg[msg.size() - 1] != '#') + updateList(); + mRequest = false; + mGotOnlineInfo = true; + return true; + } + else if (findCutFirst(msg, "oL#")) + { +// logger->log("oL"); + splitToStringVector(mTempList, msg, '#'); + if (msg.empty() || msg[msg.size() - 1] != '#') + updateList(); + mRequest = false; + mGotOnlineInfo = true; + return true; + } + else if (msg == "You are currently not in a guild. For more information " + "or to discuss the possibility of adding you own guild " + "please contact Jero.") + { + mRequest = true; + return true; + } + else if (findCutFirst(msg, "You have been invited to the ") + && findCutLast(msg, " guild chat. If you would like to accept " + "this invitation please reply \"yes\" and if not then \"no\" .")) + { + if (socialWindow) + socialWindow->showGuildInvite(msg, 1, ""); + return true; + } + else if (!haveNick && (findCutLast(msg, " has been removed " + "from the Guild.") || findCutLast(msg, " has left the Guild."))) + { + Guild *const guild = createGuild(); + if (!guild) + return false; + if (msg.size() < 4) + return false; + if (msg[0] == '#' && msg[1] == '#') + msg = msg.substr(3); + + if (actorManager) + { + Being *const b = actorManager->findBeingByName( + msg, ActorType::Player); + + if (b) + { + b->clearGuilds(); + b->setGuildName(""); + b->updateColors(); + } + } + + guild->removeMember(msg); + return true; + } + else if (msg == "You have been removed from the Guild" + || msg == "You have left the Guild") + { + return afterRemove(); + } + else + { + Guild *const guild = createGuild(); + if (!guild) + return false; + if (!mTab) + { + createTab(guild); + } + if (mTab) + { + const size_t pos = msg.find(": ", 0); + if (pos != std::string::npos) + { + const std::string sender_name = msg.substr(0, pos); + if (!guild->getMember(sender_name)) + { + mTab->chatLog(msg); + return true; + } + + msg.erase(0, pos + 2); + if (msg.size() > 3 && msg[0] == '#' && msg[1] == '#') + msg.erase(0, 3); + + trim(msg); + mTab->chatLog(sender_name, msg); + } + else + { + mTab->chatLog(msg); + } + return true; + } + } + return false; +} + +void GuildManager::kick(const std::string &msg) +{ + send("!remove " + msg); +} + +void GuildManager::invite(const std::string &msg) +{ + send("!invite " + msg); +} + +void GuildManager::leave() +{ + send("!leave"); +} + +void GuildManager::notice(const std::string &msg) +{ + if (msg.empty()) + send("!removemotd"); + else + send("!setmotd " + msg); +} + +void GuildManager::clear() +{ + if (socialWindow) + { + Guild *const guild = Guild::getGuild(1); + if (guild) + socialWindow->removeTab(guild); + } +} + +void GuildManager::inviteResponse(const bool response) +{ + if (response) + send("yes"); + else + send("no"); +} + +bool GuildManager::afterRemove() +{ + Guild *const guild = createGuild(); + if (!guild) + return false; + guild->removeFromMembers(); + guild->clearMembers(); + if (localPlayer) + { + localPlayer->setGuildName(""); + localPlayer->clearGuilds(); + } + NotifyManager::notify(NotifyTypes::GUILD_LEFT); + delete2(mTab); + + if (socialWindow) + socialWindow->removeTab(guild); + if (actorManager) + { + actorManager->updatePlayerGuild(); + actorManager->updatePlayerColors(); + } + reload(); + return true; +} + +ChatTab *GuildManager::getTab() +{ + return mTab; +} diff --git a/src/net/tmwa/guildmanager.h b/src/net/tmwa/guildmanager.h new file mode 100644 index 000000000..2fa6b2df8 --- /dev/null +++ b/src/net/tmwa/guildmanager.h @@ -0,0 +1,106 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program 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. + * + * 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 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 . + */ + +#ifndef GUILDMANAGER_H +#define GUILDMANAGER_H + +#ifdef TMWA_SUPPORT + +#include "utils/stringvector.h" + +#include "localconsts.h" + +class ChatTab; +class Guild; +class EmulateGuildTab; + +class GuildManager final +{ + public: + GuildManager(); + + A_DELETE_COPY(GuildManager) + + ~GuildManager(); + + static void init(); + + void chat(const std::string &msg); + + static void send(const std::string &msg); + + bool processGuildMessage(const std::string &msg); + + void getNames(StringVect &names) const; + + void requestGuildInfo(); + + void updateList(); + + static bool getEnableGuildBot() A_WARN_UNUSED + { return mEnableGuildBot; } + + static void kick(const std::string &msg); + + static void invite(const std::string &msg); + + static void leave(); + + static void notice(const std::string &msg); + + void createTab(Guild *const guild); + + Guild *createGuild() const A_WARN_UNUSED; + + static void clear(); + + void reload(); + + static void inviteResponse(const bool response); + + bool afterRemove(); + + void slowLogic(); + + bool havePower() const A_WARN_UNUSED + { return mHavePower; } + + ChatTab *getTab(); + + private: + bool process(std::string msg); + + static bool mEnableGuildBot; + bool mGotInfo; + bool mGotName; + bool mSentInfoRequest; + bool mSentNameRequest; + bool mHavePower; + StringVect mTempList; + EmulateGuildTab *mTab; + bool mRequest; + int mRequestTime; + bool mGotOnlineInfo; +}; + +extern GuildManager *guildManager; + +#endif // TMWA_SUPPORT +#endif // GUILDMANAGER_H diff --git a/src/notifymanager.cpp b/src/notifymanager.cpp index 7ea4259e9..97f9ea18a 100644 --- a/src/notifymanager.cpp +++ b/src/notifymanager.cpp @@ -20,9 +20,6 @@ #include "notifymanager.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "soundmanager.h" #include "being/localplayer.h" @@ -30,6 +27,10 @@ #include "net/guildhandler.h" #include "net/partyhandler.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "resources/notifications.h" #include "resources/notifytypes.h" diff --git a/src/utils/chatutils.cpp b/src/utils/chatutils.cpp index 248856569..c5b7e25ad 100644 --- a/src/utils/chatutils.cpp +++ b/src/utils/chatutils.cpp @@ -21,9 +21,6 @@ #include "utils/chatutils.h" #include "actormanager.h" -#ifdef TMWA_SUPPORT -#include "guildmanager.h" -#endif #include "party.h" #include "being/localplayer.h" @@ -37,6 +34,10 @@ #include "net/partyhandler.h" #include "net/serverfeatures.h" +#ifdef TMWA_SUPPORT +#include "net/tmwa/guildmanager.h" +#endif + #include "utils/stringutils.h" #include "debug.h" -- cgit v1.2.3-70-g09d2