]> jfr.im git - irc/quakenet/snircd.git/commitdiff
forward port of asuka-noquitparts.patch to .12
authorpaul <redacted>
Sun, 23 Oct 2005 20:44:00 +0000 (21:44 +0100)
committerpaul <redacted>
Sun, 23 Oct 2005 20:44:00 +0000 (21:44 +0100)
include/channel.h
include/supported.h
ircd/channel.c
ircd/m_clearmode.c
ircd/m_quit.c

index 2387c0c55864a65a7aef5e5a698b4baf43cc9a5c..e717cd5432aac14b2e3f181c741650229d5c127c 100644 (file)
@@ -110,6 +110,8 @@ struct Client;
 #define MODE_APASS     0x200000
 #define MODE_WASDELJOINS 0x400000      /**< Not DELJOINS, but some joins 
                                         * pending */
+#define MODE_NOQUITPARTS 0x800000
+
 /** mode flags which take another parameter (With PARAmeterS)
  */
 #define MODE_WPARAS     (MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_APASS|MODE_UPASS)
index 0fc1ac10dadd72ccbccd869e4bbb97504c7ae3cc..c0e6bd9e163371db4c30f8b67223ba38927b29c1 100644 (file)
@@ -64,7 +64,7 @@
                         feature_int(FEAT_CHANNELLEN), CHANNELLEN
 
 #define FEATURESVALUES2 (feature_bool(FEAT_LOCAL_CHANNELS) ? "#&" : "#"), "(ov)@+", "@+", \
-                        (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDd" : "b,k,l,imnpstrDd"), \
+                        (feature_bool(FEAT_OPLEVELS) ? "b,AkU,l,imnpstrDdu" : "b,k,l,imnpstrDdu"), \
                         "rfc1459", feature_str(FEAT_NETWORK)
 
 #endif /* INCLUDED_supported_h */
index 49b29299df7e2ec3013ee4bb596cc93409616148..e4cb2f7b80532d747b1cca9ae92c78dff303296b 100644 (file)
@@ -790,6 +790,8 @@ void channel_modes(struct Client *cptr, char *mbuf, char *pbuf, int buflen,
     *mbuf++ = 'n';
   if (chptr->mode.mode & MODE_REGONLY)
     *mbuf++ = 'r';
+  if (chptr->mode.mode & MODE_NOQUITPARTS)
+    *mbuf++ = 'u';
   if (chptr->mode.mode & MODE_DELJOINS)
     *mbuf++ = 'D';
   else if (MyUser(cptr) && (chptr->mode.mode & MODE_WASDELJOINS))
@@ -804,7 +806,7 @@ void channel_modes(struct Client *cptr, char *mbuf, char *pbuf, int buflen,
     *mbuf++ = 'k';
     if (previous_parameter)
       strcat(pbuf, " ");
-    if (is_chan_op(cptr, chptr) || IsServer(cptr)) {
+    if (is_chan_op(cptr, chptr) || IsServer(cptr) || IsOper(cptr)) {
       strcat(pbuf, chptr->mode.key);
     } else
       strcat(pbuf, "*");
@@ -1505,6 +1507,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
     MODE_LIMIT,                'l',
 /*  MODE_APASS,                'A', */
 /*  MODE_UPASS,                'U', */
+    MODE_NOQUITPARTS,   'u',
     0x0, 0x0
   };
   int i;
@@ -1901,7 +1904,7 @@ modebuf_mode(struct ModeBuf *mbuf, unsigned int mode)
 
   mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED |
           MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
-           MODE_DELJOINS | MODE_WASDELJOINS);
+           MODE_DELJOINS | MODE_WASDELJOINS | MODE_NOQUITPARTS);
 
   if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
     return;
@@ -2048,6 +2051,7 @@ modebuf_extract(struct ModeBuf *mbuf, char *buf)
     MODE_LIMIT,                'l',
     MODE_REGONLY,      'r',
     MODE_DELJOINS,      'D',
+    MODE_NOQUITPARTS,   'u',
     0x0, 0x0
   };
   unsigned int add;
@@ -3075,6 +3079,7 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
     MODE_LIMIT,                'l',
     MODE_REGONLY,      'r',
     MODE_DELJOINS,      'D',
+    MODE_NOQUITPARTS,   'u',
     MODE_ADD,          '+',
     MODE_DEL,          '-',
     0x0, 0x0
@@ -3310,11 +3315,13 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
     /* Send notification to channel */
     if (!(flags & (CHFL_ZOMBIE | CHFL_DELAYED)))
       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL, 0,
-                               (flags & CHFL_BANNED || !jbuf->jb_comment) ?
-                               ":%H" : "%H :%s", chan, jbuf->jb_comment);
+                   ((flags & CHFL_BANNED) || ((chan->mode.mode & MODE_NOQUITPARTS)
+                    && !IsChannelService(member->user)) || !jbuf->jb_comment) ?
+                   "%H" : "%H :%s", chan, jbuf->jb_comment);
     else if (MyUser(jbuf->jb_source))
       sendcmdto_one(jbuf->jb_source, CMD_PART, jbuf->jb_source,
-                   (flags & CHFL_BANNED || !jbuf->jb_comment) ?
+                   ((flags & CHFL_BANNED) || (chan->mode.mode & MODE_NOQUITPARTS)
+                    || !jbuf->jb_comment) ?
                    ":%H" : "%H :%s", chan, jbuf->jb_comment);
     /* XXX: Shouldn't we send a PART here anyway? */
     /* to users on the channel?  Why?  From their POV, the user isn't on
index de87212ae1a6f718e9af0f6f373b64e0c76c1e8e..6897d48c12a9d4e7dcbca8d10476f9cd6f77188c 100644 (file)
@@ -124,6 +124,7 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
     MODE_LIMIT,                'l',
     MODE_REGONLY,      'r',
     MODE_DELJOINS,      'D',
+    MODE_NOQUITPARTS,   'u',
     0x0, 0x0
   };
   int *flag_p;
index 14f7278d3457c7032deb18365acf89dccc589c0a..534e864b1009cb099847139c5518a89173ea4b23 100644 (file)
@@ -107,9 +107,11 @@ int m_quit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 
   if (cli_user(sptr)) {
     struct Membership* chan;
+    /* (slug for +u) removed !IsDelayedJoin(chan) as splidge said to */
     for (chan = cli_user(sptr)->channel; chan; chan = chan->next_channel) {
-        if (!IsZombie(chan) && !IsDelayedJoin(chan) && !member_can_send_to_channel(chan, 0))
-        return exit_client(cptr, sptr, sptr, "Signed off");
+        if (!IsZombie(chan) && (!member_can_send_to_channel(chan, 0)
+           || (chan->channel->mode.mode & MODE_NOQUITPARTS)))
+          return exit_client(cptr, sptr, sptr, "Signed off");
     }
   }
   if (parc > 1 && !BadPtr(parv[parc - 1]))