2004-05-09 Michael Poole <mdpoole@troilus.org>
[ircu2.10.12-pk.git] / ircd / channel.c
index b477c6c08ed6bc4c14a07725453edc2541cd2944..0aa8da8650b4f73dc2e7318fb4301d4da07af950 100644 (file)
@@ -711,7 +711,7 @@ int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr)
 
 /*
  * find_no_nickchange_channel
- * if a member and not opped or voiced and banned
+ * if a member and not (opped or voiced) and (banned or moderated)
  * return the name of the first channel banned on
  */
 const char* find_no_nickchange_channel(struct Client* cptr)
@@ -720,7 +720,9 @@ const char* find_no_nickchange_channel(struct Client* cptr)
     struct Membership* member;
     for (member = (cli_user(cptr))->channel; member;
         member = member->next_channel) {
-      if (!IsVoicedOrOpped(member) && is_banned(cptr, member->channel, member))
+        if (!IsVoicedOrOpped(member) &&
+            (is_banned(cptr, member->channel, member) ||
+             (member->channel->mode.mode & MODE_MODERATED)))
         return member->channel->chname;
     }
   }
@@ -3139,6 +3141,11 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
 
   if (jbuf->jb_type == JOINBUF_TYPE_PART ||
       jbuf->jb_type == JOINBUF_TYPE_PARTALL) {
+    struct Membership *member = find_member_link(chan, jbuf->jb_source);
+    if (IsUserParting(member))
+      return;
+    SetUserParting(member);
+
     /* Send notification to channel */
     if (!(flags & CHFL_ZOMBIE))
       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL,