summaryrefslogtreecommitdiff
path: root/src/channels.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-01 22:37:27 -0400
committerAdam <Adam@anope.org>2011-08-01 22:37:27 -0400
commitf7adc0b35b50f06706872a161f1c7476e6e6981e (patch)
tree91fbe281f2772136a327fd4fc4c64740d1ab65ab /src/channels.cpp
parent710c02f3bd3581b7c5b3d48e7604756975219fc8 (diff)
Rewrote the access systems and added a flags access system
Diffstat (limited to 'src/channels.cpp')
-rw-r--r--src/channels.cpp38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index fe97c5b46..17ed8a629 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -1071,47 +1071,51 @@ void do_cmode(const Anope::string &source, const Anope::string &channel, const A
**/
void chan_set_correct_modes(User *user, Channel *c, int give_modes)
{
- ChannelInfo *ci;
- ChannelMode *owner, *admin, *op, *halfop, *voice;
+ ChannelMode *owner = ModeManager::FindChannelModeByName(CMODE_OWNER),
+ *admin = ModeManager::FindChannelModeByName(CMODE_PROTECT),
+ *op = ModeManager::FindChannelModeByName(CMODE_OP),
+ *halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP),
+ *voice = ModeManager::FindChannelModeByName(CMODE_VOICE);
- owner = ModeManager::FindChannelModeByName(CMODE_OWNER);
- admin = ModeManager::FindChannelModeByName(CMODE_PROTECT);
- op = ModeManager::FindChannelModeByName(CMODE_OP);
- halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP);
- voice = ModeManager::FindChannelModeByName(CMODE_VOICE);
+ if (user == NULL || c == NULL)
+ return;
+
+ ChannelInfo *ci = c->ci;
- if (!c || !(ci = c->ci))
+ if (ci == NULL)
return;
Log(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << c->name << " (" << (give_modes ? "" : "not ") << "giving modes)";
+ AccessGroup u_access = ci->AccessFor(user);
+
if (give_modes && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP)))
{
- if (owner && check_access(user, ci, CA_AUTOOWNER))
+ if (owner && u_access.HasPriv(CA_AUTOOWNER))
c->SetMode(NULL, CMODE_OWNER, user->nick);
- else if (admin && check_access(user, ci, CA_AUTOPROTECT))
+ else if (admin && u_access.HasPriv(CA_AUTOPROTECT))
c->SetMode(NULL, CMODE_PROTECT, user->nick);
- if (op && check_access(user, ci, CA_AUTOOP))
+ if (op && u_access.HasPriv(CA_AUTOOP))
c->SetMode(NULL, CMODE_OP, user->nick);
- else if (halfop && check_access(user, ci, CA_AUTOHALFOP))
+ else if (halfop && u_access.HasPriv(CA_AUTOHALFOP))
c->SetMode(NULL, CMODE_HALFOP, user->nick);
- else if (voice && check_access(user, ci, CA_AUTOVOICE))
+ else if (voice && u_access.HasPriv(CA_AUTOVOICE))
c->SetMode(NULL, CMODE_VOICE, user->nick);
}
/* If this channel has secureops or the channel is syncing and they are not ulined, check to remove modes */
if ((ci->HasFlag(CI_SECUREOPS) || (c->HasFlag(CH_SYNCING) && user->server->IsSynced())) && !user->server->IsULined())
{
- if (owner && c->HasUserStatus(user, CMODE_OWNER) && !check_access(user, ci, CA_FOUNDER))
+ if (owner && c->HasUserStatus(user, CMODE_OWNER) && !u_access.HasPriv(CA_AUTOOWNER) && !u_access.HasPriv(CA_PROTECTME))
c->RemoveMode(NULL, CMODE_OWNER, user->nick);
- if (admin && c->HasUserStatus(user, CMODE_PROTECT) && !check_access(user, ci, CA_AUTOPROTECT) && !check_access(user, ci, CA_PROTECTME))
+ if (admin && c->HasUserStatus(user, CMODE_PROTECT) && !u_access.HasPriv(CA_AUTOPROTECT) && !u_access.HasPriv(CA_PROTECTME))
c->RemoveMode(NULL, CMODE_PROTECT, user->nick);
- if (op && c->HasUserStatus(user, CMODE_OP) && !check_access(user, ci, CA_AUTOOP) && !check_access(user, ci, CA_OPDEOPME))
+ if (op && c->HasUserStatus(user, CMODE_OP) && !u_access.HasPriv(CA_AUTOOP) && !u_access.HasPriv(CA_OPDEOPME))
c->RemoveMode(NULL, CMODE_OP, user->nick);
- if (halfop && c->HasUserStatus(user, CMODE_HALFOP) && !check_access(user, ci, CA_AUTOHALFOP) && !check_access(user, ci, CA_HALFOPME))
+ if (halfop && c->HasUserStatus(user, CMODE_HALFOP) && !u_access.HasPriv(CA_AUTOHALFOP) && !u_access.HasPriv(CA_HALFOPME))
c->RemoveMode(NULL, CMODE_HALFOP, user->nick);
}