]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_cap.h
Fix some of the include guard names (requested by SaberUK)
[user/henk/code/inspircd.git] / src / modules / m_cap.h
index 9f17bd3d05ffedcf187526e8785cfd3c17d90ada..919075a0aabbf9487f105149b5d5d64a62093c09 100644 (file)
@@ -2,22 +2,22 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ *  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.
+ *         the file COPYING for details.
  *
  * ---------------------------------------------------
  */
 
-#ifndef __CAP_H__
-#define __CAP_H__
+#ifndef M_CAP_H
+#define M_CAP_H
 
 #include <map>
 #include <string>
 
-class CapData
+class CapEvent : public Event
 {
  public:
        irc::string type;
@@ -25,6 +25,51 @@ class CapData
        std::vector<std::string> ack;
        User* user;
        Module* creator;
+       CapEvent(Module* sender, const std::string& t) : Event(sender, t) {}
+};
+
+class GenericCap
+{
+ public:
+       LocalIntExt ext;
+       const std::string cap;
+       GenericCap(Module* parent, const std::string &Cap) : ext("cap_" + Cap, parent), cap(Cap)
+       {
+               ServerInstance->Extensions.Register(&ext);
+       }
+
+       void HandleEvent(Event& ev)
+       {
+               CapEvent *data = static_cast<CapEvent*>(&ev);
+               if (ev.id == "cap_req")
+               {
+                       std::vector<std::string>::iterator it;
+                       if ((it = std::find(data->wanted.begin(), data->wanted.end(), cap)) != data->wanted.end())
+                       {
+                               // we can handle this, so ACK it, and remove it from the wanted list
+                               data->ack.push_back(*it);
+                               data->wanted.erase(it);
+                               ext.set(data->user, 1);
+                       }
+               }
+
+               if (ev.id == "cap_ls")
+               {
+                       data->wanted.push_back(cap);
+               }
+
+               if (ev.id == "cap_list")
+               {
+                       if (ext.get(data->user))
+                               data->wanted.push_back(cap);
+               }
+
+               if (ev.id == "cap_clear")
+               {
+                       data->ack.push_back("-" + cap);
+                       ext.set(data->user, 0);
+               }
+       }
 };
 
 #endif