iswydt.vala
changeset 1 76caf6a3f413
parent 0 e27ed261417d
child 2 4e050075fab9
--- a/iswydt.vala	Fri Oct 05 15:41:19 2012 +0400
+++ b/iswydt.vala	Fri Oct 19 00:38:54 2012 +0400
@@ -1,38 +1,12 @@
 
-class Config : Gee.HashMap<string,string> {
-    public Config.from_file(string filename) {
-        base();
-        IOChannel cfg;
-        /* try { */
-            cfg = new IOChannel.file(filename,"r");
-        /*} catch (FileError e) {
-            File.new_for_path(filename);*/
-        do {
-            string str;
-            size_t length, termpos;
-            IOStatus stat = cfg.read_line(out str,out length,out termpos);
-            if (stat == IOStatus.NORMAL) {
-                string[] parts = str[0:(long)termpos].split("=",2);
-                if (parts.length==2) {
-                    this[parts[0]] = parts[1];
-                    stdout.printf("LOL: key: %s value: %s\n",parts[0],parts[1]);
-                }
-            } else
-                break;
-        } while (true);
-
-
-    }
-}
-
-class Account : Object {
-    protected Lm.Connection cn;
-    protected string jid;
-    protected string password;
-    protected string resource;
-    protected string server;
-	protected int port;
-    protected bool ssl;
+class Connection : Object {
+    public Lm.Connection cn;
+    public string jid;
+    public string password;
+    public string resource;
+    public string server;
+	public int port;
+    public bool ssl;
 
     public enum State {
         DISCONNECTED,
@@ -40,13 +14,15 @@
         AUTHENTICATING,
         CONNECTED
     }
-
+        
     protected State _state;
 
     public State state {
         get { return _state; }
     }
 
+    public Module[] modules;
+
     public signal void state_changed(State old_state, State new_state, string description);
     protected void _change_state(State new_state, string description) {
         var old_state = this._state;
@@ -58,36 +34,62 @@
             stderr.printf("State not changed %s : %s\n",old_state.to_string(), description);
     }
 
-    public Account(Config cfg) {
-        this.jid = cfg["jid"];
-        this.password = cfg["password"];
+    public Connection(Config cfg) {
+        this.modules = new Module[10];
+        this.jid = cfg["server","jid"];
+        this.password = cfg["server","password"];
 
-        if (cfg.has_key("server"))
-            this.server = cfg["server"];
-        else
-            this.server = cfg["jid"].split("@",2)[1];
+        this.server = cfg.get_default("server", "server", this.jid.split("@",2)[1]);
 
-        if (cfg.has_key("port"))
-            this.port = cfg["port"].to_int();
+        if (cfg.has_key("server", "port"))
+            this.port = cfg["server", "port"].to_int();
         else
             this.port = Lm.Connection.DEFAULT_PORT;
 
-        if (cfg.has_key("ssl"))
-            this.ssl = (cfg["ssl"]=="yes");
-        else
-            this.ssl = false;
+        this.ssl = (cfg.get_default("server", "ssl", "yes")=="yes");
 
-        if (cfg.has_key("resource"))
-            this.resource = cfg["resource"];
-        else
-            this.resource = "iwydt";
+        this.resource = cfg.get_default("server", "resource", "iswydt");
 
         cn = new Lm.Connection(this.server);
         cn.set_disconnect_function((connection, reason) => {
             stderr.printf("Disconnected: %s\n",reason.to_string());
             _change_state(State.DISCONNECTED,reason.to_string());
         }, null);
-        //cn.register_message_handler(
+        var msg_handler = new Lm.MessageHandler((handler, connection, message) => {
+            stdout.printf("Got msg\n");
+            var node = message.get_node();
+            var body = node.find_child("body");
+            if (body!=null) {
+                stdout.printf("MSG %s to %s: %s\n", node.get_attribute("from"), node.get_attribute("to"), body.get_value());
+            }
+            return Lm.HandlerResult.ALLOW_MORE_HANDLERS;
+        }, null);
+        cn.register_message_handler(msg_handler, Lm.MessageType.MESSAGE, Lm.HandlerPriority.NORMAL);
+        /*var muc_handler = new Lm.MessageHandler((handler, connection, message) => {
+            var node = message.node;
+            var from = node.get_attribute("from");
+            if (from != null) {
+                var froms = from.split("/",2);
+                //stdout.printf("From: %s %s\n",node.to_string(),message.get_type().to_string());
+                if (rooms.has_key(froms[0])) {
+                    return rooms[froms[0]].muc_handler(handler, connection, message);
+                }
+            }
+            return Lm.HandlerResult.ALLOW_MORE_HANDLERS;
+        }, null);
+        cn.register_message_handler(muc_handler, Lm.MessageType.MESSAGE, Lm.HandlerPriority.NORMAL);
+        cn.register_message_handler(muc_handler, Lm.MessageType.PRESENCE, Lm.HandlerPriority.NORMAL);
+        cn.register_message_handler(muc_handler, Lm.MessageType.IQ, Lm.HandlerPriority.NORMAL);*/
+        var module = new ModuleMuc(cfg, this);
+        modules = {module};
+        state_changed.connect( (olds, news, desc) => {
+            if (news == Connection.State.CONNECTED) {
+                cn.send_raw("<message to='stiletto@stiletto.name'><body>ТХБ</body></message>");
+                /*var room = new Conference(this, "говнохост@conference.blasux.ru", "Ζαλυπα");
+                room.join("Oh hai");
+                this.rooms[room.jid] = room;*/
+            }
+        });
     }
     public void open() {
 
@@ -128,13 +130,13 @@
         stderr.printf("Usage: %s <config file>\n",args[0]);
         return 1;
     }
-    /*Log.set_handler("LM", (LogLevelFlags)65535, (domain, levels, message) => {
+    Log.set_handler("Muc", (LogLevelFlags)65535, (domain, levels, message) => {
         stderr.printf("--- %s\n", message);
-    });*/
+    });
     log("LM", LogLevelFlags.LEVEL_DEBUG, "HATE HATE");
     var cfg = new Config.from_file(args[1]);
     var loop = new MainLoop();
-    var account = new Account(cfg);
+    var account = new Connection(cfg);
     account.open();
     stdout.printf("Fuck yeah\n");
     loop.run();