- if (!removed_modules.empty())
- for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
- {
- if (UnloadModule(removing->c_str()))
- {
- WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str());
- WriteServ(user->fd,"973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str());
- rem++;
- }
- else
- {
- WriteServ(user->fd,"972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ModuleError());
- }
- }
- if (!added_modules.empty())
- for (std::vector<std::string>::iterator adding = added_modules.begin(); adding != added_modules.end(); adding++)
- {
- if (LoadModule(adding->c_str()))
- {
- WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str());
- WriteServ(user->fd,"975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str());
- add++;
- }
- else
- {
- WriteServ(user->fd,"974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ModuleError());
- }
- }
- log(DEFAULT,"Successfully unloaded %lu of %lu modules and loaded %lu of %lu modules.",(unsigned long)rem,(unsigned long)removed_modules.size(),(unsigned long)add,(unsigned long)added_modules.size());
- }
-}
-
-/* write formatted text to a socket, in same format as printf */
-
-void Write(int sock,char *text, ...)
-{
- if (sock == FD_MAGIC_NUMBER)
- return;
- if (!text)
- {
- log(DEFAULT,"*** BUG *** Write was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- char tb[MAXBUF];
-
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,"%s\r\n",textbuffer);
- chop(tb);
- if ((sock != -1) && (sock != FD_MAGIC_NUMBER))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes > 512 ? 512 : bytes));
- if (!MOD_RESULT)
- write(sock,tb,bytes > 512 ? 512 : bytes);
- if (fd_ref_table[sock])
- {
- fd_ref_table[sock]->bytes_out += (bytes > 512 ? 512 : bytes);
- fd_ref_table[sock]->cmds_out++;
- }
- statsSent += (bytes > 512 ? 512 : bytes);
- }
-}
-
-/* write a server formatted numeric response to a single socket */
-
-void WriteServ(int sock, char* text, ...)
-{
- if (sock == FD_MAGIC_NUMBER)
- return;
- if (!text)
- {
- log(DEFAULT,"*** BUG *** WriteServ was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
-
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,":%s %s\r\n",ServerName,textbuffer);
- chop(tb);
- if ((sock != -1) && (sock != FD_MAGIC_NUMBER))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes > 512 ? 512 : bytes));
- if (!MOD_RESULT)
- write(sock,tb,bytes > 512 ? 512 : bytes);
- if (fd_ref_table[sock])
- {
- fd_ref_table[sock]->bytes_out += (bytes > 512 ? 512 : bytes);
- fd_ref_table[sock]->cmds_out++;
- }
- statsSent += (bytes > 512 ? 512 : bytes);
- }
-}
-
-/* write text from an originating user to originating user */
-
-void WriteFrom(int sock, userrec *user,char* text, ...)
-{
- if (sock == FD_MAGIC_NUMBER)
- return;
- if ((!text) || (!user))
- {
- log(DEFAULT,"*** BUG *** WriteFrom was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
-
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,":%s!%s@%s %s\r\n",user->nick,user->ident,user->dhost,textbuffer);
- chop(tb);
- if ((sock != -1) && (sock != FD_MAGIC_NUMBER))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes > 512 ? 512 : bytes));
- if (!MOD_RESULT)
- write(sock,tb,bytes > 512 ? 512 : bytes);
- if (fd_ref_table[sock])
- {
- fd_ref_table[sock]->bytes_out += (bytes > 512 ? 512 : bytes);
- fd_ref_table[sock]->cmds_out++;
- }
- statsSent += (bytes > 512 ? 512 : bytes);
- }
-}
-
-/* write text to an destination user from a source user (e.g. user privmsg) */
-
-void WriteTo(userrec *source, userrec *dest,char *data, ...)
-{
- if ((!dest) || (!data))
- {
- log(DEFAULT,"*** BUG *** WriteTo was given an invalid parameter");
- return;
- }
- if (dest->fd == FD_MAGIC_NUMBER)
- return;
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, data);
- vsnprintf(textbuffer, MAXBUF, data, argsPtr);
- va_end(argsPtr);
- chop(tb);
-
- // if no source given send it from the server.
- if (!source)
- {
- WriteServ(dest->fd,":%s %s",ServerName,textbuffer);
- }
- else
- {
- WriteFrom(dest->fd,source,"%s",textbuffer);
- }
-}
-
-/* write formatted text from a source user to all users on a channel
- * including the sender (NOT for privmsg, notice etc!) */
-
-void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!user) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (otheruser->fd != FD_MAGIC_NUMBER)
- WriteTo(user,otheruser,"%s",textbuffer);
- }
-}
-
-/* write formatted text from a source user to all users on a channel
- * including the sender (NOT for privmsg, notice etc!) doesnt send to
- * users on remote servers */
-
-void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser->fd != -1) && (otheruser != user))
- {
- if (!user)
- {
- WriteServ(otheruser->fd,"%s",textbuffer);
- }
- else
- {
- WriteTo(user,otheruser,"%s",textbuffer);
- }
- }
- }
-}
-
-
-void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...)
-{
- if ((!Ptr) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannelWithServ was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
-
- std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (otheruser->fd != FD_MAGIC_NUMBER)
- WriteServ(otheruser->fd,"%s",textbuffer);
- }
-}
-
-
-/* write formatted text from a source user to all users on a channel except
- * for the sender (for privmsg etc) */
-
-void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!user) || (!text))
- {
- log(DEFAULT,"*** BUG *** ChanExceptSender was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd != FD_MAGIC_NUMBER) && (user != otheruser))
- WriteFrom(otheruser->fd,user,"%s",textbuffer);
- }
-}
-
-
-std::string GetServerDescription(char* servername)
-{
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),servername))
- {
- return me[j]->connectors[k].GetDescription();
- }
- }
- }
- return ServerDesc; // not a remote server that can be found, it must be me.
- }
-}
-
-
-/* write a formatted string to all users who share at least one common
- * channel, including the source user e.g. for use in NICK */
-
-void WriteCommon(userrec *u, char* text, ...)
-{
- if (!u)
- {
- log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
- return;
- }
-
- if (u->registered != 7) {
- log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- // FIX: Stops a message going to the same person more than once
- bzero(&already_sent,65536);
-
- bool sent_to_at_least_one = false;
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd > 0) && (!already_sent[otheruser->fd]))
- {
- already_sent[otheruser->fd] = 1;
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
- sent_to_at_least_one = true;
- }
- }
- }
- }
- // if the user was not in any channels, no users will receive the text. Make sure the user
- // receives their OWN message for WriteCommon
- if (!sent_to_at_least_one)
- {
- WriteFrom(u->fd,u,"%s",textbuffer);
- }
-}
-
-/* write a formatted string to all users who share at least one common
- * channel, NOT including the source user e.g. for use in QUIT */
-
-void WriteCommonExcept(userrec *u, char* text, ...)
-{
- if (!u)
- {
- log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
- return;
- }
-
- if (u->registered != 7) {
- log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- bzero(&already_sent,65536);
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (u != otheruser)
- {
- if ((otheruser->fd > 0) && (!already_sent[otheruser->fd]))
- {
- already_sent[otheruser->fd] = 1;
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
- }
- }
- }
- }
- }
-}
-
-void WriteOpers(char* text, ...)
-{
- if (!text)
- {
- log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (std::vector<userrec*>::iterator i = all_opers.begin(); i != all_opers.end(); i++)
- {
- userrec* a = *i;
- if ((a) && (a->fd != FD_MAGIC_NUMBER))
- {
- if (strchr(a->modes,'s'))
- {
- // send server notices to all with +s
- WriteServ(a->fd,"NOTICE %s :%s",a->nick,textbuffer);
- }
- }
- }
-}
-
-void NoticeAllOpers(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** NoticeAllOpers was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (std::vector<userrec*>::iterator i = all_opers.begin(); i != all_opers.end(); i++)
- {
- userrec* a = *i;
- if ((a) && (a->fd != FD_MAGIC_NUMBER))
- {
- if (strchr(a->modes,'s'))
- {
- // send server notices to all with +s
- WriteServ(a->fd,"NOTICE %s :*** Notice From %s: %s",a->nick,source->nick,textbuffer);
- }
- }
- }
-
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"V %s @* :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
-}
-
-// returns TRUE of any users on channel C occupy server 'servername'.
-
-bool ChanAnyOnThisServer(chanrec *c,char* servername)
-{
- log(DEBUG,"ChanAnyOnThisServer");
-
- std::vector<char*> *ulist = c->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* user = (userrec*)o;
- if (!strcasecmp(user->server,servername))
- return true;
- }
- return false;
-}
-
-// returns true if user 'u' shares any common channels with any users on server 'servername'
-
-bool CommonOnThisServer(userrec* u,const char* servername)
-{
- log(DEBUG,"ChanAnyOnThisServer");
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* user = (userrec*)o;
- if (!strcasecmp(user->server,servername))
- return true;
- }
- }
- }
- return false;
-}
-
-
-void NetSendToCommon(userrec* u, char* s)
-{
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"%s",s);
-
- log(DEBUG,"NetSendToCommon: '%s' '%s'",u->nick,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (CommonOnThisServer(u,me[j]->connectors[k].GetServerName().c_str()))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-
-void NetSendToAll(char* s)
-{
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"%s",s);
-
- log(DEBUG,"NetSendToAll: '%s'",s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
-}
-
-void NetSendToAllAlive(char* s)
-{
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"%s",s);
-
- log(DEBUG,"NetSendToAllAlive: '%s'",s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (me[j]->connectors[k].GetState() != STATE_DISCONNECTED)
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- else
- {
- log(DEBUG,"%s is dead, not sending to it.",me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-
-void NetSendToOne(char* target,char* s)
-{
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"%s",s);
-
- log(DEBUG,"NetSendToOne: '%s' '%s'",target,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),target))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-void NetSendToAllExcept(const char* target,char* s)
-{
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"%s",s);
-
- log(DEBUG,"NetSendToAllExcept: '%s' '%s'",target,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (strcasecmp(me[j]->connectors[k].GetServerName().c_str(),target))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-
-void WriteMode(const char* modes, int flags, const char* text, ...)
-{
- if ((!text) || (!modes) || (!flags))
- {
- log(DEFAULT,"*** BUG *** WriteMode was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int modelen = strlen(modes);
-
- for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
- {
- bool send_to_user = false;
-
- if (flags == WM_AND)
- {
- send_to_user = true;
- for (int n = 0; n < modelen; n++)
- {
- if (!hasumode(i->second,modes[n]))
- {
- send_to_user = false;
- break;
- }
- }
- }
- else if (flags == WM_OR)
- {
- send_to_user = false;
- for (int n = 0; n < modelen; n++)
- {
- if (hasumode(i->second,modes[n]))
- {
- send_to_user = true;
- break;
- }
- }
- }
-
- if (send_to_user)
- {
- WriteServ(i->second->fd,"NOTICE %s :%s",i->second->nick,textbuffer);
- }
- }
- }
-}
-
-
-void NoticeAll(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** NoticeAll was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
- {
- WriteFrom(i->second->fd,source,"NOTICE $* :%s",textbuffer);
- }
- }
-
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"V %s * :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
-
-}
-
-void WriteWallOps(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
- {
- if (strchr(i->second->modes,'w'))
- {
- WriteTo(source,i->second,"WALLOPS :%s",textbuffer);
- }
- }
- }
-
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"@ %s :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
-}
-
-/* convert a string to lowercase. Note following special circumstances
- * taken from RFC 1459. Many "official" server branches still hold to this
- * rule so i will too;
- *
- * Because of IRC's scandanavian origin, the characters {}| are
- * considered to be the lower case equivalents of the characters []\,
- * respectively. This is a critical issue when determining the
- * equivalence of two nicknames.
- */
-
-void strlower(char *n)
-{
- if (n)
- {
- for (char* t = n; *t; t++)
- *t = lowermap[*t];
- }
-}
-
-
-
-/* Find a user record by nickname and return a pointer to it */
-
-userrec* Find(std::string nick)
-{
- user_hash::iterator iter = clientlist.find(nick);
-
- if (iter == clientlist.end())
- /* Couldn't find it */
- return NULL;
-
- return iter->second;
-}
-
-/* find a channel record by channel name and return a pointer to it */
-
-chanrec* FindChan(const char* chan)
-{
- if (!chan)
- {
- log(DEFAULT,"*** BUG *** Findchan was given an invalid parameter");
- return NULL;
- }
-
- chan_hash::iterator iter = chanlist.find(chan);
-
- if (iter == chanlist.end())
- /* Couldn't find it */
- return NULL;
-
- return iter->second;
-}
-
-
-long GetMaxBans(char* name)
-{
- char CM[MAXBUF];
- for (int count = 0; count < ConfValueEnum("banlist",&config_f); count++)
- {
- ConfValue("banlist","chan",count,CM,&config_f);
- if (match(name,CM))
- {
- ConfValue("banlist","limit",count,CM,&config_f);
- return atoi(CM);
- }
- }
- return 64;
-}
-
-
-void purge_empty_chans(userrec* u)
-{
-
- int go_again = 1, purge = 0;
-
- // firstly decrement the count on each channel
- for (int f = 0; f < MAXCHANS; f++)
- {
- if (u->chans[f].channel)
- {
- u->chans[f].channel->DecUserCounter();
- u->chans[f].channel->DelUser((char*)u);
- }
- }
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)