-Implement reconnect on connection lost as requested. Techbot will now try to re-connect every 60 seconds when a connection lost is detected.

svn path=/trunk/; revision=33350
This commit is contained in:
Marc Piulachs 2008-05-07 19:53:14 +00:00
parent 1e922dc43f
commit 98d47d1fc4
3 changed files with 119 additions and 29 deletions

View file

@ -16,6 +16,10 @@ namespace TechBot.IRCLibrary
/// </summary> /// </summary>
public delegate void ChannelUserDatabaseChangedHandler(IrcChannel channel); public delegate void ChannelUserDatabaseChangedHandler(IrcChannel channel);
public delegate void OnConnectHandler ();
public delegate void OnDisconnectHandler();
public delegate void OnConnectionLostHandler();
/// <summary> /// <summary>
/// An IRC client. /// An IRC client.
/// </summary> /// </summary>
@ -202,6 +206,10 @@ namespace TechBot.IRCLibrary
public event ChannelUserDatabaseChangedHandler ChannelUserDatabaseChanged; public event ChannelUserDatabaseChangedHandler ChannelUserDatabaseChanged;
public event OnConnectHandler OnConnect;
public event OnConnectionLostHandler OnConnectionLost;
public event OnDisconnectHandler OnDisconnect;
#endregion #endregion
#region Public properties #region Public properties
@ -291,20 +299,39 @@ namespace TechBot.IRCLibrary
/// <param name="ar">IAsyncResult object.</param> /// <param name="ar">IAsyncResult object.</param>
private void ReadComplete(IAsyncResult ar) private void ReadComplete(IAsyncResult ar)
{ {
StateObject stateObject = (StateObject) ar.AsyncState; try
if (stateObject.Stream.CanRead) {
{ StateObject stateObject = (StateObject)ar.AsyncState;
int bytesReceived = stateObject.Stream.EndRead(ar); if (stateObject.Stream.CanRead)
if (bytesReceived > 0) {
{ int bytesReceived = stateObject.Stream.EndRead(ar);
messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived)); if (bytesReceived > 0)
while (messageStream.DataAvailable) {
{ messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived));
OnMessageReceived(new IrcMessage(messageStream.Read())); while (messageStream.DataAvailable)
} {
} OnMessageReceived(new IrcMessage(messageStream.Read()));
} }
Receive(); }
}
Receive();
}
catch (SocketException)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
catch (IOException)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
catch (Exception)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
} }
/// <summary> /// <summary>
@ -498,6 +525,9 @@ namespace TechBot.IRCLibrary
connected = false; connected = false;
tcpClient.Close(); tcpClient.Close();
tcpClient = null; tcpClient = null;
if (OnDisconnect != null)
OnDisconnect();
} }
} }
@ -507,19 +537,37 @@ namespace TechBot.IRCLibrary
/// <param name="message">The message to be sent.</param> /// <param name="message">The message to be sent.</param>
public void SendMessage(IrcMessage message) public void SendMessage(IrcMessage message)
{ {
if (!connected) try
{ {
throw new NotConnectedException(); if (!connected)
} {
throw new NotConnectedException();
/* Serialize sending messages */ }
lock (typeof(IrcClient))
{ /* Serialize sending messages */
NetworkStream networkStream = tcpClient.GetStream(); lock (typeof(IrcClient))
byte[] bytes = Encoding.GetBytes(message.Line); {
networkStream.Write(bytes, 0, bytes.Length); NetworkStream networkStream = tcpClient.GetStream();
networkStream.Flush(); byte[] bytes = Encoding.GetBytes(message.Line);
} networkStream.Write(bytes, 0, bytes.Length);
networkStream.Flush();
}
}
catch (SocketException)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
catch (IOException)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
catch (Exception)
{
if (OnConnectionLost != null)
OnConnectionLost();
}
} }
/// <summary> /// <summary>

View file

@ -71,13 +71,27 @@ namespace TechBot.Library
m_IrcClient = new IrcClient(); m_IrcClient = new IrcClient();
m_IrcClient.Encoding = Encoding.GetEncoding("iso-8859-1"); m_IrcClient.Encoding = Encoding.GetEncoding("iso-8859-1");
m_IrcClient.OnConnect += new OnConnectHandler(m_IrcClient_OnConnect);
m_IrcClient.OnConnectionLost += new OnConnectionLostHandler(m_IrcClient_OnConnectionLost);
m_IrcClient.OnDisconnect += new OnDisconnectHandler(m_IrcClient_OnDisconnect);
m_IrcClient.MessageReceived += new MessageReceivedHandler(client_MessageReceived); m_IrcClient.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged); m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
Connect();
}
void m_IrcClient_OnConnect()
{
Console.WriteLine("Connected...");
}
private void Connect()
{
Console.WriteLine("Connecting to {0} port {1}", Console.WriteLine("Connecting to {0} port {1}",
hostname, hostname,
port); port);
m_IrcClient.Connect(hostname, port); m_IrcClient.Connect(hostname, port);
Console.WriteLine("Connected...");
m_IrcClient.Register(botname, password, null); m_IrcClient.Register(botname, password, null);
Console.WriteLine("Registered as {0}...", botname); Console.WriteLine("Registered as {0}...", botname);
JoinChannels(); JoinChannels();
@ -89,9 +103,37 @@ namespace TechBot.Library
PartChannels(); PartChannels();
m_IrcClient.Diconnect(); m_IrcClient.Diconnect();
}
void m_IrcClient_OnDisconnect()
{
Console.WriteLine("Disconnected..."); Console.WriteLine("Disconnected...");
} }
void m_IrcClient_OnConnectionLost()
{
//Dispose old connection
Disconnect();
//Sleep for 1 minute
Thread.Sleep(1000 * 60);
//Try to reconnect
Connect();
}
private void Disconnect()
{
try
{
m_IrcClient.Diconnect();
}
catch (Exception)
{
//
}
}
public void Stop() public void Stop()
{ {
isStopped = true; isStopped = true;

View file

@ -9,7 +9,7 @@ using System.Configuration.Install;
namespace TechBot namespace TechBot
{ {
public class TechBotService : System.ServiceProcess.ServiceBase public class TechBotService : ServiceBase
{ {
private Thread thread; private Thread thread;
private ServiceThread threadWorker; private ServiceThread threadWorker;