From c79475caa82104e82f9a914b7673bd61f7a1f01f Mon Sep 17 00:00:00 2001 From: Justin Crawford Date: Wed, 16 May 2012 15:56:38 -0700 Subject: Added color codes to /rules, moved the parsing to ServerConfig and cleaned the code up a bit --- docs/conf/inspircd.conf.example | 8 +++++ include/configreader.h | 6 +++- include/inspircd.h | 4 --- src/commands/cmd_motd.cpp | 63 +--------------------------------- src/commands/cmd_rehash.cpp | 2 -- src/configreader.cpp | 76 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 90 insertions(+), 69 deletions(-) diff --git a/docs/conf/inspircd.conf.example b/docs/conf/inspircd.conf.example index d1293be25..f483e6692 100644 --- a/docs/conf/inspircd.conf.example +++ b/docs/conf/inspircd.conf.example @@ -297,6 +297,14 @@ # specified using or motd="secretmotd" + # Allow color codes to be processed in the message of the day file. + # the following characters are valid color code escapes: + # \002 or \b = Bold + # \037 or \u = Underline + # \003 or \c = Color (with a code postfixed to this char) + # \017 or \x = Stop all color sequences + allowmotdcolors="false" + # port: What port this user is allowed to connect on. (optional) # The port MUST be set to listen in the bind blocks above. port="6697"> diff --git a/include/configreader.h b/include/configreader.h index 509ff9c0c..e360d3917 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -568,7 +568,11 @@ class CoreExport ServerConfig void Fill(); - /* Returns true if the given string starts with a windows drive letter + /** Parses color codes from string values to actual color codes + */ + void ProcessColors(ConfigFileCache::iterator &file); + + /** Returns true if the given string starts with a windows drive letter */ bool StartsWithWindowsDriveLetter(const std::string &path); diff --git a/include/inspircd.h b/include/inspircd.h index 2f6fb01f7..78e0c1b3e 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -460,10 +460,6 @@ class CoreExport InspIRCd */ LocalStringExt OperQuit; - /** Holds whether the MOTD has been parsed for color codes - */ - bool ProcessedMotdEscapes; - /** Get the current time * Because this only calls time() once every time around the mainloop, * it is much faster than calling time() directly. diff --git a/src/commands/cmd_motd.cpp b/src/commands/cmd_motd.cpp index 9a236137d..8e227723e 100644 --- a/src/commands/cmd_motd.cpp +++ b/src/commands/cmd_motd.cpp @@ -30,7 +30,7 @@ class CommandMotd : public Command public: /** Constructor for motd. */ - CommandMotd ( Module* parent) : Command(parent,"MOTD",0,1) { ServerInstance->ProcessedMotdEscapes = false; syntax = "[]"; } + CommandMotd ( Module* parent) : Command(parent,"MOTD",0,1) { syntax = "[]"; } /** Handle command. * @param parameters The parameters to the comamnd * @param pcnt The number of parameters passed to teh command @@ -46,61 +46,6 @@ class CommandMotd : public Command } }; -/* - * 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 (such as %U - * being underline). -- Justasic - */ -void 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("\\0017", "\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 != file->second.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 && 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; - } -} - /** Handle /MOTD */ CmdResult CommandMotd::Handle (const std::vector& parameters, User *user) @@ -120,12 +65,6 @@ CmdResult CommandMotd::Handle (const std::vector& parameters, User return CMD_SUCCESS; } - if(!ServerInstance->ProcessedMotdEscapes) - { - ProcessColors(motd); - ServerInstance->ProcessedMotdEscapes = true; - } - user->SendText(":%s %03d %s :%s message of the day", ServerInstance->Config->ServerName.c_str(), RPL_MOTDSTART, user->nick.c_str(), ServerInstance->Config->ServerName.c_str()); diff --git a/src/commands/cmd_rehash.cpp b/src/commands/cmd_rehash.cpp index 2026e7a00..1fa6e5731 100644 --- a/src/commands/cmd_rehash.cpp +++ b/src/commands/cmd_rehash.cpp @@ -88,8 +88,6 @@ CmdResult CommandRehash::Handle (const std::vector& parameters, Use /* Don't do anything with the logs here -- logs are restarted * after the config thread has completed. */ - - ServerInstance->ProcessedMotdEscapes = false; // Reprocess our motd file --Justasic ServerInstance->RehashUsersAndChans(); FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect()); diff --git a/src/configreader.cpp b/src/configreader.cpp index 1e6d96d0d..166e124ca 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -723,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) { @@ -734,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; @@ -840,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; -- cgit v1.2.3