]>
Commit | Line | Data |
---|---|---|
12e0e204 JR |
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 | } |