]> jfr.im git - irc/quakenet/newserv.git/blobdiff - request/request_fasttrack.c
LUA: add function for channel chanop notice
[irc/quakenet/newserv.git] / request / request_fasttrack.c
index 2378b0660b3fdee3866b77185a2da8fe89e725c8..a49a1475716b2d476951b6e11037a6d59d7a048b 100644 (file)
@@ -36,13 +36,16 @@ int rq_initfasttrack(void) {
 }
 
 void rq_finifasttrack(void) {
-  rq_fasttrack *ft;
+  rq_fasttrack *ft, *next;
 
   deregisterhook(HOOK_NICK_NEWNICK, &rqhook_account);
   deregisterhook(HOOK_NICK_ACCOUNT, &rqhook_account);
 
-  for(ft=ftlist;ft;ft=ft->next)
+  for(ft=ftlist;ft;) {
+    next = ft->next;
     free(ft);
+    ft = next;
+  }
 
   releasenickext(rqnext);
 }
@@ -51,6 +54,8 @@ static void rqhook_account(int hook, void *arg) {
   nick *np = (nick *)arg;
   rq_fasttrack *ft;
 
+  np->exts[rqnext] = NULL;
+
   /* Auth might be null for the newnick hook. */
   if(!np->auth)
     return;
@@ -65,7 +70,35 @@ static void rqhook_account(int hook, void *arg) {
 }
 
 static void rq_cleanup_fasttrack(void *arg) {
+  time_t now;
+  rq_fasttrack **pft, *ft;
+  int j;
+  nick *tnp;
+
+  now = getnettime();
 
+  for(pft=&ftlist;*pft;pft=&((*pft)->next)) {
+    int foundnick = 0;
+
+    ft = *pft;
+
+    for(j=0;j<NICKHASHSIZE && !foundnick;j++) {
+      for(tnp=nicktable[j];tnp;tnp=tnp->next) {
+        if(tnp->exts[rqnext]==ft) {
+          foundnick = 1;
+          break;
+        }
+      }
+    }
+
+    if(!foundnick && ft->refill_time < now) {
+      *pft = ft->next;
+      free(ft);
+    }
+
+    if (!*pft)
+      break;
+  }
 }
 
 static rq_fasttrack *rq_getfasttrack(nick *np) {
@@ -87,6 +120,9 @@ static rq_fasttrack *rq_getfasttrack(nick *np) {
   ft->targets = 0;
   ft->refill_time = 0;
 
+  ft->next = ftlist;
+  ftlist = ft;
+
   np->exts[rqnext] = ft;
 
   return ft;