/** * @file fskeywords.cpp * * $LicenseInfo:firstyear=2011&license=fsviewerlgpl$ * Phoenix Firestorm Viewer Source Code * Copyright (C) 2011, The Phoenix Firestorm Project, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA * http://www.firestormviewer.org * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "fscommon.h" #include "fskeywords.h" #include "growlmanager.h" #include "llagent.h" #include "llchat.h" #include "llinstantmessage.h" #include "llmutelist.h" #include "llui.h" #include "llviewercontrol.h" #include FSKeywords::FSKeywords() { gSavedPerAccountSettings.getControl("FSKeywords")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this)); gSavedPerAccountSettings.getControl("FSKeywordCaseSensitive")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this)); gSavedPerAccountSettings.getControl("FSKeywordMatchWholeWords")->getSignal()->connect(boost::bind(&FSKeywords::updateKeywords, this)); updateKeywords(); } FSKeywords::~FSKeywords() { } void FSKeywords::updateKeywords() { bool match_whole_words = gSavedPerAccountSettings.getBOOL("FSKeywordMatchWholeWords"); std::string s = gSavedPerAccountSettings.getString("FSKeywords"); if (!gSavedPerAccountSettings.getBOOL("FSKeywordCaseSensitive")) { LLStringUtil::toLower(s); } boost::regex re(","); boost::sregex_token_iterator begin(s.begin(), s.end(), re, -1), end; mWordList.clear(); while (begin != end) { std::string token(*begin++); LLStringUtil::trim(token); if (match_whole_words) { mWordList.push_back(boost::regex_replace(token, boost::regex("[.^$|()\\[\\]{}*+?\\\\]"), "\\\\&", boost::match_default|boost::format_sed)); } else { mWordList.push_back(token); } } } bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local) { // Don't check if message is from us - unless it's a radar notification if (chat.mFromID == gAgentID && chat.mFromName != SYSTEM_FROM) { return false; } static LLCachedControl sFSKeywordOn(gSavedPerAccountSettings, "FSKeywordOn", false); static LLCachedControl sFSKeywordInChat(gSavedPerAccountSettings, "FSKeywordInChat", false); static LLCachedControl sFSKeywordInIM(gSavedPerAccountSettings, "FSKeywordInIM", false); if (!sFSKeywordOn || (is_local && !sFSKeywordInChat) || (!is_local && !sFSKeywordInIM)) { return false; } static LLCachedControl sFSKeywordSpeakersName(gSavedPerAccountSettings, "FSKeywordSpeakersName", false); std::string source; if (sFSKeywordSpeakersName) { source = chat.mFromName + " " + chat.mText; } else { source = chat.mText; } static LLCachedControl sFSKeywordCaseSensitive(gSavedPerAccountSettings, "FSKeywordCaseSensitive", false); if (!sFSKeywordCaseSensitive) { LLStringUtil::toLower(source); } static LLCachedControl sFSKeywordMatchWholeWords(gSavedPerAccountSettings, "FSKeywordMatchWholeWords", false); if (sFSKeywordMatchWholeWords) { for (const auto& word : mWordList) { if (boost::regex_search(source, boost::regex("\\b" + word + "\\b"))) { return true; } } } else { for (const auto& word : mWordList) { if (source.find(word) != std::string::npos) { return true; } } } return false; } // FIRE-10178: Keyword Alerts in group IM do not work unless the group is in the foreground void FSKeywords::notify(const LLChat& chat) { if ((chat.mFromID != gAgentID || chat.mFromName == SYSTEM_FROM) && !chat.mMuted && !LLMuteList::getInstance()->isMuted(chat.mFromID)) { static LLCachedControl PlayModeUISndFSKeywordSound(gSavedPerAccountSettings, "PlayModeUISndFSKeywordSound"); if (PlayModeUISndFSKeywordSound) { LLUI::getInstance()->mAudioCallback(LLUUID(gSavedPerAccountSettings.getString("UISndFSKeywordSound"))); } static LLCachedControl FSEnableGrowl(gSavedSettings, "FSEnableGrowl"); if (FSEnableGrowl) { std::string msg = chat.mFromName; if (FSCommon::is_irc_me_prefix(chat.mText)) { msg = msg + chat.mText.substr(3); } else { msg = msg + ": " + chat.mText; } GrowlManager::notify("Keyword Alert", msg, GROWL_KEYWORD_ALERT_TYPE); } } } //