فهرست منبع

Delete expired cached members after wait_split (900 seconds) (#49)

Bryan Drewery 14 سال پیش
والد
کامیت
11309bf0f3
1فایلهای تغییر یافته به همراه18 افزوده شده و 1 حذف شده
  1. 18 1
      src/mod/irc.mod/irc.c

+ 18 - 1
src/mod/irc.mod/irc.c

@@ -1170,6 +1170,7 @@ killmember(struct chanset_t *chan, char *nick, bool cacheMember)
     chan->channel.member = x->next;
 
   if (cacheMember) {
+    x->last = now;
     // Don't delete here, will delete when it expires from the cache.
     (*chan->channel.cached_members)[x->userhost] = x;
   } else {
@@ -1495,10 +1496,11 @@ void check_shouldjoin(struct chanset_t* chan)
 static void
 check_expired_chanstuff(struct chanset_t *chan)
 {
+  memberlist *m = NULL;
   check_shouldjoin(chan);
   if (channel_active(chan) && shouldjoin(chan)) {
     masklist *b = NULL, *e = NULL;
-    memberlist *m = NULL, *n = NULL;
+    memberlist *n = NULL;
     struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
 
     if (me_op(chan)) {
@@ -1617,6 +1619,21 @@ check_expired_chanstuff(struct chanset_t *chan)
       recheck_channel_modes(chan);
     }
   }
+  // Clear out expired cached members
+  if (chan->channel.cached_members && chan->channel.cached_members->size()) {
+    bd::Array<bd::String> member_uhosts(chan->channel.cached_members->keys());
+    for (size_t i = 0; i < member_uhosts.length(); ++i) {
+      const bd::String uhost(member_uhosts[i]);
+
+      m = (*chan->channel.cached_members)[uhost];
+
+      // Delete the expired member
+      if (now - m->last > wait_split) {
+        delete_member(m);
+        chan->channel.cached_members->remove(uhost);
+      }
+    }
+  }
 }
 
 void