]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
m_spanningtree RCONNECT handler: Fix error reporting to remote users
[user/henk/code/inspircd.git] / src / channels.cpp
index 6bd021d610ebd694b8d9bce9ae308bb4e923211e..7138880ffc81abb79dbe3aa4f941e128a0b29b19 100644 (file)
 /* $Core */
 
 #include "inspircd.h"
+#include "listmode.h"
 #include <cstdarg>
 #include "mode.h"
 
+static ModeReference ban(NULL, "ban");
+
 Channel::Channel(const std::string &cname, time_t ts)
 {
        chan_hash::iterator findchan = ServerInstance->chanlist->find(cname);
@@ -39,7 +42,7 @@ Channel::Channel(const std::string &cname, time_t ts)
        this->name.assign(cname, 0, ServerInstance->Config->Limits.ChanMax);
        this->age = ts ? ts : ServerInstance->Time();
 
-       maxbans = topicset = 0;
+       topicset = 0;
        modes.reset();
 }
 
@@ -198,7 +201,7 @@ const UserMembList* Channel::GetUsers()
 
 void Channel::SetDefaultModes()
 {
-       ServerInstance->Logs->Log("CHANNELS", DEBUG, "SetDefaultModes %s",
+       ServerInstance->Logs->Log("CHANNELS", LOG_DEBUG, "SetDefaultModes %s",
                ServerInstance->Config->DefaultModes.c_str());
        irc::spacesepstream list(ServerInstance->Config->DefaultModes);
        std::string modeseq;
@@ -277,7 +280,7 @@ Channel* Channel::JoinUser(User* user, std::string cname, bool override, const s
                if (!IS_LOCAL(user))
                {
                        if (!TS)
-                               ServerInstance->Logs->Log("CHANNELS",DEBUG,"*** BUG *** Channel::JoinUser called for REMOTE user '%s' on channel '%s' but no TS given!", user->nick.c_str(), cname.c_str());
+                               ServerInstance->Logs->Log("CHANNELS",LOG_DEBUG,"*** BUG *** Channel::JoinUser called for REMOTE user '%s' on channel '%s' but no TS given!", user->nick.c_str(), cname.c_str());
                }
                else
                {
@@ -434,10 +437,15 @@ bool Channel::IsBanned(User* user)
        if (result != MOD_RES_PASSTHRU)
                return (result == MOD_RES_DENY);
 
-       for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
+       ListModeBase* banlm = static_cast<ListModeBase*>(*ban);
+       const ListModeBase::ModeList* bans = banlm->GetList(this);
+       if (bans)
        {
-               if (CheckBan(user, i->data))
-                       return true;
+               for (ListModeBase::ModeList::const_iterator it = bans->begin(); it != bans->end(); it++)
+               {
+                       if (CheckBan(user, it->mask))
+                               return true;
+               }
        }
        return false;
 }
@@ -477,12 +485,15 @@ ModResult Channel::GetExtBanStatus(User *user, char type)
        FIRST_MOD_RESULT(OnExtBanCheck, rv, (user, this, type));
        if (rv != MOD_RES_PASSTHRU)
                return rv;
-       for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
+
+       ListModeBase* banlm = static_cast<ListModeBase*>(*ban);
+       const ListModeBase::ModeList* bans = banlm->GetList(this);
+       if (bans)
+
        {
-               if (i->data[0] == type && i->data[1] == ':')
+               for (ListModeBase::ModeList::const_iterator it = bans->begin(); it != bans->end(); ++it)
                {
-                       std::string val = i->data.substr(2);
-                       if (CheckBan(user, val))
+                       if (CheckBan(user, it->mask))
                                return MOD_RES_DENY;
                }
        }
@@ -845,32 +856,6 @@ void Channel::UserList(User *user)
        user->WriteNumeric(RPL_ENDOFNAMES, "%s %s :End of /NAMES list.", user->nick.c_str(), this->name.c_str());
 }
 
-long Channel::GetMaxBans()
-{
-       /* Return the cached value if there is one */
-       if (this->maxbans)
-               return this->maxbans;
-
-       /* If there isnt one, we have to do some O(n) hax to find it the first time. (ick) */
-       for (std::map<std::string,int>::iterator n = ServerInstance->Config->maxbans.begin(); n != ServerInstance->Config->maxbans.end(); n++)
-       {
-               if (InspIRCd::Match(this->name, n->first, NULL))
-               {
-                       this->maxbans = n->second;
-                       return n->second;
-               }
-       }
-
-       /* Screw it, just return the default of 64 */
-       this->maxbans = 64;
-       return this->maxbans;
-}
-
-void Channel::ResetMaxBans()
-{
-       this->maxbans = 0;
-}
-
 /* returns the status character for a given user on a channel, e.g. @ for op,
  * % for halfop etc. If the user has several modes set, the highest mode
  * the user has must be returned.
@@ -981,7 +966,7 @@ void Invitation::Create(Channel* c, LocalUser* u, time_t timeout)
                // Expired, don't bother
                return;
 
-       ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Create chan=%s user=%s", c->name.c_str(), u->uuid.c_str());
+       ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Create chan=%s user=%s", c->name.c_str(), u->uuid.c_str());
 
        Invitation* inv = Invitation::Find(c, u, false);
        if (inv)
@@ -989,20 +974,20 @@ void Invitation::Create(Channel* c, LocalUser* u, time_t timeout)
                 if ((inv->expiry == 0) || (inv->expiry > timeout))
                        return;
                inv->expiry = timeout;
-               ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Create changed expiry in existing invitation %p", (void*) inv);
+               ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Create changed expiry in existing invitation %p", (void*) inv);
        }
        else
        {
                inv = new Invitation(c, u, timeout);
                c->invites.push_back(inv);
                u->invites.push_back(inv);
-               ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Create created new invitation %p", (void*) inv);
+               ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Create created new invitation %p", (void*) inv);
        }
 }
 
 Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired)
 {
-       ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Find chan=%s user=%s check_expired=%d", c ? c->name.c_str() : "NULL", u ? u->uuid.c_str() : "NULL", check_expired);
+       ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Find chan=%s user=%s check_expired=%d", c ? c->name.c_str() : "NULL", u ? u->uuid.c_str() : "NULL", check_expired);
        if (!u || u->invites.empty())
                return NULL;
 
@@ -1017,7 +1002,7 @@ Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired)
                {
                        /* Expired invite, remove it. */
                        std::string expiration = ServerInstance->TimeString(inv->expiry);
-                       ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Find ecountered expired entry: %p expired %s", (void*) inv, expiration.c_str());
+                       ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Find ecountered expired entry: %p expired %s", (void*) inv, expiration.c_str());
                        i = locallist.erase(i);
                        inv->cull();
                        delete inv;
@@ -1035,7 +1020,7 @@ Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired)
        }
 
        locallist.swap(u->invites);
-       ServerInstance->Logs->Log("INVITATION", DEBUG, "Invitation::Find result=%p", (void*) result);
+       ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Find result=%p", (void*) result);
        return result;
 }
 
@@ -1052,7 +1037,7 @@ Invitation::~Invitation()
 
 void InviteBase::ClearInvites()
 {
-       ServerInstance->Logs->Log("INVITEBASE", DEBUG, "InviteBase::ClearInvites %p", (void*) this);
+       ServerInstance->Logs->Log("INVITEBASE", LOG_DEBUG, "InviteBase::ClearInvites %p", (void*) this);
        InviteList locallist;
        locallist.swap(invites);
        for (InviteList::const_iterator i = locallist.begin(); i != locallist.end(); ++i)