void chanservfreestuff();
void chanservfinishinit(int hooknum, void *arg);
+static void cs_hourlyfunc(void *arg);
DBModuleIdentifier q9dbid;
/* 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;
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() {
+ 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;
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;i<CHANNELHASHSIZE;i++) {
+ for (cip=chantable[i];cip;cip=ncip) {
+ ncip=cip->next;
+ 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);
+}