X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhelperfuncs.cpp;h=f728516f90752b45b59f1cd720ce281c8d078092;hb=c2a5839bcbd6bebf0dd102a8dfd283e92c8a0507;hp=52f365fb2430f69fec8ba253542f9bc419f93ea9;hpb=f0ad6011a36b17b42223bf78f62fd252cc858941;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 52f365fb2..f728516f9 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -458,7 +458,7 @@ void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...) { char textbuffer[MAXBUF]; va_list argsPtr; - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!user) || (!text)) { @@ -472,20 +472,16 @@ void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...) ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX - WHAT THE HELL are we doing here? :P --w00t */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (otheruser->fd != FD_MAGIC_NUMBER) - WriteTo_NoFormat(user,otheruser,textbuffer); + if (i->second->fd != FD_MAGIC_NUMBER) + WriteTo_NoFormat(user,i->second,textbuffer); } } void WriteChannel_NoFormat(chanrec* Ptr, userrec* user, const char* text) { - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!user) || (!text)) { @@ -495,14 +491,10 @@ void WriteChannel_NoFormat(chanrec* Ptr, userrec* user, const char* text) ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX - .....and here! --w00t */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (otheruser->fd != FD_MAGIC_NUMBER) - WriteTo_NoFormat(user,otheruser,text); + if (i->second->fd != FD_MAGIC_NUMBER) + WriteTo_NoFormat(user,i->second,text); } } @@ -515,7 +507,7 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...) { char textbuffer[MAXBUF]; va_list argsPtr; - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!text)) { @@ -529,21 +521,17 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...) ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX -- w00t */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user)) + if ((i->second->fd != FD_MAGIC_NUMBER) && (i->second != user)) { if (!user) { - WriteServ_NoFormat(otheruser->fd,textbuffer); + WriteServ_NoFormat(i->second->fd,textbuffer); } else { - WriteTo_NoFormat(user,otheruser,textbuffer); + WriteTo_NoFormat(user,i->second,textbuffer); } } } @@ -551,7 +539,7 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...) void WriteChannelLocal_NoFormat(chanrec* Ptr, userrec* user, const char* text) { - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!text)) { @@ -561,21 +549,17 @@ void WriteChannelLocal_NoFormat(chanrec* Ptr, userrec* user, const char* text) ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX -- w00t */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user)) + if ((i->second->fd != FD_MAGIC_NUMBER) && (i->second != user)) { if (!user) { - WriteServ_NoFormat(otheruser->fd,text); + WriteServ_NoFormat(i->second->fd,text); } else { - WriteTo_NoFormat(user,otheruser,text); + WriteTo_NoFormat(user,i->second,text); } } } @@ -587,7 +571,7 @@ void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...) { char textbuffer[MAXBUF]; va_list argsPtr; - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!text)) { @@ -601,20 +585,16 @@ void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...) ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (IS_LOCAL(otheruser)) - WriteServ_NoFormat(otheruser->fd,textbuffer); + if (IS_LOCAL(i->second)) + WriteServ_NoFormat(i->second->fd,textbuffer); } } void WriteChannelWithServ_NoFormat(char* ServName, chanrec* Ptr, const char* text) { - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!text)) { @@ -624,14 +604,10 @@ void WriteChannelWithServ_NoFormat(char* ServName, chanrec* Ptr, const char* tex ulist = Ptr->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (IS_LOCAL(otheruser)) - WriteServ_NoFormat(otheruser->fd,text); + if (IS_LOCAL(i->second)) + WriteServ_NoFormat(i->second->fd,text); } } @@ -644,7 +620,7 @@ void ChanExceptSender(chanrec* Ptr, userrec* user, char status, char* text, ...) { char textbuffer[MAXBUF]; va_list argsPtr; - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!user) || (!text)) { @@ -674,20 +650,16 @@ void ChanExceptSender(chanrec* Ptr, userrec* user, char status, char* text, ...) log(DEBUG,"%d users to write to",ulist->size()); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((IS_LOCAL(otheruser)) && (user != otheruser)) - WriteFrom_NoFormat(otheruser->fd,user,textbuffer); + if ((IS_LOCAL(i->second)) && (user != i->second)) + WriteFrom_NoFormat(i->second->fd,user,textbuffer); } } void ChanExceptSender_NoFormat(chanrec* Ptr, userrec* user, char status, const char* text) { - std::map *ulist; + CUList *ulist; if ((!Ptr) || (!user) || (!text)) { @@ -711,14 +683,10 @@ void ChanExceptSender_NoFormat(chanrec* Ptr, userrec* user, char status, const c break; } - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - /* XXX */ - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((IS_LOCAL(otheruser)) && (user != otheruser)) - WriteFrom_NoFormat(otheruser->fd,user,text); + if ((IS_LOCAL(i->second)) && (user != i->second)) + WriteFrom_NoFormat(i->second->fd,user,text); } } @@ -773,17 +741,14 @@ void WriteCommon(userrec *u, char* text, ...) { if (u->chans[i].channel) { - std::map *ulist= u->chans[i].channel->GetUsers(); + CUList *ulist= u->chans[i].channel->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((otheruser->fd > -1) && (!already_sent[otheruser->fd])) + if ((i->second->fd > -1) && (!already_sent[i->second->fd])) { - already_sent[otheruser->fd] = 1; - WriteFrom_NoFormat(otheruser->fd,u,textbuffer); + already_sent[i->second->fd] = 1; + WriteFrom_NoFormat(i->second->fd,u,textbuffer); sent_to_at_least_one = true; } } @@ -825,17 +790,14 @@ void WriteCommon_NoFormat(userrec *u, const char* text) { if (u->chans[i].channel) { - std::map *ulist= u->chans[i].channel->GetUsers(); + CUList *ulist= u->chans[i].channel->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if ((otheruser->fd > -1) && (!already_sent[otheruser->fd])) + if ((i->second->fd > -1) && (!already_sent[i->second->fd])) { - already_sent[otheruser->fd] = 1; - WriteFrom_NoFormat(otheruser->fd,u,text); + already_sent[i->second->fd] = 1; + WriteFrom_NoFormat(i->second->fd,u,text); sent_to_at_least_one = true; } } @@ -887,7 +849,6 @@ void WriteCommonExcept(userrec *u, char* text, ...) /* Yeah yeah, this is ugly. But its fast, live with it. */ char* check = textbuffer; - /* XXX - don't mean to be picky, but I think this could be done better */ if ((*check++ == 'Q') && (*check++ == 'U') && (*check++ == 'I') && (*check++ == 'T') && (*check++ == ' ') && (*check++ == ':')) { std::stringstream split(check); @@ -931,25 +892,22 @@ void WriteCommonExcept(userrec *u, char* text, ...) { if (u->chans[i].channel) { - std::map *ulist= u->chans[i].channel->GetUsers(); + CUList *ulist= u->chans[i].channel->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (u != otheruser) + if (u != i->second) { - if ((otheruser->fd > -1) && (!already_sent[otheruser->fd])) + if ((i->second->fd > -1) && (!already_sent[i->second->fd])) { - already_sent[otheruser->fd] = 1; + already_sent[i->second->fd] = 1; if (quit_munge) { - WriteFrom_NoFormat(otheruser->fd,u,*otheruser->oper ? oper_quit : textbuffer); + WriteFrom_NoFormat(i->second->fd,u,*i->second->oper ? oper_quit : textbuffer); } else - WriteFrom_NoFormat(otheruser->fd,u,textbuffer); + WriteFrom_NoFormat(i->second->fd,u,textbuffer); } } } @@ -980,19 +938,16 @@ void WriteCommonExcept_NoFormat(userrec *u, const char* text) { if (u->chans[i].channel) { - std::map *ulist= u->chans[i].channel->GetUsers(); + CUList *ulist= u->chans[i].channel->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - char* o = i->second; - userrec* otheruser = (userrec*)o; - - if (u != otheruser) + if (u != i->second) { - if ((otheruser->fd > -1) && (!already_sent[otheruser->fd])) + if ((i->second->fd > -1) && (!already_sent[i->second->fd])) { - already_sent[otheruser->fd] = 1; - WriteFrom_NoFormat(otheruser->fd,u,text); + already_sent[i->second->fd] = 1; + WriteFrom_NoFormat(i->second->fd,u,text); } } } @@ -1001,7 +956,13 @@ void WriteCommonExcept_NoFormat(userrec *u, const char* text) } -/* XXX - replace with a call to WriteMode() ? -- w00t */ +/* XXX - We don't use WriteMode for this because WriteMode is very slow and + * this isnt. Basically WriteMode has to iterate ALL the users 'n' times for + * the number of modes provided, e.g. if you send WriteMode 'og' to write to + * opers with globops, and you have 2000 users, thats 4000 iterations. WriteOpers + * uses the oper list, which means if you have 2000 users but only 5 opers, + * it iterates 5 times. + */ void WriteOpers(char* text, ...) { char textbuffer[MAXBUF]; @@ -1258,49 +1219,37 @@ long GetMaxBans(char* name) void purge_empty_chans(userrec* u) { int purge = 0; + std::vector to_delete; // firstly decrement the count on each channel - for (unsigned int f = 0; f < u->chans.size(); f++) + for (std::vector::iterator f = u->chans.begin(); f != u->chans.end(); f++) { - if (u->chans[f].channel) + ucrec* (ucrec*)*f; + if (f->channel) { - u->chans[f].channel->DelUser((char*)u); + if (f->channel->DelUser(u) == 0) + { + /* No users left in here, mark it for deletion */ + to_delete.push_back(f->channel); + f->channel = NULL; + } } } - for (unsigned int i = 0; i < u->chans.size(); i++) + for (std::vector::iterator n = to_delete.begin(); n != to_delete.end(); n++) { - if (u->chans[i].channel) + chanrec* thischan = (chanrec*)*n; + chan_hash::iterator i2 = chanlist.find(thischan->name); + if (i2 != chanlist.end()) { - if (!usercount(u->chans[i].channel)) - { - chan_hash::iterator i2 = chanlist.find(u->chans[i].channel->name); - - /* kill the record */ - if (i2 != chanlist.end()) - { - log(DEBUG,"del_channel: destroyed: %s",i2->second->name); - - if (i2->second) - { - FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(i2->second)); - delete i2->second; - } - - chanlist.erase(i2); - purge++; - u->chans[i].channel = NULL; - } - } - else - { - log(DEBUG,"skipped purge for %s",u->chans[i].channel->name); - } + FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(i2->second)); + delete i2->second; + chanlist.erase(i2); } } - log(DEBUG,"completed channel purge, killed %lu",(unsigned long)purge); - DeleteOper(u); + if (*u->oper) + DeleteOper(u); } @@ -1349,9 +1298,10 @@ char* chanmodes(chanrec *chan, bool showkey) strlcat(sparam,foo,MAXBUF); } - for (int n = 0; n < 190; n++) + /* This was still iterating up to 190, chanrec::custom_modes is only 64 elements -- Om */ + for(int n = 0; n < 64; n++) { - if (chan->custom_modes[n]) + if(chan->custom_modes[n]) { *offset++ = n+65; std::string extparam = chan->GetModeParameter(n+65); @@ -1385,14 +1335,16 @@ void userlist(userrec *user,chanrec *c) size_t dlen = snprintf(list,MAXBUF,"353 %s = %s :", user->nick, c->name); size_t initial = dlen; - std::map *ulist= c->GetUsers(); + CUList *ulist= c->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) - { - char* o = i->second; - userrec* otheruser = (userrec*)o; + /* Improvement by Brain - this doesnt change in value, so why was it inside + * the loop? + */ + bool has_user = c->HasUser(user); - if ((!has_channel(user,c)) && (strchr(otheruser->modes,'i'))) + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + { + if ((!has_user) && (strchr(i->second->modes,'i'))) { /* * user is +i, and source not on the channel, does not show @@ -1401,8 +1353,8 @@ void userlist(userrec *user,chanrec *c) continue; } - dlen += strlcat(list,cmode(otheruser,c),MAXBUF); - dlen += strlcat(list,otheruser->nick,MAXBUF); + dlen += strlcat(list,cmode(i->second,c),MAXBUF); + dlen += strlcat(list,i->second->nick,MAXBUF); charlcat(list,' ',MAXBUF); dlen++; @@ -1432,12 +1384,10 @@ int usercount_i(chanrec *c) if (!c) return 0; - std::map *ulist= c->GetUsers(); - for (std::map::iterator i = ulist->begin(); i != ulist->end(); i++) + CUList *ulist= c->GetUsers(); + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - char* o = i->second; - userrec* user = (userrec*)o; - if (!strchr(user->modes,'i')) + if (!strchr(i->second->modes,'i')) count++; } @@ -1830,9 +1780,8 @@ bool charremove(char* mp, char remove) if (shift_down) *mptr = *(mptr+1); - *mptr++; + mptr++; } return shift_down; } -