X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/fa104bcfb9f85894b9c45f18049290a022ea31d0..0d6366b6a61a69b26dc0cde44eb85e3293c6659d:/chanserv/chanserv.c diff --git a/chanserv/chanserv.c b/chanserv/chanserv.c index dcd5968c..bbddf82e 100644 --- a/chanserv/chanserv.c +++ b/chanserv/chanserv.c @@ -16,71 +16,13 @@ int chanservnext; int chanserv_init_status; sstring **chantypes; - -const flag rcflags[] = { - { 'a', QCFLAG_AUTOOP }, - { 'b', QCFLAG_BITCH }, - { 'c', QCFLAG_AUTOLIMIT }, - { 'e', QCFLAG_ENFORCE }, - { 'f', QCFLAG_FORCETOPIC }, - { 'g', QCFLAG_AUTOVOICE }, - { 'i', QCFLAG_INFO }, - { 'j', QCFLAG_JOINED }, - { 'k', QCFLAG_KNOWNONLY }, - { 'p', QCFLAG_PROTECT }, - { 's', QCFLAG_NOINFO }, - { 't', QCFLAG_TOPICSAVE }, - { 'v', QCFLAG_VOICEALL }, - { 'w', QCFLAG_WELCOME }, - { 'z', QCFLAG_SUSPENDED }, - { '\0', 0 } }; - -const flag rcuflags[] = { - { 'a', QCUFLAG_AUTOOP }, - { 'b', QCUFLAG_BANNED }, - { 'd', QCUFLAG_DENY }, - { 'g', QCUFLAG_AUTOVOICE }, - { 'i', QCUFLAG_INFO }, - { 'j', QCUFLAG_AUTOINVITE }, - { 'k', QCUFLAG_KNOWN }, - { 'm', QCUFLAG_MASTER }, - { 'n', QCUFLAG_OWNER }, - { 'o', QCUFLAG_OP }, - { 'p', QCUFLAG_PROTECT }, - { 'q', QCUFLAG_QUIET }, - { 's', QCUFLAG_NOINFO }, - { 't', QCUFLAG_TOPIC }, - { 'v', QCUFLAG_VOICE }, - { 'w', QCUFLAG_HIDEWELCOME }, - { '\0', 0 } }; - -const flag ruflags[] = { - { 'a', QUFLAG_ADMIN }, - { 'd', QUFLAG_DEV }, - { 'D', QUFLAG_CLEANUPEXEMPT }, - { 'g', QUFLAG_GLINE }, - { 'G', QUFLAG_DELAYEDGLINE }, - { 'h', QUFLAG_HELPER }, - { 'i', QUFLAG_INFO }, - { 'L', QUFLAG_NOAUTHLIMIT }, - { 'n', QUFLAG_NOTICE }, - { 'o', QUFLAG_OPER }, - { 'p', QUFLAG_PROTECT }, - { 's', QUFLAG_NOINFO }, - { 'T', QUFLAG_TRUST }, - { 'z', QUFLAG_SUSPENDED }, - { '\0', 0 } }; - -const flag mdflags[] = { - { 'l', MDFLAG_LIMIT }, - { 'b', MDFLAG_BANNED }, - { 'u', MDFLAG_ACTLIMIT }, - { '\0', 0 } }; +sstring *cs_quitreason; void chanservfreestuff(); void chanservfinishinit(int hooknum, void *arg); +static void cs_hourlyfunc(void *arg); -PQModuleIdentifier q9pqid; +DBModuleIdentifier q9dbid; void chanservdumpstuff(void *arg) { dumplastjoindata("lastjoin.dump"); @@ -93,7 +35,7 @@ void _init() { chanservcryptoinit(); csa_initregex(); - q9pqid = pqgetid(); + q9dbid = dbgetid(); if (chanservext!=-1 && chanservnext!=-1 && chanservaext!=-1) { /* Set up the chantypes */ @@ -106,6 +48,7 @@ void _init() { chantypes[5]=getsstring("gamesite",20); chantypes[6]=getsstring("game",20); chantypes[7]=getsstring("upgrade",20); + chantypes[8]=getsstring("partner",20); /* And the log system */ cs_initlog(); @@ -114,6 +57,7 @@ void _init() { chanservcommandinit(); chanservaddcommand("showcommands", 0, 1, cs_doshowcommands, "Lists available commands.","Usage: SHOWCOMMANDS []\nPrints a list of commands currently available to you, where:\nmask - Mask of commands to list (* or ? are wildcards). If no mask is specified,\n all available commands are displayed."); chanservaddcommand("quit", QCMD_DEV, 1, cs_doquit, "Makes the bot QUIT and \"reconnect\".",""); + chanservaddcommand("setquitreason", QCMD_DEV, 1, cs_dosetquitreason, "Sets the reason to be sent when quitting due to an unload.",""); chanservaddcommand("rename", QCMD_DEV, 1, cs_dorename, "Changes the bot's name.",""); chanservaddcommand("rehash", QCMD_DEV, 0, cs_dorehash, "Reloads all text from database.",""); /* Make "HELP" take 2 arguments so things like "HELP chanflags #channel" work. Any junk after the command will go into arg 2 and be ignored. */ @@ -141,6 +85,7 @@ void chanservfinishinit(int hooknum, void *arg) { /* Schedule the dumps */ schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL); + schedulerecurring(time(NULL)+5,0,5,csdb_flushchannelcounters,NULL); chanserv_init_status = CS_INIT_NOUSER; @@ -150,12 +95,14 @@ void chanservfinishinit(int hooknum, void *arg) { void chanserv_finalinit() { int i; - nick *np; + nick *np, *nnp; /* Scan for users */ for (i=0;inext) + for (np=nicktable[i];np;np=nnp) { + nnp=np->next; cs_checknick(np); + } /* Register core hooks */ registerhook(HOOK_NICK_NEWNICK, cs_handlenick); @@ -173,16 +120,24 @@ void chanserv_finalinit() { chanserv_init_status = CS_INIT_READY; triggerhook(HOOK_CHANSERV_RUNNING, NULL); + + /* run every 60 minutes, first one 5 minutes after start */ + schedulerecurring(time(NULL)+60*5,0,3600,cs_hourlyfunc,NULL); + Error("chanserv",ERR_INFO,"Ready to roll."); } void _fini() { - pqfreeid(q9pqid); + csdb_flushchannelcounters(NULL); + + dbfreeid(q9dbid); + deleteallschedules(cs_hourlyfunc); deleteallschedules(cs_timerfunc); deleteallschedules(chanservreguser); deleteallschedules(chanservdumpstuff); deleteallschedules(chanservdgline); + deleteallschedules(csdb_flushchannelcounters); if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) { int i; @@ -198,7 +153,9 @@ void _fini() { } if (chanservnick) - deregisterlocaluser(chanservnick, "Leaving"); + deregisterlocaluser(chanservnick, cs_quitreason?cs_quitreason->content:"Leaving"); + + freesstring(cs_quitreason); deregisterhook(HOOK_NICK_NEWNICK, cs_handlenick); deregisterhook(HOOK_NICK_ACCOUNT, cs_handlenick); @@ -220,6 +177,7 @@ void _fini() { chanservremovecommand("showcommands", cs_doshowcommands); chanservremovecommand("quit", cs_doquit); + chanservremovecommand("setquitreason", cs_dosetquitreason); chanservremovecommand("rename", cs_dorename); chanservremovecommand("rehash", cs_dorehash); chanservremovecommand("help", cs_dohelp); @@ -234,3 +192,33 @@ void _fini() { cs_closelog(); } + +static void cs_hourlyfunc(void *arg) { + int i, total = 0, touched = 0, toorecent = 0; + chanindex *cip, *ncip; + regchan *rcp; + time_t t = time(NULL); + + for (i=0;inext; + if (!(rcp=cip->exts[chanservext])) + continue; + + total++; + + if(cip->channel && cs_ischannelactive(cip->channel, rcp)) { + rcp->lastactive = t; + if (rcp->lastcountersync < (t - COUNTERSYNCINTERVAL)) { + csdb_updatechannelcounters(rcp); + rcp->lastcountersync=t; + touched++; + } else { + toorecent++; + } + } + + } + } + cs_log(NULL,"hourly update active completed, %d seen, %d touched, %d too recent to update.",total,touched,toorecent); +}