X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=7f2cefd2bb8059d4fb505f2ebc6e15bfb4d35674;hb=40dc59986b3991d3db3cb3a761aa9aa7bab69737;hp=2a0079bc15745734da73d7bc2c6822e70dec2d2d;hpb=ace3d85982f99ab04318ce705fd29fec5ffd7320;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index 2a0079bc1..7f2cefd2b 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -17,7 +17,7 @@ #include #include "mode.h" -Channel::Channel(InspIRCd* Instance, const std::string &cname, time_t ts) : ServerInstance(Instance) +Channel::Channel(InspIRCd* Instance, const std::string &cname, time_t ts) { chan_hash::iterator findchan = ServerInstance->chanlist->find(cname); if (findchan != Instance->chanlist->end()) @@ -240,7 +240,7 @@ Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool } else { - privs = "@"; + privs = "o"; created_by_local = true; } @@ -340,27 +340,26 @@ Channel* Channel::JoinUser(InspIRCd* Instance, User *user, const char* cn, bool Channel* Channel::ForceChan(InspIRCd* Instance, Channel* Ptr, User* user, const std::string &privs, bool bursting, bool created) { std::string nick = user->nick; - bool silent = false; - Ptr->AddUser(user); + Membership* memb = Ptr->AddUser(user); user->chans.insert(Ptr); for (std::string::const_iterator x = privs.begin(); x != privs.end(); x++) { const char status = *x; - ModeHandler* mh = Instance->Modes->FindPrefix(status); + ModeHandler* mh = Instance->Modes->FindMode(status, MODETYPE_CHANNEL); if (mh) { /* Set, and make sure that the mode handler knows this mode was now set */ - Ptr->SetPrefix(user, mh->GetModeChar(), mh->GetPrefixRank(), true); + Ptr->SetPrefix(user, mh->GetModeChar(), true); mh->OnModeChange(Instance->FakeClient, Instance->FakeClient, Ptr, nick, true); } } - FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(user, Ptr, bursting, silent, created)); + CUList except_list; + FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(memb, bursting, created, except_list)); - if (!silent) - Ptr->WriteChannel(user,"JOIN :%s",Ptr->name.c_str()); + Ptr->WriteAllExcept(user, false, 0, except_list, "JOIN :%s", Ptr->name.c_str()); /* Theyre not the first ones in here, make sure everyone else sees the modes we gave the user */ std::string ms = Instance->Modes->ModeString(user, Ptr); @@ -377,7 +376,7 @@ Channel* Channel::ForceChan(InspIRCd* Instance, Channel* Ptr, User* user, const } Ptr->UserList(user); } - FOREACH_MOD_I(Instance,I_OnPostJoin,OnPostJoin(user, Ptr)); + FOREACH_MOD_I(Instance,I_OnPostJoin,OnPostJoin(memb)); return Ptr; } @@ -462,20 +461,19 @@ ModResult Channel::GetExtBanStatus(User *user, char type) */ long Channel::PartUser(User *user, std::string &reason) { - bool silent = false; - if (!user) return this->GetUserCounter(); - UCListIter i = user->chans.find(this); - if (i != user->chans.end()) + Membership* memb = GetUser(user); + + if (memb) { - FOREACH_MOD(I_OnUserPart,OnUserPart(user, this, reason, silent)); + CUList except_list; + FOREACH_MOD(I_OnUserPart,OnUserPart(memb, reason, except_list)); - if (!silent) - this->WriteChannel(user, "PART %s%s%s", this->name.c_str(), reason.empty() ? "" : " :", reason.c_str()); + WriteAllExcept(user, false, 0, except_list, "PART %s%s%s", this->name.c_str(), reason.empty() ? "" : " :", reason.c_str()); - user->chans.erase(i); + user->chans.erase(this); this->RemoveAllPrefixes(user); } @@ -509,14 +507,13 @@ long Channel::ServerKickUser(User* user, const char* reason, const char* servern long Channel::KickUser(User *src, User *user, const char* reason) { - bool silent = false; - if (!src || !user || !reason) return this->GetUserCounter(); + Membership* memb = GetUser(user); if (IS_LOCAL(src)) { - if (!this->HasUser(user)) + if (!memb) { src->WriteNumeric(ERR_USERNOTINCHANNEL, "%s %s %s :They are not on that channel",src->nick.c_str(), user->nick.c_str(), this->name.c_str()); return this->GetUserCounter(); @@ -530,10 +527,8 @@ long Channel::KickUser(User *src, User *user, const char* reason) ModResult res; if (ServerInstance->ULine(src->server)) res = MOD_RES_ALLOW; - if (res == MOD_RES_PASSTHRU) - FIRST_MOD_RESULT(ServerInstance, OnUserPreKick, res, (src,user,this,reason)); - if (res == MOD_RES_PASSTHRU) - FIRST_MOD_RESULT(ServerInstance, OnAccessCheck, res, (src,user,this,AC_KICK)); + else + FIRST_MOD_RESULT(ServerInstance, OnUserPreKick, res, (src,memb,reason)); if (res == MOD_RES_DENY) return this->GetUserCounter(); @@ -550,16 +545,14 @@ long Channel::KickUser(User *src, User *user, const char* reason) } } - FOREACH_MOD(I_OnUserKick,OnUserKick(src, user, this, reason, silent)); - - UCListIter i = user->chans.find(this); - if (i != user->chans.end()) + if (memb) { - /* zap it from the channel list of the user */ - if (!silent) - this->WriteChannel(src, "KICK %s %s :%s", this->name.c_str(), user->nick.c_str(), reason); + CUList except_list; + FOREACH_MOD(I_OnUserKick,OnUserKick(src, memb, reason, except_list)); + + WriteAllExcept(src, false, 0, except_list, "KICK %s %s :%s", name.c_str(), user->nick.c_str(), reason); - user->chans.erase(i); + user->chans.erase(this); this->RemoveAllPrefixes(user); } @@ -839,7 +832,7 @@ void Channel::UserList(User *user) if (call_modules != MOD_RES_DENY) { - FOREACH_MOD(I_OnNamesListItem, OnNamesListItem(user, i->first, this, 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()) @@ -931,6 +924,18 @@ const char* Channel::GetPrefixChar(User *user) return pf; } +unsigned int Membership::getRank() +{ + char mchar = modes.c_str()[0]; + unsigned int rv = 0; + if (mchar) + { + ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); + if (mh) + rv = mh->GetPrefixRank(); + } + return rv; +} const char* Channel::GetAllPrefixChars(User* user) { @@ -971,26 +976,29 @@ unsigned int Channel::GetPrefixValue(User* user) return bestrank; } -void Channel::SetPrefix(User* user, char prefix, unsigned int prefix_value, bool adding) +void Channel::SetPrefix(User* user, char prefix, bool adding) { + ModeHandler* delta_mh = ServerInstance->Modes->FindMode(prefix, MODETYPE_CHANNEL); + if (!delta_mh) + return; UserMembIter m = userlist.find(user); - if (m != userlist.end()) + if (m == userlist.end()) + return; + for(unsigned int i=0; i < m->second->modes.length(); i++) { - for(unsigned int i=0; i < m->second->modes.length(); i++) + char mchar = m->second->modes[i]; + ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); + if (mh && mh->GetPrefixRank() <= delta_mh->GetPrefixRank()) { - char mchar = m->second->modes[i]; - ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); - if (mh && mh->GetPrefixRank() <= prefix_value) - { - m->second->modes = - m->second->modes.substr(0,i-1) + - (adding ? std::string(1, prefix) : "") + - m->second->modes.substr(mchar == prefix ? i+1 : i); - return; - } + m->second->modes = + m->second->modes.substr(0,i) + + (adding ? std::string(1, prefix) : "") + + m->second->modes.substr(mchar == prefix ? i+1 : i); + return; } - m->second->modes += std::string(1, prefix); } + if (adding) + m->second->modes += std::string(1, prefix); } void Channel::RemoveAllPrefixes(User* user)