]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/u_listmode.h
Document SendMetaData.
[user/henk/code/inspircd.git] / include / u_listmode.h
index f98faefd5d97799ff6f303ef4db8932f8addae8d..358ccbf8312346117ac15935afc95f9b9abe387c 100644 (file)
@@ -6,7 +6,7 @@
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ *         the file COPYING for details.
  *
  * ---------------------------------------------------
  */
@@ -55,16 +55,43 @@ class ListModeRequest : public Request
 {
  public:
        User* user;
+       std::string literal;
+       const char extban;
        Channel* chan;
 
        /** Check if a user is on a channel's list.
-        * The Event::Send() event returns true if the user is on the channel's list.
+        * The Event::Send() event returns the ban string if the user is on the channel's list,
+        * or NULL if the user is not on the list.
         * @param sender Sending module
         * @param target Target module
         * @param u User to check against
         * @param c Channel to check against
         */
-       ListModeRequest(Module* sender, Module* target, User* u, Channel* c) : Request(sender, target, "LM_CHECKLIST"), user(u), chan(c)
+       ListModeRequest(Module* sender, Module* target, User* u, Channel* c) : Request(sender, target, "LM_CHECKLIST"), user(u), literal(""), extban(0), chan(c)
+       {
+       }
+
+       /** Check if a literal string is on a channel's list, optionally using an extban char.
+        * The Event::Send() event returns the ban string if the user is on the channel's list,
+        * or NULL if the user is not on the list.
+        * @param sender Sending module
+        * @param target Target module
+        * @param literalstr String to check against, e.g. "Bob!Bobbertson@weeblshouse"
+        * @param extbanchar Extended ban character to use for the match, or a null char if not using extban
+        */
+       ListModeRequest(Module* sender, Module* target, std::string literalstr, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(NULL), literal(literalstr), extban(extbanchar), chan(channel)
+       {
+       }
+
+       /** Check if a literal string is on a channel's list, optionally using an extban char.
+        * The Event::Send() event returns the ban string if the user is on the channel's list,
+        * or NULL if the user is not on the list.
+        * @param sender Sending module
+        * @param target Target module
+        * @param User to check against, e.g. "Bob!Bobbertson@weeblshouse"
+        * @param extbanchar Extended ban character to use for the match, or a null char if not using extban
+        */
+       ListModeRequest(Module* sender, Module* target, User* u, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(u), literal(""), extban(extbanchar), chan(channel)
        {
        }
 
@@ -151,7 +178,7 @@ class ListModeBase : public ModeHandler
                {
                        for (modelist::reverse_iterator it = el->rbegin(); it != el->rend(); ++it)
                        {
-                               user->WriteNumeric(listnumeric, "%s %s %s %s %s", user->nick.c_str(), channel->name.c_str(), it->mask.c_str(), it->nick.c_str(), it->time.c_str());
+                               user->WriteNumeric(listnumeric, "%s %s %s %s %s", user->nick.c_str(), channel->name.c_str(), it->mask.c_str(), (it->nick.length() ? it->nick.c_str() : ServerInstance->Config->ServerName), it->time.c_str());
                        }
                }
                user->WriteNumeric(endoflistnumeric, "%s %s :%s", user->nick.c_str(), channel->name.c_str(), endofliststring.c_str());
@@ -238,8 +265,8 @@ class ListModeBase : public ModeHandler
         */
        virtual void DoImplements(Module* m)
        {
-               Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnCleanup, I_OnRehash };
-               ServerInstance->Modules->Attach(eventlist, m, 4);
+               Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnCleanup, I_OnRehash, I_OnRequest };
+               ServerInstance->Modules->Attach(eventlist, m, 5);
        }
 
        /** Handle the list mode.
@@ -462,6 +489,63 @@ class ListModeBase : public ModeHandler
        virtual void TellNotSet(User*, Channel*, std::string&)
        {
        }
+
+       virtual const char* DoOnRequest(Request* request)
+       {
+               ListModeRequest* LM = (ListModeRequest*)request;
+               if (strcmp("LM_CHECKLIST", request->GetId()) == 0)
+               {
+                       modelist* mlist;
+                       LM->chan->GetExt(GetInfoKey(), mlist);
+                       if (mlist)
+                       {
+                               std::string mask = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString();
+                               for (modelist::iterator it = mlist->begin(); it != mlist->end(); ++it)
+                               {
+                                       if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(mask, it->mask)))
+                                               return it->mask.c_str();
+                               }
+                               return NULL;
+                       }
+               }
+               else if (strcmp("LM_CHECKLIST_EX", request->GetId()) == 0)
+               {
+                       modelist* mlist;
+                       LM->chan->GetExt(GetInfoKey(), mlist);
+                       if (mlist)
+                       {
+                               if (LM->user)
+                                       LM->literal = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString();
+                               
+                               for (modelist::iterator it = mlist->begin(); it != mlist->end(); it++)
+                               {
+                                       if (LM->extban && it->mask.length() > 1 && it->mask[0] == LM->extban && it->mask[1] == ':')
+                                       {
+                                               static std::string ext = it->mask.substr(2);
+                                               if (LM->user)
+                                               {
+                                                       if (InspIRCd::Match(LM->user->GetFullRealHost(), ext) || InspIRCd::Match(LM->user->GetFullHost(), ext) || (InspIRCd::MatchCIDR(LM->literal, ext)))
+                                                               return it->mask.c_str();
+                                               }
+                                               else if (InspIRCd::Match(LM->literal, ext))
+                                                       return it->mask.c_str();
+                                       }
+                                       else
+                                       {
+                                               if (LM->user)
+                                               {
+                                                       if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(LM->literal, it->mask)))
+                                                               return it->mask.c_str();
+                                               }
+                                               else if (InspIRCd::Match(LM->literal, it->mask))
+                                                       return it->mask.c_str();
+                                       }
+                               }
+                       }
+               }
+               return NULL;
+       }
+
 };
 
 #endif