1
0
Эх сурвалжийг харах

Don't use hard-coded indices which will be bad if doc/responses.txt is reordered.

Can't use std::unordered_map in main due to C++11 requirement.
Bryan Drewery 11 жил өмнө
parent
commit
96db93fd61
4 өөрчлөгдсөн 39 нэмэгдсэн , 24 устгасан
  1. 2 1
      build/makeres.sh
  2. 1 0
      src/main.cc
  3. 13 1
      src/response.cc
  4. 23 22
      src/response.h

+ 2 - 1
build/makeres.sh

@@ -20,6 +20,7 @@ while read -r line; do
 done
 
 echo "typedef struct {"
+echo "  const char*  name;"
 echo "  const char** res;"
 echo "  const size_t size;"
 echo "} res_t;"
@@ -28,7 +29,7 @@ echo "static const res_t res[] = {"
 needcomma=0
 for type in ${types}; do
 	[ ${needcomma} -eq 1 ] && printf ",\n"
-	printf "\t{res_%s, sizeof(res_%s)/sizeof(res_%s[0])}" "${type}" "${type}" "${type}"
+	printf "\t{\"%s\",\tres_%s,\tsizeof(res_%s)/sizeof(res_%s[0])}" "${type}" "${type}" "${type}" "${type}"
 	needcomma=1
 done
 echo

+ 1 - 0
src/main.cc

@@ -827,6 +827,7 @@ int main(int argc, char **argv)
   Auth::InitTimer();
   init_vars();			/* needed for cfg */
   init_botcmd();
+  init_responses();
 
   egg_dns_init();
   channels_init();

+ 13 - 1
src/response.cc

@@ -8,10 +8,22 @@
 #include "common.h"
 #include "response.h"
 #include "responses.cc"
+#include <bdlib/src/HashTable.h>
+#include <vector>
+
+static bd::HashTable<const char*, std::vector<const char*> > res_map;
+
+void
+init_responses()
+{
+  for (size_t i = 0; i < sizeof(res)/sizeof(res[0]); ++i)
+    res_map[res[i].name] = std::vector<const char*>(res[i].res,
+        res[i].res + res[i].size);
+}
 
 const char *
 response(response_t type)
 {
-  return res[type].res[randint(res[type].size)];
+  return res_map[type].at(randint(res_map[type].size()));
 }
 /* vim: set sts=2 sw=2 ts=8 et: */

+ 23 - 22
src/response.h

@@ -1,29 +1,30 @@
 #ifndef _RESPONSE_H
 #define _RESPONSE_H
 
-enum response_t {
-	RES_BANNED = 0,
-	RES_KICKBAN,
-	RES_MASSDEOP,
-	RES_BADOP,
-	RES_BADOPPED,
-	RES_BITCHOP,
-	RES_BITCHOPPED,
-	RES_MANUALOP,
-	RES_MANUALOPPED,
-	RES_CLOSED,
-	RES_FLOOD,
-	RES_NICKFLOOD,
-	RES_KICKFLOOD,
-	RES_REVENGE,
-	RES_USERNAME,
-	RES_PASSWORD,
-	RES_BADUSERPASS,
-	RES_MIRCVER,
-	RES_MIRCSCRIPT,
-	RES_OTHERSCRIPT,
-};
+#define RES_BANNED	"banned"
+#define RES_KICKBAN	"kickban"
+#define RES_MASSDEOP	"massdeop"
+#define RES_BADOP	"badop"
+#define RES_BADOPPED	"badopped"
+#define RES_BITCHOP	"bitchop"
+#define RES_BITCHOPPED	"bitchopped"
+#define RES_MANUALOP	"manualop"
+#define RES_MANUALOPPED	"manualopped"
+#define RES_CLOSED	"closed"
+#define RES_FLOOD	"flood"
+#define RES_NICKFLOOD	"nickflood"
+#define RES_KICKFLOOD	"kickflood"
+#define RES_REVENGE	"revenge"
+#define RES_USERNAME	"username"
+#define RES_PASSWORD	"password"
+#define RES_BADUSERPASS	"baduserpass"
+#define RES_MIRCVER	"mIRCver"
+#define RES_MIRCSCRIPT	"mIRCscript"
+#define RES_OTHERSCRIPT	"otherscript"
 
+typedef const char* response_t;
+
+void init_responses();
 const char *response(response_t);
 
 inline const char *