X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fm_destruct.c;h=f5b7dd60cfc118cbda14667fcfbf4ea1909403e2;hb=refs%2Fheads%2Fupstream-ssl;hp=cafbb6e3ba052970b84d948004c4156bc8f77d68;hpb=e54ec73c9572a6d6351e333225bb8f00d805b9e9;p=ircu2.10.12-pk.git diff --git a/ircd/m_destruct.c b/ircd/m_destruct.c index cafbb6e..f5b7dd6 100644 --- a/ircd/m_destruct.c +++ b/ircd/m_destruct.c @@ -143,30 +143,17 @@ int ms_destruct(struct Client* cptr, struct Client* sptr, int parc, char* parv[] a bug that causes two JOIN's for the same user to result in that user being on the channel twice). */ - struct Membership *chanop; struct Membership *member; - int is_real_chanop; struct ModeBuf mbuf; struct Ban *link; - /* First find a channel op, if any. */ - for (chanop = chptr->members; chanop && !IsChanOp(chanop); chanop = chanop->next_member); - /* Now chanop is either a channel op, or NULL. */ - is_real_chanop = chanop ? 1 : 0; - /* Next, send all PARTs upstream. */ for (member = chptr->members; member; member = member->next_member) sendcmdto_one(member->user, CMD_PART, cptr, "%H", chptr); - /* Next, send a CREATE. If we don't have a chanop, just use the first member. */ - if (!chanop) - chanop = chptr->members; - sendcmdto_one(chanop->user, CMD_CREATE, cptr, "%H %Tu", chptr, chanTS); - - /* Next, send JOINs for possible other members. */ + /* Next, send JOINs for all members. */ for (member = chptr->members; member; member = member->next_member) - if (member != chanop) - sendcmdto_one(member->user, CMD_JOIN, cptr, "%H", chptr); + sendcmdto_one(member->user, CMD_JOIN, cptr, "%H", chptr); /* Build MODE strings. We use MODEBUF_DEST_BOUNCE with MODE_DEL to assure that the resulting MODEs are only sent upstream. */ @@ -175,8 +162,8 @@ int ms_destruct(struct Client* cptr, struct Client* sptr, int parc, char* parv[] /* Op/voice the users as appropriate. We use MODE_DEL because we fake a bounce. */ for (member = chptr->members; member; member = member->next_member) { - if (IsChanOp(member) && member != chanop) - modebuf_mode_client(&mbuf, MODE_DEL | MODE_CHANOP, member->user, OpLevel(member)); + if (IsChanOp(member)) + modebuf_mode_client(&mbuf, MODE_DEL | MODE_CHANOP, member->user, OpLevel(member)); if (HasVoice(member)) modebuf_mode_client(&mbuf, MODE_DEL | MODE_VOICE, member->user, MAXOPLEVEL + 1); } @@ -194,10 +181,6 @@ int ms_destruct(struct Client* cptr, struct Client* sptr, int parc, char* parv[] for (link = chptr->banlist; link; link = link->next) modebuf_mode_string(&mbuf, MODE_DEL | MODE_BAN, link->banstr, 0); modebuf_flush(&mbuf); - - /* When chanop wasn't really a chanop, let him deop himself. */ - if (!is_real_chanop) - sendcmdto_one(chanop->user, CMD_MODE, cptr, "%H -o %C", chptr, chanop->user); #endif return 0; @@ -207,7 +190,8 @@ int ms_destruct(struct Client* cptr, struct Client* sptr, int parc, char* parv[] sendcmdto_serv_butone(&me, CMD_DESTRUCT, 0, "%s %Tu", parv[1], chanTS); /* Remove the empty channel. */ - remove_destruct_event(chptr); + if (chptr->destruct_event) + remove_destruct_event(chptr); destruct_channel(chptr); return 0;