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()
{