X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhelperfuncs.cpp;h=439320c1e00d85334c29d3da845357b246d11cfa;hb=748b3a0d89e7ecc9a766471b79fb78f63a5ca2bb;hp=3efa58bba44150c111d2e109ab5f14d6cb6f39e6;hpb=3479532178c73ae47da4729865e5bfc91a299027;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 3efa58bba..439320c1e 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -100,11 +100,6 @@ User* InspIRCd::FindNickOnly(const char* nick) } 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); @@ -114,6 +109,11 @@ User *InspIRCd::FindUUID(const char *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) { @@ -140,7 +140,7 @@ Channel* InspIRCd::FindChan(const std::string &chan) /* Send an error notice to all users, registered or not */ void InspIRCd::SendError(const std::string &s) { - for (std::vector::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) @@ -223,6 +223,63 @@ void InspIRCd::StripColor(std::string &sentence) } } +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 + { + 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) + { + 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; + } +} + /* true for valid channel name, false else */ bool IsChannelHandler::Call(const char *chname, size_t max) { @@ -282,8 +339,8 @@ bool IsNickHandler::Call(const char* n, size_t max) return false; } - /* too long? or not -- pointer arithmetic rocks */ - return (p < max); + /* too long? or not */ + return (p <= max); } /* return true for good ident, false else */ @@ -438,7 +495,26 @@ bool InspIRCd::SilentULine(const std::string& sserver) std::string InspIRCd::TimeString(time_t curtime) { - return std::string(ctime(&curtime),24); +#ifdef _WIN32 + if (curtime < 0) + curtime = 0; +#endif + + struct tm* timeinfo = localtime(&curtime); + if (!timeinfo) + { + curtime = 0; + timeinfo = localtime(&curtime); + } + + // If the calculated year exceeds four digits or is less than the year 1000, + // the behavior of asctime() is undefined + if (timeinfo->tm_year + 1900 > 9999) + timeinfo->tm_year = 9999 - 1900; + else if (timeinfo->tm_year + 1900 < 1000) + timeinfo->tm_year = 0; + + return std::string(asctime(timeinfo),24); } // You should only pass a single character to this.