X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=b96b4588e92ad1fb95405c1cba549cfae53b1baf;hb=ed105d7fef72b5bb5f23e72fae40d6b4ffdcb5b8;hp=de698883fdf63a952574b435cec383c1fafa29b5;hpb=2d86278096674dea9d475747a7c80bede538fbc8;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index de698883f..b96b4588e 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -30,6 +30,7 @@ chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance) created = topicset = limit = 0; internal_userlist.clear(); memset(&modes,0,64); + age = ServerInstance->Time(true); } void chanrec::SetMode(char mode,bool mode_on) @@ -212,7 +213,7 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo { privs = "@"; - if (IS_LOCAL(user)) + if (IS_LOCAL(user) && override == false) { MOD_RESULT = 0; FOREACH_RESULT_I(Instance,I_OnUserPreJoin,OnUserPreJoin(user,NULL,cname,privs)); @@ -225,7 +226,11 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo Instance->chanlist[cname] = Ptr; strlcpy(Ptr->name, cname,CHANMAX); - Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1; + + /* As spotted by jilles, dont bother to set this on remote users */ + if (IS_LOCAL(user)) + Ptr->modes[CM_TOPICLOCK] = Ptr->modes[CM_NOEXTERNAL] = 1; + Ptr->created = Instance->Time(); *Ptr->topic = 0; *Ptr->setby = 0; @@ -243,7 +248,7 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo * remote users are allowed us to bypass channel modes * and bans (used by servers) */ - if (IS_LOCAL(user)) /* was a check on fd > -1 */ + if (IS_LOCAL(user) && override == false) { MOD_RESULT = 0; FOREACH_RESULT_I(Instance,I_OnUserPreJoin,OnUserPreJoin(user,Ptr,cname,privs)); @@ -328,7 +333,7 @@ chanrec* chanrec::JoinUser(InspIRCd* Instance, userrec *user, const char* cn, bo * and put the channel in here. Same for remote users which are not bound by * the channel limits. Otherwise, nope, youre boned. */ - if (!IS_LOCAL(user)) /* was a check on fd < 0 */ + if (!IS_LOCAL(user) || override == true) /* was a check on fd < 0 */ { ucrec* a = new ucrec(); chanrec* c = chanrec::ForceChan(Instance, Ptr, a, user, privs); @@ -690,7 +695,22 @@ void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status this->WriteAllExceptSender(user, serversource, status, std::string(textbuffer)); } -void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, const std::string& text) +void chanrec::WriteAllExcept(userrec* user, bool serversource, char status, CUList &except_list, char* text, ...) +{ + char textbuffer[MAXBUF]; + va_list argsPtr; + + if (!text) + return; + + va_start(argsPtr, text); + vsnprintf(textbuffer, MAXBUF, text, argsPtr); + va_end(argsPtr); + + this->WriteAllExcept(user, serversource, status, except_list, std::string(textbuffer)); +} + +void chanrec::WriteAllExcept(userrec* user, bool serversource, char status, CUList &except_list, const std::string &text) { CUList *ulist; @@ -712,7 +732,7 @@ void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - if ((IS_LOCAL(i->second)) && (user != i->second)) + if ((IS_LOCAL(i->second)) && (except_list.find(i->second) == except_list.end())) { if (serversource) i->second->WriteServ(text); @@ -722,6 +742,13 @@ void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status } } +void chanrec::WriteAllExceptSender(userrec* user, bool serversource, char status, const std::string& text) +{ + CUList except_list; + except_list[user] = user; + this->WriteAllExcept(user, serversource, status, except_list, std::string(text)); +} + /* * return a count of the users on a specific channel accounting for * invisible users who won't increase the count. e.g. for /LIST @@ -1009,12 +1036,16 @@ void chanrec::SetPrefix(userrec* user, char prefix, unsigned int prefix_value, b n->second.erase(x); } } + ServerInstance->Log(DEBUG,"Added prefix %c to %s for %s, prefixlist size is now %d", prefix, this->name, user->nick, prefixes.size()); } void chanrec::RemoveAllPrefixes(userrec* user) { prefixlist::iterator n = prefixes.find(user); if (n != prefixes.end()) + { + ServerInstance->Log(DEBUG,"Removed prefixes from %s for %s, prefixlist size is now %d", this->name, user->nick, prefixes.size()); prefixes.erase(n); + } }