added MODE_HALFOP (+h, %)
[ircu2.10.12-pk.git] / ircd / m_burst.c
index 15d70344ab600d8c2e10eb9a9b104534036ff036..71fac547ad6faa1d596cb2de64f3b13f543ec2c4 100644 (file)
@@ -505,6 +505,14 @@ int ms_burst(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
                  current_mode = (current_mode & ~CHFL_DELAYED) | CHFL_VOICE;
                  oplevel = -1; /* subsequent digits are an absolute op-level value. */
                 }
+        else if (*ptr == 'h') { /* has halfop status */
+                 if (current_mode_needs_reset) {
+                    current_mode = base_mode;
+                   current_mode_needs_reset = 0;
+                 }
+                 current_mode = (current_mode & ~CHFL_DELAYED) | CHFL_HALFOP;
+                 oplevel = -1; /* subsequent digits are an absolute op-level value. */
+                }
         else if (*ptr == 'i') { /* has voice status */
                  if (current_mode_needs_reset) {
                     current_mode = base_mode;
@@ -579,6 +587,8 @@ int ms_burst(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
               Remember the current mode. */
            if (member->status & CHFL_CHANOP)
              member->status |= CHFL_BURST_ALREADY_OPPED;
+        if (member->status & CHFL_HALFOP)
+             member->status |= CHFL_BURST_ALREADY_HALFOPPED;
            if (member->status & CHFL_VOICE)
              member->status |= CHFL_BURST_ALREADY_VOICED;
            /* Synchronize with the burst. */
@@ -613,15 +623,19 @@ int ms_burst(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
       if (member->status & CHFL_BURST_JOINED) { /* joined during burst */
        if ((member->status & CHFL_CHANOP) && !(member->status & CHFL_BURST_ALREADY_OPPED))
          modebuf_mode_client(mbuf, MODE_ADD | CHFL_CHANOP, member->user, OpLevel(member));
+    if ((member->status & CHFL_HALFOP) && !(member->status & CHFL_BURST_ALREADY_HALFOPPED))
+         modebuf_mode_client(mbuf, MODE_ADD | CHFL_HALFOP, member->user, OpLevel(member));
        if ((member->status & CHFL_VOICE) && !(member->status & CHFL_BURST_ALREADY_VOICED))
          modebuf_mode_client(mbuf, MODE_ADD | CHFL_VOICE, member->user, OpLevel(member));
       } else if (parse_flags & MODE_PARSE_WIPEOUT) { /* wipeout old ops */
        if (member->status & CHFL_CHANOP)
          modebuf_mode_client(mbuf, MODE_DEL | CHFL_CHANOP, member->user, OpLevel(member));
+    if (member->status & CHFL_HALFOP)
+         modebuf_mode_client(mbuf, MODE_DEL | CHFL_HALFOP, member->user, OpLevel(member));
        if (member->status & CHFL_VOICE)
          modebuf_mode_client(mbuf, MODE_DEL | CHFL_VOICE, member->user, OpLevel(member));
        member->status = (member->status
-                          & ~(CHFL_CHANNEL_MANAGER | CHFL_CHANOP | CHFL_VOICE))
+                          & ~(CHFL_CHANNEL_MANAGER | CHFL_CHANOP | CHFL_HALFOP | CHFL_VOICE))
                         | CHFL_DEOPPED;
       }
     }