Bladeren bron

* Optimize channel groups by storing as an array in memory

Bryan Drewery 14 jaren geleden
bovenliggende
commit
a8c5400f07

+ 4 - 1
src/chan.h

@@ -8,6 +8,9 @@
 #ifndef _EGG_CHAN_H
 #define _EGG_CHAN_H
 
+#include <lib/bdlib/src/Array.h>
+#include <lib/bdlib/src/String.h>
+
 typedef struct memstruct {
   struct memstruct *next;
   struct userrec *user;
@@ -210,7 +213,7 @@ struct chanset_t {
   char pls[21];			/* positive mode changes		*/
   char mns[21];			/* negative mode changes		*/
   char key_prot[121];		/* desired password			*/
-  char groups[1024];		/* groups that should join */
+  bd::Array<bd::String> *groups;/* groups that should join */
 /* Chanchar template
  *char temp[121];
  */

+ 7 - 5
src/chanprog.c

@@ -861,13 +861,15 @@ bool bot_shouldjoin(struct userrec* u, struct flag_record* fr, struct chanset_t*
 #endif
 
   // Am I in the groups that this channel has?
-  bd::Array<bd::String> my_groupsArray(bd::String(groups).split(',')), channel_groupsArray(bd::String(chan->groups).split(' '));
+  bd::Array<bd::String> my_groupsArray(bd::String(groups).split(','));
   bool group_match = 0;
 
-  for (size_t i = 0; i < my_groupsArray.length(); ++i) {
-    if (channel_groupsArray.find(my_groupsArray[i]) != channel_groupsArray.npos) {
-      group_match = 1;
-      break;
+  if (chan->groups && chan->groups->length()) {
+    for (size_t i = 0; i < my_groupsArray.length(); ++i) {
+      if (chan->groups->find(my_groupsArray[i]) != chan->groups->npos) {
+        group_match = 1;
+        break;
+      }
     }
   }
 

+ 3 - 2
src/mod/channels.mod/chanmisc.c

@@ -348,7 +348,7 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
       // Replace commas with spaces to be in proper format
       changroups.sub(",", " ");
       changroups.trim();
-      strlcpy(chan->groups, changroups.c_str(), sizeof(chan->groups));
+      *(chan->groups) = changroups.split(" ");
     } else if (!strcmp(item[i], "topic")) {
       char *p = NULL;
 
@@ -1008,7 +1008,8 @@ int channel_add(char *result, const char *newname, char *options, bool isdefault
 /* Chanint template
  *  chan->temp = 0;
  */
-    strlcpy(chan->groups, "main", sizeof(chan->groups));
+    chan->groups = new bd::Array<bd::String>;
+    *(chan->groups) << "main";
     chan->protect_backup = 1;
     chan->knock_flags = 0;
     chan->flood_lock_time = 120;

+ 3 - 0
src/mod/channels.mod/channels.c

@@ -723,6 +723,9 @@ void remove_channel(struct chanset_t *chan)
      free(chan->key);
    if (chan->rmkey)
      free(chan->rmkey);
+   if (chan->groups) {
+     delete(chan->groups);
+   }
    free(chan);
 }
 

+ 1 - 1
src/mod/channels.mod/cmdschan.c

@@ -1228,7 +1228,7 @@ static void cmd_chaninfo(int idx, char *par)
 /* FIXME: SHOW_CHAR() here */
     get_mode_protect(chan, work, sizeof(work));
     dprintf(idx, "Protect modes (chanmode): %s\n", work[0] ? work : "None");
-    dprintf(idx, "Groups: %s\n", chan->groups[0] ? bd::String(chan->groups).c_str() : "None");
+    dprintf(idx, "Groups: %s\n", chan->groups && chan->groups->length() ? static_cast<bd::String>(chan->groups->join(" ")).c_str() : "None");
 //    dprintf(idx, "Protect topic (topic)   : %s\n", chan->topic[0] ? chan->topic : "");
 /* Chanchar template
  *  dprintf(idx, "String temp: %s\n", chan->temp[0] ? chan->temp : "NULL");

+ 1 - 1
src/mod/channels.mod/userchan.c

@@ -732,7 +732,7 @@ flood-exempt %d flood-lock-time %d knock %d \
  *      temp,
  * also include temp %s in dprintf.
  */
-        chan->groups,
+        chan->groups && chan->groups->length() ? static_cast<bd::String>(chan->groups->join(" ")).c_str() : "",
 	chan->bad_cookie,
 	chan->manop,
 	chan->mdop,