summaryrefslogtreecommitdiff
path: root/src/gui/windows/whoisonline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/windows/whoisonline.cpp')
-rw-r--r--src/gui/windows/whoisonline.cpp909
1 files changed, 0 insertions, 909 deletions
diff --git a/src/gui/windows/whoisonline.cpp b/src/gui/windows/whoisonline.cpp
deleted file mode 100644
index e123d3941..000000000
--- a/src/gui/windows/whoisonline.cpp
+++ /dev/null
@@ -1,909 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2009 The Mana World Development Team
- * Copyright (C) 2009-2010 Andrei Karas
- * Copyright (C) 2011-2017 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 "gui/windows/whoisonline.h"
-
-#include "actormanager.h"
-#include "configuration.h"
-#include "guild.h"
-#include "party.h"
-#ifdef TMWA_SUPPORT
-#include "settings.h"
-#endif // TMWA_SUPPORT
-
-#include "gui/onlineplayer.h"
-#include "gui/popupmanager.h"
-#include "gui/viewport.h"
-
-#include "gui/popups/popupmenu.h"
-
-#include "gui/windows/chatwindow.h"
-#include "gui/windows/setupwindow.h"
-#include "gui/windows/socialwindow.h"
-
-#include "gui/widgets/button.h"
-#include "gui/widgets/scrollarea.h"
-#include "gui/widgets/staticbrowserbox.h"
-
-#include "being/beingflag.h"
-#include "being/localplayer.h"
-#include "being/playerrelations.h"
-
-#ifdef TMWA_SUPPORT
-#include "net/download.h"
-#endif // TMWA_SUPPORT
-#include "net/packetlimiter.h"
-#include "net/playerhandler.h"
-#include "net/serverfeatures.h"
-
-#include "utils/foreach.h"
-#include "utils/gettext.h"
-#include "utils/sdlhelper.h"
-
-#ifdef TMWA_SUPPORT
-#include "net/net.h"
-#else // TMWA_SUPPORT
-#include <curl/curl.h>
-#endif // TMWA_SUPPORT
-
-#include "debug.h"
-
-#ifdef free
-#undef free
-#endif // free
-
-#ifdef malloc
-#undef malloc
-#endif // malloc
-
-WhoIsOnline *whoIsOnline = nullptr;
-
-namespace
-{
- class NameFunctuator final
- {
- public:
- A_DEFAULT_COPY(NameFunctuator)
-
- bool operator()(const OnlinePlayer *left,
- const OnlinePlayer *right) const
- {
- return (compareStrI(left->getNick(), right->getNick()) < 0);
- }
- } nameCompare;
-} // namespace
-
-WhoIsOnline::WhoIsOnline() :
- // TRANSLATORS: who is online window name
- Window(_("Who Is Online - Updating"),
- Modal_false,
- nullptr,
- "whoisonline.xml"),
- mUpdateTimer(0),
- mThread(nullptr),
- mMemoryBuffer(nullptr),
- mCurlError(new char[CURL_ERROR_SIZE]),
- mBrowserBox(new StaticBrowserBox(this, Opaque_true,
- "onlinebrowserbox.xml")),
- mScrollArea(new ScrollArea(this, mBrowserBox, Opaque_false)),
- // TRANSLATORS: who is online. button.
- mUpdateButton(new Button(this, _("Update"), "update", this)),
- mOnlinePlayers(),
- mOnlineNicks(),
- mFriends(),
- mNeutral(),
- mDisregard(),
- mEnemy(),
- mDownloadedBytes(0),
- mDownloadStatus(UPDATE_LIST),
- mDownloadComplete(true),
- mAllowUpdate(true),
- mShowLevel(false),
- mUpdateOnlineList(config.getBoolValue("updateOnlineList")),
- mGroupFriends(true),
-#ifdef TMWA_SUPPORT
- mWebList(Net::getNetworkType() == ServerType::TMWATHENA),
-#endif
- mServerSideList(serverFeatures->haveServerOnlineList())
-{
- mCurlError[0] = 0;
- setWindowName("WhoIsOnline");
-}
-
-void WhoIsOnline::postInit()
-{
- Window::postInit();
- const int h = 350;
- const int w = 200;
- setDefaultSize(w, h, ImagePosition::CENTER);
-
- setVisible(Visible_false);
- setCloseButton(true);
- setResizable(true);
- setStickyButtonLock(true);
- setSaveVisible(true);
-
- if (setupWindow != nullptr)
- setupWindow->registerWindowForReset(this);
-
- mUpdateButton->setEnabled(false);
- mUpdateButton->setDimension(Rect(5, 5, w - 10, 20 + 5));
-
- mBrowserBox->setOpaque(Opaque_false);
- mScrollArea->setDimension(Rect(5, 20 + 10, w - 10, h - 10 - 30));
- mScrollArea->setSize(w - 10, h - 10 - 30);
- mScrollArea->setSelectable(false);
- mBrowserBox->setLinkHandler(this);
-
- add(mUpdateButton);
- add(mScrollArea);
-
- setLocationRelativeTo(getParent());
-
- loadWindowState();
- enableVisibleSound(true);
-
- download();
-
- widgetResized(Event(nullptr));
- config.addListener("updateOnlineList", this);
- config.addListener("groupFriends", this);
- mGroupFriends = config.getBoolValue("groupFriends");
-}
-
-WhoIsOnline::~WhoIsOnline()
-{
- config.removeListeners(this);
- CHECKLISTENERS
-
- SDL::WaitThread(mThread);
- mThread = nullptr;
- free(mMemoryBuffer);
- mMemoryBuffer = nullptr;
-
- // Remove possibly leftover temporary download
- delete []mCurlError;
-
- FOR_EACH (std::set<OnlinePlayer*>::iterator, itd, mOnlinePlayers)
- delete *itd;
- mOnlinePlayers.clear();
- mOnlineNicks.clear();
-}
-
-void WhoIsOnline::handleLink(const std::string& link, MouseEvent *event)
-{
- if ((event == nullptr) || event->getButton() == MouseButton::LEFT)
- {
- if (chatWindow != nullptr)
- {
- const std::string text = decodeLinkText(link);
- if (config.getBoolValue("whispertab"))
- {
- chatWindow->localChatInput("/q " + text);
- }
- else
- {
- chatWindow->addInputText(std::string("/w \"").append(
- text).append("\" "));
- }
- }
- }
- else if (event->getButton() == MouseButton::RIGHT)
- {
- if ((localPlayer != nullptr) && link == localPlayer->getName())
- return;
-
- if (popupMenu != nullptr)
- {
- if (actorManager != nullptr)
- {
- const std::string text = decodeLinkText(link);
- Being *const being = actorManager->findBeingByName(
- text, ActorType::Player);
-
- if ((being != nullptr) && (popupManager != nullptr))
- {
- popupMenu->showPopup(viewport->mMouseX,
- viewport->mMouseY,
- being);
- return;
- }
- }
- popupMenu->showPlayerPopup(link);
- }
- }
-}
-
-void WhoIsOnline::updateWindow(size_t numOnline)
-{
- // Set window caption
- // TRANSLATORS: who is online window name
- setCaption(_("Who Is Online - ") + toString(CAST_U32(numOnline)));
-
- // List the online people
- std::sort(mFriends.begin(), mFriends.end(), nameCompare);
- std::sort(mNeutral.begin(), mNeutral.end(), nameCompare);
- std::sort(mDisregard.begin(), mDisregard.end(), nameCompare);
- bool addedFromSection(false);
- FOR_EACH (STD_VECTOR<OnlinePlayer*>::const_iterator, it, mFriends)
- {
- mBrowserBox->addRow((*it)->getText());
- addedFromSection = true;
- }
- if (addedFromSection == true)
- {
- mBrowserBox->addRow("---");
- addedFromSection = false;
- }
- FOR_EACH (STD_VECTOR<OnlinePlayer*>::const_iterator, it, mEnemy)
- {
- mBrowserBox->addRow((*it)->getText());
- addedFromSection = true;
- }
- if (addedFromSection == true)
- {
- mBrowserBox->addRow("---");
- addedFromSection = false;
- }
- FOR_EACH (STD_VECTOR<OnlinePlayer*>::const_iterator, it, mNeutral)
- {
- mBrowserBox->addRow((*it)->getText());
- addedFromSection = true;
- }
- if (addedFromSection == true && !mDisregard.empty())
- mBrowserBox->addRow("---");
-
- FOR_EACH (STD_VECTOR<OnlinePlayer*>::const_iterator, it, mDisregard)
- mBrowserBox->addRow((*it)->getText());
-
- if (mScrollArea->getVerticalMaxScroll() <
- mScrollArea->getVerticalScrollAmount())
- {
- mScrollArea->setVerticalScrollAmount(
- mScrollArea->getVerticalMaxScroll());
- }
- mBrowserBox->updateHeight();
-}
-
-void WhoIsOnline::handlerPlayerRelation(const std::string &nick,
- OnlinePlayer *const player)
-{
- if (player == nullptr)
- return;
- switch (playerRelations.getRelation(nick))
- {
- case Relation::NEUTRAL:
- default:
- setNeutralColor(player);
- mNeutral.push_back(player);
- break;
-
- case Relation::FRIEND:
- player->setText("2");
- if (mGroupFriends)
- mFriends.push_back(player);
- else
- mNeutral.push_back(player);
- break;
-
- case Relation::DISREGARDED:
- case Relation::BLACKLISTED:
- player->setText("8");
- mDisregard.push_back(player);
- break;
-
- case Relation::ENEMY2:
- player->setText("1");
- mEnemy.push_back(player);
- break;
-
- case Relation::IGNORED:
- case Relation::ERASED:
- // Ignore the ignored.
- break;
- }
-}
-
-void WhoIsOnline::loadList(const STD_VECTOR<OnlinePlayer*> &list)
-{
- mBrowserBox->clearRows();
- const size_t numOnline = list.size();
-
- FOR_EACH (std::set<OnlinePlayer*>::iterator, itd, mOnlinePlayers)
- delete *itd;
- mOnlinePlayers.clear();
- mOnlineNicks.clear();
-
- mShowLevel = config.getBoolValue("showlevel");
-
- FOR_EACH (STD_VECTOR<OnlinePlayer*>::const_iterator, it, list)
- {
- OnlinePlayer *player = *it;
- const std::string nick = player->getNick();
- mOnlinePlayers.insert(player);
- mOnlineNicks.insert(nick);
-
- if (!mShowLevel)
- player->setLevel(0);
-
- handlerPlayerRelation(nick, player);
- }
-
- updateWindow(numOnline);
- if (!mOnlineNicks.empty())
- {
- if (chatWindow != nullptr)
- chatWindow->updateOnline(mOnlineNicks);
- if (socialWindow != nullptr)
- socialWindow->updateActiveList();
- if (actorManager != nullptr)
- actorManager->updateSeenPlayers(mOnlineNicks);
- }
- updateSize();
- mFriends.clear();
- mNeutral.clear();
- mDisregard.clear();
- mEnemy.clear();
-}
-
-#ifdef TMWA_SUPPORT
-void WhoIsOnline::loadWebList()
-{
- if (mMemoryBuffer == nullptr)
- return;
-
- // Reallocate and include terminating 0 character
- mMemoryBuffer = static_cast<char*>(
- realloc(mMemoryBuffer, mDownloadedBytes + 1));
- if (mMemoryBuffer == nullptr)
- return;
-
- mMemoryBuffer[mDownloadedBytes] = '\0';
-
- mBrowserBox->clearRows();
- bool listStarted(false);
- std::string lineStr;
- size_t numOnline(0U);
-
- // Tokenize and add each line separately
- char *line = strtok(mMemoryBuffer, "\n");
- const std::string gmText("(GM)");
- const std::string gmText2("(gm)");
-
- FOR_EACH (std::set<OnlinePlayer*>::iterator, itd, mOnlinePlayers)
- delete *itd;
-
- mOnlinePlayers.clear();
- mOnlineNicks.clear();
-
- mShowLevel = config.getBoolValue("showlevel");
-
- while (line != nullptr)
- {
- std::string nick;
- lineStr = line;
- trim(lineStr);
- if (listStarted == true)
- {
- if (lineStr.find(" users are online.") == std::string::npos)
- {
- if (lineStr.length() > 24)
- {
- nick = lineStr.substr(0, 24);
- lineStr = lineStr.substr(25);
- }
- else
- {
- nick = lineStr;
- lineStr.clear();
- }
- trim(nick);
-
- bool isGM(false);
- size_t pos = lineStr.find(gmText, 0);
- if (pos != std::string::npos)
- {
- lineStr = lineStr.substr(pos + gmText.length());
- isGM = true;
- }
- else
- {
- pos = lineStr.find(gmText2, 0);
- if (pos != std::string::npos)
- {
- lineStr = lineStr.substr(pos + gmText.length());
- isGM = true;
- }
- }
-
- trim(lineStr);
- pos = lineStr.find('/', 0);
-
- if (pos != std::string::npos)
- lineStr = lineStr.substr(0, pos);
-
- int level = 0;
- if (!lineStr.empty())
- level = atoi(lineStr.c_str());
-
- if (actorManager != nullptr)
- {
- Being *const being = actorManager->findBeingByName(
- nick, ActorType::Player);
- if (being != nullptr)
- {
- if (level > 0)
- {
- being->setLevel(level);
- being->updateName();
- }
- else
- {
- if (being->getLevel() > 1)
- level = being->getLevel();
- }
- }
- }
-
- if (!mShowLevel)
- level = 0;
-
- OnlinePlayer *const player = new OnlinePlayer(nick,
- CAST_U8(255), level,
- Gender::UNSPECIFIED, -1);
- mOnlinePlayers.insert(player);
- mOnlineNicks.insert(nick);
-
- if (isGM)
- player->setIsGM(true);
-
- numOnline++;
- handlerPlayerRelation(nick, player);
- }
- }
- else if (lineStr.find("------------------------------")
- != std::string::npos)
- {
- listStarted = true;
- }
- line = strtok(nullptr, "\n");
- }
-
- updateWindow(numOnline);
- mBrowserBox->updateHeight();
-
- // Free the memory buffer now that we don't need it anymore
- free(mMemoryBuffer);
- mMemoryBuffer = nullptr;
- mFriends.clear();
- mNeutral.clear();
- mDisregard.clear();
- mEnemy.clear();
-}
-
-size_t WhoIsOnline::memoryWrite(void *restrict ptr,
- size_t size,
- size_t nmemb,
- FILE *restrict stream)
-{
- if (stream == nullptr)
- return 0;
-
- WhoIsOnline *restrict const wio =
- reinterpret_cast<WhoIsOnline *restrict>(stream);
- const size_t totalMem = size * nmemb;
- wio->mMemoryBuffer = static_cast<char*>(realloc(wio->mMemoryBuffer,
- CAST_SIZE(wio->mDownloadedBytes) + totalMem));
- if (wio->mMemoryBuffer != nullptr)
- {
- memcpy(&(wio->mMemoryBuffer[wio->mDownloadedBytes]), ptr, totalMem);
- wio->mDownloadedBytes += CAST_S32(totalMem);
- }
-
- return totalMem;
-}
-
-int WhoIsOnline::downloadThread(void *ptr)
-{
- int attempts = 0;
- WhoIsOnline *const wio = reinterpret_cast<WhoIsOnline *>(ptr);
- if (wio == nullptr)
- return 0;
- CURLcode res;
- const std::string url(settings.onlineListUrl + "/online.txt");
-
- while (attempts < 1 && !wio->mDownloadComplete)
- {
- CURL *curl = curl_easy_init();
- if (curl != nullptr)
- {
- if (!wio->mAllowUpdate)
- {
- curl_easy_cleanup(curl);
- curl = nullptr;
- break;
- }
- wio->mDownloadedBytes = 0;
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
- &WhoIsOnline::memoryWrite);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, ptr);
-
- curl_easy_setopt(curl,
- CURLOPT_USERAGENT,
- settings.userAgent.c_str());
-
- curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, wio->mCurlError);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
- curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, ptr);
-
-#if LIBCURL_VERSION_NUM >= 0x070a00
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-#endif // LIBCURL_VERSION_NUM >= 0x070a00
- curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 7);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
- Net::Download::addHeaders(curl);
- Net::Download::addProxy(curl);
- Net::Download::secureCurl(curl);
-
- // Make sure the resources2.txt and news.txt aren't cached,
- // in order to always get the latest version.
- struct curl_slist *pHeaders = nullptr;
- pHeaders = curl_slist_append(
- pHeaders, "pragma: no-cache");
- pHeaders = curl_slist_append(pHeaders,
- "Cache-Control: no-cache");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pHeaders);
-
- if ((res = curl_easy_perform(curl)) != 0)
- {
- wio->mDownloadStatus = UPDATE_ERROR;
- PRAGMA45(GCC diagnostic push)
- PRAGMA45(GCC diagnostic ignored "-Wswitch-enum")
- switch (res)
- {
- case CURLE_COULDNT_CONNECT:
- default:
- std::cerr << "curl error "
- << CAST_U32(res) << ": "
- << wio->mCurlError << " host: "
- << url.c_str() << std::endl;
- break;
- }
- PRAGMA45(GCC diagnostic pop)
- attempts++;
- curl_easy_cleanup(curl);
- curl_slist_free_all(pHeaders);
- curl = nullptr;
- continue;
- }
-
- curl_easy_cleanup(curl);
- curl_slist_free_all(pHeaders);
-
- // It's stored in memory, we're done
- wio->mDownloadComplete = true;
- }
- if (!wio->mAllowUpdate)
- break;
- attempts++;
- }
-
- if (!wio->mDownloadComplete)
- wio->mDownloadStatus = UPDATE_ERROR;
- return 0;
-}
-#endif // TMWA_SUPPORT
-
-void WhoIsOnline::download()
-{
- if (mServerSideList)
- {
- if (PacketLimiter::limitPackets(PacketType::PACKET_ONLINELIST))
- playerHandler->requestOnlineList();
- }
-#ifdef TMWA_SUPPORT
- else if (mWebList)
- {
- mDownloadComplete = true;
- SDL::WaitThread(mThread);
- mThread = nullptr;
- mDownloadComplete = false;
- mThread = SDL::createThread(&WhoIsOnline::downloadThread,
- "whoisonline", this);
- if (mThread == nullptr)
- mDownloadStatus = UPDATE_ERROR;
- }
-#endif // TMWA_SUPPORT
-}
-
-void WhoIsOnline::logic()
-{
- BLOCK_START("WhoIsOnline::logic")
- mScrollArea->logic();
- BLOCK_END("WhoIsOnline::logic")
-}
-
-void WhoIsOnline::slowLogic()
-{
- if (!mAllowUpdate)
- return;
-
- BLOCK_START("WhoIsOnline::slowLogic")
- if (mUpdateTimer == 0)
- mUpdateTimer = cur_time;
-
- const double timeDiff = difftime(cur_time, mUpdateTimer);
- const int timeLimit = isWindowVisible() ? 20 : 120;
-
- if (mUpdateOnlineList && timeDiff >= timeLimit
- && mDownloadStatus != UPDATE_LIST)
- {
- if (mDownloadComplete == true)
- {
- // TRANSLATORS: who is online window name
- setCaption(_("Who Is Online - Updating"));
- mUpdateTimer = 0;
- mDownloadStatus = UPDATE_LIST;
- download();
- }
- }
-
-#ifdef TMWA_SUPPORT
- switch (mDownloadStatus)
- {
- case UPDATE_ERROR:
- logger->assertLog("Failed to fetch the online list:");
- if (mCurlError != nullptr)
- logger->assertLog("%s", mCurlError);
- mDownloadStatus = UPDATE_COMPLETE;
- // TRANSLATORS: who is online window name
- setCaption(_("Who Is Online - error"));
- mUpdateButton->setEnabled(true);
- mUpdateTimer = cur_time + 240;
- mDownloadComplete = true;
- updateSize();
- break;
- case UPDATE_LIST:
- if (mDownloadComplete == true)
- {
- loadWebList();
- mDownloadStatus = UPDATE_COMPLETE;
- mUpdateButton->setEnabled(true);
- mUpdateTimer = 0;
- updateSize();
- if (!mOnlineNicks.empty())
- {
- if (chatWindow != nullptr)
- chatWindow->updateOnline(mOnlineNicks);
- if (socialWindow != nullptr)
- socialWindow->updateActiveList();
- if (actorManager != nullptr)
- actorManager->updateSeenPlayers(mOnlineNicks);
- }
- }
- break;
- case UPDATE_COMPLETE:
- default:
- break;
- }
-#endif // TMWA_SUPPORT
-
- BLOCK_END("WhoIsOnline::slowLogic")
-}
-
-void WhoIsOnline::action(const ActionEvent &event)
-{
- if (event.getId() == "update")
- {
-#ifdef TMWA_SUPPORT
- if (!mServerSideList)
- {
- if (mDownloadStatus == UPDATE_COMPLETE)
- {
- mUpdateTimer = cur_time - 20;
- if (mUpdateButton != nullptr)
- mUpdateButton->setEnabled(false);
- // TRANSLATORS: who is online window name
- setCaption(_("Who Is Online - Update"));
- SDL::WaitThread(mThread);
- mThread = nullptr;
- mDownloadComplete = true;
- }
- }
- else
-#endif // TMWA_SUPPORT
- {
- if (PacketLimiter::limitPackets(PacketType::PACKET_ONLINELIST))
- {
- mUpdateTimer = cur_time;
- playerHandler->requestOnlineList();
- }
- }
- }
-}
-
-void WhoIsOnline::widgetResized(const Event &event)
-{
- Window::widgetResized(event);
- updateSize();
-}
-
-void WhoIsOnline::updateSize()
-{
- const Rect area = getChildrenArea();
- if (mUpdateButton != nullptr)
- mUpdateButton->setWidth(area.width - 10);
-
- if (mScrollArea != nullptr)
- mScrollArea->setSize(area.width - 10, area.height - 10 - 30);
-}
-
-const std::string WhoIsOnline::prepareNick(const std::string &restrict nick,
- const int level,
- const std::string &restrict
- color) const
-{
- const std::string text = encodeLinkText(nick);
- if (mShowLevel && level > 1)
- {
- return strprintf("@@%s|##%s%s (%d)@@", text.c_str(),
- color.c_str(), text.c_str(), level);
- }
- return strprintf("@@%s|##%s%s@@", text.c_str(),
- color.c_str(), text.c_str());
-}
-
-void WhoIsOnline::optionChanged(const std::string &name)
-{
- if (name == "updateOnlineList")
- mUpdateOnlineList = config.getBoolValue("updateOnlineList");
- else if (name == "groupFriends")
- mGroupFriends = config.getBoolValue("groupFriends");
-}
-
-void WhoIsOnline::setNeutralColor(OnlinePlayer *const player)
-{
- if (player == nullptr)
- return;
-
- if ((actorManager != nullptr) && (localPlayer != nullptr))
- {
- const std::string &nick = player->getNick();
- if (nick == localPlayer->getName())
- {
- player->setText("s");
- return;
- }
- if (localPlayer->isInParty())
- {
- const Party *const party = localPlayer->getParty();
- if (party != nullptr)
- {
- if (party->getMember(nick) != nullptr)
- {
- player->setText("P");
- return;
- }
- }
- }
-
- const Being *const being = actorManager->findBeingByName(nick);
- if (being != nullptr)
- {
- const Guild *const guild2 = localPlayer->getGuild();
- if (guild2 != nullptr)
- {
- const Guild *const guild1 = being->getGuild();
- if (guild1 != nullptr)
- {
- if (guild1->getId() == guild2->getId()
- || (guild2->getMember(nick) != nullptr))
- {
- player->setText("U");
- return;
- }
- }
- else if (guild2->isMember(nick))
- {
- player->setText("U");
- return;
- }
- }
- }
- const Guild *const guild3 = Guild::getGuild(1);
- if ((guild3 != nullptr) && guild3->isMember(nick))
- {
- player->setText("U");
- return;
- }
- }
- player->setText("0");
-}
-
-void WhoIsOnline::getPlayerNames(StringVect &names)
-{
- names.clear();
- FOR_EACH (std::set<std::string>::const_iterator, it, mOnlineNicks)
- names.push_back(*it);
-}
-
-void OnlinePlayer::setText(std::string color)
-{
- mText.clear();
-
- if (mStatus != 255 && (actorManager != nullptr))
- {
- Being *const being = actorManager->findBeingByName(
- mNick, ActorType::Player);
- if (being != nullptr)
- {
- being->setState(mStatus);
- // for now highlight versions > 3
- if (mVersion > 3)
- being->setAdvanced(true);
- }
- }
-
- if ((mStatus != 255 && ((mStatus & BeingFlag::GM) != 0)) || mIsGM)
- mText.append("(GM) ");
-
- if (mLevel > 0)
- mText.append(strprintf("%d", mLevel));
-
- if (mGender == Gender::FEMALE)
- mText.append("\u2640");
- else if (mGender == Gender::MALE)
- mText.append("\u2642");
-
- if (mStatus > 0 && mStatus != 255)
- {
- if ((mStatus & BeingFlag::SHOP) != 0)
- mText.append("$");
- if ((mStatus & BeingFlag::AWAY) != 0)
- {
- // TRANSLATORS: this away status writed in player nick
- mText.append(_("A"));
- }
- if ((mStatus & BeingFlag::INACTIVE) != 0)
- {
- // TRANSLATORS: this inactive status writed in player nick
- mText.append(_("I"));
- }
-
- if (((mStatus & BeingFlag::GM) != 0) && color == "0")
- color = "2";
- }
- else if (mIsGM && color == "0")
- {
- color = "2";
- }
-
- if (mVersion > 0)
- mText.append(strprintf(" - %d", mVersion));
-
- const std::string text = encodeLinkText(mNick);
- mText = strprintf("@@%s|##%s%s %s@@", text.c_str(), color.c_str(),
- text.c_str(), mText.c_str());
-}