summaryrefslogtreecommitdiff
path: root/modules/extra/m_statusupdate.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 /modules/extra/m_statusupdate.cpp
parent710c02f3bd3581b7c5b3d48e7604756975219fc8 (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.cpp52
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);
+ }
+ }
}
};