rendered paste body// APPConfiguration.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using ProjectName.Base;
namespace ProjectName.Application.Configuration
{
public class AppConfiguration
{
#region Public Static Members
/// <summary>
/// server
/// </summary>
public static string server { get; set; }
/// <summary>
/// nickname
/// </summary>
public static string nickName { get; set; }
/// <summary>
/// username
/// </summary>
public static string userName { get; set; }
/// <summary>
/// port
/// </summary>
public static int port { get; set; }
#endregion Public Static Members
#region Constructor
public static void initConfiguration()
{
if (!ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.server"].Equals(null))
AppConfiguration.server = ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.server"];
if (!ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.userName"].Equals(null))
AppConfiguration.userName = ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.userName"];
if (!ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.nickName"].Equals(null))
AppConfiguration.nickName = ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.nickName"];
if (!ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.port"].Equals(null))
AppConfiguration.port = NullCheck.GetInt32Value(ConfigurationSettings.AppSettings["ProjectName.Application.Configuration.IRCConnection.port"], 0);
}
#endregion Constructor
}
}
// CONNECTION STATUS.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProjectName.IRC
{
public enum CONNECTION_STATUS
{
Connecting = 0,
Connected = 1,
Disconnected = 2
}
}
// IRCChannel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProjectName.IRC
{
public class IRCChannel
{
#region Public Members
/// <summary>
/// Channel name
/// </summary>
public string name { get; set; }
#endregion Public Members
}
}
// IRCConnection.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using ProjectName.Base;
using ProjectName.IRC;
namespace ProjectName.IRC.Connection
{
public class IRCConnection
{
#region Private Members
/// <summary>
/// net stream
/// </summary>
private NetworkStream m_stream;
/// <summary>
/// reader
/// </summary>
private StreamReader m_reader;
/// <summary>
/// writer
/// </summary>
private StreamWriter m_writer;
/// <summary>
/// Thread IRC Handler
/// </summary>
private Thread m_threadIRCHandler;
/// <summary>
/// Handler message
/// </summary>
private IRCHandlerPrivmsg m_ircHandlerPrivmsg;
#endregion Private Members
#region Public Members
/// <summary>
/// server
/// </summary>
public string server { get; set; }
/// <summary>
/// port
/// </summary>
public int port { get; set; }
/// <summary>
/// username
/// </summary>
public string userName { get; set; }
/// <summary>
/// nickname
/// </summary>
public string nickName { get; set; }
/// <summary>
/// Connection Status
/// </summary>
private CONNECTION_STATUS m_connectionStatus = CONNECTION_STATUS.Disconnected;
public CONNECTION_STATUS connectionStatus
{
get
{
return this.m_connectionStatus;
}
set
{
this.m_connectionStatus = value;
}
}
/// <summary>
/// Connection Instance
/// </summary>
public IRCConnectionInstance currentInstance { get; set; }
#endregion Public Members
#region Public Methods
/// <summary>
/// Connection
/// </summary>
public void Launch()
{
if (string.IsNullOrEmpty(this.server) || string.IsNullOrEmpty(this.userName) || string.IsNullOrEmpty(this.nickName) || port.Equals(null))
throw new SystemException("ERROR : you must configure the irc client correctly");
this.currentInstance = new IRCConnectionInstance();
// Connection
TcpClient client = new TcpClient(this.server, this.port);
this.connectionStatus = CONNECTION_STATUS.Connecting;
this.m_stream = client.GetStream();
this.m_reader = new StreamReader(this.m_stream);
this.m_writer = new StreamWriter(this.m_stream);
this.m_writer.WriteLine("USER " + this.userName + " 8 * :" + this.userName);
this.m_writer.Flush();
this.m_writer.WriteLine("NICK " + this.nickName);
this.m_writer.Flush();
this.m_threadIRCHandler = new Thread(new ThreadStart(this.handleConnection));
this.m_threadIRCHandler.Start();
}
/// <summary>
/// Disconnection
/// </summary>
public void Disconnect()
{
this.m_reader.Close();
this.m_writer.Close();
this.m_stream.Close();
this.m_threadIRCHandler.Abort();
this.m_connectionStatus = CONNECTION_STATUS.Disconnected;
Console.WriteLine("The connection has been closed");
Console.ReadLine();
}
/// <summary>
/// Write into IRC Stream
/// </summary>
/// <param name="text"></param>
public void writeToIRC(string text)
{
this.m_writer.WriteLine(text);
this.m_writer.Flush();
}
#endregion Public Methods
#region Public Events
/// <summary>
/// Privmsg Handler Delegate
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void PrivmsgHandler(object sender, string text);
/// <summary>
/// OnPrivmsg Event
/// </summary>
public event PrivmsgHandler Privmsg;
#endregion Public Events
#region Private Methods
/// <summary>
/// Connection Handler
/// </summary>
private void handleConnection()
{
this.m_ircHandlerPrivmsg = new IRCHandlerPrivmsg(this);
Privmsg += new PrivmsgHandler(OnPrivmsg);
string line;
while (true)
{
while ((line = this.m_reader.ReadLine()) != null)
{
Console.WriteLine(line);
StringBuilder sb = new StringBuilder();
string[] sline = line.Split(' ');
string sender = sline[0].Substring(1, sline[0].Length - 1);
#region Connection
// Connected
if (sline[1].Equals("001"))
{
this.connectionStatus = CONNECTION_STATUS.Connected;
}
// Server infos
if (sline[1].Equals("002"))
{
this.currentInstance.currentServer = sline[6].Substring(0, sline[6].Length - 1);
}
// PING
if (sline[0] == "PING")
{
string replyNumber = sline[1];
Console.WriteLine("PONG " + replyNumber);
this.writeToIRC("PONG " + replyNumber);
}
#endregion Connection
// PRIVMSG
if (sline[1].Equals("PRIVMSG"))
{
sb.Append(sline[3].Substring(1, sline[3].Length - 1));
sb.AppendFormat(" {0}", StringHelper.getTextByRange(sline, 4, null, ' '));
if (Privmsg != null)
OnPrivmsg(sender, sb.ToString());
}
// JOIN
if (sline[1].Equals("JOIN"))
{
if (!sender.Equals(this.currentInstance.currentServer, StringComparison.InvariantCultureIgnoreCase))
continue;
IRCChannel channel = new IRCChannel();
channel.name = sline[2];
this.currentInstance.currentChannels.Add(channel);
}
// PART
if (sline[1].Equals("PART"))
{
if (!sender.Equals(this.currentInstance.currentServer, StringComparison.InvariantCultureIgnoreCase))
continue;
IRCChannel channel = this.currentInstance.getCurrentIRCChannelByName(sline[2]);
if (channel.Equals(null))
return;
this.currentInstance.currentChannels.Remove(channel);
}
}
}
}
#endregion Private Methods
#region Events
private void OnPrivmsg(string sender, string text)
{
this.m_ircHandlerPrivmsg.handlePrivmsg(sender, text);
}
#endregion Events
}
}
// IRC ConnectionInstance.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjectName.IRC;
namespace ProjectName.IRC.Connection
{
public class IRCConnectionInstance
{
#region Public Members
/// <summary>
/// Current Server
/// </summary>
public string currentServer { get; set; }
/// <summary>
/// Current Nickname
/// </summary>
public string currentNickname { get; set; }
/// <summary>
/// Current Channels
/// </summary>
private List<IRCChannel> m_currentChannels = new List<IRCChannel>();
public List<IRCChannel> currentChannels
{
get
{
return this.m_currentChannels;
}
}
#endregion Public Members
#region Public Methods
/// <summary>
/// Get the IRC Channel by its name
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public IRCChannel getCurrentIRCChannelByName(string name)
{
foreach (IRCChannel ircChannel in this.currentChannels)
{
if (ircChannel.name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return ircChannel;
}
return null;
}
#endregion Public Methods
}
}
// IRCHandlerPrivmsg.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjectName.Base;
using ProjectName.IRC.Connection;
namespace ProjectName.IRC
{
public class IRCHandlerPrivmsg
{
#region Private Class
/// <summary>
/// PrivmsgEventArgs
/// </summary>
public class PrivmsgEventArgs : EventArgs
{
#region Public Members
public string ircChannel { get; set; }
public string message { get; set; }
public bool isPrivateMessage { get; set; }
#endregion Public Members
}
#endregion Private Class
#region Private Members
/// <summary>
/// Delegate
/// </summary>
/// <param name="sender"></param>
/// <param name="message"></param>
private delegate void OnPrivmsg(string sender, PrivmsgEventArgs e);
/// <summary>
/// IRC Connection
/// </summary>
private IRCConnection m_ircConnection;
/// <summary>
/// List of events
/// </summary>
private Dictionary<string, OnPrivmsg> m_privmsgEventsList;
#endregion Private Members
#region Public Constructor
public IRCHandlerPrivmsg(IRCConnection ircConnection)
{
this.m_ircConnection = ircConnection;
this.m_privmsgEventsList = new Dictionary<string, OnPrivmsg>();
this.m_privmsgEventsList.Add(".join", new OnPrivmsg(join));
this.m_privmsgEventsList.Add(".part", new OnPrivmsg(part));
}
#endregion Public Constructor
#region Public Methods
/// <summary>
/// Privmsg Handler
/// </summary>
/// <param name="sender"></param>
/// <param name="message"></param>
public void handlePrivmsg(string sender, string text)
{
string[] stext = text.Split(' ');
if (!this.m_privmsgEventsList.ContainsKey(stext[0].Trim()))
return;
// StringHelper.getTextByRange(stext, 1, null, ' ')
this.m_privmsgEventsList[stext[0].Trim()](sender, new PrivmsgEventArgs());
}
#endregion Public Methods
#region Private Methods
/// <summary>
/// Join
/// </summary>
/// <param name="sender"></param>
/// <param name="text"></param>
private void join(string sender, PrivmsgEventArgs e)
{
this.m_ircConnection.writeToIRC(string.Format("JOIN {0}", e.message));
}
/// <summary>
/// Part
/// </summary>
/// <param name="sender"></param>
/// <param name="text"></param>
private void part(string sender, PrivmsgEventArgs e)
{
this.m_ircConnection.writeToIRC(string.Format("PART {0}", e.message));
}
#endregion Private Methods
}
}
Program.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjectName.IRC.Connection;
using ProjectName.Application.Configuration;
namespace ProjectName
{
class sharp
{
static void Main(string[] args)
{
AppConfiguration.initConfiguration();
IRCConnection ircConnection = new IRCConnection();
ircConnection.server = AppConfiguration.server;
ircConnection.port = AppConfiguration.port;
ircConnection.nickName = AppConfiguration.nickName;
ircConnection.userName = AppConfiguration.userName;
ircConnection.Launch();
}
}
}
/////////////////////////////////////// PROJET BASE LINKER AU PROJET
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProjectName.Base
{
public class NullCheck
{
#region Public Methods
/// <summary>
/// Try to convert value into int
/// </summary>
/// <param name="value"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static int GetInt32Value(object value, int defaultValue)
{
try
{
return Convert.ToInt32(value);
}
catch
{
return defaultValue;
}
}
#endregion Public Methods
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProjectName.Base
{
public class StringHelper
{
#region Public Static Methods
/// <summary>
/// Returns a text by a range of splitted args
/// </summary>
/// <param name="text"></param>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <param name="separator"></param>
/// <param name="concatChar"></param>
/// <returns></returns>
public static string getTextByRange(string text, int startIndex, int? endIndex, char separator, char? concatChar)
{
string[] stext = text.Split(separator);
StringBuilder sb = new StringBuilder();
for (int i = startIndex; ((i <= endIndex || endIndex.Equals(null)) && (i <= stext.Count() - 1)); i++)
sb.AppendFormat("{0}{1}", stext[i], !concatChar.Equals(null) ? concatChar.ToString() : string.Empty);
return sb.ToString();
}
/// <summary>
/// Returns a text by a range of splitted args
/// </summary>
/// <param name="text"></param>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <param name="separator"></param>
/// /// <param name="concatChar"></param>
/// <returns></returns>
public static string getTextByRange(string[] stext, int startIndex, int? endIndex, char? concatChar)
{
StringBuilder sb = new StringBuilder();
for (int i = startIndex; ((i <= endIndex || endIndex.Equals(null)) && (i <= stext.Count() - 1)); i++)
sb.AppendFormat("{0}{1}", stext[i], !concatChar.Equals(null) ? concatChar.ToString() : string.Empty);
return sb.ToString();
}
#endregion Public Static Methods
}
}