Ver código fonte

Update member from cache if possible (#49)

This is only updating flood/EVOICE data to avoid using stale data.
Bryan Drewery 14 anos atrás
pai
commit
015109ee55
4 arquivos alterados com 30 adições e 0 exclusões
  1. 1 0
      doc/UPDATES
  2. 2 0
      src/mod/irc.mod/chan.c
  3. 26 0
      src/mod/irc.mod/irc.c
  4. 1 0
      src/mod/irc.mod/irc.h

+ 1 - 0
doc/UPDATES

@@ -2,6 +2,7 @@
 * Add chanset 'voice-moderate' which will auto set +m in '+voice' channel and devoice flooding clients instead of kick. (#48)
 * Bots now will enforce devoices made by ops (user +o) and allow any op (user +o) to revoice to disable that enforcement.
   This used to use +m to enforce/allowed revoicing.
+* Bots will now remember a client's flood/devoice settings if they cycle (#49)
 
 1.4.0 - http://wraith.botpack.net/milestone/1.4.0
   * Updated server list, 'set -yes servers -' and 'set -yes servers6 -' to get new list.

+ 2 - 0
src/mod/irc.mod/chan.c

@@ -1953,6 +1953,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     /* Store the userhost */
     simple_snprintf(m->userhost, sizeof(m->userhost), "%s@%s", user, host);
     simple_snprintf(m->from, sizeof(m->from), "%s!%s", m->nick, m->userhost);
+    member_update_from_cache(chan, m);
 
     if (!m->userip[0]) {
       if (ip)
@@ -2738,6 +2739,7 @@ static int gotjoin(char *from, char *chname)
 	m = newmember(chan, nick);
 	m->joined = m->last = now;
 	strlcpy(m->userhost, uhost, sizeof(m->userhost));
+        member_update_from_cache(chan, m);
         simple_snprintf(m->from, sizeof(m->from), "%s!%s", m->nick, m->userhost);
         if (is_dotted_ip(host)) {
           strlcpy(m->userip, uhost, sizeof(m->userip));

+ 26 - 0
src/mod/irc.mod/irc.c

@@ -1199,6 +1199,32 @@ killmember(struct chanset_t *chan, char *nick, bool cacheMember)
   return 1;
 }
 
+/**
+ * Update the member with cached information from a parted/quitted member
+ */
+static void member_update_from_cache(struct chanset_t* chan, memberlist *m) {
+  using std::swap;
+
+  // Are they in the cache?
+  const bd::String userhost(m->userhost);
+  if (chan->channel.cached_members->contains(userhost)) {
+    memberlist *cached_member = (*chan->channel.cached_members)[userhost];
+
+    // Update important flood tracking information
+    swap(m->floodtime, cached_member->floodtime);
+    swap(m->floodnum, cached_member->floodnum);
+
+    // Update EVOICE flag
+    if (cached_member->flags & EVOICE) {
+      m->flags |= EVOICE;
+    }
+
+    // No longer need the cached member
+    delete_member(cached_member);
+    chan->channel.cached_members->remove(userhost);
+  }
+}
+
 /* Check whether I'm voice. Returns boolean 1 or 0.
  */
 bool

+ 1 - 0
src/mod/irc.mod/irc.h

@@ -93,6 +93,7 @@ static bool new_mask(masklist *, char *, char *);
 static void do_closed_kick(struct chanset_t *, memberlist *);
 static char *quickban(struct chanset_t *, const char *);
 static bool killmember(struct chanset_t *chan, char *nick, bool cacheMember = true);
+static void member_update_from_cache(struct chanset_t* chan, memberlist *m);
 static void check_lonely_channel(struct chanset_t *chan);
 static int gotmode(char *, char *);
 void unset_im(struct chanset_t* chan);