Do not send JOIN for zombies given ops or voice.
[ircu2.10.12-pk.git] / ircd / channel.c
index 6502c49fa23e12957906891e685aea20b62ea748..99e5182e6df59427cf825313573f17bb60915c23 100644 (file)
@@ -287,6 +287,13 @@ int sub1_from_channel(struct Channel* chptr)
       free_ban(link);
     }
     chptr->banlist = NULL;
+
+    /* Immediately destruct empty -A channels if not using apass. */
+    if (!feature_bool(FEAT_OPLEVELS))
+    {
+      destruct_channel(chptr);
+      return 0;
+    }
   }
   if (TStime() - chptr->creationtime < 172800) /* Channel younger than 48 hours? */
     schedule_destruct_event_1m(chptr);         /* Get rid of it in approximately 4-5 minutes */
@@ -679,7 +686,11 @@ int member_can_send_to_channel(struct Membership* member, int reveal)
    * we do not want to send ERR_CANNOTSENDTOCHAN more than once.
    */
   if (!MyUser(member->user))
+  {
+    if (IsDelayedJoin(member) && reveal)
+      RevealDelayedJoin(member);
     return 1;
+  }
 
   /* Discourage using the Apass to get op.  They should use the Upass. */
   if (IsChannelManager(member) && member->channel->mode.apass[0])
@@ -1571,7 +1582,10 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
 
   /* Ok, if we were given the OPMODE flag, or its a server, hide the source.
    */
-  if (mbuf->mb_dest & MODEBUF_DEST_OPMODE || IsServer(mbuf->mb_source) || IsMe(mbuf->mb_source))
+  if (feature_bool(FEAT_HIS_MODEWHO) &&
+      (mbuf->mb_dest & MODEBUF_DEST_OPMODE ||
+       IsServer(mbuf->mb_source) ||
+       IsMe(mbuf->mb_source)))
     app_source = &his;
   else
     app_source = mbuf->mb_source;
@@ -1848,7 +1862,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
        * We're propagating a normal MODE command to the rest of the network;
        * we send the actual channel TS unless this is a HACK3 or a HACK4
        */
-      if (IsServer(mbuf->mb_source))
+      if (IsServer(mbuf->mb_source) || IsMe(mbuf->mb_source))
        sendcmdto_serv_butone(mbuf->mb_source, CMD_MODE, mbuf->mb_connect,
                              "%H %s%s%s%s%s%s %Tu", mbuf->mb_channel,
                              rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
@@ -3071,7 +3085,7 @@ mode_process_clients(struct ParseState *state)
     /* actually effect the change */
     if (state->flags & MODE_PARSE_SET) {
       if (state->cli_change[i].flag & MODE_ADD) {
-        if (IsDelayedJoin(member))
+        if (IsDelayedJoin(member) && !IsZombie(member))
           RevealDelayedJoin(member);
        member->status |= (state->cli_change[i].flag &
                           (MODE_CHANOP | MODE_VOICE));