X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/87b2d09bd02f7edfecc39d59a151240872b18b86..41cd057bb981b3dc00cc527485c48549a912cb2b:/projects/stargazer/user.cpp diff --git a/projects/stargazer/user.cpp b/projects/stargazer/user.cpp index 50046fa5..1b7d2f4c 100644 --- a/projects/stargazer/user.cpp +++ b/projects/stargazer/user.cpp @@ -605,7 +605,7 @@ void USER::Run() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -if (stgTime - lastWriteStat > settings->GetStatWritePeriod()) +if (stgTime > static_cast(lastWriteStat + settings->GetStatWritePeriod())) { printfd(__FILE__, "USER::WriteStat user=%s\n", GetLogin().c_str()); WriteStat(); @@ -1153,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) { @@ -1167,133 +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; } messages.push_back(*msg); } } -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::iterator it; - -it = authorizedBy.begin(); +set::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__); - -/*vector hdrsList; - -if (store->GetMessageHdrs(&hdrsList, login)) - { - 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) - { - STG_MSG msg; - if (store->GetMessage(hdrsList[i].id, &msg, login) == 0) - { - if (SendMessage(msg) == 0) - { - 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()); - } - } - } - } - else - { - WriteServLog("Cannot get message for user %s.", login.c_str()); - WriteServLog("%s", store->GetStrError().c_str()); - } - } - }*/ +// No lock `cause we are already locked from caller +// We need not check for the authorizedBy `cause it has already checked by caller std::list::iterator it(messages.begin()); while (it != messages.end()) { - if (SendMessage(*it)) - { - break; - } - it->header.repeat--; - if (it->header.repeat < 0) + if (settings->GetMessageTimeout() > 0 && + difftime(stgTime, it->header.creationTime) > settings->GetMessageTimeout()) { - printfd(__FILE__, "DelMessage\n"); - store->DelMessage(it->header.id, login); + // 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; } - else + if (it->GetNextSendTime() <= stgTime) { - #ifndef DEBUG - //TODO: gcc v. 4.x generate ICE on x86_64 - it->header.lastSendTime = time(NULL); - #else - it->header.lastSendTime = stgTime; - #endif - if (store->EditMessage(*it, login)) + if (SendMessage(*it)) + { + // We need to check all messages in queue for timeout + ++it; + continue; + } + if (it->header.repeat < 0) + { + 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); + } + else { - printfd(__FILE__, "EditMessage Error %s\n", 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; } + ++it; } - -return 0; } //----------------------------------------------------------------------------- //-----------------------------------------------------------------------------