Bladeren bron

Store chanset_by_dname in a hash table.

Bryan Drewery 7 jaren geleden
bovenliggende
commit
9779ed3f0e
5 gewijzigde bestanden met toevoegingen van 16 en 13 verwijderingen
  1. 1 0
      src/chan.h
  2. 3 12
      src/chanprog.cc
  3. 10 1
      src/chanprog.h
  4. 1 0
      src/mod/channels.mod/chanmisc.cc
  5. 1 0
      src/mod/channels.mod/channels.cc

+ 1 - 0
src/chan.h

@@ -10,6 +10,7 @@
 
 #include <functional>
 #include <lib/bdlib/src/Array.h>
+#include <lib/bdlib/src/HashTable.h>
 #include <lib/bdlib/src/String.h>
 
 /* chan & global */

+ 3 - 12
src/chanprog.cc

@@ -55,8 +55,11 @@
 #endif
 #include <sys/utsname.h>
 #include <bdlib/src/Array.h>
+#include <bdlib/src/HashTable.h>
 #include <bdlib/src/String.h>
 
+bd::HashTable<RfcString, struct chanset_t *> chanset_by_dname;
+
 char *def_chanset = "+enforcebans +dynamicbans +userbans -bitch +cycle -inactive +userexempts -dynamicexempts +userinvites -dynamicinvites -nodesynch -closed -take -voice -private -fastop ban-type 3 protect-backup 1 groups { main } revenge react";
 struct chanset_t 	*chanset = NULL;	/* Channel list			*/
 struct chanset_t	*chanset_default = NULL;	/* Default channel list */
@@ -117,18 +120,6 @@ struct chanset_t *findchan(const char *name)
   return NULL;
 }
 
-/* Find a chanset by display name (ie !channel)
- */
-struct chanset_t *findchan_by_dname(const char *name)
-{
-  struct chanset_t	*chan = NULL;
-
-  for (chan = chanset; chan; chan = chan->next)
-    if (!rfc_casecmp(chan->dname, name))
-      return chan;
-  return NULL;
-}
-
 /*
  *    "caching" functions
  */

+ 10 - 1
src/chanprog.h

@@ -2,11 +2,14 @@
 #define _CHANPROG_H
 
 #include "src/chan.h"
+#include "RfcString.h"
 
 #define DO_LOCAL	1
 #define DO_NET		2
 #define CMD		4
 
+extern bd::HashTable<RfcString, struct chanset_t *> chanset_by_dname;
+
 int do_chanset(char *, struct chanset_t *, const char *, int);
 void checkchans(int);
 void tell_verbose_uptime(int);
@@ -39,7 +42,13 @@ struct userrec *check_chanlist(const char *);
 struct userrec *check_chanlist_hand(const char *);
 memberlist *ismember(const struct chanset_t *, const char *);
 struct chanset_t *findchan(const char *name);
-struct chanset_t *findchan_by_dname(const char *name);
+/*
+ * Find a chanset by display name (ie !channel)
+ */
+static inline struct chanset_t *
+findchan_by_dname(const char *name) {
+  return chanset_by_dname[name];
+}
 
 extern struct chanset_t		*chanset, *chanset_default;
 extern char			admin[], origbotnick[HANDLEN + 1], origbotname[NICKLEN], jupenick[NICKLEN], botname[NICKLEN], *def_chanset;

+ 1 - 0
src/mod/channels.mod/chanmisc.cc

@@ -1185,6 +1185,7 @@ int channel_add(char *result, const char *newname, char *options, bool isdefault
      * the server knows it, when we join the channel. <cybah>
      */
     strlcpy(chan->dname, newname, sizeof(chan->dname));
+    chanset_by_dname[chan->dname] = chan;
 
     /* Initialize chan->channel info */
     if (isdefault) {

+ 1 - 0
src/mod/channels.mod/channels.cc

@@ -607,6 +607,7 @@ void remove_channel(struct chanset_t *chan)
      /* Remove the channel from the list, so that noone can pull it
         away from under our feet during the check_part() call. */
      list_delete((struct list_type **) &chanset, (struct list_type *) chan);
+     chanset_by_dname.remove(chan->dname);
 
     /* Using chan->name is important here, especially for !chans <cybah> */
     if (!conf.bot->hub && shouldjoin(chan) && chan->name[0])