diff options
author | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2010-01-21 06:31:17 +0000 |
---|---|---|
committer | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2010-01-21 06:31:17 +0000 |
commit | 0ed0fa4af62554a7281d403b6895b29e198e8186 (patch) | |
tree | 4b0509084ef8181790f19c258c3bc1f5e38b80cc /src/core | |
parent | 15817208aae1c80e2b03668981ac9268d6a02dde (diff) |
Rewrote how Anope stores channel status modes on users.
This allows 3rd party modules to add and track their own status mode.
Additionally we now store a users status in both the UserContainer and ChannelContainer.
This also fixes the ModeStacker to not send any mode strings unnecessarially and shuffles some code
around so we don't have to manually remove channels from users lists everywhere.
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2775 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/cs_ban.c | 2 | ||||
-rw-r--r-- | src/core/cs_clear.c | 40 | ||||
-rw-r--r-- | src/core/cs_invite.c | 2 | ||||
-rw-r--r-- | src/core/cs_kick.c | 2 | ||||
-rw-r--r-- | src/core/cs_modes.c | 2 | ||||
-rw-r--r-- | src/core/cs_register.c | 2 | ||||
-rw-r--r-- | src/core/os_clearmodes.c | 30 |
7 files changed, 25 insertions, 55 deletions
diff --git a/src/core/cs_ban.c b/src/core/cs_ban.c index 7edbe0944..0d07dd370 100644 --- a/src/core/cs_ban.c +++ b/src/core/cs_ban.c @@ -72,7 +72,7 @@ class CommandCSBan : public Command c->SetMode(NULL, CMODE_BAN, mask); /* We still allow host banning while not allowing to kick */ - if (!is_on_chan(c, u2)) + if (c->FindUser(u2)) return MOD_CONT; if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !check_access(u, ci, CA_SIGNKICK))) diff --git a/src/core/cs_clear.c b/src/core/cs_clear.c index 5f95e0cdc..0e8312f37 100644 --- a/src/core/cs_clear.c +++ b/src/core/cs_clear.c @@ -71,8 +71,6 @@ class CommandCSClear : public Command } else if (what == "ops") { - int isop, isadmin, isown; - if (ircd->svsmode_ucmode) { ircdproto->SendSVSModeChan(c, "-o", NULL); @@ -94,18 +92,11 @@ class CommandCSClear : public Command { UserContainer *uc = *it; - isop = chan_has_user_status(c, uc->user, CUS_OP); - isadmin = chan_has_user_status(c, uc->user, CUS_PROTECT); - isown = chan_has_user_status(c, uc->user, CUS_OWNER); - - if (!isop && !isadmin && !isown) - continue; - - if (isown) + if (uc->Status->HasFlag(CMODE_OWNER)) c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick); - if (admin) + if (uc->Status->HasFlag(CMODE_PROTECT)) c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick); - if (isop) + if (uc->Status->HasFlag(CMODE_OP)) c->RemoveMode(NULL, CMODE_OP, uc->user->nick); } } @@ -115,18 +106,11 @@ class CommandCSClear : public Command { UserContainer *uc = *it; - isop = chan_has_user_status(c, uc->user, CUS_OP); - isadmin = chan_has_user_status(c, uc->user, CUS_PROTECT); - isown = chan_has_user_status(c, uc->user, CUS_OWNER); - - if (!isop && !isadmin && !isown) - continue; - - if (isown) + if (uc->Status->HasFlag(CMODE_OWNER)) c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick); - if (isadmin) + if (uc->Status->HasFlag(CMODE_PROTECT)) c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick); - if (isop) + if (uc->Status->HasFlag(CMODE_OP)) c->RemoveMode(NULL, CMODE_OP, uc->user->nick); } } @@ -139,10 +123,8 @@ class CommandCSClear : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_HALFOP)) - continue; - - c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick); + if (uc->Status->HasFlag(CMODE_HALFOP)) + c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick); } notice_lang(Config.s_ChanServ, u, CHAN_CLEARED_HOPS, chan); @@ -153,10 +135,8 @@ class CommandCSClear : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_VOICE)) - continue; - - c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick); + if (uc->Status->HasFlag(CMODE_VOICE)) + c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick); } notice_lang(Config.s_ChanServ, u, CHAN_CLEARED_VOICES, chan); diff --git a/src/core/cs_invite.c b/src/core/cs_invite.c index 86a4f9b38..4dd17a335 100644 --- a/src/core/cs_invite.c +++ b/src/core/cs_invite.c @@ -54,7 +54,7 @@ class CommandCSInvite : public Command } } - if (is_on_chan(c, u2)) + if (c->FindUser(u2)) notice_lang(Config.s_ChanServ, u, CHAN_INVITE_ALREADY_IN, c->name.c_str()); else { diff --git a/src/core/cs_kick.c b/src/core/cs_kick.c index 2ea506c04..7c0c57b51 100644 --- a/src/core/cs_kick.c +++ b/src/core/cs_kick.c @@ -52,7 +52,7 @@ class CommandCSKick : public Command notice_lang(Config.s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); } else if (is_same ? !(u2 = u) : !(u2 = finduser(target))) { notice_lang(Config.s_ChanServ, u, NICK_X_NOT_IN_USE, target); - } else if (!is_on_chan(c, u2)) { + } else if (!c->FindUser(u2)) { notice_lang(Config.s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str()); } else if (!is_same ? !check_access(u, ci, CA_KICK) : !check_access(u, ci, CA_KICKME)) { diff --git a/src/core/cs_modes.c b/src/core/cs_modes.c index bbd9e7a42..d3525d7cc 100644 --- a/src/core/cs_modes.c +++ b/src/core/cs_modes.c @@ -46,7 +46,7 @@ static CommandReturn do_util(User *u, ChannelMode *cm, const char *chan, const c notice_lang(Config.s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); else if (is_same ? !(u2 = u) : !(u2 = finduser(nick))) notice_lang(Config.s_ChanServ, u, NICK_X_NOT_IN_USE, nick); - else if (!is_on_chan(c, u2)) + else if (!c->FindUser(u2)) notice_lang(Config.s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str()); else if (is_same ? !check_access(u, ci, levelself) : !check_access(u, ci, level)) notice_lang(Config.s_ChanServ, u, ACCESS_DENIED); diff --git a/src/core/cs_register.c b/src/core/cs_register.c index bf3472c5a..d934afb6e 100644 --- a/src/core/cs_register.c +++ b/src/core/cs_register.c @@ -49,7 +49,7 @@ class CommandCSRegister : public Command notice_lang(Config.s_ChanServ, u, CHAN_ALREADY_REGISTERED, chan); else if (!stricmp(chan, "#")) notice_lang(Config.s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan); - else if (!chan_has_user_status(c, u, CUS_OP)) + else if (!c->HasUserStatus(u, CMODE_OP)) notice_lang(Config.s_ChanServ, u, CHAN_MUST_BE_CHANOP); else if (Config.CSMaxReg && u->nc->channelcount >= Config.CSMaxReg && !u->nc->HasPriv("chanserv/no-register-limit")) notice_lang(Config.s_ChanServ, u, u->nc->channelcount > Config.CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config.CSMaxReg); diff --git a/src/core/os_clearmodes.c b/src/core/os_clearmodes.c index d0bc4c44b..f52cd12ae 100644 --- a/src/core/os_clearmodes.c +++ b/src/core/os_clearmodes.c @@ -65,10 +65,8 @@ class CommandOSClearModes : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_OP)) - continue; - - c->RemoveMode(NULL, CMODE_OP, uc->user->nick); + if (uc->Status->HasFlag(CMODE_OP)) + c->RemoveMode(NULL, CMODE_OP, uc->user->nick); } } @@ -81,10 +79,8 @@ class CommandOSClearModes : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_VOICE)) - continue; - - c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick); + if (uc->Status->HasFlag(CMODE_VOICE)) + c->RemoveMode(NULL, CMODE_VOICE, uc->user->nick); } } @@ -99,10 +95,8 @@ class CommandOSClearModes : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_HALFOP)) - continue; - - c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick); + if (uc->Status->HasFlag(CMODE_HALFOP)) + c->RemoveMode(NULL, CMODE_HALFOP, uc->user->nick); } } } @@ -121,10 +115,8 @@ class CommandOSClearModes : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_OWNER)) - continue; - - c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick); + if (uc->Status->HasFlag(CMODE_OWNER)) + c->RemoveMode(NULL, CMODE_OWNER, uc->user->nick); } } } @@ -143,10 +135,8 @@ class CommandOSClearModes : public Command { UserContainer *uc = *it; - if (!chan_has_user_status(c, uc->user, CUS_PROTECT)) - continue; - - c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick); + if (uc->Status->HasFlag(CMODE_PROTECT)) + c->RemoveMode(NULL, CMODE_PROTECT, uc->user->nick); } } } |