瀏覽代碼

Added chanset 'colorlimit' (#8)

Mark 15 年之前
父節點
當前提交
7691f6c9c9
共有 6 個文件被更改,包括 29 次插入11 次删除
  1. 1 0
      doc/UPDATES
  2. 1 0
      src/chan.h
  3. 10 1
      src/mod/channels.mod/chanmisc.c
  4. 1 0
      src/mod/channels.mod/cmdschan.c
  5. 4 2
      src/mod/channels.mod/userchan.c
  6. 12 8
      src/mod/irc.mod/irc.c

+ 1 - 0
doc/UPDATES

@@ -1,4 +1,5 @@
 * Add chanset 'capslimit' to handle % of message that can be in caps before kick (#8)
+* Add chanset 'colorlimit' to handle how many color codes are allowed in a message before kick (#8)
 
 1.4.0 - http://wraith.botpack.net/milestone/1.4.0
   * Updated server list, 'set -yes servers -' and 'set -yes servers6 -' to get new list.

+ 1 - 0
src/chan.h

@@ -176,6 +176,7 @@ struct chanset_t {
   int flood_mjoin_thr;
   int limitraise;
   int capslimit;
+  int colorlimit;
   int checklimit;
   int closed_ban;
   int closed_private;

+ 10 - 1
src/mod/channels.mod/chanmisc.c

@@ -436,7 +436,15 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
         return ERROR;
       }
       chan->capslimit = capslimit;
-    } else if (!strcmp(item[i], "closed-ban")) {
+    } else if (!strcmp(item[i], "colorlimit") || !strcmp(item[i], "color-limit")) {
+      i++;
+      if (i >= items) {
+        if (result)
+          strlcpy(result, "channel colorlimit needs argument", RESULT_LEN);
+        return ERROR;
+      }
+      chan->colorlimit = atoi(item[i]);
+   } else if (!strcmp(item[i], "closed-ban")) {
       i++;
       if (i >= items) {
         if (result)
@@ -1054,6 +1062,7 @@ int channel_add(char *result, const char *newname, char *options, bool isdefault
     chan->flood_mjoin_thr = 6;
     chan->flood_mjoin_time = 1;
     chan->capslimit = 0;
+    chan->colorlimit = 0;
     chan->limitraise = 20;
     chan->ban_time = global_ban_time;
     chan->exempt_time = global_exempt_time;

+ 1 - 0
src/mod/channels.mod/cmdschan.c

@@ -1244,6 +1244,7 @@ static void cmd_chaninfo(int idx, char *par)
     SHOW_INT("Flood-exempt: ", chan->flood_exempt_mode, F_STR(chan->flood_exempt_mode), "None");
     SHOW_INT("Flood-lock-time: ", chan->flood_lock_time, NULL, "Don't");
     SHOW_INT("Caps-Limit(%): ", chan->capslimit, NULL, "None");
+    SHOW_INT("Color-Limit: ", chan->colorlimit, NULL, "None");
     SHOW_INT("Invite-time: ", chan->invite_time, NULL, "Forever");
     SHOW_INT("Knock: ", chan->knock_flags, F_STR(chan->knock_flags), "None");
     SHOW_INT("Limit raise (limit): ", chan->limitraise, NULL, "Disabled");

+ 4 - 2
src/mod/channels.mod/userchan.c

@@ -717,7 +717,7 @@ bd::String channel_to_string(struct chanset_t* chan, bool force_inactive) {
 chanmode { %s } groups { %s } bad-cookie %d manop %d mdop %d mop %d limit %d revenge %d ban-type %d \
 flood-chan %d:%d flood-ctcp %d:%d flood-join %d:%d \
 flood-kick %d:%d flood-deop %d:%d flood-nick %d:%d flood-mjoin %d:%d \
-capslimit %d closed-ban %d closed-invite %d closed-private %d ban-time %d \
+capslimit %d colorlimit %d closed-ban %d closed-invite %d closed-private %d ban-time %d \
 exempt-time %d invite-time %d voice-non-ident %d auto-delay %d \
 flood-exempt %d flood-lock-time %d knock %d fish-key { %s } \
 %cmeankicks %cenforcebans %cdynamicbans %cuserbans %cbitch %cfloodban \
@@ -745,6 +745,7 @@ flood-exempt %d flood-lock-time %d knock %d fish-key { %s } \
 	chan->flood_nick_thr, chan->flood_nick_time,
 	chan->flood_mjoin_thr, chan->flood_mjoin_time,
         chan->capslimit,
+        chan->colorlimit,
         chan->closed_ban,
 /* Chanint template
  *      chan->temp,
@@ -834,7 +835,7 @@ void write_chans_compat(bd::Stream& stream, int idx)
 bad-cookie %d manop %d mdop %d mop %d limit %d \
 flood-chan %d:%d flood-ctcp %d:%d flood-join %d:%d \
 flood-kick %d:%d flood-deop %d:%d flood-nick %d:%d \
-capslimit %d closed-ban %d closed-invite %d closed-private %d ban-time %d \
+capslimit %d colorlimit %d closed-ban %d closed-invite %d closed-private %d ban-time %d \
 exempt-time %d invite-time %d voice-non-ident %d auto-delay %d \
 %cenforcebans %cdynamicbans %cuserbans %cbitch \
 %cprivate %ccycle %cinactive %cdynamicexempts %cuserexempts \
@@ -856,6 +857,7 @@ exempt-time %d invite-time %d voice-non-ident %d auto-delay %d \
         chan->flood_deop_thr, chan->flood_deop_time,
 	chan->flood_nick_thr, chan->flood_nick_time,
         chan->capslimit,
+        chan->colorlimit,
         chan->closed_ban,
         chan->closed_invite,
         chan->closed_private,

+ 12 - 8
src/mod/irc.mod/irc.c

@@ -117,21 +117,25 @@ voice_ok(memberlist *m, struct chanset_t *chan)
 static int
 detect_offense(memberlist* m, struct chanset_t *chan, char *msg)
 {
-  struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
-  struct userrec *u = m->user ? m->user : get_user_by_host(m->userhost);
   int tot = (int)strlen(msg);
-  int i = 0;
-  get_user_flagrec(u, &fr, chan->dname, chan);
+  int caps_count = 0;
+  int color_count = 0;
 
   /* caps control. */
-  if (tot > 5 && chan->capslimit) { /* the caller checks for doflood so no need to check again here */
+  if (tot > 5 && (chan->capslimit || chan->colorlimit)) { /* the caller checks for doflood so no need to check again here */
     while (msg && *msg) {
       if (egg_isupper(*msg))
-        i++;
+        caps_count++;
+      else if (*msg == 3)
+        color_count++;
       msg++;
     }
-    if (i && tot) {
-      if (((float)(i/tot))*100 >= chan->capslimit)
+    if (chan->capslimit && caps_count) {
+      int cap_p = (((float)caps_count)/((float)tot))*100;
+      if (cap_p >= chan->capslimit)
+        return 1;
+    } else if (chan->colorlimit && color_count) {
+      if (color_count >= chan->colorlimit)
         return 1;
     }
   }