From: pk910 Date: Sat, 10 Dec 2011 02:55:06 +0000 (+0100) Subject: fixed cmd_resync: don't op/voice users with NoAutoOp enabled (added FORCE parameter... X-Git-Tag: v5.3~159 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=af4f47d9744e626dc70feb9fd189f20220c551dd fixed cmd_resync: don't op/voice users with NoAutoOp enabled (added FORCE parameter to do so) --- diff --git a/src/cmd_neonserv_resync.c b/src/cmd_neonserv_resync.c index 162a9c9..f155ada 100644 --- a/src/cmd_neonserv_resync.c +++ b/src/cmd_neonserv_resync.c @@ -18,12 +18,13 @@ #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; @@ -31,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) { @@ -53,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; @@ -112,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, 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)))