Index: /trunk/FACT++/src/skypeclient.cc
===================================================================
--- /trunk/FACT++/src/skypeclient.cc	(revision 13979)
+++ /trunk/FACT++/src/skypeclient.cc	(revision 13980)
@@ -32,4 +32,6 @@
 
     bool fAllowRaw;
+
+    uint64_t fLastReadMessage;
 
     string Contact(const string &id) const
@@ -424,6 +426,14 @@
         if (vec[0]=="CHATMESSAGE")
         {
-            if (vec[2]=="STATUS" && vec[3]=="RECEIVED")
-            {
+            if (vec[2]=="STATUS" && (vec[3]=="RECEIVED"|| vec[3]=="READ"))
+            {
+                const uint64_t last = stoll(vec[1]);
+
+                // Check if message has already been processed: Sometimes
+                // some messages are received twice as READ/READ
+                if (last<=fLastReadMessage)
+                    return;
+                fLastReadMessage = last;
+
                 string rc;
 
@@ -436,7 +446,10 @@
                 const size_t p = rc.find(" BODY ");
                 if (p==string::npos)
+                {
+                    cout<< "BODY TAG NOT FOUND|" << rc << "|" << endl;
                     return;
-
-                rc = rc.substr(rc.find(" BODY ")+6);
+                }
+
+                rc = Tools::Trim(rc.substr(rc.find(" BODY ")+6));
 
                 if (rc=="start")
@@ -467,30 +480,19 @@
                 }
 
-                if (rc=="list")
+                if (rc=="status")
                 {
-                    ostringstream out;
-                    out << "*\n\nCurrently subscribed:\n";
-
-                    int cnt = 0;
                     for (auto it=fContacts.begin(); it!=fContacts.end(); it++)
                     {
-                        const string user = Contact(*it);
-                        if (user.empty())
-                            continue;
-
-                        out << "   *   " << user << '\n';
-                        cnt ++;
+                        if (*it==vec[1])
+                        {
+                            SendSkypeMessage(id, "You are subscribed.");
+                            return;
+                        }
                     }
-
-                    if (cnt==0)
-                        out << " <no subscriptions>";
-                    else
-                        out << cnt << " user(s) subscribed.";
-
-                    SendSkypeMessage(id, out.str());
+                    SendSkypeMessage(id, "You are not subscribed.");
                     return;
                 }
 
-                SendSkypeMessage(id, "*\n\nSyntax Error:\nPlease use either 'start' or 'stop'");
+                SendSkypeMessage(id, "SYNTAX ERROR\n\nAvailable commands:\nPlease use either 'start', 'stop' or 'status'");
 
             }
@@ -502,5 +504,7 @@
             if (vec[2]=="ACTIVITY_TIMESTAMP")
             {
+                //SendDBusMessage("CHAT CREATE "+Contact(vec[1]));
                 //Info(vec[2]);
+                // ALTER CHAT DISBAND
             }
             if (vec[2]=="MYROLE")
@@ -541,4 +545,9 @@
     }
 
+    int HandleDisconnect()
+    {
+        return kStateDisconnected;
+    }
+
     int HandleConnect()
     {
@@ -619,5 +628,6 @@
 public:
     SkypeClient(ostream &lout) : StateMachineDim(lout, "SKYPE"),
-        fLastConnect(Time()-boost::posix_time::minutes(5)), fLoop(0)
+        fLastConnect(Time()-boost::posix_time::minutes(5)), fLoop(0),
+        fLastReadMessage(0)
     {
         AddStateName(kStateDisconnected, "Disonnected", "");
@@ -638,4 +648,8 @@
         AddEvent("CONNECT", kStateDisconnected)
             (bind(&SkypeClient::HandleConnect, this))
+            ("");
+
+        AddEvent("DISCONNECT", kStateConnected)
+            (bind(&SkypeClient::HandleDisconnect, this))
             ("");
 
