bool KviStupidNotifyListManager::handleIsOn(KviIrcMessage * msg) { if(m_pConnection->lagMeter()) m_pConnection->lagMeter()->lagCheckComplete("@notify_naive"); KviCString nk; const char * aux = msg->trailing(); while(*aux) { nk = ""; aux = kvi_extractToken(nk, aux, ' '); if(nk.hasData()) { QString nkd = m_pConnection->decodeText(nk.ptr()); QString nksp = " " + nkd; m_szLastIsOnMsg.replace(nksp, "", Qt::CaseInsensitive); if(!(m_pConsole->notifyListView()->findEntry(nkd))) { // not yet notified notifyOnLine(nkd); } } } // ok...check the users that have left irc now... QStringList sl = m_szLastIsOnMsg.isEmpty() ? QStringList() : m_szLastIsOnMsg.split(' ', QString::SkipEmptyParts); for(auto & it : sl) { if(m_pConsole->notifyListView()->findEntry(it)) { // has just left irc notifyOffLine(it); } // else has never been here... } if(((unsigned int)m_iNextNickToCheck) >= m_pNickList->count()) { // have to restart unsigned int iTimeout = KVI_OPTION_UINT(KviOption_uintNotifyListCheckTimeInSecs); if(iTimeout < 5) { // life first of all. // don't allow the user to suicide if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Timeout (%d sec) is too short, resetting to something more reasonable (5 sec)"), iTimeout); iTimeout = 5; KVI_OPTION_UINT(KviOption_uintNotifyListCheckTimeInSecs) = 5; } m_iRestartTimer = startTimer(iTimeout * 1000); } else sendIsOn(); return true; }
bool KviIsOnNotifyListManager::doMatchUser(const QString & notifyString, const KviIrcMask & mask) { const auto i = m_pRegUserDict.find(notifyString); if(i != m_pRegUserDict.end()) { const QString & nam = i->second; // ok... find the user if(KviRegisteredUser * u = g_pRegisteredUserDataBase->findUserByName(nam)) { // ok... match the user if(u->matchesFixed(mask)) { // new user online if(!(m_pConsole->notifyListView()->findEntry(mask.nick()))) { notifyOnLine(mask.nick(), mask.user(), mask.host()); } // else already online, and matching... all ok } else { // not matched.... has he been online before ? if(m_pConsole->notifyListView()->findEntry(mask.nick())) { // has been online just a sec ago, but now the mask does not match // either reguserdb has changed, or the user went offline and another one got his nick // in the meantime... (ugly situation anyway) notifyOffLine(mask.nick(), mask.user(), mask.host(), __tr2qs("registration mask changed, or nickname is being used by someone else")); } else { // has never been online if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: \r!n\r%Q\r appears to be online, but the mask [%Q@\r!h\r%Q\r] does not match (registration mask does not match, or nickname is being used by someone else)"), &(mask.nick()), &(mask.user()), &(mask.host())); } } } else { // oops... unexpected inconsistency.... reguser db modified ? m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, registered user DB modified? (restarting)")); stop(); start(); return false; // critical... exit from the call stack } } else { // oops... unexpected inconsistency m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, expected \r!n\r%Q\r in the registered user DB"), ¬ifyString); } return true; }
bool KviWatchNotifyListManager::doMatchUser(KviIrcMessage * msg, const QString & notifyString, const KviIrcMask & mask) { QString * nam = m_pRegUserDict->find(notifyString); if(nam) { // ok...find the user if(KviRegisteredUser * u = g_pRegisteredUserDataBase->findUserByName(*nam)) { // ok ... match the user if(u->matchesFixed(mask)) { // new user online if(!(m_pConsole->notifyListView()->findEntry(mask.nick()))) { notifyOnLine(mask.nick(), mask.user(), mask.host(), "watch"); } else { // else already online, and matching...all ok if(msg->numeric() == RPL_NOWON) { // This is a reply to a /watch +something (should not happen, unless the user is messing) or to /watch l (user requested) notifyOnLine(mask.nick(), mask.user(), mask.host(), __tr2qs("watch entry listing requested by user"), false); } else { // This is a RPL_LOGON....we're desynched ? notifyOnLine(mask.nick(), mask.user(), mask.host(), __tr2qs("possible watch list desync"), false); } } } else { // not matched.... has he been online before ? if(m_pConsole->notifyListView()->findEntry(mask.nick())) { // has been online just a sec ago, but now the mask does not match // prolly the reguserdb has been changed notifyOffLine(mask.nick(), mask.user(), mask.host(), __tr2qs("registration mask changed or desync with the watch service")); } else { // has never been online if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr("Notify list: \r!n\r%Q\r appears to be online, but the mask [%Q@\r!h\r%Q\r] does not match (watch: registration mask does not match, or nickname is being used by someone else)"), &(mask.nick()), &(mask.user()), &(mask.host())); } } } else { // ops... unexpected inconsistency .... reguser db modified ? m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, registered user DB modified? (watch: restarting)")); stop(); start(); return false; // critical ... exit from the call stack } } else { // not in our dictionary // prolly someone used /WATCH behind our back... bad boy! if(!(m_pConsole->notifyListView()->findEntry(mask.nick()))) { notifyOnLine(mask.nick(), mask.user(), mask.host(), __tr2qs("watch entry added by user")); } } return true; }