X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=0ad99fb94d3946778a487fdf0439551c4e86a243;hb=19963bd452eac3c9fc52b3ee60fbf1a81efed7d3;hp=8d145aa16f7c9d8b49ae9576d1560411bf5690aa;hpb=cd712c40e1b352c05e7ae0f72e0a5e84cdf64323;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index 8d145aa16..0ad99fb94 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -81,29 +81,26 @@ std::string Channel::GetModeParameter(ModeHandler* mode) int Channel::SetTopic(User *u, std::string &ntopic, bool forceset) { - if (u) + if (!u) + u = ServerInstance->FakeClient; + if (IS_LOCAL(u) && !forceset) { - if(!forceset) - { - ModResult res; - /* 0: check status, 1: don't, -1: disallow change silently */ - - FIRST_MOD_RESULT(OnPreTopicChange, res, (u,this,ntopic)); + ModResult res; + FIRST_MOD_RESULT(OnPreTopicChange, res, (u,this,ntopic)); - if (res == MOD_RES_DENY) + if (res == MOD_RES_DENY) + return CMD_FAILURE; + if (res != MOD_RES_ALLOW) + { + if (!this->HasUser(u)) + { + u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str()); return CMD_FAILURE; - if (res != MOD_RES_ALLOW) + } + if (IsModeSet('t') && !ServerInstance->OnCheckExemption(u,this,"topiclock").check(GetPrefixValue(u) >= HALFOP_VALUE)) { - if (!this->HasUser(u)) - { - u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str()); - return CMD_FAILURE; - } - if ((this->IsModeSet('t')) && (this->GetPrefixValue(u) < HALFOP_VALUE)) - { - u->WriteNumeric(482, "%s %s :You must be at least a half-operator to change the topic on this channel", u->nick.c_str(), this->name.c_str()); - return CMD_FAILURE; - } + 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; } } } @@ -122,11 +119,7 @@ int Channel::SetTopic(User *u, std::string &ntopic, bool forceset) this->topicset = ServerInstance->Time(); - // XXX: this check for 'u' is probably pre-fake-user, and it fucking sucks anyway. we need to change this. - if (u) - { - FOREACH_MOD(I_OnPostTopicChange,OnPostTopicChange(u, this, this->topic)); - } + FOREACH_MOD(I_OnPostTopicChange,OnPostTopicChange(u, this, this->topic)); return CMD_SUCCESS; } @@ -399,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) @@ -753,20 +745,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()); @@ -793,14 +779,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;