From: pk910 Date: Wed, 5 Oct 2011 09:40:18 +0000 (+0200) Subject: added botwar detection to event_mode X-Git-Tag: v5.3~318 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=6271d34960fbf9d0261deb9deb202c59dc49ca8b added botwar detection to event_mode --- diff --git a/src/event_neonserv_mode.c b/src/event_neonserv_mode.c index 3eec575..eeeff8c 100644 --- a/src/event_neonserv_mode.c +++ b/src/event_neonserv_mode.c @@ -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; +} +