diff --git a/data/stk_config.xml b/data/stk_config.xml index f691b6175..d04fc1cd4 100644 --- a/data/stk_config.xml +++ b/data/stk_config.xml @@ -36,6 +36,10 @@ Penalty: Penalty time if a kart accelerates before GO. --> <startup penalty="1" /> + <!-- How often a news message is going to be displayed before + it will be ignored. --> + <news max-display="10"/> + <!-- If the normals (for wheel raycasts) should be smoothened --> <physics smooth-normals="false"/> diff --git a/src/addons/network_http.cpp b/src/addons/network_http.cpp index 8dfe106cd..5c6705e98 100644 --- a/src/addons/network_http.cpp +++ b/src/addons/network_http.cpp @@ -236,12 +236,20 @@ void NetworkHttp::updateNews(const XMLNode *xml, const std::string &filename) if(node->getName()!="message") continue; std::string news; node->get("content", &news); + int id=-1; + node->get("id", &id); m_news.lock(); { - NewsMessage n(core::stringw(news.c_str()), - m_news.getData().size()); - m_news.getData().push_back(n); + // While the xml file does not have an id: + if(id==-1) + id = m_news.getData().size(); + // Only add the news if it's not supposed to be ignored. + if(id>UserConfigParams::m_ignore_message_id) + { + NewsMessage n(core::stringw(news.c_str()), id); + m_news.getData().push_back(n); + } } m_news.unlock(); @@ -260,6 +268,8 @@ void NetworkHttp::updateNews(const XMLNode *xml, const std::string &filename) m_news.getData().push_back(n); m_news.unlock(); } + else + updateMessageDisplayCount(); } // updateNews @@ -315,12 +325,31 @@ const core::stringw NetworkHttp::getNextNewsMessage() core::stringw m(""); m_news.lock(); { + // Check if we have a message that was finished being + // displayed --> increase display count. if(m_current_news_message>-1) { - // Now we have a message that was finished being - // displayed --> increase display count. - m_news.getData()[m_current_news_message].increaseDisplayCount(); + NewsMessage &n = m_news.getData()[m_current_news_message]; + n.increaseDisplayCount(); + + // If the message is being displayed often enough, + // ignore it from now on. + if(n.getDisplayCount()>stk_config->m_max_display_news) + { + // Messages have sequential numbers, so we only store + // the latest message id (which is the current one) + UserConfigParams::m_ignore_message_id = n.getMessageId(); + m_news.getData().erase(m_news.getData().begin() + +m_current_news_message ); + + } updateUserConfigFile(); + // + if(m_news.getData().size()==0) + { + m_news.unlock(); + return ""; + } } m_current_news_message++; if(m_current_news_message >= (int)m_news.getData().size()) @@ -334,7 +363,9 @@ const core::stringw NetworkHttp::getNextNewsMessage() // ---------------------------------------------------------------------------- /** Saves the information about which message was being displayed how often - * to the user config file. + * to the user config file. It dnoes not actually save the user config + * file, this is left to the main program (user config is saved at + * the exit of the program). * Note that this function assumes that m_news is already locked! */ void NetworkHttp::updateUserConfigFile() const @@ -346,9 +377,38 @@ void NetworkHttp::updateUserConfigFile() const o << n.getMessageId() << ":" << n.getDisplayCount() << " "; } - UserConfigParams::m_display_count = o.str(); } // updateUserConfigFile + +// ---------------------------------------------------------------------------- +/** Reads the information about which message was dislpayed how often from + * the user config file. + */ +void NetworkHttp::updateMessageDisplayCount() +{ + m_news.lock(); + std::vector<std::string> pairs = + StringUtils::split(UserConfigParams::m_display_count,' '); + for(unsigned int i=0; i<pairs.size(); i++) + { + std::vector<std::string> v = StringUtils::split(pairs[i], ':'); + int id, count; + StringUtils::fromString(v[0], id); + StringUtils::fromString(v[1], count); + // Search all downloaded messages for this id. + for(unsigned int j=0; j<m_news.getData().size(); j++) + { + if(m_news.getData()[j].getMessageId()!=id) + continue; + m_news.getData()[j].setDisplayCount(count); + if(count>stk_config->m_max_display_news) + m_news.getData().erase(m_news.getData().begin()+j); + break; + } // for j <m_news.getData().size() + } + m_news.unlock(); +} // updateMessageDisplayCount + // ---------------------------------------------------------------------------- size_t NetworkHttp::writeStr(char ptr [], size_t size, size_t nb_char, diff --git a/src/addons/network_http.hpp b/src/addons/network_http.hpp index 5c895e96c..76349f62a 100644 --- a/src/addons/network_http.hpp +++ b/src/addons/network_http.hpp @@ -74,6 +74,8 @@ private: int getMessageId() const {return m_message_id;} /** Returns the display count. */ int getDisplayCount() const {return m_display_count; } + /** Sets the display count for this message. */ + void setDisplayCount(int n) {m_display_count = n; } }; // NewsMessage mutable Synchronised< std::vector<NewsMessage> > m_news; @@ -81,6 +83,10 @@ private: /** Index of the current news message that is being displayed. */ int m_current_news_message; + /** Stores the news message display count from the user config file. + */ + std::vector<int> m_saved_display_count; + /** Which command to execute next. Access to this variable is guarded * by m_mutex_command and m_cond_command. */ HttpCommands m_command; @@ -116,6 +122,7 @@ private: void loadAddonsList(const XMLNode *xml, const std::string &filename); std::string downloadToStrInternal(std::string url); + void updateMessageDisplayCount(); bool downloadFileInternal(const std::string &file, const std::string &save_filename, bool is_asynchron); diff --git a/src/config/stk_config.cpp b/src/config/stk_config.cpp index 406eddcd8..143591b4d 100644 --- a/src/config/stk_config.cpp +++ b/src/config/stk_config.cpp @@ -127,6 +127,7 @@ void STKConfig::load(const std::string &filename) CHECK_NEG(m_music_credit_time, "music-credit-time" ); CHECK_NEG(m_leader_time_per_kart, "leader time-per-kart" ); CHECK_NEG(m_penalty_time, "penalty-time" ); + CHECK_NEG(m_max_display_news, "max-display-news" ); m_kart_properties.checkAllSet(filename); } // load @@ -156,6 +157,7 @@ void STKConfig::init_defaults() m_max_kart_version = -100; m_min_track_version = -100; m_max_track_version = -100; + m_max_display_news = -100; m_title_music = NULL; m_enable_networking = true; m_smooth_normals = false; @@ -233,6 +235,11 @@ void STKConfig::getAllData(const XMLNode * root) startup_node->get("penalty", &m_penalty_time ); } + if (const XMLNode *news_node= root->getNode("news")) + { + news_node->get("max-display", &m_max_display_news); + } + if (const XMLNode *music_node = root->getNode("music")) { std::string title_music; diff --git a/src/config/stk_config.hpp b/src/config/stk_config.hpp index 749471da5..ac48c8f1f 100644 --- a/src/config/stk_config.hpp +++ b/src/config/stk_config.hpp @@ -95,6 +95,8 @@ public: m_max_kart_version; /**<version supported by this binary. */ int m_min_track_version, /**<The minimum and maximum .track file */ m_max_track_version; /**<version supported by this binary. */ + int m_max_display_news; /**<How often a news message is displayed + before it is ignored. */ bool m_enable_networking; std::vector<float> diff --git a/src/config/user_config.hpp b/src/config/user_config.hpp index 0418bd7e3..8bbe61516 100644 --- a/src/config/user_config.hpp +++ b/src/config/user_config.hpp @@ -412,7 +412,7 @@ namespace UserConfigParams PARAM_DEFAULT( StringUserConfigParam("Peach.stkskin", "skin_file", "Name of the skin to use") ); // ---- Addon server related entries - PARAM_PREFIX GroupUserConfigParam m_addon_group + PARAM_PREFIX GroupUserConfigParam m_addon_group PARAM_DEFAULT( GroupUserConfigParam("AddonAndNews", "Addon and news related settings") ); @@ -422,7 +422,7 @@ namespace UserConfigParams &m_addon_group, "The server used for addon.") ); - PARAM_PREFIX TimeUserConfigParam m_news_last_updated + PARAM_PREFIX TimeUserConfigParam m_news_last_updated PARAM_DEFAULT( TimeUserConfigParam(0, "news_last_updated", &m_addon_group, "Time news was updated last.") ); @@ -437,22 +437,31 @@ namespace UserConfigParams &m_addon_group, "How often all news messages have been displayed") ); - PARAM_PREFIX TimeUserConfigParam m_addons_last_updated + PARAM_PREFIX IntUserConfigParam m_ignore_message_id + PARAM_DEFAULT( IntUserConfigParam(-1, "ignore_message_id", + &m_addon_group, + "Ignore all messages with this id and lower") ); + + PARAM_PREFIX BoolUserConfigParam m_enable_internet + PARAM_DEFAULT( BoolUserConfigParam(true, "enable_internet", + &m_addon_group, + "Enable news and addons server") ); + + PARAM_PREFIX TimeUserConfigParam m_addons_last_updated PARAM_DEFAULT( TimeUserConfigParam(0, "addon_last_updated", &m_addon_group, "Time addon-list was updated last.") ); - - PARAM_PREFIX StringUserConfigParam m_language + PARAM_PREFIX StringUserConfigParam m_language PARAM_DEFAULT( StringUserConfigParam("system", "language", "Which language to use (language code or 'system')") ); - PARAM_PREFIX BoolUserConfigParam m_artist_debug_mode + PARAM_PREFIX BoolUserConfigParam m_artist_debug_mode PARAM_DEFAULT( BoolUserConfigParam(false, "artist_debug_mode", "Whether to enable track debugging features") ); // TODO? implement blacklist for new irrlicht device and GUI PARAM_PREFIX std::vector<std::string> m_blacklist_res; - PARAM_PREFIX PtrVector<PlayerProfile> m_all_players; + PARAM_PREFIX PtrVector<PlayerProfile> m_all_players; } #undef PARAM_PREFIX