From 34207065ceb58bbc1bcca8d79826b861c2b75ac6 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 29 Jun 2011 19:25:57 +0200 Subject: [PATCH] Better AdminInterface --- include/transport/usermanager.h | 4 +++ src/admininterface.cpp | 44 ++++++++++++++++++++++++++++++++- src/usermanager.cpp | 4 +++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index a4f84845..33f176c8 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -52,6 +52,10 @@ class UserManager { /// \return User class associated with this user User *getUser(const std::string &barejid); + const std::map &getUsers() { + return m_users; + } + /// Returns number of online users. /// \return number of online users int getUserCount(); diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 0302aa60..26deb9f0 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -35,6 +35,14 @@ namespace Transport { static LoggerPtr logger = Logger::getLogger("AdminInterface"); +static std::string getArg(const std::string &body) { + std::string ret; + if (body.find(" ") == std::string::npos) + return ret; + + return body.substr(body.find(" ") + 1); +} + AdminInterface::AdminInterface(Component *component, UserManager *userManager, NetworkPluginServer *server, StorageBackend *storageBackend) { m_component = component; m_storageBackend = storageBackend; @@ -65,8 +73,42 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { int backends = m_server->getBackendCount() - 1; message->setBody("Running (" + boost::lexical_cast(users) + " users connected using " + boost::lexical_cast(backends) + " backends)"); } + else if (message->getBody() == "online_users_count") { + int users = m_userManager->getUserCount(); + message->setBody(boost::lexical_cast(users)); + } + else if (message->getBody() == "backends_count") { + int backends = m_server->getBackendCount() - 1; + message->setBody(boost::lexical_cast(backends)); + } + else if (message->getBody().find("has_online_user") == 0) { + User *user = m_userManager->getUser(getArg(message->getBody())); + std::cout << getArg(message->getBody()) << "\n"; + message->setBody(boost::lexical_cast(user != NULL)); + } + else if (message->getBody().find("online_users") == 0) { + std::string lst; + const std::map &users = m_userManager->getUsers(); + if (users.size() == 0) + lst = "0"; + + for (std::map::const_iterator it = users.begin(); it != users.end(); it ++) { + lst += (*it).first + "\n"; + } + + message->setBody(lst); + } + else if (message->getBody().find("help") == 0) { + std::string help; + help += "status - shows instance status\n"; + help += "online_users - returns list of all online users\n"; + help += "online_users_count - number of online users\n"; + help += "has_online_user - returns 1 if user is online\n"; + help += "backends_count - number of active backends\n"; + message->setBody(help); + } else { - message->setBody("Unknown command"); + message->setBody("Unknown command. Try \"help\""); } m_component->getStanzaChannel()->sendMessage(message); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index d8c8e695..42bb2685 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -98,6 +98,10 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { User *user = getUser(userkey); if (!user) { + if (CONFIG_STRING(m_component->getConfig(), "service.admin_username") == presence->getFrom().getNode()) { + return; + } + // No user and unavailable presence -> answer with unavailable if (presence->getType() == Swift::Presence::Unavailable) { Swift::Presence::ref response = Swift::Presence::create();