added botwar detection to event_mode
authorpk910 <philipp@zoelle1.de>
Wed, 5 Oct 2011 09:40:18 +0000 (11:40 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 5 Oct 2011 10:56:44 +0000 (12:56 +0200)
src/event_neonserv_mode.c

index 3eec5751de0e116a0dad3c78adb673f736a53a9d..eeeff8c5258556c8aa79558c7e96795dff4781a2 100644 (file)
@@ -17,6 +17,9 @@
 
 static USERLIST_CALLBACK(neonserv_event_mode_userlist_lookup);
 static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc);
+static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan);
+
+static int botwar_detect_executed;
 
 struct neonserv_event_mode_cache {
     struct ClientSocket *client;
@@ -69,6 +72,7 @@ static USERLIST_CALLBACK(neonserv_event_mode_userlist_lookup) {
 
 static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc) {
     struct ClientSocket *textclient = ((client->flags & SOCKET_FLAG_PREFERRED) ? client : get_prefered_bot(client->botid));
+    botwar_detect_executed = 0;
     MYSQL_ROW row, defaults = NULL;
     int i, arg, add = 1, skip = 0;
     unsigned int modetype;
@@ -117,7 +121,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                         db_canop = -1;
                     }
                     if(db_canop == -1) {
-                        modeBufferSet(modeBuf, !add, modes[i], carg);
+                        if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                            modeBufferSet(modeBuf, !add, modes[i], carg);
                         break;
                     }
                 } else {
@@ -126,7 +131,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                         db_canvoice = -1;
                     }
                     if(db_canvoice == -1) {
-                        modeBufferSet(modeBuf, !add, modes[i], carg);
+                        if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                            modeBufferSet(modeBuf, !add, modes[i], carg);
                         break;
                     }
                 }
@@ -138,12 +144,14 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                     //check protection
                     if(isBot(cuser)) {
                         reply(textclient, user, "NS_SERVICE_IMMUNE", cuser->nick);
-                        modeBufferSet(modeBuf, !add, modes[i], carg);
+                        if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                            modeBufferSet(modeBuf, !add, modes[i], carg);
                         break;
                     }
                     if(isUserProtected(chan, cuser, user)) {
                         reply(textclient, user, "NS_USER_PROTECTED", cuser->nick);
-                        modeBufferSet(modeBuf, !add, modes[i], carg);
+                        if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                            modeBufferSet(modeBuf, !add, modes[i], carg);
                         break;
                     }
                 }
@@ -158,7 +166,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                     db_canban = -1;
                 }
                 if(db_canban == -1) {
-                    modeBufferSet(modeBuf, !add, modes[i], carg);
+                    if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                        modeBufferSet(modeBuf, !add, modes[i], carg);
                     break;
                 }
                 char hostmask_buffer[NICKLEN+USERLEN+HOSTLEN+3];
@@ -182,7 +191,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                         reply(textclient, user, "NS_LAME_MASK_WARNING", carg, match_count);
                     }
                 }
-                if(skip) {
+                if(skip && !neonserv_cmd_mode_botwar_detect(client, user, chan)) {
                     modeBufferSet(modeBuf, !add, modes[i], carg);
                 }
                 break;
@@ -205,7 +214,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                                 reply(textclient, user, "NS_MODE_LOCKED", tmp, chan->name);
                                 sent_modes_locked = 1;
                             }
-                            modeBufferSet(modeBuf, add, modes[i], modelock_val);
+                            if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                                modeBufferSet(modeBuf, add, modes[i], modelock_val);
                             break;
                         }
                     }
@@ -218,7 +228,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                                 sent_modes_locked = 1;
                             }
                             sprintf(tmp, "%d", *modelock_val);
-                            modeBufferSet(modeBuf, add, modes[i], tmp);
+                            if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                                modeBufferSet(modeBuf, add, modes[i], tmp);
                             break;
                         }
                     }
@@ -235,7 +246,8 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
                         reply(textclient, user, "NS_MODE_LOCKED", tmp, chan->name);
                         sent_modes_locked = 1;
                     }
-                    modeBufferSet(modeBuf, !add, modes[i], carg);
+                    if(!neonserv_cmd_mode_botwar_detect(client, user, chan))
+                        modeBufferSet(modeBuf, !add, modes[i], carg);
                     break;
                 }
                 break;
@@ -244,3 +256,35 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN
     freeModeBuffer(modeBuf);
     freeModeNode(modelock);
 }
+
+static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan) {
+    struct ChanUser *chanuser = getChanUser(user, chan);
+    if(!chanuser) return 0; //flying super cow?
+    if(time(0) - chanuser->changeTime > BOTWAR_DETECTION_TIME) {
+        chanuser->changeTime = time(0);
+        chanuser->chageEvents = 1;
+    } else {
+        if(!botwar_detect_executed)
+            chanuser->chageEvents++;
+        botwar_detect_executed = 1;
+        if(chanuser->chageEvents >= BOTWAR_DETECTION_EVENTS || chanuser->chageEvents < 0) {
+            //BOTWAR!
+            chanuser->changeTime = time(0);
+            if(chanuser->chageEvents > 0) {
+                putsock(client, "NOTICE @%s :%s %s", chan->name, get_language_string(user, "NS_BOTWAR_DETECTED"), (BOTWAR_ALERT_CHAN ? get_language_string(user, "NS_BOTWAR_REPORTED") : ""));
+                if(BOTWAR_ALERT_CHAN) {
+                    struct ChanNode *alertchan = getChanByName(BOTWAR_ALERT_CHAN);
+                    struct ClientSocket *alertclient;
+                    if(alertchan && (alertclient = getBotForChannel(chan)) != NULL) {
+                        char msgBuf[MAXLEN];
+                        putsock(alertclient, "PRIVMSG %s :%s", alertchan->name, build_language_string(NULL, msgBuf, "NS_BOTWAR_ALERT", chan->name, user->nick));
+                    }
+                }
+            }
+            chanuser->chageEvents = -2;
+            return 1;
+        }
+    }
+    return 0;
+}
+