X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fcmd_neonserv_resync.c;h=f2ee0905cc48982dd2a1a8066d744d34812326c5;hb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;hp=c9d4bba40d11c86e57f660b096715f63435f6154;hpb=0f1dc61921eef1db8e404a5a82372e2d1cd55daa;p=NeonServV5.git diff --git a/src/cmd_neonserv_resync.c b/src/cmd_neonserv_resync.c index c9d4bba..f2ee090 100644 --- a/src/cmd_neonserv_resync.c +++ b/src/cmd_neonserv_resync.c @@ -1,13 +1,30 @@ +/* cmd_neonserv_resync.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "cmd_neonserv.h" /* -* argv[0] - usermask -* argv[1] - min access -* argv[2] - max access +* argv[0] - (optional) usermask +* argv[1] - (optional) min access +* argv[2] - (optional) max access +* argv[1/3] - (optional) FORCE (override NoAutoOp) */ static USERLIST_CALLBACK(neonserv_cmd_resync_userlist_lookup); -static void neonserv_cmd_resync_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *usermask, int min_access, int max_access); +static void neonserv_cmd_resync_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *usermask, int min_access, int max_access, char override_noautoop); struct neonserv_cmd_resync_cache { struct ClientSocket *client, *textclient; @@ -15,16 +32,22 @@ struct neonserv_cmd_resync_cache { char *usermask; int min_access; int max_access; + char override_noautoop; }; CMD_BIND(neonserv_cmd_resync) { int min_access = 0, max_access = 500; char *usermask = NULL; - if(argc > 0) + char override_noautoop = 0; + if(argc > 0) { usermask = argv[0]; - if(argc > 2) { - min_access = atoi(argv[1]); - max_access = atoi(argv[2]); + if(argc > 2) { + min_access = atoi(argv[1]); + max_access = atoi(argv[2]); + if(argc > 3) + override_noautoop = (!stricmp(argv[3], "FORCE") ? 1 : 0); + } else if(argc > 1) + override_noautoop = (!stricmp(argv[1], "FORCE") ? 1 : 0); } struct neonserv_cmd_resync_cache *cache = malloc(sizeof(*cache)); if (!cache) { @@ -37,18 +60,19 @@ CMD_BIND(neonserv_cmd_resync) { cache->usermask = (usermask ? strdup(usermask) : NULL); cache->min_access = min_access; cache->max_access = max_access; + cache->override_noautoop = override_noautoop; get_userlist_with_invisible(chan, neonserv_cmd_resync_userlist_lookup, cache); } static USERLIST_CALLBACK(neonserv_cmd_resync_userlist_lookup) { struct neonserv_cmd_resync_cache *cache = data; - neonserv_cmd_resync_async1(cache->client, cache->textclient, cache->user, chan, cache->usermask, cache->min_access, cache->max_access); + neonserv_cmd_resync_async1(cache->client, cache->textclient, cache->user, chan, cache->usermask, cache->min_access, cache->max_access, cache->override_noautoop); if(cache->usermask) free(cache->usermask); free(cache); } -static void neonserv_cmd_resync_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *usermask, int min_access, int max_access) { +static void neonserv_cmd_resync_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *usermask, int min_access, int max_access, char override_noautoop) { MYSQL_RES *res; MYSQL_ROW row, defaults = NULL; int i; @@ -96,18 +120,20 @@ static void neonserv_cmd_resync_async1(struct ClientSocket *client, struct Clien if(!stricmp(db_users[i], chanuser->user->auth)) { caccess = db_access[i]; cflags = db_flags[i]; + if(cflags & DB_CHANUSER_SUSPENDED) + caccess = 0; break; } } } - if((usermask && *usermask && match(usermask, row[1])) || caccess < min_access || caccess > max_access) continue; + if((usermask && *usermask && match(usermask, chanuser->user->nick)) || caccess < min_access || caccess > max_access) continue; if(caccess >= db_enfops) { - if(!(chanuser->flags & CHANUSERFLAG_OPPED) && resync_op) + if(!(chanuser->flags & CHANUSERFLAG_OPPED) && resync_op && (override_noautoop || !(cflags & DB_CHANUSER_NOAUTOOP))) modeBufferOp(modeBuf, chanuser->user->nick); } else if(caccess >= db_enfvoice) { if((chanuser->flags & CHANUSERFLAG_OPPED) && resync_op && !(chanuser->user->flags & (USERFLAG_ISBOT | USERFLAG_ISIRCOP))) modeBufferDeop(modeBuf, chanuser->user->nick); - if(!(chanuser->flags & CHANUSERFLAG_VOICED) && resync_voice) + if(!(chanuser->flags & CHANUSERFLAG_VOICED) && resync_voice && (override_noautoop || !(cflags & DB_CHANUSER_NOAUTOOP))) modeBufferVoice(modeBuf, chanuser->user->nick); } else { if((chanuser->flags & CHANUSERFLAG_OPPED) && resync_op && !(chanuser->user->flags & (USERFLAG_ISBOT | USERFLAG_ISIRCOP)))