X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/da53a1b3162ccd7726debe9d1b08e44dbbcd9f59..bdeb548fe5327b8ff0cda877d98ce0c8dd3be384:/chanserv/chanservuser.c diff --git a/chanserv/chanservuser.c b/chanserv/chanservuser.c index 7bbcd692..db70abd4 100644 --- a/chanserv/chanservuser.c +++ b/chanserv/chanservuser.c @@ -174,6 +174,20 @@ void chanservuserhandler(nick *target, int message, void **params) { break; } + if ((cmd->level & QCMD_ACHIEVEMENTS) && !UIsDev(rup) && + ((time(NULL) < ACHIEVEMENTS_START) || + ((time(NULL) > ACHIEVEMENTS_END) && !UIsAchievements(rup)))) { + chanservstdmessage(sender, QM_UNKNOWNCMD, cargv[0]); + break; + } + + if ((cmd->level & QCMD_TITLES) && !UIsDev(rup) && + ((time(NULL) < ACHIEVEMENTS_START) || + (time(NULL) > ACHIEVEMENTS_END))) { + chanservstdmessage(sender, QM_UNKNOWNCMD, cargv[0]); + break; + } + cmd->calls++; if (cmd->maxparams < (cargc-1)) { @@ -182,6 +196,8 @@ void chanservuserhandler(nick *target, int message, void **params) { } cmd->handler((void *)sender, cargc-1, &(cargv[1])); + + triggerhook(HOOK_CHANSERV_CMD, sender); } break; @@ -776,7 +792,7 @@ void cs_doallautomodes(nick *np) { continue; } - if (CUKnown(rcup) && rcup->chan->index->channel->users->totalusers >= 3) { + if (CUHasOpPriv(rcup) && cs_ischannelactive(rcup->chan->index->channel, NULL)) { /* This meets the channel use criteria, update. */ rcup->chan->lastactive=time(NULL); @@ -1352,7 +1368,7 @@ reguser *findreguser(nick *sender, const char *str) { * * Return 0 if it works, 1 if it don't. */ -int cs_unbanfn(nick *sender, chanindex *cip, UnbanFN fn, void *arg, int removepermbans, int abortonfailure) { +int cs_unbanfn(nick *sender, chanindex *cip, int (*fn)(void *arg, struct chanban *ban), void *arg, int removepermbans, int abortonfailure) { regban **rbh, *rbp; chanban **cbh, *cbp; regchan *rcp; @@ -1428,3 +1444,98 @@ int checkreason(nick *np, char *reason) { return 1; } + +regchan *cs_addchan(chanindex *cip, nick *sender, reguser *addedby, reguser *founder, flag_t flags, short type) { + regchan *rcp; + regchanuser *rcup; + void *args[3]; + int i; + + if (cip->exts[chanservext]) + return NULL; + + /* Initialise the channel */ + rcp=getregchan(); + + /* ID, index */ + rcp->ID=++lastchannelID; + rcp->index=cip; + cip->exts[chanservext]=rcp; + + rcp->chantype=type; + rcp->flags=flags; + rcp->status=0; + rcp->bans=NULL; + rcp->lastcountersync=0; + + rcp->limit=0; + rcp->forcemodes=CHANMODE_DEFAULT; + rcp->denymodes=0; + + if (CIsAutoLimit(rcp)) { + rcp->forcemodes |= CHANMODE_LIMIT; + } + + rcp->autolimit=5; + rcp->banstyle=0; + + rcp->created=rcp->lastactive=rcp->statsreset=rcp->ostatsreset=time(NULL); + rcp->banduration=0; + rcp->autoupdate=0; + rcp->lastbancheck=0; + + /* Added by */ + rcp->addedby=addedby->ID; + + /* Founder */ + rcp->founder=founder->ID; + + /* Suspend by */ + rcp->suspendby=0; + rcp->suspendtime=0; + + rcp->totaljoins=rcp->tripjoins=rcp->otripjoins=rcp->maxusers=rcp->tripusers=rcp->otripusers=0; + rcp->welcome=rcp->topic=rcp->key=rcp->suspendreason=rcp->comment=NULL; + + /* Users */ + memset(rcp->regusers,0,REGCHANUSERHASHSIZE*sizeof(reguser *)); + + rcp->checksched=NULL; + rcp->ltimestamp=0; + for (i=0;ichanopnicks[i][0]='\0'; + rcp->chanopaccts[i]=0; + } + rcp->chanoppos=0; + + /* Add new channel to db.. */ + csdb_createchannel(rcp); + + /* Add the founder as +ano */ + rcup=getregchanuser(); + rcup->chan=rcp; + rcup->user=founder; + rcup->flags=(QCUFLAG_OWNER | QCUFLAG_OP | QCUFLAG_AUTOOP); + rcup->usetime=0; + rcup->info=NULL; + rcup->changetime=time(NULL); + + addregusertochannel(rcup); + csdb_createchanuser(rcup); + csdb_chanlevhistory_insert(rcp, sender, rcup->user, 0, rcup->flags); + + args[0]=sender; + args[1]=rcup; + args[2]=(void *)0; + + triggerhook(HOOK_CHANSERV_CHANLEVMOD, args); + + /* If the channel exists, get the ball rolling */ + if (cip->channel) { + chanservjoinchan(cip->channel); + rcp->status |= QCSTAT_MODECHECK | QCSTAT_OPCHECK | QCSTAT_BANCHECK; + cs_timerfunc(cip); + } + + return rcp; +}