created = topicset = limit = 0;
internal_userlist.clear();
memset(&modes,0,64);
+ age = ServerInstance->Time(true);
}
void chanrec::SetMode(char mode,bool mode_on)
{
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));
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;
* 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));
* 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);
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;
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);
}
}
+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
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);
+ }
}