X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmodules%2FNeonBackup.mod%2Fbot_NeonBackup.c;h=62e391839f2eca6e4f3bbcde2315dc807452d64c;hb=78e040af3fcc36ab684611c0f98b4381ff420878;hp=9738afbdcb80cd5747dc24fdcd15c003cb4f3e9a;hpb=9f27add1dff4dfa36fb65d43805da1939fbe4a4b;p=NeonServV5.git diff --git a/src/modules/NeonBackup.mod/bot_NeonBackup.c b/src/modules/NeonBackup.mod/bot_NeonBackup.c index 9738afb..62e3918 100644 --- a/src/modules/NeonBackup.mod/bot_NeonBackup.c +++ b/src/modules/NeonBackup.mod/bot_NeonBackup.c @@ -1,4 +1,4 @@ -/* bot_NeonBackup.c - NeonServ v5.4 +/* bot_NeonBackup.c - NeonServ v5.5 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -96,7 +96,7 @@ static void start_bots(int type) { client->flags |= (strcmp(row[6], "0") ? SOCKET_FLAG_PREFERRED : 0); client->flags |= (strcmp(row[8], "0") ? SOCKET_FLAG_USE_QUEUE : 0); client->flags |= (strcmp(row[9], "0") ? SOCKET_FLAG_SSL : 0); - client->flags |= SOCKET_FLAG_REQUEST_INVITE; + client->flags |= SOCKET_FLAG_REQUEST_INVITE | SOCKET_FLAG_REQUEST_OP; client->botid = BOTID; client->clientid = atoi(row[7]); connect_socket(client); @@ -124,7 +124,26 @@ static void start_bots(int type) { } void neonbackup_recover_chan(struct ChanNode *chan) { - + struct ClientSocket *bot = getChannelBot(chan, BOTID); // prefer backup bot ;) + struct ChanUser *chanuser = (bot ? getChanUser(bot->user, chan) : NULL); + if(!chanuser || !(chanuser->flags & CHANUSERFLAG_OPPED)) { + //search an opped bot + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if((chanuser = getChanUser(bot->user, chan)) && (chanuser->flags & CHANUSERFLAG_OPPED)) + break; + } + } + if(!bot) //no opped bots present... channel can't be recovered + return; + struct ClientSocket *target; + struct ModeBuffer *modeBuf; + modeBuf = initModeBuffer(bot, chan); + for(target = getBots(SOCKET_FLAG_READY, NULL); target; target = getBots(SOCKET_FLAG_READY, target)) { + if((target->flags & SOCKET_FLAG_REQUEST_OP) && (chanuser = getChanUser(target->user, chan)) && !(chanuser->flags & CHANUSERFLAG_OPPED)) { + modeBufferOp(modeBuf, target->user->nick); + } + } + freeModeBuffer(modeBuf); } static void neonbackup_event_join(struct ChanUser *chanuser) {