void lua_bothandler(nick *target, int type, void **args) { nick *np; char *p; int le; switch(type) { case LU_PRIVMSG: np = (nick *)args[0]; p = (char *)args[1]; if(!np || !p) return; lua_avpcall("irc_onmsg", "ls", np->numeric, p); break; case LU_PRIVNOTICE: np = (nick *)args[0]; p = (char *)args[1]; if(!np || !p) return; le = strlen(p); if((le > 1) && (p[0] == '\001')) { if(p[le - 1] == '\001') p[le - 1] = '\000'; lua_avpcall("irc_onctcp", "ls", np->numeric, p + 1); } else { lua_avpcall("irc_onnotice", "ls", np->numeric, p); } break; case LU_KILLED: if(myublip) { myublip = NULL; deleteschedule(myublip, &lua_blip, NULL); } if(myutick) { myutick = NULL; deleteschedule(myutick, &lua_tick, NULL); } lua_nick = NULL; myureconnect = scheduleoneshot(time(NULL) + 1, &lua_startbot, NULL); break; } }
void nterfacer_freeline(void *tag) { struct sched_rline *prequest = tag; prequest->rl.callback = NULL; if(prequest->schedule) deleteschedule(prequest->schedule, execrline, NULL); }
void _fini() { void* p, *np; deregisterhook(HOOK_NICK_NEWNICK, &versionscan_newnick); if (vsconnect) { deleteschedule(vsconnect, &versionscan_createfakeuser, NULL); vsconnect=NULL; } if (versionscan_nick) { deregisterlocaluser(versionscan_nick, "Module unloaded."); versionscan_nick=NULL; } destroycommandtree(versionscan_commands); for (p=vspatterns; p;) { np=((vspattern*)p)->next; free(p); p=np; } for (p=vsauths; p;) { np=((vsauthdata*)p)->next; free(p); p=np; } for (p=vsstats; p;) { np=((vsstatistic*)p)->next; free(((vsstatistic*)p)->reply); free(p); p=np; } }
static void ib_hook_lostnick(int hooknum, void *arg) { nick *np = arg; ibnick *inp = np->exts[ib_nickext]; if (!inp) return; deleteschedule(inp->sched, ib_clear_ext, np); free(np->exts[ib_nickext]); }
void lua_destroybot(void) { if(myutick) deleteschedule(myutick, &lua_tick, NULL); if(myublip) deleteschedule(myublip, &lua_blip, NULL); lua_deregisterevents(); if (myureconnect) deleteschedule(myureconnect, &lua_startbot, NULL); if(lua_nick) deregisterlocaluser(lua_nick, NULL); if(luabotnick) { freesstring(luabotnick); luabotnick = NULL; } }
void safereload(char *themodule) { if (safereload_str) freesstring(safereload_str); safereload_str=getsstring(themodule, 100); if (safereload_sched) deleteschedule(safereload_sched, safereloadcallback, NULL); scheduleoneshot(1, safereloadcallback, NULL); }
static void fake_free(fakeuser *fake) { fakeuser **pnext; if (fake->user) deregisterlocaluser(fake->user, "Signing off"); deleteschedule(NULL, &reconnectfakeuser, fake); for (pnext = &fakeuserlist; *pnext; pnext = &((*pnext)->next)) { if (*pnext == fake) { *pnext = fake->next; break; } } free(fake); }
void __fini() { #else void _fini() { #endif if(loaded) { if(startsched) deleteschedule(startsched, &lua_startup, NULL); while(lua_head) lua_unloadscript(lua_head); lua_destroybot(); lua_destroycontrol(); } freesstring(cpath); freesstring(suffix); freesstring(dummy.name); lua_freedebugsocket(); nscheckfreeall(POOL_LUA); } void lua_loadscripts(void) { array *ls; ls = getconfigitems("lua", "script"); if(!ls) { Error("lua", ERR_INFO, "No scripts loaded."); } else { sstring **scripts = (sstring **)(ls->content); int i; for(i=0;i<ls->cursi;i++) lua_loadscript(scripts[i]->content); } }
static void ib_hook_modechange(int hooknum, void *arg) { void **arglist=(void **)arg; channel *cp=(channel *)arglist[0]; nick *np=(nick *)arglist[1]; long changeflags=(long)arglist[2]; chanban *cbp; const char *p; int colons, colonsnext; modechanges changes; ibnick *inp; char *mask, *pos; int slot, i; array bans; if (!np || !(changeflags & MODECHANGE_BANS)) return; inp = np->exts[ib_nickext]; /* Ignore the mode change if the same user has recently * set/unset a channel ban. */ if (inp && inp->timeout > time(NULL)) return; if (inp) { deleteschedule(inp->sched, ib_clear_ext, np); free(inp); np->exts[ib_nickext] = NULL; } array_init(&bans, 512); for (cbp = cp->bans; cbp; cbp = cbp->next) { if (!cbp->host) continue; colons = 0; colonsnext = 0; for (p = cbp->host->content; *p; p++) { if (*p == ':') { colons++; if (*(p + 1) == ':') colonsnext = 1; } } if (colons - colonsnext >= 8) { slot = array_getfreeslot(&bans); mask = ((char *)bans.content) + slot * 512; strncpy(mask, bantostring(cbp), 512); } } if (bans.cursi > 0) { localsetmodeinit(&changes, cp, NULL); for (i = 0; i < bans.cursi; i++) { mask = ((char *)bans.content) + i * 512; pos = strchr(mask, '@'); if (!pos) continue; /* This should never happen. */ pos++; /* Skip over the @ sign. */ for (; *pos; pos++) { if (*pos != ':') { *pos = '?'; break; } } localdosetmode_ban(&changes, mask, MCB_ADD); } localsetmodeflush(&changes, 1); /* Ignore the user for a short amount of time. If it's a bot * it'll probably try re-setting the ban immediately. */ inp = malloc(sizeof(ibnick)); inp->timeout = time(NULL) + 15; inp->sched = scheduleoneshot(inp->timeout + 1, ib_clear_ext, np); np->exts[ib_nickext] = inp; } array_free(&bans); }
void _fini() { deleteschedule(settime_schedule, &settime_sendsettime, NULL); deregistercontrolcmd("settime",&settime_cmd); }