Let the server irc bot reconnect once every day.

This commit is contained in:
lotodore
2008-11-02 21:25:42 +00:00
parent eff1919831
commit 9943e34d4a
5 changed files with 55 additions and 6 deletions
+22 -2
View File
@@ -251,11 +251,30 @@ irc_event_numeric(irc_session_t * session, unsigned irc_event, const char * /*or
}
}
IrcThread::IrcThread(IrcCallback &callback)
IrcThread::IrcThread(const IrcThread &other)
: m_terminationTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start),
m_lastConnectTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start)
{
m_callback = other.m_callback;
m_context.reset(new IrcContext(*this));
IrcContext &context = GetContext();
const IrcContext &otherContext = other.GetContext();
context.serverAddress = otherContext.serverAddress;
context.serverPort = otherContext.serverPort;
context.useIPv6 = otherContext.useIPv6;
context.nick = otherContext.nick;
context.channel = otherContext.channel;
context.channelPassword = otherContext.channelPassword;
}
IrcThread::IrcThread(IrcCallback *callback)
: m_callback(callback),
m_terminationTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start),
m_lastConnectTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start)
{
assert(callback);
m_context.reset(new IrcContext(*this));
}
@@ -469,6 +488,7 @@ IrcThread::GetContext()
IrcCallback &
IrcThread::GetCallback()
{
return m_callback;
assert(m_callback);
return *m_callback;
}
+22
View File
@@ -32,6 +32,8 @@
#include <boost/bind.hpp>
#include <boost/algorithm/string/predicate.hpp>
#define SERVER_RESTART_IRC_BOT_INTERVAL_SEC 86400 // 1 day
using namespace std;
ServerManager::ServerManager(GuiInterface &gui, ConfigFile *config, AvatarManager &avatarManager)
@@ -172,6 +174,26 @@ ServerManager::RunAll()
for_each(m_acceptThreadPool.begin(), m_acceptThreadPool.end(), boost::mem_fn(&ServerAcceptThread::Run));
}
void
ServerManager::Process()
{
if (m_ircRestartTimer.elapsed().total_seconds() > SERVER_RESTART_IRC_BOT_INTERVAL_SEC)
{
if (m_ircThread)
{
m_ircThread->SignalTermination();
if (m_ircThread->Join(NET_ADMIN_IRC_TERMINATE_TIMEOUT_MSEC))
{
boost::shared_ptr<IrcThread> tmpIrcThread(new IrcThread(*m_ircThread));
tmpIrcThread->Run();
m_ircThread = tmpIrcThread;
}
}
m_ircRestartTimer.reset();
m_ircRestartTimer.start();
}
}
void
ServerManager::SignalTerminationAll()
{
+3 -2
View File
@@ -31,7 +31,8 @@ struct IrcContext;
class IrcThread : public Thread
{
public:
IrcThread(IrcCallback &callback);
IrcThread(const IrcThread &other);
IrcThread(IrcCallback *callback);
virtual ~IrcThread();
// Set the parameters.
@@ -58,7 +59,7 @@ protected:
private:
boost::shared_ptr<IrcContext> m_context;
IrcCallback &m_callback;
IrcCallback *m_callback;
boost::timers::portable::microsec_timer m_terminationTimer;
boost::timers::portable::microsec_timer m_lastConnectTimer;
+5
View File
@@ -24,6 +24,7 @@
#include <game_defs.h>
#include <gui/guiinterface.h>
#include <third_party/boost/timers.hpp>
#include <string>
#include <list>
@@ -46,6 +47,9 @@ public:
// Main start function.
void RunAll();
// Let the server manager perform processing.
void Process();
void SignalTerminationAll();
bool JoinAll(bool wait);
@@ -75,6 +79,7 @@ private:
boost::shared_ptr<ServerLobbyThread> m_lobbyThread;
boost::shared_ptr<IrcThread> m_ircThread;
boost::timers::portable::microsec_timer m_ircRestartTimer;
AcceptThreadList m_acceptThreadPool;
};