]> jfr.im git - z_archive/kelsier.git/blob - Bot.cs
Added bot class, misc other changes
[z_archive/kelsier.git] / Bot.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using MySql.Data.MySqlClient;
6 using System.Net;
7 using System.Net.Sockets;
8
9 namespace Kelsier {
10 class Bot {
11 public int id { get; private set; }
12
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; }
19
20 private IPEndPoint local;
21
22 private Socket s;
23 public bool online { get; private set; }
24
25 private Logger log;
26
27
28 public Bot(int id) {
29 this.id = id;
30
31 this.log = new Logger(id.ToString("0000"), Root.log);
32
33 MySqlDataReader rdr = Root.db.queryReader("SELECT nick, ident, realname, bindip, server, serverport FROM bots WHERE id = @id", new object[] { "@id", id });
34 rdr.Read();
35
36 this.nick = rdr.GetString("nick");
37 this.ident = rdr.GetString("ident");
38 this.realname = rdr.GetString("realname");
39
40 if (rdr.IsDBNull(rdr.GetOrdinal("bindip"))) {
41 this.localip = null;
42 this.local = new IPEndPoint(IPAddress.Any, 0);
43 } else {
44 this.localip = rdr.GetString("bindip");
45 this.local = new IPEndPoint(IPAddress.Parse(this.localip), 0);
46 }
47
48 this.server = rdr.GetString("server");
49 this.serverport = rdr.GetInt32("serverport");
50 }
51
52 public string connect() {
53 if (online) throw new InvalidStateException();
54
55 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
56 s.Bind(local);
57 s.Connect(server, serverport);
58
59 Stator rcvstate = new Stator();
60 s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
61
62 return "TODO";
63 }
64
65 public void dataIn(IAsyncResult ar) {
66 Stator rcvstate = (Stator)ar.AsyncState;
67 s.EndReceive(ar);
68
69 if (rcvstate.buffer[0] == '\n') {
70 processData(rcvstate.buffersb.ToString());
71 rcvstate = new Stator();
72 } else {
73 rcvstate.buffersb.Append(Encoding.ASCII.GetString(rcvstate.buffer, 0, 1));
74 }
75 s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
76 }
77 private void send(string data, params object[] args) {
78 log.debug(">>> " + data);
79 s.Send(Encoding.ASCII.GetBytes(data + "\n"));
80 }
81
82 private void processData(string data) {
83 log.debug("<<< " + data);
84
85 if (!online) { register(); return; }
86
87 short numeric;
88 if (data.StartsWith(":") && Int16.TryParse(data.Substring(data.IndexOf(' ')+1, 3), out numeric)) {
89 if (numeric == 1) {
90 send("JOIN #mustis");
91 send("PRIVMSG #mustis :lolol!");
92 }
93 } else if (data.Substring(0, 4) == "PING") {
94 send("PONG" + data.Substring(4));
95 }
96 }
97
98 private void register() {
99 send(String.Format("NICK {0}", nick));
100 send(String.Format("USER {0} * * :{1}", ident, realname));
101 online = true;
102 }
103 }
104
105 class InvalidStateException : Exception { }
106
107 class Stator {
108 public byte[] buffer = new byte[1];
109 public StringBuilder buffersb = new StringBuilder();
110 }
111 }