X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=0afbc93bbba25c1c9c577a299b94a2bd0c041e0d;hb=ca1b136b306784191235a6579da59f7e862003d1;hp=37edcebfb7c4a36aadd5c62be573cf1c59eb1a1b;hpb=b4be0c94ab5fb7e5a7a799a195c78de072a5e315;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index 37edcebfb..0afbc93bb 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; } @@ -347,11 +347,11 @@ Channel* Channel::ForceChan(InspIRCd* Instance, Channel* Ptr, User* user, const 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); } } @@ -527,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) + else FIRST_MOD_RESULT(ServerInstance, OnUserPreKick, res, (src,memb,reason)); - if (res == MOD_RES_PASSTHRU) - FIRST_MOD_RESULT(ServerInstance, OnAccessCheck, res, (src,user,this,AC_KICK)); if (res == MOD_RES_DENY) return this->GetUserCounter(); @@ -916,7 +914,7 @@ const char* Channel::GetPrefixChar(User *user) { char mchar = m->second->modes[i]; ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); - if (mh && mh->GetPrefixRank() > bestrank) + if (mh && mh->GetPrefixRank() > bestrank && mh->GetPrefix()) { bestrank = mh->GetPrefixRank(); pf[0] = mh->GetPrefix(); @@ -932,7 +930,7 @@ unsigned int Membership::getRank() unsigned int rv = 0; if (mchar) { - ModeHandler* mh = chan->ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); + ModeHandler* mh = ServerInstance->Modes->FindMode(mchar, MODETYPE_CHANNEL); if (mh) rv = mh->GetPrefixRank(); } @@ -962,42 +960,35 @@ const char* Channel::GetAllPrefixChars(User* user) unsigned int Channel::GetPrefixValue(User* user) { - unsigned int bestrank = 0; - UserMembIter m = userlist.find(user); - if (m != userlist.end()) - { - 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() > bestrank) - bestrank = mh->GetPrefixRank(); - } - } - return bestrank; + if (m == userlist.end()) + return 0; + return m->second->getRank(); } -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)