corrade-vassal – Blame information for rev 1
?pathlinks?
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 | } |