summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-02-03 05:17:17 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-02-03 05:17:17 +0000
commitbd965ad19f3288832a5a8edab8739f658da4c8f4 (patch)
tree71914359598341adeef99a6a39ea3243627a0beb /src
parentf02b271d9a85a736af7c49869ced767fef1113d6 (diff)
Add m_autoop.so - ircd-side channel access lists via listmode +w
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12359 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_autoop.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/modules/m_autoop.cpp b/src/modules/m_autoop.cpp
new file mode 100644
index 000000000..a66e2bd4d
--- /dev/null
+++ b/src/modules/m_autoop.cpp
@@ -0,0 +1,92 @@
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2010 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include "u_listmode.h"
+
+/* $ModDesc: Provides support for the +w channel mode, autoop list */
+
+/** Handles +w channel mode
+ */
+class AutoOpList : public ListModeBase
+{
+ public:
+ AutoOpList(Module* Creator) : ListModeBase(Creator, "autoop", 'w', "End of Channel Access List", 910, 911, true)
+ {
+ levelrequired = OP_VALUE;
+ }
+ // TODO need own numerics
+ // TODO add some serious access control for setting this mode (you can currently gain +qa with it)
+};
+
+
+class ModuleAutoOp : public Module
+{
+ AutoOpList mh;
+
+public:
+ ModuleAutoOp() : mh(this)
+ {
+ ServerInstance->Modules->AddService(mh);
+ mh.DoImplements(this);
+
+ Implementation list[] = { I_OnUserPreJoin, };
+ ServerInstance->Modules->Attach(list, this, 1);
+ }
+
+ ModResult OnUserPreJoin(User *user, Channel *chan, const char *cname, std::string &privs, const std::string &keygiven)
+ {
+ if (!chan)
+ return MOD_RES_PASSTHRU;
+
+ modelist* list = mh.extItem.get(chan);
+ if (list)
+ {
+ for (modelist::iterator it = list->begin(); it != list->end(); it++)
+ {
+ std::string::size_type colon = it->mask.find(':');
+ if (colon == std::string::npos)
+ continue;
+ if (chan->CheckBan(user, it->mask.substr(colon+1)))
+ {
+ privs = it->mask.substr(0, colon);
+ break;
+ }
+ }
+ }
+
+ return MOD_RES_PASSTHRU;
+ }
+
+ void OnCleanup(int target_type, void* item)
+ {
+ mh.DoCleanup(target_type, item);
+ }
+
+ void OnSyncChannel(Channel* chan, Module* proto, void* opaque)
+ {
+ mh.DoSyncChannel(chan, proto, opaque);
+ }
+
+ void OnRehash(User* user)
+ {
+ mh.DoRehash();
+ }
+
+ Version GetVersion()
+ {
+ return Version("Provides support for the +w channel mode", VF_VENDOR);
+ }
+};
+
+MODULE_INIT(ModuleAutoOp)