|
1 |
|
2 class Config : Gee.HashMap<string,string> { |
|
3 public Config.from_file(string filename) { |
|
4 base(); |
|
5 IOChannel cfg; |
|
6 /* try { */ |
|
7 cfg = new IOChannel.file(filename,"r"); |
|
8 /*} catch (FileError e) { |
|
9 File.new_for_path(filename);*/ |
|
10 do { |
|
11 string str; |
|
12 size_t length, termpos; |
|
13 IOStatus stat = cfg.read_line(out str,out length,out termpos); |
|
14 if (stat == IOStatus.NORMAL) { |
|
15 string[] parts = str[0:(long)termpos].split("=",2); |
|
16 if (parts.length==2) { |
|
17 this[parts[0]] = parts[1]; |
|
18 stdout.printf("LOL: key: %s value: %s\n",parts[0],parts[1]); |
|
19 } |
|
20 } else |
|
21 break; |
|
22 } while (true); |
|
23 |
|
24 |
|
25 } |
|
26 } |
|
27 |
|
28 class Account : Object { |
|
29 protected Lm.Connection cn; |
|
30 protected string jid; |
|
31 protected string password; |
|
32 protected string resource; |
|
33 protected string server; |
|
34 protected int port; |
|
35 protected bool ssl; |
|
36 |
|
37 public enum State { |
|
38 DISCONNECTED, |
|
39 CONNECTING, |
|
40 AUTHENTICATING, |
|
41 CONNECTED |
|
42 } |
|
43 |
|
44 protected State _state; |
|
45 |
|
46 public State state { |
|
47 get { return _state; } |
|
48 } |
|
49 |
|
50 public signal void state_changed(State old_state, State new_state, string description); |
|
51 protected void _change_state(State new_state, string description) { |
|
52 var old_state = this._state; |
|
53 if (old_state != new_state) { |
|
54 this._state = new_state; |
|
55 stderr.printf("State changed %s -> %s : %s\n",old_state.to_string(), new_state.to_string(), description); |
|
56 state_changed(old_state, new_state, description); |
|
57 } else |
|
58 stderr.printf("State not changed %s : %s\n",old_state.to_string(), description); |
|
59 } |
|
60 |
|
61 public Account(Config cfg) { |
|
62 this.jid = cfg["jid"]; |
|
63 this.password = cfg["password"]; |
|
64 |
|
65 if (cfg.has_key("server")) |
|
66 this.server = cfg["server"]; |
|
67 else |
|
68 this.server = cfg["jid"].split("@",2)[1]; |
|
69 |
|
70 if (cfg.has_key("port")) |
|
71 this.port = cfg["port"].to_int(); |
|
72 else |
|
73 this.port = Lm.Connection.DEFAULT_PORT; |
|
74 |
|
75 if (cfg.has_key("ssl")) |
|
76 this.ssl = (cfg["ssl"]=="yes"); |
|
77 else |
|
78 this.ssl = false; |
|
79 |
|
80 if (cfg.has_key("resource")) |
|
81 this.resource = cfg["resource"]; |
|
82 else |
|
83 this.resource = "iwydt"; |
|
84 |
|
85 cn = new Lm.Connection(this.server); |
|
86 cn.set_disconnect_function((connection, reason) => { |
|
87 stderr.printf("Disconnected: %s\n",reason.to_string()); |
|
88 _change_state(State.DISCONNECTED,reason.to_string()); |
|
89 }, null); |
|
90 //cn.register_message_handler( |
|
91 } |
|
92 public void open() { |
|
93 |
|
94 stderr.printf("Connecting to %s:%d as %s\n",server,port,jid); |
|
95 cn.set_port(port); |
|
96 cn.set_jid(jid); |
|
97 _change_state(State.CONNECTING,""); |
|
98 try { |
|
99 var result = cn.open((connection, consuc) => { |
|
100 stderr.printf("Connection success: %s\n",consuc.to_string()); |
|
101 if (consuc) { |
|
102 _change_state(State.AUTHENTICATING,""); |
|
103 stderr.printf("Authing\n"); |
|
104 cn.authenticate(jid.split("@",2)[0],password, resource, (connection, authsuc) => { |
|
105 stderr.printf("Auth success: %s\n",authsuc.to_string()); |
|
106 if (authsuc) { |
|
107 _change_state(State.CONNECTED,""); |
|
108 } else |
|
109 cn.close(); |
|
110 }, null); |
|
111 } else { |
|
112 _change_state(State.DISCONNECTED, "Connection not successful"); |
|
113 } |
|
114 }, null); |
|
115 if (!result) |
|
116 _change_state(State.DISCONNECTED, "Open failed"); |
|
117 } catch (Error e) { |
|
118 stderr.printf("Error: %s\n", e.message); |
|
119 _change_state(State.DISCONNECTED, e.message); |
|
120 } |
|
121 } |
|
122 |
|
123 } |
|
124 |
|
125 |
|
126 int main(string[] args) { |
|
127 if (args.length<2) { |
|
128 stderr.printf("Usage: %s <config file>\n",args[0]); |
|
129 return 1; |
|
130 } |
|
131 /*Log.set_handler("LM", (LogLevelFlags)65535, (domain, levels, message) => { |
|
132 stderr.printf("--- %s\n", message); |
|
133 });*/ |
|
134 log("LM", LogLevelFlags.LEVEL_DEBUG, "HATE HATE"); |
|
135 var cfg = new Config.from_file(args[1]); |
|
136 var loop = new MainLoop(); |
|
137 var account = new Account(cfg); |
|
138 account.open(); |
|
139 stdout.printf("Fuck yeah\n"); |
|
140 loop.run(); |
|
141 return 0; |
|
142 } |