}
User *InspIRCd::FindUUID(const std::string &uid)
-{
- return FindUUID(uid.c_str());
-}
-
-User *InspIRCd::FindUUID(const char *uid)
{
user_hash::iterator finduuid = this->Users->uuidlist->find(uid);
return finduuid->second;
}
+User *InspIRCd::FindUUID(const char *uid)
+{
+ return FindUUID(std::string(uid));
+}
+
/* find a channel record by channel name and return a pointer to it */
Channel* InspIRCd::FindChan(const char* chan)
{
/* Send an error notice to all users, registered or not */
void InspIRCd::SendError(const std::string &s)
{
- for (std::vector<LocalUser*>::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
+ for (LocalUserList::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
{
User* u = *i;
if (u->registered == REG_ALL)
return true;
}
-/* true for valid channel name, false else */
-bool IsChannelHandler::Call(const char *chname, size_t max)
+void InspIRCd::StripColor(std::string &sentence)
{
- const char *c = chname + 1;
+ /* refactor this completely due to SQUIT bug since the old code would strip last char and replace with \0 --peavey */
+ int seq = 0;
- /* check for no name - don't check for !*chname, as if it is empty, it won't be '#'! */
- if (!chname || *chname != '#')
+ for (std::string::iterator i = sentence.begin(); i != sentence.end();)
{
- return false;
+ if (*i == 3)
+ seq = 1;
+ else if (seq && (( ((*i >= '0') && (*i <= '9')) || (*i == ',') ) ))
+ {
+ seq++;
+ if ( (seq <= 4) && (*i == ',') )
+ seq = 1;
+ else if (seq > 3)
+ seq = 0;
+ }
+ else
+ seq = 0;
+
+ if (seq || ((*i == 2) || (*i == 15) || (*i == 22) || (*i == 21) || (*i == 31)))
+ i = sentence.erase(i);
+ else
+ ++i;
}
+}
- while (*c)
+void InspIRCd::ProcessColors(file_cache& input)
+{
+ /*
+ * 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
+ */
+ static struct special_chars
{
- switch (*c)
+ 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 = input.begin(), it_end = input.end(); it != it_end; it++)
+ {
+ std::string ret = *it;
+ for(int i = 0; special[i].character.empty() == false; ++i)
{
- case ' ':
- case ',':
- case 7:
- return false;
+ 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());
+ }
}
- c++;
+ // 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;
}
+}
- size_t len = c - chname;
- /* too long a name - note funky pointer arithmetic here. */
- if (len > max)
+/* true for valid channel name, false else */
+bool IsChannelHandler::Call(const std::string& chname, size_t max)
+{
+ if (chname.empty() || chname.length() > max)
+ return false;
+
+ if (chname[0] != '#')
+ return false;
+
+ for (std::string::const_iterator i = chname.begin()+1; i != chname.end(); ++i)
{
- return false;
+ switch (*i)
+ {
+ case ' ':
+ case ',':
+ case 7:
+ return false;
+ }
}
return true;
}
/* true for valid nickname, false else */
-bool IsNickHandler::Call(const char* n, size_t max)
+bool IsNickHandler::Call(const std::string& n, size_t max)
{
- if (!n || !*n)
+ if (n.empty() || n.length() > max)
return false;
- unsigned int p = 0;
- for (const char* i = n; *i; i++, p++)
+ for (std::string::const_iterator i = n.begin(); i != n.end(); ++i)
{
if ((*i >= 'A') && (*i <= '}'))
{
continue;
}
- if ((((*i >= '0') && (*i <= '9')) || (*i == '-')) && (i > n))
+ if ((((*i >= '0') && (*i <= '9')) || (*i == '-')) && (i != n.begin()))
{
/* "0"-"9", "-" can occur anywhere BUT the first char of a nickname */
continue;
return false;
}
- /* too long? or not -- pointer arithmetic rocks */
- return (p < max);
+ return true;
}
/* return true for good ident, false else */
-bool IsIdentHandler::Call(const char* n)
+bool IsIdentHandler::Call(const std::string& n)
{
- if (!n || !*n)
+ if (n.empty())
return false;
- for (const char* i = n; *i; i++)
+ for (std::string::const_iterator i = n.begin(); i != n.end(); ++i)
{
if ((*i >= 'A') && (*i <= '}'))
{
return true;
}
-bool IsSIDHandler::Call(const std::string &str)
+bool InspIRCd::IsSID(const std::string &str)
{
/* Returns true if the string given is exactly 3 characters long,
* starts with a digit, and the other two characters are A-Z or digits
}
FileWriter* fw = new FileWriter(startup);
- FileLogStream *f = new FileLogStream((Config->cmdline.forcedebug ? DEBUG : DEFAULT), fw);
+ FileLogStream *f = new FileLogStream((Config->cmdline.forcedebug ? LOG_DEBUG : LOG_DEFAULT), fw);
this->Logs->AddLogType("*", f, true);
if (geteuid() == 0)
{
std::cout << "ERROR: You are running an irc server as root! DO NOT DO THIS!" << std::endl << std::endl;
- this->Logs->Log("STARTUP",DEFAULT,"Can't start as root");
+ this->Logs->Log("STARTUP",LOG_DEFAULT,"Can't start as root");
Exit(EXIT_STATUS_ROOT);
}
#endif
/** Refactored by Brain, Jun 2009. Much faster with some clever O(1) array
* lookups and pointer maths.
*/
-long InspIRCd::Duration(const std::string &str)
+unsigned long InspIRCd::Duration(const std::string &str)
{
unsigned char multiplier = 0;
long total = 0;
return std::string(ctime(&curtime),24);
}
-// You should only pass a single character to this.
-void InspIRCd::AddExtBanChar(char c)
-{
- std::string &tok = Config->data005;
- std::string::size_type ebpos = tok.find(" EXTBAN=,");
-
- if (ebpos == std::string::npos)
- {
- tok.append(" EXTBAN=,");
- tok.push_back(c);
- }
- else
- {
- ebpos += 9;
- while (isalpha(tok[ebpos]) && tok[ebpos] < c)
- ebpos++;
- tok.insert(ebpos, 1, c);
- }
-}
-
std::string InspIRCd::GenRandomStr(int length, bool printable)
{
char* buf = new char[length];