corrade-vassal – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 using System;
2 using System.Net.Sockets;
3 using System.Text;
4 using System.Threading;
5  
6 public class IRCClient
7 {
8 private TcpClient ircClient;
9 private bool Shutdown = false;
10 private string ServerHost;
11 private int ServerPort;
12 private string Nickname;
13 private string RealName = String.Empty;
14 private Thread LoopThread;
15 private Thread ConnectThread;
16  
17 public delegate void ConnectCallback();
18 public event ConnectCallback OnConnectFail;
19 public event ConnectCallback OnConnected;
20 public event ConnectCallback OnDisconnected;
21  
22 public delegate void DataCallback(string data);
23 public event DataCallback OnData;
24  
25 public delegate void MessageCallback(string target, string name, string address, string message);
26 public event MessageCallback OnMessage;
27  
28 /// <summary>
29 /// Basic class for a threaded, sychronous TCP client with built-in functions and events for IRC connectivity
30 /// </summary>
31 /// <param name="serverHost"></param>
32 /// <param name="port"></param>
33 /// <param name="nickname"></param>
34 /// <param name="realName"></param>
35 public IRCClient(string serverHost, int port, string nickname, string realName)
36 {
37 ircClient = new TcpClient();
38 ServerHost = serverHost;
39 ServerPort = port;
40 Nickname = nickname;
41 RealName = realName;
42 }
43  
44 /// <summary>
45 /// Connect to IRC network
46 /// </summary>
47 public void Connect()
48 {
49 ConnectThread = new Thread(new ThreadStart(ConnectThreadStart));
50 ConnectThread.Start();
51 }
52  
53 /// <summary>
54 /// Connect to IRC network with the specified parameters
55 /// </summary>
56 /// <param name="serverHost"></param>
57 /// <param name="port"></param>
58 /// <param name="nickname"></param>
59 /// <param name="realName"></param>
60 public void Connect(string serverHost, int port, string nickname, string realName)
61 {
62 ServerHost = serverHost;
63 ServerPort = port;
64 Nickname = nickname;
65 RealName = realName;
66  
67 Connect();
68 }
69  
70 /// <summary>
71 /// Join an IRC channel
72 /// </summary>
73 /// <param name="channel"></param>
74 public void JoinChannel(string channel)
75 {
76 ircClient.Client.Send(Encoding.ASCII.GetBytes("JOIN " + channel + "\r\n"));
77 }
78  
79 /// <summary>
80 /// Send a message to the specified nickname or channel
81 /// </summary>
82 /// <param name="target"></param>
83 /// <param name="message"></param>
84 public void SendMessage(string target, string message)
85 {
86 ircClient.Client.Send(Encoding.ASCII.GetBytes("PRIVMSG " + target + " :" + message + "\r\n"));
87 }
88  
89 private void ConnectThreadStart()
90 {
91 ircClient.Connect(ServerHost, ServerPort);
92  
93 if (!ircClient.Connected)
94 {
95 if (OnConnectFail != null)
96 OnConnectFail();
97  
98 return;
99 }
100  
101 ircClient.Client.Send(Encoding.ASCII.GetBytes("USER " + Nickname + " x x :" + RealName + "\r\n"));
102 ircClient.Client.Send(Encoding.ASCII.GetBytes("NICK " + Nickname + "\r\n"));
103  
104 LoopThread = new Thread(new ThreadStart(LoopThreadStart));
105 LoopThread.Start();
106 }
107  
108 private void LoopThreadStart()
109 {
110 while (!Shutdown && ircClient.Connected)
111 {
112 byte[] buffer = new byte[4096];
113 ircClient.Client.Receive(buffer);
114 if (buffer.Length == 0) break;
115  
116 string[] lines = Encoding.ASCII.GetString(buffer).Split(new string[] { "\r\n", "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries);
117  
118 for(int i=0; i<lines.Length - 1; i++)
119 {
120 string[] words = lines[i].Split(new char[] { ' ' });
121  
122 if (OnData != null && lines[i].Length > 0)
123 OnData(lines[i]);
124  
125 if (words.Length < 2) return;
126  
127 if (words[0].ToUpper() == "PING")
128 ircClient.Client.Send(Encoding.ASCII.GetBytes("PONG " + words[1] + "\r\n"));
129  
130 else if (words[1] == "001")
131 {
132 if (OnConnected != null)
133 OnConnected();
134 }
135  
136 else if (words[1].ToUpper() == "PRIVMSG")
137 {
138 if (OnMessage != null)
139 {
140 int nameIndex = words[0].IndexOf('!');
141 string name = nameIndex > 0 ? words[0].Substring(1, nameIndex - 1) : words[0];
142 string address = words[0].Substring(nameIndex + 1);
143 OnMessage(words[2], name, address, lines[i].Substring(lines[i].IndexOf(":", 1) + 1));
144 }
145 }
146 }
147 }
148  
149 if (!ircClient.Connected)
150 {
151 if (OnDisconnected != null)
152 OnDisconnected();
153 }
154  
155 else ircClient.Close();
156 }
157  
158 }