X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Fchannel.c;h=9c0f192d2a3cd79502fda636e5d7ada15bfaec89;hp=aae13e6e595cfd37babb8773212a6bd0f544393c;hb=f2f202755d04c25b61e2b2a18a347e917acf1b9b;hpb=2a6a833ef097f5c53726ddd6b59b5643bfa18143 diff --git a/ircd/channel.c b/ircd/channel.c index aae13e6..9c0f192 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -1489,6 +1489,20 @@ build_string(char *strptr, int *strptr_i, const char *str1, strptr[(*strptr_i)] = '\0'; } +/** Check a channel for join-delayed members. + * @param[in] chan Channel to search. + * @return Non-zero if any members are join-delayed; false if none are. + */ +static int +find_delayed_joins(const struct Channel *chan) +{ + const struct Membership *memb; + for (memb = chan->members; memb; memb = memb->next_member) + if (IsDelayedJoin(memb)) + return 1; + return 0; +} + /** Flush out the modes * This is the workhorse of our ModeBuf suite; this actually generates the * output MODE commands, HACK notices, or whatever. It's pretty complicated. @@ -1568,6 +1582,23 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all) else app_source = mbuf->mb_source; + /* Must be set if going -D and some clients are hidden */ + if ((mbuf->mb_rem & MODE_DELJOINS) + && !(mbuf->mb_channel->mode.mode & (MODE_DELJOINS | MODE_WASDELJOINS)) + && find_delayed_joins(mbuf->mb_channel)) { + mbuf->mb_channel->mode.mode |= MODE_WASDELJOINS; + mbuf->mb_add |= MODE_WASDELJOINS; + mbuf->mb_rem &= ~MODE_WASDELJOINS; + } + + /* +d must be cleared if +D is set */ + if ((mbuf->mb_add & MODE_DELJOINS) + && (mbuf->mb_channel->mode.mode & MODE_WASDELJOINS)) { + mbuf->mb_channel->mode.mode &= ~MODE_WASDELJOINS; + mbuf->mb_add &= ~MODE_WASDELJOINS; + mbuf->mb_rem |= MODE_WASDELJOINS; + } + /* * Account for user we're bouncing; we have to get it in on the first * bounced MODE, or we could have problems @@ -2024,47 +2055,15 @@ modebuf_mode_client(struct ModeBuf *mbuf, unsigned int mode, modebuf_flush_int(mbuf, 0); } -/** Check a channel for join-delayed members. - * @param[in] chan Channel to search. - * @return Non-zero if any members are join-delayed; false if none are. - */ -static int -find_delayed_joins(const struct Channel *chan) -{ - const struct Membership *memb; - for (memb = chan->members; memb; memb = memb->next_member) - if (IsDelayedJoin(memb)) - return 1; - return 0; -} - /** The exported binding for modebuf_flush() * * @param mbuf The mode buffer to flush. - * + * * @see modebuf_flush_int() */ int modebuf_flush(struct ModeBuf *mbuf) { - /* Check if MODE_WASDELJOINS should be set: */ - /* Must be set if going -D and some clients are hidden */ - if ((mbuf->mb_rem & MODE_DELJOINS) - && !(mbuf->mb_channel->mode.mode & (MODE_DELJOINS | MODE_WASDELJOINS)) - && find_delayed_joins(mbuf->mb_channel)) { - mbuf->mb_channel->mode.mode |= MODE_WASDELJOINS; - mbuf->mb_add |= MODE_WASDELJOINS; - mbuf->mb_rem &= ~MODE_WASDELJOINS; - } - /* Must be cleared if +D is set */ - if ((mbuf->mb_add & MODE_DELJOINS) - && ((mbuf->mb_channel->mode.mode & (MODE_WASDELJOINS | MODE_WASDELJOINS)) - == (MODE_WASDELJOINS | MODE_WASDELJOINS))) { - mbuf->mb_channel->mode.mode &= ~MODE_WASDELJOINS; - mbuf->mb_add &= ~MODE_WASDELJOINS; - mbuf->mb_rem |= MODE_WASDELJOINS; - } - return modebuf_flush_int(mbuf, 1); }