using System; using System.Net.Sockets; using System.IO; using System.Text; namespace x_bot { class IrcClient { private NetworkStream Reader; private NetworkStream Writer; private TcpClient xBot; public bool Connected { get { return xBot.Connected; } protected set { } } public IrcClient(string server, int port) { xBot = new TcpClient(); xBot.Connect(server, port); if (xBot.Connected) { Reader = xBot.GetStream(); Writer = xBot.GetStream(); } } private void Write(string data) { try { byte[] packet = Encoding.ASCII.GetBytes(data + "\r\n"); Writer.Write(packet, 0, packet.Length); Console.WriteLine("Wrote -> {0}", data); } catch (Exception) { } } private bool NullOrEmpty(byte[] packet) { foreach(byte b in packet) { if((char)b != '\r' && (char)b != '\n' && (char)b != '\0') { return false; } } return true; } private void Write(string data, params string[] args) { Write(String.Format(data, args)); } private byte[] Read(int length) { try { byte[] packet = new byte[length]; Reader.Read(packet, 0, packet.Length); if (NullOrEmpty(packet)) { return packet; } Console.WriteLine("Read -> {0}", Encoding.ASCII.GetString(packet)); return packet; } catch (Exception) { return new byte[length]; } } public void Nick(string nick) { Write("NICK {0}", nick); } public void Quit(string msg) { Write("QUIT :{0}", msg); } public void Notice(string target, string msg) { Write("NOTICE {0} :{1}", target, msg); } public void Msg(string target, string msg) { Write("PRIVMSG {0} :{1}", target, msg); } public void Join(string chan) { Write("JOIN {0}", chan); } public void Join(string chan, string key) { Write("JOIN {0} {1}", chan, key); } public void Pong(string server) { Write("PONG :{0}", server); } public void Part(string chan) { Write("PART {0}", chan); } public void Raw(string data) { Write(data); } public void User() { Write("USER {0} 0 * :{3}", Bot.RandString(8), Bot.RandString(8), Bot.RandString(8), Bot.RandString(8)); } public string ReadLine() { return Encoding.ASCII.GetString(Read(1024)); } } } { public class IRCParsed { public string Prefix; public string Command; public List Args = new List(); } public static IRCParsed ParseMessage(string s) { IRCParsed parsed = new IRCParsed(); List trailing = new List(); if (s.IndexOf(":") == 0) { string[] returned = s.Substring(1).Split(new char[] { ' ' }, 2); if (returned.Length > 1) { parsed.Prefix = returned[0]; s = returned[1]; } } if (!(s.IndexOf(" :") == -1)) { string[] returned = s.Split(new string[] { " :" }, 2, StringSplitOptions.None); s = returned[0]; trailing.Add(returned[1]); string[] split_args = s.Split(new char[] { ' ' }, StringSplitOptions.None); foreach (string arg in split_args) { parsed.Args.Add(arg); } foreach (string trail in trailing) { parsed.Args.Add(trail); } } else { foreach (string arg in s.Split(new char[] { ' ' }, StringSplitOptions.None)) { parsed.Args.Add(arg); } } parsed.Command = parsed.Args[0]; parsed.Args.RemoveAt(0); return parsed; } } }