remove old unused stuff
[ircu2.10.12-pk.git] / ircd / channel.c
index 1ca8519486edcb0a135583718df110e91a2a78fb..9de97d3755d5f65c516c8e6bfc2eeab9e2a74d64 100644 (file)
@@ -1280,36 +1280,12 @@ static void send_ban_list(struct Client* cptr, struct Channel* chptr)
   assert(0 != cptr);
   assert(0 != chptr);
 
-  for (lp = chptr->banlist; lp; lp = lp->next) {
-    if(!(lp->flags & BAN_EXCEPTION))
-        send_reply(cptr, RPL_BANLIST, chptr->chname, lp->banstr,
-                   lp->who, lp->when);
-  }
+  for (lp = chptr->banlist; lp; lp = lp->next)
+    send_reply(cptr, RPL_BANLIST, chptr->chname, lp->banstr, lp->who, lp->when);
 
   send_reply(cptr, RPL_ENDOFBANLIST, chptr->chname);
 }
 
-/** send an exceptionlist to a client for a channel
- *
- * @param cptr Client to send the exceptionlist to.
- * @param chptr        Channel whose exceptionlist to send.
- */
-static void send_exception_list(struct Client* cptr, struct Channel* chptr)
-{
-  struct Ban* lp;
-
-  assert(0 != cptr);
-  assert(0 != chptr);
-
-  for (lp = chptr->banlist; lp; lp = lp->next) {
-    if(lp->flags & BAN_EXCEPTION)
-        send_reply(cptr, RPL_EXCEPTIONLIST, chptr->chname, lp->banstr,
-                   lp->who, lp->when);
-  }
-
-  send_reply(cptr, RPL_ENDOFEXCEPTIONLIST, chptr->chname);
-}
-
 /** Get a channel block, creating if necessary.
  *  Get Channel block for chname (and allocate a new channel
  *  block, if it didn't exists before).
@@ -1611,7 +1587,6 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
     MODE_PERSIST,      'z',
     MODE_NOCOLOUR,  'c',
     MODE_NOCTCP,    'C',
-/*  MODE_EXCEPTION, 'e', */
 /*  MODE_ALTCHAN,   'F', */
 /*  MODE_NOFLOOD,   'f', */
     MODE_ACCESS,    'a',
@@ -1710,14 +1685,14 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
        bufptr[(*bufptr_i)++] = MB_TYPE(mbuf, i) & MODE_CHANOP ? 'o' : 'v';
        totalbuflen -= IRCD_MAX(9, tmp) + 1;
       }
-    } else if (MB_TYPE(mbuf, i) & (MODE_BAN | MODE_EXCEPTION | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD)) {
+    } else if (MB_TYPE(mbuf, i) & (MODE_BAN | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD)) {
       tmp = strlen(MB_STRING(mbuf, i));
 
       if ((totalbuflen - tmp) <= 0) /* don't overflow buffer */
        MB_TYPE(mbuf, i) |= MODE_SAVE; /* save for later */
       else {
        char mode_char;
-       switch(MB_TYPE(mbuf, i) & (MODE_BAN | MODE_EXCEPTION | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD))
+       switch(MB_TYPE(mbuf, i) & (MODE_BAN | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD))
        {
          case MODE_APASS:
            mode_char = 'A';
@@ -1725,9 +1700,6 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
          case MODE_UPASS:
            mode_char = 'U';
            break;
-      case MODE_EXCEPTION:
-        mode_char = 'e';
-        break;
       case MODE_ALTCHAN:
                mode_char = 'F';
                break;
@@ -1811,7 +1783,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
        build_string(strptr, strptr_i, cli_name(MB_CLIENT(mbuf, i)), 0, ' ');
 
       /* deal with bans... */
-      else if (MB_TYPE(mbuf, i) & (MODE_BAN | MODE_EXCEPTION))
+      else if (MB_TYPE(mbuf, i) & (MODE_BAN))
        build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0, ' ');
 
       /* deal with keys... */
@@ -1927,7 +1899,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
        build_string(strptr, strptr_i, NumNick(MB_CLIENT(mbuf, i)), ' ');
 
       /* deal with modes that take strings */
-      else if (MB_TYPE(mbuf, i) & (MODE_KEY | MODE_BAN | MODE_EXCEPTION | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD))
+      else if (MB_TYPE(mbuf, i) & (MODE_KEY | MODE_BAN | MODE_APASS | MODE_UPASS | MODE_ALTCHAN | MODE_NOFLOOD))
        build_string(strptr, strptr_i, MB_STRING(mbuf, i), 0, ' ');
 
       /*
@@ -2235,7 +2207,6 @@ modebuf_extract(struct ModeBuf *mbuf, char *buf)
     MODE_PERSIST,       'z',
     MODE_NOCOLOUR,  'c',
     MODE_NOCTCP,    'C',
-/*  MODE_EXCEPTION, 'e', */
     MODE_NOAMSGS,   'M',
        MODE_NONOTICE,  'N',
        MODE_QUARANTINE,  'Q',
@@ -2351,7 +2322,6 @@ mode_invite_clear(struct Channel *chan)
 #define DONE_KEY_DEL    0x80    /**< We've removed the key */
 #define DONE_UPASS_DEL  0x100   /**< We've removed the user pass */
 #define DONE_APASS_DEL  0x200   /**< We've removed the admin pass */
-#define DONE_EXCEPTIONLIST 0x400 /**< We've sent the exception list */
 #define DONE_ALTCHAN   0x800   /**< We've set the altchan */
 #define DONE_ACCESS    0x1000  /**< We've set the access */
 #define DONE_NOFLOOD   0x2000  /**< We've set the noflood options */
@@ -2732,7 +2702,10 @@ mode_parse_noflood(struct ParseState *state, ulong64 *flag_p)
     struct Membership *member;
     for(member = state->chptr->members; member; member = member->next_member) {
         struct MemberFlood *floodnode;
-        for(floodnode = member->flood; floodnode; floodnode = floodnode->next_memberflood) {} //simply walk to the end
+        for(floodnode = member->flood;floodnode ; floodnode = floodnode->next_memberflood) {
+          if(floodnode->next_memberflood == NULL) break;
+        } //simply walk to the end
+        if(!floodnode) continue;
         floodnode->next_memberflood = free_MemberFlood;
         free_MemberFlood  = floodnode;
         member->flood = NULL;
@@ -3292,19 +3265,9 @@ mode_parse_ban(struct ParseState *state, ulong64 *flag_p)
   struct Ban *ban, *newban;
 
   if (state->parc <= 0) { /* Not enough args, send ban list */
-    if (MyUser(state->sptr)) {
-      if (*flag_p == MODE_EXCEPTION) {
-        if (!(state->done & DONE_EXCEPTIONLIST)) {
-          send_exception_list(state->sptr, state->chptr);
-          state->done |= DONE_EXCEPTIONLIST;
-        }
-      }
-      else {
-        if (!(state->done & DONE_BANLIST)) {
-          send_ban_list(state->sptr, state->chptr);
-          state->done |= DONE_BANLIST;
-        }
-      }
+    if (MyUser(state->sptr) && !(state->done & DONE_BANLIST)) {
+      send_ban_list(state->sptr, state->chptr);
+      state->done |= DONE_BANLIST;
     }
     return;
   }
@@ -3381,8 +3344,7 @@ mode_process_bans(struct ParseState *state)
     } else if (ban->flags & BAN_DEL) { /* Deleted a ban? */
       char *bandup;
       DupString(bandup, ban->banstr);
-      modebuf_mode_string(state->mbuf, MODE_DEL | ((ban->flags & BAN_EXCEPTION) ? MODE_EXCEPTION : MODE_BAN),
-                         bandup, 1);
+      modebuf_mode_string(state->mbuf, MODE_DEL | MODE_BAN, bandup, 1);
 
       if (state->flags & MODE_PARSE_SET) { /* Ok, make it take effect */
        if (prevban) /* clip it out of the list... */
@@ -3421,14 +3383,13 @@ mode_process_bans(struct ParseState *state)
           char *bandup;
          /* add the ban to the buffer */
           DupString(bandup, ban->banstr);
-          modebuf_mode_string(state->mbuf, MODE_ADD | ((ban->flags & BAN_EXCEPTION) ? MODE_EXCEPTION : MODE_BAN),
-                             bandup, 1);
+          modebuf_mode_string(state->mbuf, MODE_ADD | MODE_BAN, bandup, 1);
 
          if (state->flags & MODE_PARSE_SET) { /* create a new ban */
            newban = make_ban(ban->banstr);
             strcpy(newban->who, ban->who);
            newban->when = ban->when;
-           newban->flags = ban->flags & (BAN_IPMASK | BAN_EXCEPTION);
+           newban->flags = ban->flags & BAN_IPMASK;
 
            newban->next = state->chptr->banlist; /* and link it in */
            state->chptr->banlist = newban;
@@ -3771,7 +3732,6 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
     MODE_PERSIST,       'z',
     MODE_NOCOLOUR,      'c',
     MODE_NOCTCP,        'C',
-/*    MODE_EXCEPTION,     'e',*/
     MODE_NOAMSGS,       'M',
        MODE_NONOTICE,      'N',
        MODE_QUARANTINE,      'Q',
@@ -3868,9 +3828,6 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
         if (IsServer(cptr) || feature_bool(FEAT_OPLEVELS))
        mode_parse_upass(&state, flag_p);
        break;
-
-/*      case 'e':
-        if(MyUser(state.sptr) && !(state.flags & MODE_PARSE_FORCE) && !feature_bool(FEAT_EXCEPT_ENABLE)) break;*/
       case 'b': /* deal with bans */
        mode_parse_ban(&state, flag_p);
         break;
@@ -4305,7 +4262,7 @@ void RevealDelayedJoinIfNeeded(struct Client *sptr, struct Channel *chptr)
 int ext_amsg_block(struct Client *cptr, struct Channel *chptr, const char *msg)
 {
   int amsg_time;
-
+  
   /* First on every message we check whether the mechanism is enabled.
    * If it is enabled, we check:
    *  - whether the channel has MODE_NOAMSGS
@@ -4319,6 +4276,60 @@ int ext_amsg_block(struct Client *cptr, struct Channel *chptr, const char *msg)
    */
   amsg_time = feature_int(FEAT_NOAMSG_TIME);
   if(amsg_time > 0) {
+    /* first of all strip the message (filter out invisible content) */
+    char *stripped_message = MyMalloc(BUFSIZE + 1);
+    strcpy(stripped_message, msg);
+    char p = stripped_message[0];
+    int p_pos = 0;
+    int is_visible = 1, is_ccode = 0, i = 0, j = 0;
+    char codes[5];
+    for(i = 0; p != '\n'; p = stripped_message[++i]) {
+      if(p == 3) {
+        j = 0;
+        is_ccode = 1;
+      } else if(is_ccode) {
+        if((p >= 48 && p <= 57) || p == 44) {
+          if(is_ccode == 1) {
+            if(p == 44) {
+              is_ccode = 2;
+              codes[j++] = 0;
+              j = 0;
+            } else
+              codes[j++] = p;
+          } else {
+            //compare
+            if(p != codes[j++]) {
+             is_ccode = 3;
+            }
+          }
+        } else {
+          //END of color code...
+          is_ccode = 0;
+          if(is_ccode != 1 && codes[j] != 0) is_ccode = 3;
+          if(is_ccode == 1) {
+            codes[j] = 0;
+            int k;
+            for(k = 0; k < j-1; k++) {
+              if(codes[k] != 48) {
+                is_visible = 1;
+                goto normalchar;
+              }
+            }
+            is_visible = 0;
+          } else if(is_ccode == 2) {
+            is_visible = 0;
+          } else if(is_ccode == 3) {
+            is_visible = 1;
+            goto normalchar;
+          }
+        }
+      } else {
+        normalchar:
+        if(is_visible)
+          stripped_message[p_pos++] = p;
+      }
+    }
+    stripped_message[p_pos++] = 0;
     /* Allocate a new buffer if there is none, yet. */
     if(!cli_user(cptr)->lastmsg) {
       cli_user(cptr)->lastmsg = MyMalloc(BUFSIZE + 1);
@@ -4326,16 +4337,18 @@ int ext_amsg_block(struct Client *cptr, struct Channel *chptr, const char *msg)
     }
     if((chptr->mode.mode & MODE_NOAMSGS) &&
        ((cli_user(cptr)->lastmsg_time + amsg_time) >= CurrentTime) &&
-       (strcmp(cli_user(cptr)->lastmsg, msg) == 0)) {
+       (strcmp(cli_user(cptr)->lastmsg, stripped_message) == 0)) {
       cli_user(cptr)->lastmsg_time = CurrentTime;
       cli_user(cptr)->lastmsg_num++;
+      MyFree(stripped_message);
       if(cli_user(cptr)->lastmsg_num >= feature_int(FEAT_NOAMSG_NUM)) return 1;
       else return 0;
     }
     /* Message did not match so update the data. */
     cli_user(cptr)->lastmsg_time = CurrentTime;
     cli_user(cptr)->lastmsg_num = 0;
-    strcpy(cli_user(cptr)->lastmsg, msg);
+    strcpy(cli_user(cptr)->lastmsg, stripped_message);
+    MyFree(stripped_message);
   }
   return 0;
 }
@@ -4351,13 +4364,14 @@ int ext_amsg_block(struct Client *cptr, struct Channel *chptr, const char *msg)
  * --pk910 2011/7/1
  */
 int ext_noflood_block(struct Client *cptr, struct Channel *chptr) {
-  if(!chptr->mode.noflood) return 0;
+  if(chptr->mode.noflood == NULL || !chptr->mode.noflood) return 0;
   struct Membership *member = find_member_link(chptr, cptr);
   if(!member) return 0; //TODO: we've no check for -n channels implemented, yet
   //check if this user is really affected by +f
   unsigned int flags = (chptr->mode.noflood_value & 0x00000007);        //0000 0000 0000 0000 0000 0000 0000 0111 = 0x00000007 >> 0
   unsigned int count = (chptr->mode.noflood_value & 0x00001ff8) >> 3;   //0000 0000 0000 0000 0001 1111 1111 1000 = 0x00001ff8 >> 3
   int time           = (chptr->mode.noflood_value & 0x07ffe000) >> 13;  //0000 0111 1111 1111 1110 0000 0000 0000 = 0x07ffe000 >> 13
+  if(count == 0 || time == 0) return 0;
   if(!(flags & FLFL_NOFLOOD) && HasPriv(cptr, PRIV_FLOOD))
     return 0;
   if(!(flags & FLFL_CHANOP) && (member->status & CHFL_CHANOP))