diff options
| author | Adam <Adam@anope.org> | 2011-08-01 22:37:27 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2011-08-01 22:37:27 -0400 |
| commit | f7adc0b35b50f06706872a161f1c7476e6e6981e (patch) | |
| tree | 91fbe281f2772136a327fd4fc4c64740d1ab65ab /modules/extra | |
| parent | 710c02f3bd3581b7c5b3d48e7604756975219fc8 (diff) | |
Rewrote the access systems and added a flags access system
Diffstat (limited to 'modules/extra')
| -rw-r--r-- | modules/extra/cs_appendtopic.cpp | 4 | ||||
| -rw-r--r-- | modules/extra/cs_enforce.cpp | 7 | ||||
| -rw-r--r-- | modules/extra/cs_tban.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/m_helpchan.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/m_statusupdate.cpp | 52 |
5 files changed, 42 insertions, 25 deletions
diff --git a/modules/extra/cs_appendtopic.cpp b/modules/extra/cs_appendtopic.cpp index 5b39b8c8c..c9af50613 100644 --- a/modules/extra/cs_appendtopic.cpp +++ b/modules/extra/cs_appendtopic.cpp @@ -58,7 +58,7 @@ class CommandCSAppendTopic : public Command source.Reply(CHAN_X_NOT_IN_USE, params[0].c_str()); else if (!c->ci) source.Reply(CHAN_X_NOT_REGISTERED, c->name.c_str()); - else if (!check_access(u, c->ci, CA_TOPIC)) + else if (!c->ci->HasPriv(u, CA_TOPIC)) source.Reply(ACCESS_DENIED); else { @@ -77,7 +77,7 @@ class CommandCSAppendTopic : public Command if (has_topiclock) c->ci->SetFlag(CI_TOPICLOCK); - bool override = !check_access(u, c->ci, CA_TOPIC); + bool override = c->ci->HasPriv(u, CA_TOPIC); Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, c->ci) << "changed topic to " << topic; } return; diff --git a/modules/extra/cs_enforce.cpp b/modules/extra/cs_enforce.cpp index 4ba813ffd..5f59a4b31 100644 --- a/modules/extra/cs_enforce.cpp +++ b/modules/extra/cs_enforce.cpp @@ -69,7 +69,7 @@ class CommandCSEnforce : public Command void DoRestricted(Channel *c) { - ChannelInfo *ci; + /*ChannelInfo *ci; int16 old_nojoin_level; Anope::string mask; @@ -94,6 +94,9 @@ class CommandCSEnforce : public Command } ci->levels[CA_NOJOIN] = old_nojoin_level; + XXX + */ + } void DoCModeR(Channel *c) @@ -136,7 +139,7 @@ class CommandCSEnforce : public Command source.Reply(CHAN_X_NOT_IN_USE, params[0].c_str()); else if (!c->ci) source.Reply(CHAN_X_NOT_REGISTERED, c->name.c_str()); - else if (!check_access(u, c->ci, CA_AKICK)) + else if (!c->ci->HasPriv(u, CA_AKICK)) source.Reply(ACCESS_DENIED); else { diff --git a/modules/extra/cs_tban.cpp b/modules/extra/cs_tban.cpp index a0bb6a626..404279bef 100644 --- a/modules/extra/cs_tban.cpp +++ b/modules/extra/cs_tban.cpp @@ -40,7 +40,7 @@ static bool CanBanUser(CommandSource &source, Channel *c, User *u2) User *u = source.u; ChannelInfo *ci = c->ci; bool ok = false; - if (!check_access(u, ci, CA_BAN)) + if (!ci->HasPriv(u, CA_BAN)) source.Reply(ACCESS_DENIED); else if (matches_list(c, u2, CMODE_EXCEPT)) source.Reply(CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str()); diff --git a/modules/extra/m_helpchan.cpp b/modules/extra/m_helpchan.cpp index 71e1d3355..f5c63941a 100644 --- a/modules/extra/m_helpchan.cpp +++ b/modules/extra/m_helpchan.cpp @@ -28,7 +28,7 @@ class HelpChannel : public Module { User *u = finduser(param); - if (u && check_access(u, c->ci, CA_OPDEOPME)) + if (u && c->ci->HasPriv(u, CA_OPDEOPME)) u->SetMode(findbot(Config->OperServ), UMODE_HELPOP); } diff --git a/modules/extra/m_statusupdate.cpp b/modules/extra/m_statusupdate.cpp index f04ab4fa5..2b23492ec 100644 --- a/modules/extra/m_statusupdate.cpp +++ b/modules/extra/m_statusupdate.cpp @@ -7,6 +7,19 @@ #include "module.h" +static struct ModeInfo +{ + ChannelAccess priv; + ChannelModeName name; +} modeInfo[] = { + { CA_AUTOOWNER, CMODE_OWNER }, + { CA_AUTOPROTECT, CMODE_PROTECT }, + { CA_AUTOOP, CMODE_OP }, + { CA_AUTOHALFOP, CMODE_HALFOP }, + { CA_AUTOVOICE, CMODE_VOICE }, + { CA_SIZE, CMODE_END } +}; + class StatusUpdate : public Module { public: @@ -14,41 +27,42 @@ class StatusUpdate : public Module { this->SetAuthor("Anope"); - Implementation i[] = { I_OnAccessAdd, I_OnAccessChange, I_OnAccessDel, I_OnAccessClear }; + Implementation i[] = { I_OnAccessAdd, I_OnAccessDel }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } void OnAccessAdd(ChannelInfo *ci, User *u, ChanAccess *access) { - this->OnAccessChange(ci, u, access); - } - - void OnAccessChange(ChannelInfo *ci, User *, ChanAccess *access) - { if (ci->c) for (CUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it) { User *user = (*it)->user; - if (user == ci->bi) - continue; - - ChanAccess *highest = ci->GetAccess(user); - - if (!access || (highest == access)) - chan_set_correct_modes(user, ci->c, 1); + if (access->Matches(user, user->Account())) + { + for (int i = 0; modeInfo[i].priv != CA_SIZE; ++i) + if (access->HasPriv(modeInfo[i].priv)) + ci->c->SetMode(NULL, modeInfo[i].name, user->nick); + else + ci->c->RemoveMode(NULL, modeInfo[i].name, user->nick); + } } } void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access) { - access->level = 0; - this->OnAccessChange(ci, u, access); - } + if (ci->c) + for (CUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it) + { + User *user = (*it)->user; - void OnAccessClear(ChannelInfo *ci, User *u) - { - this->OnAccessChange(ci, u, NULL); + if (access->Matches(user, user->Account())) + { + for (int i = 0; modeInfo[i].priv != CA_SIZE; ++i) + if (access->HasPriv(modeInfo[i].priv)) + ci->c->RemoveMode(NULL, modeInfo[i].name, user->nick); + } + } } }; |
