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/m_statusupdate.cpp | |
| parent | 710c02f3bd3581b7c5b3d48e7604756975219fc8 (diff) | |
Rewrote the access systems and added a flags access system
Diffstat (limited to 'modules/extra/m_statusupdate.cpp')
| -rw-r--r-- | modules/extra/m_statusupdate.cpp | 52 |
1 files changed, 33 insertions, 19 deletions
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); + } + } } }; |
