]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/channels.cpp
auto-set +s when +n is set (as +n requires +s) - allow +n to be 'set twice' allowing...
[user/henk/code/inspircd.git] / src / channels.cpp
index 048b77a1f589f09571a87ef19ab4e6fd33fb16c8..ba4277eb50f08629be68f441e1b60e9cb789aad1 100644 (file)
@@ -450,7 +450,6 @@ chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr,ucrec *a,userrec* u
                        user->WriteServ("333 %s %s %s %lu", user->nick, Ptr->name, Ptr->setby, (unsigned long)Ptr->topicset);
                }
                Ptr->UserList(user);
-               user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, Ptr->name);
        }
        FOREACH_MOD_I(Instance,I_OnUserJoin,OnUserJoin(user,Ptr));
        return Ptr;
@@ -811,6 +810,14 @@ void chanrec::UserList(userrec *user)
 {
        char list[MAXBUF];
        size_t dlen, curlen;
+       int MOD_RESULT = 0;
+
+       FOREACH_RESULT(I_OnUserList,OnUserList(user, this));
+       ServerInstance->Log(DEBUG,"MOD_RESULT for UserList = %d",MOD_RESULT);
+       if (MOD_RESULT == 1)
+               return;
+
+       ServerInstance->Log(DEBUG,"Using builtin NAMES list generation");
 
        dlen = curlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, this->name);
 
@@ -835,7 +842,7 @@ void chanrec::UserList(userrec *user)
                        continue;
                }
 
-               size_t ptrlen = snprintf(ptr, MAXBUF, "%s%s ", this->GetStatusChar(i->second), i->second->nick);
+               size_t ptrlen = snprintf(ptr, MAXBUF, "%s%s ", this->GetPrefixChar(i->second), i->second->nick);
 
                curlen += ptrlen;
                ptr += ptrlen;
@@ -861,6 +868,8 @@ void chanrec::UserList(userrec *user)
        {
                user->WriteServ(list);
        }
+
+       user->WriteServ("366 %s %s :End of /NAMES list.", user->nick, this->name);
 }
 
 long chanrec::GetMaxBans()
@@ -906,6 +915,26 @@ const char* chanrec::GetPrefixChar(userrec *user)
        return px;
 }
 
+const char* chanrec::GetAllPrefixChars(userrec* user)
+{
+       static char prefix[MAXBUF];
+       int ctr = 0;
+       *prefix = 0;
+
+       prefixlist::iterator n = prefixes.find(user);
+       if (n != prefixes.end())
+       {
+               for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
+               {
+                       prefix[ctr++] = x->first;
+               }
+       }
+
+       prefix[ctr] = 0;
+
+       return prefix;
+}
+
 unsigned int chanrec::GetPrefixValue(userrec* user)
 {
        unsigned int mx = 0;
@@ -964,6 +993,11 @@ int chanrec::GetStatus(userrec *user)
        return STATUS_NORMAL;
 }
 
+/*bool ModeParser::PrefixComparison(const prefixtype one, const prefixtype two)
+{       
+        return one.second > two.second;
+}*/
+
 void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, bool adding)
 {
        prefixlist::iterator n = prefixes.find(user);
@@ -975,6 +1009,7 @@ void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, b
                        if (std::find(n->second.begin(), n->second.end(), pfx) == n->second.end())
                        {
                                n->second.push_back(pfx);
+                               std::sort(n->second.begin(), n->second.end(), ModeParser::PrefixComparison);
                        }
                }
                else