+2005-11-17 Carlo Wood <run@alinoe.com>
+
+ * include/ircd_features.h (Feature): Add ZANNELS.
+ * ircd/ircd_features.c (FeatureDesc): idem.
+ * ircd/channel.c (sub1_from_channel): Don't keep zannels
+ around when ZANNELS and OPLEVELS are FALSE.
+ * ircd/m_destruct.c (ms_destruct): Use JOIN instead of
+ CREATE to recreate a non-empty channel after DESTRUCT.
+
2005-11-16 Michael Poole <mdpoole@troilus.org>
* tools/convert-conf.py: Delete obsolete code.
free_ban(link);
}
chptr->banlist = NULL;
+
+#if 1 /* Temporary code */
+ /* Immediately destruct empty -A channels if ZANNELS is FALSE.
+ When OPLEVELS is true, ZANNELS should be TRUE too. Test for
+ that error. This is done to avoid the DESTRUCT message to
+ occur, which is necessary on a network with mixed versions
+ of 2.10.12.x, with x < 04 *and* 2.10.11 servers. Because
+ servers prior to 2.10.12.04 can cause a BURST message outside
+ the normal net.burst as a result of a DESTRUCT message, and
+ 2.10.11 SQUIT servers when they do that. */
+ if (!(feature_bool(FEAT_ZANNELS) || feature_bool(FEAT_OPLEVELS)))
+ {
+ destruct_channel(chptr);
+ return 0;
+ }
+#endif
}
if (TStime() - chptr->creationtime < 172800) /* Channel younger than 48 hours? */
schedule_destruct_event_1m(chptr); /* Get rid of it in approximately 4-5 minutes */
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. */
/* 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);
}
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;