delete a->second;
userlist.erase(a);
}
+
+ if (userlist.empty())
+ {
+ ModResult res;
+ FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
+ if (res == MOD_RES_DENY)
+ return;
+ chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
+ /* kill the record */
+ if (iter != ServerInstance->chanlist->end())
+ {
+ FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
+ ServerInstance->chanlist->erase(iter);
+ }
+ ServerInstance->GlobalCulls.AddItem(this);
+ }
}
bool Channel::HasUser(User* user)
*/
if (IS_LOCAL(user) && !override)
{
- // Checking MyClass exists because we *may* get here with NULL, not 100% sure.
- if (user->MyClass && user->MyClass->maxchans)
+ if (user->HasPrivPermission("channels/high-join-limit"))
{
- if (user->HasPrivPermission("channels/high-join-limit"))
+ if (user->chans.size() >= ServerInstance->Config->OperMaxChans)
{
- if (user->chans.size() >= ServerInstance->Config->OperMaxChans)
- {
- user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cn);
- return NULL;
- }
+ user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cn);
+ return NULL;
}
- else
+ }
+ else
+ {
+ unsigned int maxchans = user->GetClass()->maxchans;
+ if (!maxchans)
+ maxchans = ServerInstance->Config->MaxChans;
+ if (user->chans.size() >= maxchans)
{
- if (user->chans.size() >= user->MyClass->maxchans)
- {
- user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cn);
- return NULL;
- }
+ user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cn);
+ return NULL;
}
}
}
else if (MOD_RESULT == MOD_RES_PASSTHRU)
{
std::string ckey = Ptr->GetModeParameter('k');
- bool invited = user->IsInvited(Ptr->name.c_str());
+ bool invited = IS_LOCAL(user)->IsInvited(Ptr->name.c_str());
bool can_bypass = ServerInstance->Config->InvBypassModes && invited;
if (!ckey.empty())
*/
if (invited)
{
- user->RemoveInvite(Ptr->name.c_str());
+ IS_LOCAL(user)->RemoveInvite(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 = ServerInstance->Modes->ModeString(user, Ptr);
+ std::string ms = memb->modes;
+ 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());
}
this->DelUser(user);
- if (userlist.empty())
- {
- ModResult res;
- FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
- if (res == MOD_RES_DENY)
- return;
- chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
- /* kill the record */
- if (iter != ServerInstance->chanlist->end())
- {
- FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
- ServerInstance->chanlist->erase(iter);
- }
- ServerInstance->GlobalCulls.AddItem(this);
- }
-}
-
-void Channel::ServerKickUser(User* user, const char* reason, const std::string& servername)
-{
- if (servername.empty() || !ServerInstance->Config->HideWhoisServer.empty())
- ServerInstance->FakeClient->server = ServerInstance->Config->ServerName;
- else
- ServerInstance->FakeClient->server = servername;
-
- KickUser(ServerInstance->FakeClient, user, reason);
}
void Channel::KickUser(User *src, User *user, const char* reason)
}
this->DelUser(user);
- if (userlist.empty())
- {
- ModResult res;
- FIRST_MOD_RESULT(OnChannelPreDelete, res, (this));
- if (res == MOD_RES_DENY)
- return;
- chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
- /* kill the record */
- if (iter != ServerInstance->chanlist->end())
- {
- FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
- ServerInstance->chanlist->erase(iter);
- }
- ServerInstance->GlobalCulls.AddItem(this);
- }
}
void Channel::WriteChannel(User* user, const char* text, ...)
void Channel::RawWriteAllExcept(User* user, bool serversource, char status, CUList &except_list, const std::string &out)
{
- char statmode = 0;
+ unsigned int minrank = 0;
if (status)
{
ModeHandler* mh = ServerInstance->Modes->FindPrefix(status);
if (mh)
- statmode = mh->GetModeChar();
+ minrank = mh->GetPrefixRank();
}
for (UserMembIter i = userlist.begin(); i != userlist.end(); i++)
{
- if ((IS_LOCAL(i->first)) && (except_list.find(i->first) == except_list.end()))
+ if (IS_LOCAL(i->first) && (except_list.find(i->first) == except_list.end()))
{
- /* User doesnt have the status we're after */
- if (statmode && !i->second->hasMode(statmode))
+ /* User doesn't have the status we're after */
+ if (minrank && i->second->getRank() < minrank)
continue;
i->first->Write(out);