From 0ebeca359c445fd2e3a43c4e1bdf7f5aac51ef70 Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 20 Aug 2009 22:10:50 +0000 Subject: [PATCH] Adding missing files. --- src/net/common/serverlobbybot.cpp | 145 ++++++++++++++++++++++++++++++ src/net/serverlobbybot.h | 80 +++++++++++++++++ 2 files changed, 225 insertions(+) create mode 100644 src/net/common/serverlobbybot.cpp create mode 100644 src/net/serverlobbybot.h diff --git a/src/net/common/serverlobbybot.cpp b/src/net/common/serverlobbybot.cpp new file mode 100644 index 00000000..b3521d6d --- /dev/null +++ b/src/net/common/serverlobbybot.cpp @@ -0,0 +1,145 @@ +/*************************************************************************** + * Copyright (C) 2009 by Lothar May * + * * + * 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 * + * (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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define SERVER_RESTART_IRC_BOT_INTERVAL_SEC 86400 // 1 day + +using namespace std; + +ServerLobbyBot::ServerLobbyBot() +{ +} + +ServerLobbyBot::~ServerLobbyBot() +{ +} + +void +ServerLobbyBot::Init(boost::shared_ptr lobbyThread, boost::shared_ptr ircLobbyThread) +{ + m_lobbyThread = lobbyThread; + m_ircLobbyThread = ircLobbyThread; +} + +void +ServerLobbyBot::SignalIrcConnect(const std::string &server) +{ + LOG_MSG("Lobby bot: Connected to IRC server " << server << "."); +} + +void +ServerLobbyBot::SignalIrcSelfJoined(const std::string &nickName, const std::string &channel) +{ + LOG_MSG("Lobby bot: Joined IRC channel " << channel << " as user " << nickName << "."); + m_ircNick = nickName; +} + +void +ServerLobbyBot::SignalIrcChatMsg(const std::string &/*nickName*/, const std::string &/*msg*/) +{ +} + +void +ServerLobbyBot::SignalIrcError(int errorCode) +{ + LOG_MSG("Lobby bot: IRC error " << errorCode << "."); +} + +void +ServerLobbyBot::SignalIrcServerError(int errorCode) +{ + LOG_MSG("Lobby bot: IRC server error " << errorCode << "."); +} + +void +ServerLobbyBot::SignalLobbyMessage(unsigned playerId, const std::string &playerName, const std::string &msg) +{ + if (m_ircLobbyThread && !msg.empty()) + { + ostringstream ircMsg; + if (playerId) + ircMsg << playerName << " (" << playerId << "): " << msg; + else + ircMsg << playerName << ": " << msg; + m_ircLobbyThread->SendChatMessage(ircMsg.str()); + } +} + +void +ServerLobbyBot::Run() +{ + if (m_ircLobbyThread) + m_ircLobbyThread->Run(); +} + +void +ServerLobbyBot::Process() +{ + if (m_ircRestartTimer.elapsed().total_seconds() > SERVER_RESTART_IRC_BOT_INTERVAL_SEC) + { + if (m_ircLobbyThread) + { + m_ircLobbyThread->SignalTermination(); + if (m_ircLobbyThread->Join(NET_ADMIN_IRC_TERMINATE_TIMEOUT_MSEC)) + { + boost::shared_ptr tmpIrcThread(new IrcThread(*m_ircLobbyThread)); + tmpIrcThread->Run(); + m_ircLobbyThread = tmpIrcThread; + } + } + + m_ircRestartTimer.reset(); + m_ircRestartTimer.start(); + } +} + +void +ServerLobbyBot::SignalTermination() +{ + if (m_ircLobbyThread) + m_ircLobbyThread->SignalTermination(); +} + +bool +ServerLobbyBot::Join(bool wait) +{ + bool terminated = true; + if (m_ircLobbyThread) + terminated = m_ircLobbyThread->Join(wait ? NET_ADMIN_IRC_TERMINATE_TIMEOUT_MSEC : 0); + return terminated; +} + +ServerLobbyThread & +ServerLobbyBot::GetLobbyThread() +{ + assert(m_lobbyThread.get()); + return *m_lobbyThread; +} + diff --git a/src/net/serverlobbybot.h b/src/net/serverlobbybot.h new file mode 100644 index 00000000..dbb99ca1 --- /dev/null +++ b/src/net/serverlobbybot.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (C) 2009 by Lothar May * + * * + * 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 * + * (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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* IRC lobby bot for the server. */ + +#ifndef _SERVERLOBBYBOT_H_ +#define _SERVERLOBBYBOT_H_ + +#include +#include +#include +#include + +#include +#include +#include + +class ServerLobbyThread; +class ServerAcceptHelper; +class SenderThread; +class ConfigFile; +class AvatarManager; +class IrcThread; + +class ServerLobbyBot : public IrcCallback, public ServerIrcBotCallback +{ +public: + ServerLobbyBot(); + virtual ~ServerLobbyBot(); + + void Init(boost::shared_ptr lobbyThread, boost::shared_ptr ircLobbyThread); + + // Main start function. + void Run(); + + // Perform processing. + void Process(); + + void SignalTermination(); + bool Join(bool wait); + + virtual void SignalIrcConnect(const std::string &server); + virtual void SignalIrcSelfJoined(const std::string &nickName, const std::string &channel); + virtual void SignalIrcPlayerJoined(const std::string & /*nickName*/) {} + virtual void SignalIrcPlayerChanged(const std::string & /*oldNick*/, const std::string & /*newNick*/) {} + virtual void SignalIrcPlayerKicked(const std::string & /*nickName*/, const std::string & /*byWhom*/, const std::string & /*reason*/) {} + virtual void SignalIrcPlayerLeft(const std::string & /*nickName*/) {} + virtual void SignalIrcChatMsg(const std::string &nickName, const std::string &msg); + virtual void SignalIrcError(int errorCode); + virtual void SignalIrcServerError(int errorCode); + + virtual void SignalLobbyMessage(unsigned playerId, const std::string &playerName, const std::string &msg); + +protected: + ServerLobbyThread &GetLobbyThread(); + +private: + std::string m_ircNick; + + boost::shared_ptr m_lobbyThread; + boost::shared_ptr m_ircLobbyThread; + boost::timers::portable::microsec_timer m_ircRestartTimer; +}; + +#endif