From 478ab2454efd62fb4cc9e403670068af7df4c790 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 6 Feb 2012 16:16:46 +0100 Subject: [PATCH] fixed event_neonserv_mode.c multi-thread support --- src/event_neonserv_mode.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/event_neonserv_mode.c b/src/event_neonserv_mode.c index ef8bf77..f0794a9 100644 --- a/src/event_neonserv_mode.c +++ b/src/event_neonserv_mode.c @@ -17,9 +17,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); -static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan); - -static int botwar_detect_executed; +static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int *botwar_detect_executed); struct neonserv_event_mode_cache { struct ClientSocket *client; @@ -73,7 +71,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; + int botwar_detect_executed = 0; MYSQL_ROW row, defaults = NULL; int i, arg, add = 1, skip = 0; unsigned int modetype; @@ -131,7 +129,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN caccess = getChannelAccess(cuser, chan); if(modes[i] == 'o' && !add && cuser == client->user) { //someone deopped the bot??? - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) requestOp(client->user, chan); } if((modes[i] == 'o' || (modes[i] == 'h' && !with_halfops)) && !(add && isBot(cuser))) { @@ -142,7 +140,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN deop_user = 1; } if(db_canop == -1 && caccess < db_getop) { - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); break; } @@ -154,7 +152,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN deop_user = 1; } if(db_canhalfop == -1 && caccess < db_gethalfop) { - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); break; } @@ -166,7 +164,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN deop_user = 1; } if(db_canvoice == -1 && caccess < db_getvoice) { - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); break; } @@ -176,13 +174,13 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN if(isBot(cuser)) { //don't send this - just try to reop //reply(textclient, user, "NS_SERVICE_IMMUNE", cuser->nick); - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); break; } if(isUserProtected(chan, cuser, user)) { reply(textclient, user, "NS_USER_PROTECTED", cuser->nick); - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); if(uaccess < db_getop) deop_user = 1; @@ -200,7 +198,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN db_canban = -1; } if(db_canban == -1) { - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); if(uaccess < db_getop) deop_user = 1; @@ -228,7 +226,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN } } if(skip) { - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); if(uaccess < db_getop) deop_user = 1; @@ -255,7 +253,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN if(uaccess < db_getop) deop_user = 1; } - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, add, modes[i], modelock_val); break; } @@ -271,7 +269,7 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN deop_user = 1; } sprintf(tmp, "%d", *modelock_val); - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, add, modes[i], tmp); break; } @@ -291,30 +289,30 @@ static void neonserv_event_mode_async1(struct ClientSocket *client, struct UserN if(uaccess < db_getop) deop_user = 1; } - if(!neonserv_cmd_mode_botwar_detect(client, user, chan)) + if(!neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) modeBufferSet(modeBuf, !add, modes[i], carg); break; } break; } } - if(deop_user && !neonserv_cmd_mode_botwar_detect(client, user, chan)) { + if(deop_user && !neonserv_cmd_mode_botwar_detect(client, user, chan, &botwar_detect_executed)) { modeBufferDeop(modeBuf, user->nick); } freeModeBuffer(modeBuf); freeModeNode(modelock); } -static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan) { +static int neonserv_cmd_mode_botwar_detect(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int *botwar_detect_executed) { 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) + if(!*botwar_detect_executed) chanuser->chageEvents++; - botwar_detect_executed = 1; + *botwar_detect_executed = 1; if(chanuser->chageEvents >= BOTWAR_DETECTION_EVENTS || chanuser->chageEvents < 0) { //BOTWAR! chanuser->changeTime = time(0); -- 2.20.1