mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 11:09:04 -04:00
Merge pull request #127 from Justasic/insp20+color
[2.0] Added processing of color codes into /rules
This commit is contained in:
commit
e57ab366e6
@ -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">
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user