Added color codes to /rules, moved the parsing to ServerConfig and cleaned the code up a bit

This commit is contained in:
Justin Crawford 2012-05-16 15:56:38 -07:00
parent def08e968b
commit c79475caa8
6 changed files with 90 additions and 69 deletions

View File

@ -297,6 +297,14 @@
# specified using <files secretmotd="filename"> or <execfiles ...>
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">

View File

@ -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);

View File

@ -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.

View File

@ -30,7 +30,7 @@ class CommandMotd : public Command
public:
/** Constructor for motd.
*/
CommandMotd ( Module* parent) : Command(parent,"MOTD",0,1) { ServerInstance->ProcessedMotdEscapes = false; syntax = "[<servername>]"; }
CommandMotd ( Module* parent) : Command(parent,"MOTD",0,1) { syntax = "[<servername>]"; }
/** 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<std::string>& parameters, User *user)
@ -120,12 +65,6 @@ CmdResult CommandMotd::Handle (const std::vector<std::string>& 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());

View File

@ -88,8 +88,6 @@ CmdResult CommandRehash::Handle (const std::vector<std::string>& 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());

View File

@ -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;