]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
Fix bug #83
[user/henk/code/inspircd.git] / src / channels.cpp
index ee1ba2e1fdf92b6a463d1843fbad2c024ffdcbd9..8e7d4af06cc5426e1d76f231587c29e350cd7462 100644 (file)
@@ -92,14 +92,14 @@ int Channel::SetTopic(User *u, std::string &ntopic, bool forceset)
                        return CMD_FAILURE;
                if (res != MOD_RES_ALLOW)
                {
-                       FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (u,this,"topiclock"));
-                       bool defok = IsModeSet('t') ? GetPrefixValue(u) >= HALFOP_VALUE : HasUser(u);
-                       if (!res.check(defok))
+                       if (!this->HasUser(u))
                        {
-                               if (!this->HasUser(u))
-                                       u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str());
-                               else
-                                       u->WriteNumeric(482, "%s %s :You do not have access to change the topic on this channel", u->nick.c_str(), this->name.c_str());
+                               u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str());
+                               return CMD_FAILURE;
+                       }
+                       if (IsModeSet('t') && !ServerInstance->OnCheckExemption(u,this,"topiclock").check(GetPrefixValue(u) >= HALFOP_VALUE))
+                       {
+                               u->WriteNumeric(482, "%s %s :You do not have access to change the topic on this channel", u->nick.c_str(), this->name.c_str());
                                return CMD_FAILURE;
                        }
                }
@@ -392,9 +392,8 @@ Channel* Channel::ForceChan(Channel* Ptr, User* user, const std::string &privs,
        for(unsigned int i=0; i < memb->modes.length(); i++)
                ms.append(" ").append(user->nick);
        if ((Ptr->GetUserCounter() > 1) && (ms.length()))
-               Ptr->WriteAllExceptSender(user, true, 0, "MODE %s +%s", Ptr->name.c_str(), ms.c_str());
+               Ptr->WriteAllExceptSender(user, ServerInstance->Config->CycleHostsFromUser, 0, "MODE %s +%s", Ptr->name.c_str(), ms.c_str());
 
-       /* Major improvement by Brain - we dont need to be calculating all this pointlessly for remote users */
        if (IS_LOCAL(user))
        {
                if (Ptr->topicset)
@@ -526,11 +525,19 @@ void Channel::KickUser(User *src, User *user, const char* reason)
 
                if (res == MOD_RES_PASSTHRU)
                {
-                       int them = this->GetPrefixValue(src);
-                       int us = this->GetPrefixValue(user);
-                       if ((them < HALFOP_VALUE) || (them < us))
+                       unsigned int them = this->GetPrefixValue(src);
+                       unsigned int req = HALFOP_VALUE;
+                       for (std::string::size_type i = 0; i < memb->modes.length(); i++)
+                       {
+                               ModeHandler* mh = ServerInstance->Modes->FindMode(memb->modes[i], MODETYPE_CHANNEL);
+                               if (mh && mh->GetLevelRequired() > req)
+                                       req = mh->GetLevelRequired();
+                       }
+
+                       if (them < req)
                        {
-                               src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must be a channel %soperator",src->nick.c_str(), this->name.c_str(), them >= HALFOP_VALUE ? "" : "half-");
+                               src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must be a channel %soperator",
+                                       src->nick.c_str(), this->name.c_str(), req > HALFOP_VALUE ? "" : "half-");
                                return;
                        }
                }
@@ -746,20 +753,14 @@ void Channel::UserList(User *user)
 {
        char list[MAXBUF];
        size_t dlen, curlen;
-       ModResult call_modules;
 
        if (!IS_LOCAL(user))
                return;
 
-       FIRST_MOD_RESULT(OnUserList, call_modules, (user, this));
-
-       if (call_modules != MOD_RES_ALLOW)
+       if (this->IsModeSet('s') && !this->HasUser(user) && !user->HasPrivPermission("channels/auspex"))
        {
-               if ((this->IsModeSet('s')) && (!this->HasUser(user)))
-               {
-                       user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), this->name.c_str());
-                       return;
-               }
+               user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), this->name.c_str());
+               return;
        }
 
        dlen = curlen = snprintf(list,MAXBUF,"%s %c %s :", user->nick.c_str(), this->IsModeSet('s') ? '@' : this->IsModeSet('p') ? '*' : '=',  this->name.c_str());
@@ -786,14 +787,11 @@ void Channel::UserList(User *user)
                std::string prefixlist = this->GetPrefixChar(i->first);
                std::string nick = i->first->nick;
 
-               if (call_modules != MOD_RES_DENY)
-               {
-                       FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->second, prefixlist, nick));
+               FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->second, prefixlist, nick));
 
-                       /* Nick was nuked, a module wants us to skip it */
-                       if (nick.empty())
-                               continue;
-               }
+               /* Nick was nuked, a module wants us to skip it */
+               if (nick.empty())
+                       continue;
 
                size_t ptrlen = 0;