summaryrefslogtreecommitdiff
path: root/src/guildmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/guildmanager.cpp')
-rw-r--r--src/guildmanager.cpp477
1 files changed, 477 insertions, 0 deletions
diff --git a/src/guildmanager.cpp b/src/guildmanager.cpp
new file mode 100644
index 000000000..1a8d5b433
--- /dev/null
+++ b/src/guildmanager.cpp
@@ -0,0 +1,477 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "guildmanager.h"
+
+#include "actorspritemanager.h"
+#include "client.h"
+#include "configuration.h"
+#include "guild.h"
+#include "localplayer.h"
+
+#include "gui/socialwindow.h"
+
+#include "gui/widgets/guildchattab.h"
+
+#include "net/chathandler.h"
+#include "net/net.h"
+
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include "debug.h"
+
+bool GuildManager::mEnableGuildBot = false;
+
+GuildManager::GuildManager() :
+ mGotInfo(false),
+ mGotName(false),
+ mHavePower(false),
+ mTab(0),
+ mRequest(false)
+{
+}
+
+GuildManager::~GuildManager()
+{
+ delete mTab;
+ mTab = 0;
+}
+
+void GuildManager::init()
+{
+ if (guildManager)
+ return;
+
+ 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)
+ guildManager = new GuildManager();
+}
+
+void GuildManager::reload()
+{
+ mGotInfo = false;
+ mGotName = false;
+ mHavePower = false;
+ mRequest = false;
+ mTempList.clear();
+
+ if (socialWindow)
+ {
+ Guild *guild = Guild::getGuild(1);
+ if (guild)
+ socialWindow->removeTab(guild);
+ }
+ delete mTab;
+ mTab = 0;
+}
+
+void GuildManager::send(std::string msg)
+{
+ Net::getChatHandler()->privateMessage("guild", msg);
+}
+
+void GuildManager::chat(std::string msg)
+{
+ if (!player_node || !mTab)
+ return;
+
+ Net::getChatHandler()->privateMessage("guild", msg);
+ mTab->chatLog(player_node->getName(), msg);
+}
+
+void GuildManager::getNames(std::vector<std::string> &names)
+{
+ Guild *guild = createGuild();
+ guild->getNames(names);
+}
+
+void GuildManager::requestGuildInfo()
+{
+ if (mRequest)
+ return;
+
+ if (!mGotName)
+ {
+ send("!info " + toString(tick_time));
+ mRequest = true;
+ }
+ else if (!mGotInfo)
+ {
+ send("!getonlineinfo " + toString(tick_time));
+ mRequest = true;
+ }
+}
+
+void GuildManager::updateList()
+{
+ Guild *guild = Guild::getGuild(1);
+ if (guild)
+ {
+ guild->setServerGuild(false);
+ std::vector<std::string>::iterator it = mTempList.begin();
+ std::vector<std::string>::iterator it_end = mTempList.end();
+ int i = 0;
+ while (it != it_end)
+ {
+ std::string name = *it;
+ if (name.size() > 1)
+ {
+ int status = atoi(name.substr(name.size() - 1).c_str());
+
+ name = name.substr(0, name.size() - 1);
+ GuildMember *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 (player_node && name == player_node->getName())
+ {
+ mHavePower = (status & 2);
+ m->setOnline(true);
+ }
+ }
+ }
+ ++ it;
+ i ++;
+ }
+ guild->sort();
+ createTab(guild);
+ if (actorSpriteManager)
+ {
+ actorSpriteManager->updatePlayerGuild();
+ actorSpriteManager->updatePlayerColors();
+ }
+ }
+ mTempList.clear();
+ mGotInfo = true;
+}
+
+void GuildManager::createTab(Guild *guild)
+{
+ if (!mTab)
+ {
+ mTab = new GuildChatTab();
+ mTab->loadFromLogFile("#Guild");
+ if (player_node)
+ player_node->addGuild(guild);
+ }
+}
+
+Guild *GuildManager::createGuild()
+{
+ Guild *guild = Guild::getGuild(1);
+ if (!guild)
+ return 0;
+
+ guild->setServerGuild(false);
+ return guild;
+}
+
+bool GuildManager::processGuildMessage(std::string msg)
+{
+ 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);
+
+ bool haveNick = (msg.find(": ") != std::string::npos);
+
+ if (!haveNick && findCutLast(msg, " is now Offline."))
+ {
+ Guild *guild = createGuild();
+ if (!guild)
+ return false;
+ if (msg.size() < 4)
+ return false;
+ if (msg[0] == '#' && msg[1] == '#')
+ msg = msg.substr(3);
+
+ GuildMember *m = guild->addMember(msg);
+ if (m)
+ m->setOnline(false);
+ guild->sort();
+ mRequest = false;
+ return true;
+ }
+ else if (!haveNick && findCutLast(msg, " is now Online."))
+ {
+ Guild *guild = createGuild();
+ if (!guild)
+ return false;
+ if (msg.size() < 4)
+ return false;
+ if (msg[0] == '#' && msg[1] == '#')
+ msg = msg.substr(3);
+ GuildMember *m = guild->addMember(msg);
+ if (m)
+ m->setOnline(true);
+ guild->sort();
+ mRequest = false;
+ return true;
+ }
+ else if (findCutFirst(msg, "Welcome to the "))
+ {
+ Guild *guild = createGuild();
+ if (!guild)
+ return false;
+// logger->log("welcome message: %s", msg.c_str());
+ int pos = msg.find("! (");
+ if (pos == (int)std::string::npos)
+ return false;
+ msg = msg.substr(0, pos);
+ guild->setName(msg);
+ if (player_node)
+ player_node->setGuildName(msg);
+ mGotName = true;
+ mRequest = false;
+ return true;
+ }
+ else if (findCutFirst(msg, "Player name: "))
+ {
+ Guild *guild = createGuild();
+ if (!guild)
+ return false;
+ int pos = msg.find("Access Level: ");
+ if (pos == (int)std::string::npos)
+ return false;
+
+ msg = msg.substr(pos);
+ if (!findCutFirst(msg, "Access Level: "))
+ return false;
+
+ pos = msg.find(", Guild:");
+ if (pos == (int)std::string::npos)
+ return false;
+
+ 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 == (int)std::string::npos)
+ return false;
+
+ msg = msg.substr(0, pos);
+// logger->log("guild name: %s", msg.c_str());
+
+ guild->setName(msg);
+ if (player_node)
+ player_node->setGuildName(msg);
+ mGotName = true;
+ mRequest = false;
+ return true;
+ }
+ else if (findCutFirst(msg, "OL#"))
+ {
+// logger->log("OL");
+ mTempList.clear();
+ splitToStringVector(mTempList, msg, '#');
+ if (msg.size() < 1 || msg[msg.size() - 1] != '#')
+ updateList();
+ mRequest = false;
+ return true;
+ }
+ else if (findCutFirst(msg, "oL#"))
+ {
+// logger->log("oL");
+ splitToStringVector(mTempList, msg, '#');
+ if (msg.size() < 1 || msg[msg.size() - 1] != '#')
+ updateList();
+ mRequest = false;
+ 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 *guild = createGuild();
+ if (!guild)
+ return false;
+ if (msg.size() < 4)
+ return false;
+ if (msg[0] == '#' && msg[1] == '#')
+ msg = msg.substr(3);
+
+ if (actorSpriteManager)
+ {
+ Being *b = actorSpriteManager->findBeingByName(
+ msg, Being::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 *guild = createGuild();
+ if (!guild)
+ return false;
+ if (!mTab)
+ {
+ createTab(guild);
+ }
+ if (mTab)
+ {
+ std::string::size_type pos = msg.find(": ", 0);
+ if (pos != std::string::npos)
+ {
+ std::string sender_name = ((pos == std::string::npos)
+ ? "" : 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(std::string msg)
+{
+ send("!remove " + msg);
+}
+
+void GuildManager::invite(std::string msg)
+{
+ send("!invite " + msg);
+}
+
+void GuildManager::leave()
+{
+ send("!leave");
+}
+
+void GuildManager::notice(std::string msg)
+{
+ if (msg.empty())
+ send("!removemotd");
+ else
+ send("!setmotd " + msg);
+}
+
+void GuildManager::clear()
+{
+ if (socialWindow)
+ {
+ Guild *guild = Guild::getGuild(1);
+ if (guild)
+ socialWindow->removeTab(guild);
+ }
+}
+
+void GuildManager::inviteResponse(bool response)
+{
+ if (response)
+ send("yes");
+ else
+ send("no");
+}
+
+bool GuildManager::afterRemove()
+{
+ Guild *guild = createGuild();
+ if (!guild)
+ return false;
+ guild->removeFromMembers();
+ guild->clearMembers();
+ if (player_node)
+ {
+ player_node->setGuildName("");
+ player_node->clearGuilds();
+ }
+ SERVER_NOTICE(_("You have left the guild."))
+ delete mTab;
+ mTab = 0;
+
+ if (socialWindow)
+ socialWindow->removeTab(guild);
+ if (actorSpriteManager)
+ {
+ actorSpriteManager->updatePlayerGuild();
+ actorSpriteManager->updatePlayerColors();
+ }
+ reload();
+ return true;
+}