]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules.cpp
More cleanup
[user/henk/code/inspircd.git] / src / modules.cpp
index f4ba902826ba31cfe404e9fe8b152d05f6c11b1e..f5129c83724389877f26ce08bb6cf0133fa9b262 100644 (file)
@@ -235,8 +235,8 @@ void                Module::OnPostOper(userrec* user, std::string opertype) { };
 void           Module::OnInfo(userrec* user) { };
 void           Module::OnWhois(userrec* source, userrec* dest) { };
 int            Module::OnUserPreInvite(userrec* source,userrec* dest,chanrec* channel) { return 0; };
-int            Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text) { return 0; };
-int            Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text) { return 0; };
+int            Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text,char status) { return 0; };
+int            Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text,char status) { return 0; };
 int            Module::OnUserPreNick(userrec* user, std::string newnick) { return 0; };
 void           Module::OnUserPostNick(userrec* user, std::string oldnick) { };
 int            Module::OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) { return ACR_DEFAULT; };
@@ -271,9 +271,9 @@ void                Module::OnRawSocketAccept(int fd, std::string ip, int localport) { };
 int            Module::OnRawSocketWrite(int fd, char* buffer, int count) { return 0; };
 void           Module::OnRawSocketClose(int fd) { };
 int            Module::OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult) { return 0; };
-void           Module::OnUserMessage(userrec* user, void* dest, int target_type, std::string text) { };
+void           Module::OnUserMessage(userrec* user, void* dest, int target_type, std::string text, char status) { };
 void           Module::OnUserNotice(userrec* user, void* dest, int target_type, std::string text, char status) { };
-void           Module::OnRemoteKill(userrec* source, userrec* dest, std::string reason, char status) { };
+void           Module::OnRemoteKill(userrec* source, userrec* dest, std::string reason) { };
 void           Module::OnUserInvite(userrec* source,userrec* dest,chanrec* channel) { };
 void           Module::OnPostLocalTopicChange(userrec* user, chanrec* chan, std::string topic) { };
 void           Module::OnGetServerDescription(std::string servername,std::string &description) { };
@@ -302,6 +302,8 @@ void                Module::OnCleanup(int target_type, void* item) { };
 void           Module::Implements(char* Implements) { for (int j = 0; j < 255; j++) Implements[j] = 0; };
 void           Module::OnChannelDelete(chanrec* chan) { };
 Priority       Module::Prioritize() { return PRIORITY_DONTCARE; }
+void           Module::OnSetAway(userrec* user) { };
+void           Module::OnCancelAway(userrec* user) { };
 
 /* server is a wrapper class that provides methods to all of the C-style
  * exports in the core
@@ -389,6 +391,34 @@ void Server::DelSocket(InspSocket* sock)
        }
 }
 
+long Server::GetChannelCount()
+{
+       return (long)chanlist.size();
+}
+
+/* This is ugly, yes, but hash_map's arent designed to be
+ * addressed in this manner, and this is a bit of a kludge.
+ * Luckily its a specialist function and rarely used by
+ * many modules (in fact, it was specially created to make
+ * m_safelist possible, initially).
+ */
+
+chanrec* Server::GetChannelIndex(long index)
+{
+       int target = 0;
+       for (chan_hash::iterator n = chanlist.begin(); n != chanlist.end(); n++, target++)
+       {
+               if (index == target)
+                       return n->second;
+       }
+       return NULL;
+}
+
+void Server::AddTimer(InspTimer* T)
+{
+       ::AddTimer(T);
+}
+
 void Server::SendOpers(std::string s)
 {
        WriteOpers("%s",s.c_str());
@@ -421,12 +451,9 @@ chanuserlist Server::GetUsers(chanrec* chan)
 {
        chanuserlist userl;
        userl.clear();
-       std::map<char*,char*> *list = chan->GetUsers();
-       for (std::map<char*,char*>::iterator i = list->begin(); i != list->end(); i++)
-       {
-               char* o = i->second;
-               userl.push_back((userrec*)o);
-       }
+       CUList *list = chan->GetUsers();
+       for (CUList::iterator i = list->begin(); i != list->end(); i++)
+               userl.push_back(i->second);
        return userl;
 }
 void Server::ChangeUserNick(userrec* user, std::string nickname)
@@ -456,9 +483,9 @@ bool Server::IsUlined(std::string server)
        return is_uline(server.c_str());
 }
 
-void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
+bool Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
 {
-       ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user);
+       return ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user);
 }
 
 bool Server::IsValidModuleCommand(std::string commandname, int pcnt, userrec* user)
@@ -473,7 +500,11 @@ void Server::Log(int level, std::string s)
 
 void Server::AddCommand(command_t *f)
 {
-       ServerInstance->Parser->CreateCommand(f);
+       if (!ServerInstance->Parser->CreateCommand(f))
+       {
+               ModuleException err("Command "+std::string(f->command)+" already exists.");
+               throw (err);
+       }
 }
 
 void Server::SendMode(char **parameters, int pcnt, userrec *user)
@@ -501,7 +532,7 @@ void Server::SendTo(userrec* Source, userrec* Dest, std::string s)
        if (!Source)
        {
                // if source is NULL, then the message originates from the local server
-               Write(Dest->fd,":%s %s",this->GetServerName().c_str(),s.c_str());
+               WriteServ_NoFormat(Dest->fd,s.c_str());
        }
        else
        {
@@ -532,6 +563,22 @@ bool Server::CommonChannels(userrec* u1, userrec* u2)
        return (common_channels(u1,u2) != 0);
 }
 
+void Server::DumpText(userrec* User, std::string LinePrefix, stringstream &TextStream)
+{
+       std::string CompleteLine = LinePrefix;
+       std::string Word = "";
+       while (TextStream >> Word)
+       {
+               if (CompleteLine.length() + Word.length() + 3 > 500)
+               {
+                       WriteServ_NoFormat(User->fd,CompleteLine.c_str());
+                       CompleteLine = LinePrefix;
+               }
+               CompleteLine = CompleteLine + Word + " ";
+       }
+       WriteServ_NoFormat(User->fd,CompleteLine.c_str());
+}
+
 void Server::SendCommon(userrec* User, std::string text,bool IncludeSender)
 {
        if (IncludeSender)
@@ -584,11 +631,6 @@ std::string Server::ChanMode(userrec* User, chanrec* Chan)
        return cmode(User,Chan);
 }
 
-bool Server::IsOnChannel(userrec* User, chanrec* Chan)
-{
-       return has_channel(User,Chan);
-}
-
 std::string Server::GetServerName()
 {
        return Config->ServerName;
@@ -617,24 +659,28 @@ bool Server::AddExtendedMode(char modechar, int type, bool requires_oper, int pa
        {
                if (type == MT_SERVER)
                {
-                       log(DEBUG,"*** API ERROR *** Modes of type MT_SERVER are reserved for future expansion");
+                       ModuleException e("Modes of type MT_SERVER are reserved for future expansion");
+                       throw(e);
                        return false;
                }
                if (((params_when_on>0) || (params_when_off>0)) && (type == MT_CLIENT))
                {
-                       log(DEBUG,"*** API ERROR *** Parameters on MT_CLIENT modes are not supported");
+                       ModuleException e("Parameters on MT_CLIENT modes are not supported");
+                       throw(e);
                        return false;
                }
                if ((params_when_on>1) || (params_when_off>1))
                {
-                       log(DEBUG,"*** API ERROR *** More than one parameter for an MT_CHANNEL mode is not yet supported");
+                       ModuleException e("More than one parameter for an MT_CHANNEL mode is not yet supported");
+                       throw(e);
                        return false;
                }
                return DoAddExtendedMode(modechar,type,requires_oper,params_when_on,params_when_off);
        }
        else
        {
-               log(DEBUG,"*** API ERROR *** Muppet modechar detected.");
+               ModuleException e("Muppet modechar detected.");
+               throw(e);
        }
        return false;
 }
@@ -776,26 +822,26 @@ long Server::CalcDuration(std::string delta)
 
 bool Server::IsValidMask(std::string mask)
 {
-       const char* dest = mask.c_str();
+       char* dest = (char*)mask.c_str();
         if (strchr(dest,'!')==0)
                 return false;
         if (strchr(dest,'@')==0)
                 return false;
-        for (unsigned int i = 0; i < strlen(dest); i++)
-                if (dest[i] < 32)
+        for (char* i = dest; *i; i++)
+                if (*i < 32)
                         return false;
-        for (unsigned int i = 0; i < strlen(dest); i++)
-                if (dest[i] > 126)
+        for (char* i = dest; *i; i++)
+                if (*i > 126)
                         return false;
         unsigned int c = 0;
-        for (unsigned int i = 0; i < strlen(dest); i++)
-                if (dest[i] == '!')
+        for (char* i = dest; *i; i++)
+                if (*i == '!')
                         c++;
         if (c>1)
                 return false;
         c = 0;
-        for (unsigned int i = 0; i < strlen(dest); i++)
-                if (dest[i] == '@')
+        for (char* i = dest; *i; i++)
+                if (*i == '@')
                         c++;
         if (c>1)
                 return false;
@@ -891,9 +937,9 @@ long ConfigReader::ReadInteger(std::string tag, std::string name, int index, boo
                this->error = CONF_VALUE_NOT_FOUND;
                return 0;
        }
-       for (unsigned int i = 0; i < strlen(val); i++)
+       for (char* i = val; *i; i++)
        {
-               if (!isdigit(val[i]))
+               if (!isdigit(*i))
                {
                        this->error = CONF_NOT_A_NUMBER;
                        return 0;