]> git.stg.codes - stg.git/blobdiff - projects/stargazer/user.cpp
Виправлено помилку що призводила до масових дисконнектів після масових
[stg.git] / projects / stargazer / user.cpp
index 48b8094c2c8e4af01535aea52c7d52df05646fb2..6e77f0a53de025a3208d8fa8ea06fcff9d511f98 100644 (file)
@@ -115,7 +115,6 @@ ips = StrToIPS("*");
 deleted = false;
 lastWriteStat = stgTime + random() % settings->GetStatWritePeriod();
 lastWriteDeatiledStat = stgTime;
-lastSwapDeatiledStat = stgTime;
 
 property.tariffName.AddBeforeNotifier(&tariffNotifier);
 property.passive.AddBeforeNotifier(&passiveNotifier);
@@ -197,7 +196,6 @@ deleted = u.deleted;
 
 lastWriteStat = u.lastWriteStat;
 lastWriteDeatiledStat = u.lastWriteDeatiledStat;
-lastSwapDeatiledStat = u.lastSwapDeatiledStat;
 
 settings = u.settings;
 
@@ -257,6 +255,24 @@ if (tariff == NULL)
     return -1;
     }
 
+std::vector<STG_MSG_HDR> hdrsList;
+
+if (store->GetMessageHdrs(&hdrsList, login))
+    {
+    printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str());
+    return -1;
+    }
+
+std::vector<STG_MSG_HDR>::const_iterator it;
+for (it = hdrsList.begin(); it != hdrsList.end(); ++it)
+    {
+    STG_MSG msg;
+    if (store->GetMessage(it->id, &msg, login) == 0)
+        {
+        messages.push_back(msg);
+        }
+    }
+
 return 0;
 }
 //-----------------------------------------------------------------------------
@@ -589,7 +605,7 @@ void USER::Run()
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
-if (stgTime - lastWriteStat > settings->GetStatWritePeriod())
+if (stgTime > static_cast<time_t>(lastWriteStat + settings->GetStatWritePeriod()))
     {
     printfd(__FILE__, "USER::WriteStat user=%s\n", GetLogin().c_str());
     WriteStat();
@@ -1137,7 +1153,18 @@ int USER::AddMessage(STG_MSG * msg)
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
-if (SendMessage(*msg) == 0)
+if (SendMessage(*msg))
+    {
+    if (store->AddMessage(msg, login))
+        {
+        errorStr = store->GetStrError();
+        WriteServLog("Error adding message: '%s'", errorStr.c_str());
+        printfd(__FILE__, "Error adding message: '%s'\n", errorStr.c_str());
+        return -1;
+        }
+    messages.push_back(*msg);
+    }
+else
     {
     if (msg->header.repeat > 0)
         {
@@ -1151,100 +1178,87 @@ if (SendMessage(*msg) == 0)
         if (store->AddMessage(msg, login))
             {
             errorStr = store->GetStrError();
-            STG_LOGGER & WriteServLog = GetStgLogger();
-            WriteServLog("Error adding message %s", errorStr.c_str());
-            WriteServLog("%s", store->GetStrError().c_str());
+            WriteServLog("Error adding repeatable message: '%s'", errorStr.c_str());
+            printfd(__FILE__, "Error adding repeatable message: '%s'\n", errorStr.c_str());
             return -1;
             }
-        }
-    }
-else
-    {
-    if (store->AddMessage(msg, login))
-        {
-        errorStr = store->GetStrError();
-        STG_LOGGER & WriteServLog = GetStgLogger();
-        WriteServLog("Error adding message %s", errorStr.c_str());
-        WriteServLog("%s", store->GetStrError().c_str());
-        return -1;
+        messages.push_back(*msg);
         }
     }
 return 0;
 }
 //-----------------------------------------------------------------------------
-int USER::SendMessage(const STG_MSG & msg)
+int USER::SendMessage(STG_MSG & msg) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-
-if (authorizedBy.empty())
-    {
-    return -1;
-    }
-
+// No lock `cause we are already locked from caller
 int ret = -1;
-set<const BASE_AUTH*>::iterator it;
-
-it = authorizedBy.begin();
+set<const BASE_AUTH*>::iterator it(authorizedBy.begin());
 while (it != authorizedBy.end())
     {
-    if ((*it)->SendMessage(msg, currIP) == 0)
+    if (!(*it++)->SendMessage(msg, currIP))
         ret = 0;
-    ++it;
+    }
+if (!ret)
+    {
+#ifndef DEBUG
+    //TODO: gcc v. 4.x generate ICE on x86_64
+    msg.header.lastSendTime = time(NULL);
+#else
+    msg.header.lastSendTime = stgTime;
+#endif
+    msg.header.repeat--;
     }
 return ret;
 }
 //-----------------------------------------------------------------------------
-int USER::ScanMessage()
+void USER::ScanMessage()
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+// No lock `cause we are already locked from caller
+// We need not check for the authorizedBy `cause it has already checked by caller
 
-vector<STG_MSG_HDR> hdrsList;
-
-if (store->GetMessageHdrs(&hdrsList, login))
+std::list<STG_MSG>::iterator it(messages.begin());
+while (it != messages.end())
     {
-    printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str());
-    return -1;
-    }
-
-for (unsigned i = 0; i < hdrsList.size(); i++)
-    {
-
-    if (hdrsList[i].lastSendTime + hdrsList[i].repeatPeriod * 60 < (unsigned)stgTime)
+    if (settings->GetMessageTimeout() > 0 &&
+        difftime(stgTime, it->header.creationTime) > settings->GetMessageTimeout())
+        {
+        // Timeout exceeded
+        if (store->DelMessage(it->header.id, login))
+            {
+            WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+            printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
+            }
+        messages.erase(it++);
+        continue;
+        }
+    if (it->GetNextSendTime() <= stgTime)
         {
-        STG_MSG msg;
-        if (store->GetMessage(hdrsList[i].id, &msg, login) == 0)
+        if (SendMessage(*it))
+            {
+            // We need to check all messages in queue for timeout
+            ++it;
+            continue;
+            }
+        if (it->header.repeat < 0)
             {
-            if (SendMessage(msg) == 0)
+            if (store->DelMessage(it->header.id, login))
                 {
-                msg.header.repeat--;
-                if (msg.header.repeat < 0)
-                    {
-                    printfd(__FILE__, "DelMessage\n");
-                    store->DelMessage(hdrsList[i].id, login);
-                    }
-                else
-                    {
-                    #ifndef DEBUG
-                    //TODO: gcc v. 4.x generate ICE on x86_64
-                    msg.header.lastSendTime = time(NULL);
-                    #else
-                    msg.header.lastSendTime = stgTime;
-                    #endif
-                    if (store->EditMessage(msg, login))
-                        {
-                        printfd(__FILE__, "EditMessage Error %s\n", store->GetStrError().c_str());
-                        }
-                    }
+                WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+                printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
                 }
+            messages.erase(it++);
             }
         else
             {
-            WriteServLog("Cannot get message for user %s.", login.c_str());
-            WriteServLog("%s", store->GetStrError().c_str());
+            if (store->EditMessage(*it, login))
+                {
+                WriteServLog("Error modifying message: '%s'", store->GetStrError().c_str());
+                printfd(__FILE__, "Error modifying message: '%s'\n", store->GetStrError().c_str());
+                }
+            ++it;
             }
         }
     }
-return 0;
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------