diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/extra/m_statusupdate.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/modules/extra/m_statusupdate.cpp b/modules/extra/m_statusupdate.cpp new file mode 100644 index 000000000..797d5aed0 --- /dev/null +++ b/modules/extra/m_statusupdate.cpp @@ -0,0 +1,55 @@ +/* + * (C) 2003-2011 Anope Team + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + */ + +#include "module.h" + +class StatusUpdate : public Module +{ + public: + StatusUpdate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED) + { + this->SetAuthor("Anope"); + + Implementation i[] = { I_OnAccessAdd, I_OnAccessChange, I_OnAccessDel, I_OnAccessClear }; + ModuleManager::Attach(i, this, 4); + } + + 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); + } + } + + void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access) + { + access->level = 0; + this->OnAccessChange(ci, u, access); + } + + void OnAccessClear(ChannelInfo *ci, User *u) + { + this->OnAccessChange(ci, u, NULL); + } +}; + +MODULE_INIT(StatusUpdate) |
