]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/helperfuncs.cpp
Put back different stats numerics for /stats g, /stats k etc
[user/henk/code/inspircd.git] / src / helperfuncs.cpp
index a90dd01050063f5d83605c5cf326f65bfd29e968..a1d40cc5fabe1932b4e05a7d4cb5bf3958fddead 100644 (file)
@@ -11,6 +11,8 @@
  * ---------------------------------------------------
  */
 
+/* $Core: libIRCDhelper */
+
 #include "inspircd.h"
 #include <stdarg.h>
 #include "wildcard.h"
@@ -360,12 +362,6 @@ int InspIRCd::ModeCount(const char mode)
                return 0;
 }
 
-/* wrapper for readability */
-int InspIRCd::InvisibleUserCount()
-{
-       return ModeCount('i');
-}
-
 /* return how many users are opered */
 int InspIRCd::OperCount()
 {
@@ -391,6 +387,38 @@ long InspIRCd::LocalUserCount()
        return (local_users.size() - this->UnregisteredUserCount());
 }
 
+bool InspIRCd::IsValidMask(const std::string &mask)
+{
+       char* dest = (char*)mask.c_str();
+       int exclamation = 0;
+       int atsign = 0;
+
+       for (char* i = dest; *i; i++)
+       {
+               /* out of range character, bad mask */
+               if (*i < 32 || *i > 126)
+               {
+                       return false;
+               }
+
+               switch (*i)
+               {
+                       case '!':
+                               exclamation++;
+                               break;
+                       case '@':
+                               atsign++;
+                               break;
+               }
+       }
+
+       /* valid masks only have 1 ! and @ */
+       if (exclamation != 1 || atsign != 1)
+               return false;
+
+       return true;
+}
+
 /* true for valid channel name, false else */
 bool InspIRCd::IsChannel(const char *chname)
 {
@@ -479,7 +507,7 @@ bool IsIdentHandler::Call(const char* n)
 }
 
 /* open the proper logfile */
-bool InspIRCd::OpenLog(char** argv, int argc)
+bool InspIRCd::OpenLog(char**, int)
 {
        Config->MyDir = Config->GetFullProgDir();
 
@@ -548,3 +576,70 @@ void InspIRCd::SendWhoisLine(User* user, User* dest, int numeric, const char* fo
 
        this->SendWhoisLine(user, dest, numeric, std::string(textbuffer));
 }
+
+/** Refactored by Brain, Jun 2007. Much faster with some clever O(1) array
+ * lookups and pointer maths.
+ */
+long InspIRCd::Duration(const std::string &str)
+{
+       unsigned char multiplier = 0;
+       long total = 0;
+       long times = 1;
+       long subtotal = 0;
+
+       /* Iterate each item in the string, looking for number or multiplier */
+       for (std::string::const_reverse_iterator i = str.rbegin(); i != str.rend(); ++i)
+       {
+               /* Found a number, queue it onto the current number */
+               if ((*i >= '0') && (*i <= '9'))
+               {
+                       subtotal = subtotal + ((*i - '0') * times);
+                       times = times * 10;
+               }
+               else
+               {
+                       /* Found something thats not a number, find out how much
+                        * it multiplies the built up number by, multiply the total
+                        * and reset the built up number.
+                        */
+                       if (subtotal)
+                               total += subtotal * duration_multi[multiplier];
+
+                       /* Next subtotal please */
+                       subtotal = 0;
+                       multiplier = *i;
+                       times = 1;
+               }
+       }
+       if (multiplier)
+       {
+               total += subtotal * duration_multi[multiplier];
+               subtotal = 0;
+       }
+       /* Any trailing values built up are treated as raw seconds */
+       return total + subtotal;
+}
+
+bool InspIRCd::ULine(const char* server)
+{
+       if (!server)
+               return false;
+       if (!*server)
+               return true;
+
+       return (Config->ulines.find(server) != Config->ulines.end());
+}
+
+bool InspIRCd::SilentULine(const char* server)
+{
+       std::map<irc::string,bool>::iterator n = Config->ulines.find(server);
+       if (n != Config->ulines.end())
+               return n->second;
+       else return false;
+}
+
+std::string InspIRCd::TimeString(time_t curtime)
+{
+       return std::string(ctime(&curtime),24);
+}
+