Jelajahi Sumber

* Add '%group' support to 'bots' command.

Bryan Drewery 14 tahun lalu
induk
melakukan
95db741896
3 mengubah file dengan 39 tambahan dan 49 penghapusan
  1. 1 0
      doc/UPDATES
  2. 3 2
      doc/help.txt
  3. 35 47
      src/botnet.c

+ 1 - 0
doc/UPDATES

@@ -4,6 +4,7 @@
 * 'botjoin' and 'botpart' have been removed. Just use .+chan, .chanset, .botset to control groups.
 * Add command 'groups' to list all groups and which bots are in them.
 * Command 'channels' now accepts a '%group' param to show which channels a group are in.
+* Add '%group' support to 'bots' command.
 
 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.

+ 3 - 2
doc/help.txt

@@ -284,7 +284,7 @@ See also: msg%{+n}
  
 See also: netnick, nick
 :hub:bots
-###  $bbots$b [nodename]
+###  $bbots$b [nodename|%group]
    Shows the list of bots currently on the botnet.
    Example:
       Bots: cEvin, ruthie, Killa1
@@ -292,7 +292,8 @@ See also: netnick, nick
    bot. %{+n}Use $b'%dwho'$b or $b'%dbottree'$b for that information.%{-}
  
    Specifying a nodename will display all bots up/down on that nodename.
-   Bots with a * preceeding its name is down.
+   Bots with a * preceeding its name are down.
+   Specifying a %%group will only show bots in that group.
  
 See also: groups, downbots%{+n}, bottree%{-}
 :hub:botserver:

+ 35 - 47
src/botnet.c

@@ -527,60 +527,48 @@ void answer_local_whom(int idx, int chan)
 void
 tell_bots(int idx, int up, const char *nodename)
 {
-  struct userrec *u = NULL;
-  int cnt = 0, tot = 0, total = 1, mtot = 0;
-  char work[151] = "", *node = NULL;
-
-  if (up) {
-    if (nodename)
-      node = (char *) get_user(&USERENTRY_NODENAME, conf.bot->u);    
-    if (!nodename || wild_match(nodename, node)) {
-      strlcat(work, conf.bot->nick, sizeof(work));
-      strlcat(work, " ", sizeof(work));
-      cnt++;
-      tot++;
-      if (nodename)
-        mtot++;
-    }
+  size_t total = 0;
+  bd::Array<bd::String> bots;
+  bd::String group;
+
+  if (nodename && nodename[0] == '%') {
+    group = nodename + 1;
   }
 
-  for (u = userlist; u; u = u->next) {
+  // Gather a list of nodes and bots per node, as well as per domain
+  for (struct userrec* u = userlist; u; u = u->next) {
     if (u->bot) {
-      if (strcasecmp(u->handle, conf.bot->nick)) {
-        bool found = 0;
-        
-        if (findbot(u->handle))
-          found = 1;
-        total++;
-        if (nodename || (!nodename && ((!up && !found) || (up && found)))) {
-          if (nodename)
-            node = (char *) get_user(&USERENTRY_NODENAME, u);
-          if (!nodename || wild_match(nodename, node)) {
-            if (nodename && !found)
-              strlcat(work, "*", sizeof(work));
-            strlcat(work, u->handle, sizeof(work));
-            cnt++;
-            if (nodename)
-              mtot++;
-            if (!nodename || (nodename && found))
-              tot++;
-            if (cnt == 11) {
-              dprintf(idx, "%s bots: %s\n", nodename ? "Matching" : up ? "Up" : "Down", work);
-              work[0] = 0;
-              cnt = 0;
-            } else {
-              strlcat(work, " ", sizeof(work));
-            }
-          }
+      // If looking for groups, exclude hubs
+      if (group.length() && bot_hublevel(u) != 999) {
+        continue;
+      }
+      ++total;
+      bd::String botnick(u->handle);
+      const bd::Array<bd::String> botgroups(bd::String(var_get_bot_data(u, "groups", true)).split(","));
+
+      // Include this bot?
+      const bool group_match = group.length() && botgroups.find(group) != botgroups.npos;
+      const bd::String node((const char*) get_user(&USERENTRY_NODENAME, u));
+      const bool node_match = ((nodename && node.length() && wild_match(nodename, node.c_str())) || !nodename);
+      const bool bot_found = findbot(u->handle);
+      const bool up_down_match = (nodename || (!nodename && ((up && bot_found) || (!up && !bot_found))));
+      if (group_match || (group.length() == 0 && node_match && up_down_match)) {
+        if ((group.length() || nodename) && !up && !bot_found) {
+          botnick = '*' + botnick;
         }
+        nodeBots[node] << botnick;
+        bots << botnick;
       }
     }
   }
-  if (work[0])
-    dprintf(idx, "%s bot%s: %s\n", nodename ? "Matching" : up ? "Up" : "Down", cnt > 1 ? "s" : "", work);
-  if (nodename)
-    dprintf(idx, "(Total Matching: %d/%d)\n", mtot, total);
-  dprintf(idx, "(Total %s: %d/%d)\n", nodename ? "up" : up ? "up" : "down", tot, nodename ? mtot : total);
+
+  dumplots(idx, nodename ? "Matching: " : (up ? "Up: " : "Down: "), static_cast<bd::String>(bots.join(" ")).c_str());
+
+  if (nodename || group.length()) {
+    dprintf(idx, "(Total Matching: %zu/%zu)\n", bots.length(), total);
+  } else {
+    dprintf(idx, "(Total %s: %zu/%zu)\n", up ? "up" : "down", bots.length(), total);
+  }
 }
 
 /* Show a simpleton bot tree