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 ...>
|
# specified using <files secretmotd="filename"> or <execfiles ...>
|
||||||
motd="secretmotd"
|
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)
|
# port: What port this user is allowed to connect on. (optional)
|
||||||
# The port MUST be set to listen in the bind blocks above.
|
# The port MUST be set to listen in the bind blocks above.
|
||||||
port="6697">
|
port="6697">
|
||||||
|
@ -568,7 +568,11 @@ class CoreExport ServerConfig
|
|||||||
|
|
||||||
void Fill();
|
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);
|
bool StartsWithWindowsDriveLetter(const std::string &path);
|
||||||
|
|
||||||
|
@ -460,10 +460,6 @@ class CoreExport InspIRCd
|
|||||||
*/
|
*/
|
||||||
LocalStringExt OperQuit;
|
LocalStringExt OperQuit;
|
||||||
|
|
||||||
/** Holds whether the MOTD has been parsed for color codes
|
|
||||||
*/
|
|
||||||
bool ProcessedMotdEscapes;
|
|
||||||
|
|
||||||
/** Get the current time
|
/** Get the current time
|
||||||
* Because this only calls time() once every time around the mainloop,
|
* Because this only calls time() once every time around the mainloop,
|
||||||
* it is much faster than calling time() directly.
|
* it is much faster than calling time() directly.
|
||||||
|
@ -30,7 +30,7 @@ class CommandMotd : public Command
|
|||||||
public:
|
public:
|
||||||
/** Constructor for motd.
|
/** 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.
|
/** Handle command.
|
||||||
* @param parameters The parameters to the comamnd
|
* @param parameters The parameters to the comamnd
|
||||||
* @param pcnt The number of parameters passed to teh command
|
* @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
|
/** Handle /MOTD
|
||||||
*/
|
*/
|
||||||
CmdResult CommandMotd::Handle (const std::vector<std::string>& parameters, User *user)
|
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;
|
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(),
|
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());
|
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
|
/* Don't do anything with the logs here -- logs are restarted
|
||||||
* after the config thread has completed.
|
* after the config thread has completed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ServerInstance->ProcessedMotdEscapes = false; // Reprocess our motd file --Justasic
|
|
||||||
ServerInstance->RehashUsersAndChans();
|
ServerInstance->RehashUsersAndChans();
|
||||||
FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect());
|
FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect());
|
||||||
|
|
||||||
|
@ -723,6 +723,24 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
|
|||||||
errstr.clear();
|
errstr.clear();
|
||||||
errstr.str(std::string());
|
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 */
|
/* No old configuration -> initial boot, nothing more to do here */
|
||||||
if (!old)
|
if (!old)
|
||||||
{
|
{
|
||||||
@ -734,6 +752,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// If there were errors processing configuration, don't touch modules.
|
// If there were errors processing configuration, don't touch modules.
|
||||||
if (!valid)
|
if (!valid)
|
||||||
return;
|
return;
|
||||||
@ -840,6 +859,63 @@ ConfigTagList ServerConfig::ConfTags(const std::string& tag)
|
|||||||
return config_data.equal_range(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)
|
bool ServerConfig::FileExists(const char* file)
|
||||||
{
|
{
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user