diff options
Diffstat (limited to 'src/configreader.cpp')
-rw-r--r-- | src/configreader.cpp | 81 |
1 files changed, 80 insertions, 1 deletions
diff --git a/src/configreader.cpp b/src/configreader.cpp index b0bb6a92f..166e124ca 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -436,8 +436,11 @@ static const Deprecated ChangedConfig[] = { {"options", "somaxconn", "has been moved to <performance:somaxconn> as of 1.2a3"}, {"options", "netbuffersize", "has been moved to <performance:netbuffersize> as of 1.2a3"}, {"options", "maxwho", "has been moved to <performance:maxwho> as of 1.2a3"}, - {"options", "loglevel", "1.2 does not use the loglevel value. Please define <log> tags instead."}, + {"options", "loglevel", "1.2+ does not use the loglevel value. Please define <log> tags instead."}, {"die", "value", "you need to reread your config"}, + {"bind", "transport", "has been moved to <bind:ssl> as of 2.0a1"}, + {"link", "transport", "has been moved to <link:ssl> as of 2.0a1"}, + }; void ServerConfig::Fill() @@ -720,6 +723,24 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) errstr.clear(); errstr.str(std::string()); + // Re-parse our MOTD and RULES files for colors -- Justasic + for (ClassVector::const_iterator it = this->Classes.begin(), it_end = this->Classes.end(); it != it_end; ++it) + { + ConfigTag *tag = (*it)->config; + // Make sure our connection class allows motd colors + if(!tag->getBool("allowmotdcolors")) + continue; + + ConfigFileCache::iterator motdfile = this->Files.find(tag->getString("motd", "motd")); + ConfigFileCache::iterator rulesfile = this->Files.find(tag->getString("rules", "rules")); + + if(motdfile != this->Files.end()) + this->ProcessColors(motdfile); + + if(rulesfile != this->Files.end()) + this->ProcessColors(rulesfile); + } + /* No old configuration -> initial boot, nothing more to do here */ if (!old) { @@ -731,6 +752,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) return; } + // If there were errors processing configuration, don't touch modules. if (!valid) return; @@ -837,6 +859,63 @@ ConfigTagList ServerConfig::ConfTags(const std::string& tag) return config_data.equal_range(tag); } +/* + * Replace all color codes from the special[] array to actual + * color code chars using C++ style escape sequences. You + * can append other chars to replace if you like -- Justasic + */ +void ServerConfig::ProcessColors(ConfigFileCache::iterator &file) +{ + static struct special_chars + { + std::string character; + std::string replace; + special_chars(const std::string &c, const std::string &r) : character(c), replace(r) { } + } + + special[] = { + special_chars("\\002", "\002"), // Bold + special_chars("\\037", "\037"), // underline + special_chars("\\003", "\003"), // Color + special_chars("\\017", "\017"), // Stop colors + special_chars("\\u", "\037"), // Alias for underline + special_chars("\\b", "\002"), // Alias for Bold + special_chars("\\x", "\017"), // Alias for stop + special_chars("\\c", "\003"), // Alias for color + special_chars("", "") + }; + + for(file_cache::iterator it = file->second.begin(), it_end = file->second.end(); it != it_end; it++) + { + std::string ret = *it; + for(int i = 0; special[i].character.empty() == false; ++i) + { + std::string::size_type pos = ret.find(special[i].character); + if(pos == std::string::npos) // Couldn't find the character, skip this line + continue; + + if((pos > 0) && (ret[pos-1] == '\\') && (ret[pos] == '\\')) + continue; // Skip double slashes. + + // Replace all our characters in the array + while(pos != std::string::npos) + { + ret = ret.substr(0, pos) + special[i].replace + ret.substr(pos + special[i].character.size()); + pos = ret.find(special[i].character, pos + special[i].replace.size()); + } + } + + // Replace double slashes with a single slash before we return + std::string::size_type pos = ret.find("\\\\"); + while(pos != std::string::npos) + { + ret = ret.substr(0, pos) + "\\" + ret.substr(pos + 2); + pos = ret.find("\\\\", pos + 1); + } + *it = ret; + } +} + bool ServerConfig::FileExists(const char* file) { struct stat sb; |