]> 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 15c139f6b54d5116595bc350b3afc314a0d7d859..358ccbf8312346117ac15935afc95f9b9abe387c 100644 (file)
@@ -55,7 +55,7 @@ class ListModeRequest : public Request
 {
  public:
        User* user;
-       const std::string literal;
+       std::string literal;
        const char extban;
        Channel* chan;
 
@@ -79,7 +79,19 @@ class ListModeRequest : public Request
         * @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"), literal(literalstr), extban(extbanchar), chan(channel)
+       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)
        {
        }
 
@@ -166,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());
@@ -487,7 +499,7 @@ class ListModeBase : public ModeHandler
                        LM->chan->GetExt(GetInfoKey(), mlist);
                        if (mlist)
                        {
-                               std::string mask = std::string(LM->user->nick) + "!" + LM->user->ident + "@" + LM->user->GetIPString();
+                               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)))
@@ -502,16 +514,30 @@ class ListModeBase : public ModeHandler
                        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] == ':')
                                        {
-                                               if (InspIRCd::Match(LM->literal.substr(2), it->mask))
+                                               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 (InspIRCd::Match(LM->literal, it->mask))
+                                               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();
                                        }
                                }