2 using System.Collections.Generic;
5 using MySql.Data.MySqlClient;
7 using System.Net.Sockets;
11 public int id { get; private set; }
13 public string nick { get; private set; }
14 public string ident { get; private set; }
15 public string realname { get; private set; }
16 public string localip { get; private set; }
17 public string server { get; private set; }
18 public int serverport { get; private set; }
20 private IPEndPoint local;
23 public bool online { get; private set; }
31 this.log = new Logger(id.ToString("0000"), Root.log);
33 MySqlDataReader rdr = Root.db.queryReader("SELECT nick, ident, realname, bindip, server, serverport FROM bots WHERE id = @id", new object[] { "@id", id });
36 this.nick = rdr.GetString("nick");
37 this.ident = rdr.GetString("ident");
38 this.realname = rdr.GetString("realname");
40 if (rdr.IsDBNull(rdr.GetOrdinal("bindip"))) {
42 this.local = new IPEndPoint(IPAddress.Any, 0);
44 this.localip = rdr.GetString("bindip");
45 this.local = new IPEndPoint(IPAddress.Parse(this.localip), 0);
48 this.server = rdr.GetString("server");
49 this.serverport = rdr.GetInt32("serverport");
52 public string connect() {
53 if (online) throw new InvalidStateException();
55 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
57 s.Connect(server, serverport);
59 Stator rcvstate = new Stator();
60 s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
65 public void dataIn(IAsyncResult ar) {
66 Stator rcvstate = (Stator)ar.AsyncState;
69 if (rcvstate.buffer[0] == '\n') {
70 processData(rcvstate.buffersb.ToString());
71 rcvstate = new Stator();
73 rcvstate.buffersb.Append(Encoding.ASCII.GetString(rcvstate.buffer, 0, 1));
75 s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
77 private void send(string data, params object[] args) {
78 log.debug(">>> " + data);
79 s.Send(Encoding.ASCII.GetBytes(data + "\n"));
82 private void processData(string data) {
83 log.debug("<<< " + data);
85 if (!online) { register(); return; }
88 if (data.StartsWith(":") && Int16.TryParse(data.Substring(data.IndexOf(' ')+1, 3), out numeric)) {
91 send("PRIVMSG #mustis :lolol!");
93 } else if (data.Substring(0, 4) == "PING") {
94 send("PONG" + data.Substring(4));
98 private void register() {
99 send(String.Format("NICK {0}", nick));
100 send(String.Format("USER {0} * * :{1}", ident, realname));
105 class InvalidStateException : Exception { }
108 public byte[] buffer = new byte[1];
109 public StringBuilder buffersb = new StringBuilder();